diff --git a/src/ui/zcl_abapgit_services_repo.clas.abap b/src/ui/zcl_abapgit_services_repo.clas.abap index 1aa65b167..2c537cbfa 100644 --- a/src/ui/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/zcl_abapgit_services_repo.clas.abap @@ -84,6 +84,12 @@ CLASS zcl_abapgit_services_repo DEFINITION !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt RAISING zcx_abapgit_exception . + CLASS-METHODS popup_package_overwrite + CHANGING + !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt + RAISING + zcx_abapgit_exception + zcx_abapgit_cancel . ENDCLASS. @@ -126,10 +132,18 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. DATA: ls_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks. +* find troublesome objects ls_checks = io_repo->deserialize_checks( ). - popup_overwrite( CHANGING ct_overwrite = ls_checks-overwrite ). +* and let the user decide what to do + TRY. + popup_overwrite( CHANGING ct_overwrite = ls_checks-overwrite ). + popup_package_overwrite( CHANGING ct_overwrite = ls_checks-warning_package ). + CATCH zcx_abapgit_cancel. + RETURN. + ENDTRY. +* and pass decisions to deserialize io_repo->deserialize( ls_checks ). ENDMETHOD. @@ -214,6 +228,45 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. ENDMETHOD. + METHOD popup_package_overwrite. + + DATA: lv_question TYPE c LENGTH 200, + lv_answer TYPE c. + + FIELD-SYMBOLS: LIKE LINE OF ct_overwrite. + + + IF lines( ct_overwrite ) = 0. + RETURN. + ENDIF. + + LOOP AT ct_overwrite ASSIGNING . + CONCATENATE 'Overwrite object' -obj_type -obj_name + 'from package' -devclass + INTO lv_question SEPARATED BY space. "#EC NOTEXT + + lv_answer = zcl_abapgit_popups=>popup_to_confirm( + titlebar = 'Warning' + text_question = lv_question + text_button_1 = 'Ok' + icon_button_1 = 'ICON_DELETE' + text_button_2 = 'Cancel' + icon_button_2 = 'ICON_CANCEL' + default_button = '2' + display_cancel_button = abap_false ). "#EC NOTEXT + + IF lv_answer = '2'. + RAISE EXCEPTION TYPE zcx_abapgit_cancel. + ENDIF. + +* todo, let the user decide yes/no/cancel + -decision = 'Y'. + + ENDLOOP. + + ENDMETHOD. + + METHOD purge. DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index 43d5b5564..f470ead6c 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -120,6 +120,14 @@ CLASS zcl_abapgit_objects DEFINITION !ct_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception . + CLASS-METHODS checks_adjust + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo + !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks + CHANGING + !ct_results TYPE zif_abapgit_definitions=>ty_results_tt + RAISING + zcx_abapgit_exception . CLASS-METHODS warning_overwrite_find IMPORTING !it_results TYPE zif_abapgit_definitions=>ty_results_tt @@ -127,12 +135,20 @@ CLASS zcl_abapgit_objects DEFINITION VALUE(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt RAISING zcx_abapgit_exception . - CLASS-METHODS warning_package + CLASS-METHODS warning_package_adjust IMPORTING - !is_item TYPE zif_abapgit_definitions=>ty_item - !iv_package TYPE devclass + !io_repo TYPE REF TO zcl_abapgit_repo + !it_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt + CHANGING + !ct_results TYPE zif_abapgit_definitions=>ty_results_tt + RAISING + zcx_abapgit_exception . + CLASS-METHODS warning_package_find + IMPORTING + !it_results TYPE zif_abapgit_definitions=>ty_results_tt + !io_repo TYPE REF TO zcl_abapgit_repo RETURNING - VALUE(rv_cancel) TYPE abap_bool + VALUE(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt RAISING zcx_abapgit_exception . CLASS-METHODS update_package_tree @@ -187,6 +203,22 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. ENDMETHOD. + METHOD checks_adjust. + + warning_overwrite_adjust( + EXPORTING it_overwrite = is_checks-overwrite + CHANGING ct_results = ct_results ). + + warning_package_adjust( + EXPORTING + io_repo = io_repo + it_overwrite = is_checks-warning_package + CHANGING + ct_results = ct_results ). + + ENDMETHOD. + + METHOD check_duplicates. DATA: lt_files TYPE zif_abapgit_definitions=>ty_files_tt. @@ -395,36 +427,30 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. lt_results = files_to_deserialize( io_repo ). - warning_overwrite_adjust( - EXPORTING it_overwrite = is_checks-overwrite - CHANGING ct_results = lt_results ). + checks_adjust( + EXPORTING + io_repo = io_repo + is_checks = is_checks + CHANGING + ct_results = lt_results ). CREATE OBJECT lo_progress EXPORTING iv_total = lines( lt_results ). - LOOP AT lt_results ASSIGNING WHERE obj_type IS NOT INITIAL - AND NOT ( lstate = zif_abapgit_definitions=>gc_state-added AND rstate IS INITIAL ). + LOOP AT lt_results ASSIGNING . lo_progress->show( iv_current = sy-tabix iv_text = |Deserialize { -obj_name }| ) ##NO_TEXT. CLEAR ls_item. ls_item-obj_type = -obj_type. ls_item-obj_name = -obj_name. -* handle namespaces - REPLACE ALL OCCURRENCES OF '#' IN ls_item-obj_name WITH '/'. lv_package = zcl_abapgit_folder_logic=>path_to_package( iv_top = io_repo->get_package( ) io_dot = io_repo->get_dot_abapgit( ) iv_path = -path ). - lv_cancel = warning_package( is_item = ls_item - iv_package = lv_package ). - IF lv_cancel = abap_true. - zcx_abapgit_exception=>raise( 'cancelled' ). - ENDIF. - IF ls_item-obj_type = 'DEVC'. " Packages have the same filename across different folders. The path needs to be supplied " to find the correct file. @@ -498,6 +524,10 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. rs_checks-overwrite = warning_overwrite_find( lt_results ). + rs_checks-warning_package = warning_package_find( + io_repo = io_repo + it_results = lt_results ). + ENDMETHOD. @@ -548,13 +578,24 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. METHOD files_to_deserialize. + FIELD-SYMBOLS: LIKE LINE OF rt_results. + + rt_results = zcl_abapgit_file_status=>status( io_repo ). DELETE rt_results WHERE match = abap_true. " Full match SORT rt_results BY obj_type ASCENDING obj_name ASCENDING. DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name. + DELETE rt_results WHERE obj_type IS INITIAL. + DELETE rt_results WHERE lstate = zif_abapgit_definitions=>gc_state-added AND rstate IS INITIAL. + rt_results = prioritize_deser( rt_results ). + LOOP AT rt_results ASSIGNING . +* handle namespaces + REPLACE ALL OCCURRENCES OF '#' IN -obj_name WITH '/'. + ENDLOOP. + ENDMETHOD. @@ -791,37 +832,70 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. ENDMETHOD. - METHOD warning_package. + METHOD warning_package_adjust. - DATA: lv_question TYPE c LENGTH 200, - lv_answer TYPE c, - ls_tadir TYPE tadir. + DATA: lt_overwrite LIKE it_overwrite, + ls_overwrite LIKE LINE OF lt_overwrite. + + FIELD-SYMBOLS: LIKE LINE OF lt_overwrite. - ls_tadir = zcl_abapgit_tadir=>read_single( - iv_object = is_item-obj_type - iv_obj_name = is_item-obj_name ). +* make sure to get the current status, as something might have changed in the meanwhile + lt_overwrite = warning_package_find( + it_results = ct_results + io_repo = io_repo ). - IF NOT ls_tadir IS INITIAL AND ls_tadir-devclass <> iv_package. - CONCATENATE 'Overwrite object' is_item-obj_type is_item-obj_name - 'from package' ls_tadir-devclass - INTO lv_question SEPARATED BY space. "#EC NOTEXT - - lv_answer = zcl_abapgit_popups=>popup_to_confirm( - titlebar = 'Warning' - text_question = lv_question - text_button_1 = 'Ok' - icon_button_1 = 'ICON_DELETE' - text_button_2 = 'Cancel' - icon_button_2 = 'ICON_CANCEL' - default_button = '2' - display_cancel_button = abap_false ). "#EC NOTEXT - - IF lv_answer = '2'. - rv_cancel = abap_true. + LOOP AT lt_overwrite ASSIGNING . + READ TABLE it_overwrite INTO ls_overwrite WITH KEY + obj_type = -obj_type + obj_name = -obj_name. + IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. + zcx_abapgit_exception=>raise( |Overwrite odd package { -obj_type } { + -obj_name } undecided| ). ENDIF. - ENDIF. + IF ls_overwrite-decision = 'N'. + DELETE ct_results WHERE + obj_type = -obj_type AND + obj_name = -obj_name. + ASSERT sy-subrc = 0. + ENDIF. - ENDMETHOD. "check_warning + ENDLOOP. + + ENDMETHOD. + + + METHOD warning_package_find. + + DATA: lv_package TYPE devclass, + ls_overwrite LIKE LINE OF rt_overwrite, + ls_tadir TYPE tadir. + + FIELD-SYMBOLS: LIKE LINE OF it_results. + + + LOOP AT it_results ASSIGNING . + + lv_package = zcl_abapgit_folder_logic=>path_to_package( + iv_top = io_repo->get_package( ) + io_dot = io_repo->get_dot_abapgit( ) + iv_path = -path ). + + ls_tadir = zcl_abapgit_tadir=>read_single( + iv_object = -obj_type + iv_obj_name = -obj_name ). + + IF NOT ls_tadir IS INITIAL AND ls_tadir-devclass <> lv_package. +* overwriting object from different package than expected + CLEAR ls_overwrite. + ls_overwrite-obj_type = -obj_type. + ls_overwrite-obj_name = -obj_name. + ls_overwrite-devclass = ls_tadir-devclass. + APPEND ls_overwrite TO rt_overwrite. + ENDIF. + + ENDLOOP. + + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_repo.clas.abap b/src/zcl_abapgit_repo.clas.abap index a003bb3b4..13fe30ca8 100644 --- a/src/zcl_abapgit_repo.clas.abap +++ b/src/zcl_abapgit_repo.clas.abap @@ -66,7 +66,6 @@ CLASS zcl_abapgit_repo DEFINITION !iv_drop_cache TYPE abap_bool DEFAULT abap_false RAISING zcx_abapgit_exception . - METHODS refresh_local . METHODS update_local_checksums IMPORTING !it_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt @@ -191,10 +190,10 @@ CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Current login language does not match master language' ). ENDIF. -* todo - rs_checks = zcl_abapgit_objects=>deserialize_checks( me ). +* todo + ENDMETHOD. @@ -428,11 +427,6 @@ CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION. ENDMETHOD. "refresh - METHOD refresh_local. " For testing purposes, maybe removed later - mv_do_local_refresh = abap_true. - ENDMETHOD. "refresh_local - - METHOD set. * TODO: refactor diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 992a89bf5..97db9e227 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -90,7 +90,8 @@ INTERFACE zif_abapgit_definitions PUBLIC. TYPES: ty_overwrite_tt TYPE STANDARD TABLE OF ty_overwrite WITH DEFAULT KEY. TYPES: BEGIN OF ty_deserialize_checks, - overwrite TYPE ty_overwrite_tt, + overwrite TYPE ty_overwrite_tt, + warning_package TYPE ty_overwrite_tt, END OF ty_deserialize_checks. TYPES: