From f8ac419f29534625e4c2ca4a1db5e2b667e7c974 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Fri, 4 Nov 2022 08:56:31 -0400 Subject: [PATCH] Fix "Unexpected package naming" error (#5805) * Fix "Unexpected package naming" error Previously, when an object existed in the repo and locally but was *not* included in the package hierarchy of the repository, you would get the following error (when opening the repo): ... With this PR, log messages will list all objects that are not included in the package hierarchy. When pulling, the popup will show these objects and ask for confirmation to overwrite. I added an icon and description to the "package overwrite" popup similar to the "object selection" popup. Closes #5728 * Update unit tests Co-authored-by: Lars Hvam --- .../core/zcl_abapgit_file_status.clas.abap | 13 ++++--- .../core/zcl_abapgit_folder_logic.clas.abap | 16 +++++++- ...abapgit_folder_logic.clas.testclasses.abap | 37 +++++++++++++++++-- .../core/zcl_abapgit_objects_check.clas.abap | 3 ++ src/ui/zcl_abapgit_services_repo.clas.abap | 10 ++++- 5 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/objects/core/zcl_abapgit_file_status.clas.abap b/src/objects/core/zcl_abapgit_file_status.clas.abap index d252141c3..8f79f1f1e 100644 --- a/src/objects/core/zcl_abapgit_file_status.clas.abap +++ b/src/objects/core/zcl_abapgit_file_status.clas.abap @@ -440,6 +440,7 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. DATA: lv_path TYPE string, + lv_object TYPE string, lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic. FIELD-SYMBOLS LIKE LINE OF it_results. @@ -454,12 +455,12 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. io_dot = io_dot iv_package = -package ). - IF lv_path <> -path. - ii_log->add( iv_msg = |Package and path do not match for object { - -obj_type } { -obj_name }| - iv_type = 'W' ). - ELSEIF lv_path IS INITIAL. - zcx_abapgit_exception=>raise( |Error determining parent package of package { -package }| ). + lv_object = |{ -obj_type } { -obj_name }|. + + IF lv_path IS INITIAL. + ii_log->add_error( |{ lv_object } already exists outside of { iv_top } package hierarchy| ). + ELSEIF lv_path <> -path. + ii_log->add_warning( |Package and path do not match for object { lv_object }| ). ENDIF. ENDLOOP. diff --git a/src/objects/core/zcl_abapgit_folder_logic.clas.abap b/src/objects/core/zcl_abapgit_folder_logic.clas.abap index c7ebf7590..d41693784 100644 --- a/src/objects/core/zcl_abapgit_folder_logic.clas.abap +++ b/src/objects/core/zcl_abapgit_folder_logic.clas.abap @@ -30,6 +30,7 @@ CLASS zcl_abapgit_folder_logic DEFINITION METHODS get_parent IMPORTING + !iv_top TYPE devclass !iv_package TYPE devclass RETURNING VALUE(rv_parent) TYPE devclass @@ -45,6 +46,7 @@ CLASS zcl_abapgit_folder_logic DEFINITION TYPES: ty_devclass_info_tt TYPE SORTED TABLE OF ty_devclass_info WITH UNIQUE KEY devclass . + DATA mt_top_subpackages TYPE ty_devclass_info_tt . DATA mt_parent TYPE ty_devclass_info_tt . ENDCLASS. @@ -61,6 +63,16 @@ CLASS zcl_abapgit_folder_logic IMPLEMENTATION. METHOD get_parent. DATA: ls_parent LIKE LINE OF mt_parent. + " Check that package is included in the TOP package hierarchy + IF mt_top_subpackages IS INITIAL. + mt_top_subpackages = zcl_abapgit_factory=>get_sap_package( iv_top )->list_subpackages( ). + ENDIF. + + READ TABLE mt_top_subpackages TRANSPORTING NO FIELDS WITH KEY devclass = iv_package. + IF sy-subrc <> 0. + RETURN. + ENDIF. + "Determine Parent Package READ TABLE mt_parent INTO ls_parent WITH TABLE KEY devclass = iv_package. @@ -86,7 +98,9 @@ CLASS zcl_abapgit_folder_logic IMPLEMENTATION. IF iv_top = iv_package. rv_path = io_dot->get_starting_folder( ). ELSE. - lv_parentcl = get_parent( iv_package ). + lv_parentcl = get_parent( + iv_top = iv_top + iv_package = iv_package ). " If the parent package can not be determined, we return an initial path and handle " it outside of this class (in zcl_abapgit_file_status) diff --git a/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap b/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap index d512c7536..8c802cb84 100644 --- a/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap +++ b/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap @@ -35,6 +35,10 @@ CLASS ltcl_folder_logic_helper IMPLEMENTATION. io_dot = lo_dot iv_package = iv_package ). + IF lv_path IS INITIAL. + zcx_abapgit_exception=>raise( 'Unable to determine path' ). + ENDIF. + cl_abap_unit_assert=>assert_equals( act = lv_package exp = iv_package ). @@ -57,7 +61,11 @@ ENDCLASS. CLASS ltcl_folder_logic_package IMPLEMENTATION. METHOD zif_abapgit_sap_package~list_subpackages. - RETURN. + DATA lv_devclass TYPE devclass. + lv_devclass = '$TOP_BAR'. + INSERT lv_devclass INTO TABLE rt_list. + lv_devclass = '$TOP_FOO_BAR'. + INSERT lv_devclass INTO TABLE rt_list. ENDMETHOD. METHOD zif_abapgit_sap_package~list_superpackages. @@ -125,8 +133,22 @@ ENDCLASS. CLASS ltcl_folder_logic IMPLEMENTATION. + " Test packages: + " + " $TOP + " > $TOP_FOO + " > > $TOP_BAR + " > > $TOP_FOO_BAR + " + " $FOOBAR (outside of $TOP) METHOD zif_abapgit_sap_package~list_subpackages. - RETURN. + DATA lv_devclass TYPE devclass. + lv_devclass = '$TOP_BAR'. + INSERT lv_devclass INTO TABLE rt_list. + lv_devclass = '$TOP_FOO'. + INSERT lv_devclass INTO TABLE rt_list. + lv_devclass = '$TOP_FOO_BAR'. + INSERT lv_devclass INTO TABLE rt_list. ENDMETHOD. METHOD zif_abapgit_sap_package~list_superpackages. @@ -322,8 +344,17 @@ ENDCLASS. CLASS ltcl_folder_logic_namespaces IMPLEMENTATION. + " Test packages: + " + " /TEST/TOOLS + " > /TEST/T1 + " > /TEST/TOOLS_T1 METHOD zif_abapgit_sap_package~list_subpackages. - RETURN. + DATA lv_devclass TYPE devclass. + lv_devclass = '/TEST/T1'. + INSERT lv_devclass INTO TABLE rt_list. + lv_devclass = '/TEST/TOOLS_T1'. + INSERT lv_devclass INTO TABLE rt_list. ENDMETHOD. METHOD zif_abapgit_sap_package~list_superpackages. diff --git a/src/objects/core/zcl_abapgit_objects_check.clas.abap b/src/objects/core/zcl_abapgit_objects_check.clas.abap index 8720a6c06..e28478c2b 100644 --- a/src/objects/core/zcl_abapgit_objects_check.clas.abap +++ b/src/objects/core/zcl_abapgit_objects_check.clas.abap @@ -284,6 +284,9 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION. ls_overwrite-obj_type = -obj_type. ls_overwrite-obj_name = -obj_name. ls_overwrite-devclass = ls_tadir-devclass. + ls_overwrite-action = zif_abapgit_objects=>c_deserialize_action-overwrite. + ls_overwrite-icon = icon_change. + ls_overwrite-text = 'Overwrite local object'. INSERT ls_overwrite INTO TABLE lt_overwrite_unique. ENDIF. diff --git a/src/ui/zcl_abapgit_services_repo.clas.abap b/src/ui/zcl_abapgit_services_repo.clas.abap index 7eb74f163..93918a9c3 100644 --- a/src/ui/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/zcl_abapgit_services_repo.clas.abap @@ -95,7 +95,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. +CLASS zcl_abapgit_services_repo IMPLEMENTATION. METHOD check_package. @@ -395,6 +395,14 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. -name = 'OBJ_NAME'. APPEND INITIAL LINE TO lt_columns ASSIGNING . -name = 'DEVCLASS'. + APPEND INITIAL LINE TO lt_columns ASSIGNING . + -name = 'ICON'. + -text = 'Action'. + -show_icon = abap_true. + -length = 5. + APPEND INITIAL LINE TO lt_columns ASSIGNING . + -name = 'TEXT'. + -text = 'Description'. li_popups = zcl_abapgit_ui_factory=>get_popups( ). li_popups->popup_to_select_from_list(