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 <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2022-11-04 08:56:31 -04:00 committed by GitHub
parent ff573fd4d6
commit f8ac419f29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 68 additions and 11 deletions

View File

@ -440,6 +440,7 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION.
DATA: DATA:
lv_path TYPE string, lv_path TYPE string,
lv_object TYPE string,
lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic. lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
FIELD-SYMBOLS <ls_result> LIKE LINE OF it_results. FIELD-SYMBOLS <ls_result> LIKE LINE OF it_results.
@ -454,12 +455,12 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION.
io_dot = io_dot io_dot = io_dot
iv_package = <ls_result>-package ). iv_package = <ls_result>-package ).
IF lv_path <> <ls_result>-path. lv_object = |{ <ls_result>-obj_type } { <ls_result>-obj_name }|.
ii_log->add( iv_msg = |Package and path do not match for object {
<ls_result>-obj_type } { <ls_result>-obj_name }| IF lv_path IS INITIAL.
iv_type = 'W' ). ii_log->add_error( |{ lv_object } already exists outside of { iv_top } package hierarchy| ).
ELSEIF lv_path IS INITIAL. ELSEIF lv_path <> <ls_result>-path.
zcx_abapgit_exception=>raise( |Error determining parent package of package { <ls_result>-package }| ). ii_log->add_warning( |Package and path do not match for object { lv_object }| ).
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.

View File

@ -30,6 +30,7 @@ CLASS zcl_abapgit_folder_logic DEFINITION
METHODS get_parent METHODS get_parent
IMPORTING IMPORTING
!iv_top TYPE devclass
!iv_package TYPE devclass !iv_package TYPE devclass
RETURNING RETURNING
VALUE(rv_parent) TYPE devclass VALUE(rv_parent) TYPE devclass
@ -45,6 +46,7 @@ CLASS zcl_abapgit_folder_logic DEFINITION
TYPES: TYPES:
ty_devclass_info_tt TYPE SORTED TABLE OF ty_devclass_info ty_devclass_info_tt TYPE SORTED TABLE OF ty_devclass_info
WITH UNIQUE KEY devclass . WITH UNIQUE KEY devclass .
DATA mt_top_subpackages TYPE ty_devclass_info_tt .
DATA mt_parent TYPE ty_devclass_info_tt . DATA mt_parent TYPE ty_devclass_info_tt .
ENDCLASS. ENDCLASS.
@ -61,6 +63,16 @@ CLASS zcl_abapgit_folder_logic IMPLEMENTATION.
METHOD get_parent. METHOD get_parent.
DATA: ls_parent LIKE LINE OF mt_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 "Determine Parent Package
READ TABLE mt_parent INTO ls_parent READ TABLE mt_parent INTO ls_parent
WITH TABLE KEY devclass = iv_package. WITH TABLE KEY devclass = iv_package.
@ -86,7 +98,9 @@ CLASS zcl_abapgit_folder_logic IMPLEMENTATION.
IF iv_top = iv_package. IF iv_top = iv_package.
rv_path = io_dot->get_starting_folder( ). rv_path = io_dot->get_starting_folder( ).
ELSE. 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 " 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) " it outside of this class (in zcl_abapgit_file_status)

View File

@ -35,6 +35,10 @@ CLASS ltcl_folder_logic_helper IMPLEMENTATION.
io_dot = lo_dot io_dot = lo_dot
iv_package = iv_package ). iv_package = iv_package ).
IF lv_path IS INITIAL.
zcx_abapgit_exception=>raise( 'Unable to determine path' ).
ENDIF.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lv_package act = lv_package
exp = iv_package ). exp = iv_package ).
@ -57,7 +61,11 @@ ENDCLASS.
CLASS ltcl_folder_logic_package IMPLEMENTATION. CLASS ltcl_folder_logic_package IMPLEMENTATION.
METHOD zif_abapgit_sap_package~list_subpackages. 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. ENDMETHOD.
METHOD zif_abapgit_sap_package~list_superpackages. METHOD zif_abapgit_sap_package~list_superpackages.
@ -125,8 +133,22 @@ ENDCLASS.
CLASS ltcl_folder_logic IMPLEMENTATION. 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. 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. ENDMETHOD.
METHOD zif_abapgit_sap_package~list_superpackages. METHOD zif_abapgit_sap_package~list_superpackages.
@ -322,8 +344,17 @@ ENDCLASS.
CLASS ltcl_folder_logic_namespaces IMPLEMENTATION. CLASS ltcl_folder_logic_namespaces IMPLEMENTATION.
" Test packages:
"
" /TEST/TOOLS
" > /TEST/T1
" > /TEST/TOOLS_T1
METHOD zif_abapgit_sap_package~list_subpackages. 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. ENDMETHOD.
METHOD zif_abapgit_sap_package~list_superpackages. METHOD zif_abapgit_sap_package~list_superpackages.

View File

@ -284,6 +284,9 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION.
ls_overwrite-obj_type = <ls_result>-obj_type. ls_overwrite-obj_type = <ls_result>-obj_type.
ls_overwrite-obj_name = <ls_result>-obj_name. ls_overwrite-obj_name = <ls_result>-obj_name.
ls_overwrite-devclass = ls_tadir-devclass. 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. INSERT ls_overwrite INTO TABLE lt_overwrite_unique.
ENDIF. ENDIF.

View File

@ -95,7 +95,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. CLASS zcl_abapgit_services_repo IMPLEMENTATION.
METHOD check_package. METHOD check_package.
@ -395,6 +395,14 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION.
<ls_column>-name = 'OBJ_NAME'. <ls_column>-name = 'OBJ_NAME'.
APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>. APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
<ls_column>-name = 'DEVCLASS'. <ls_column>-name = 'DEVCLASS'.
APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
<ls_column>-name = 'ICON'.
<ls_column>-text = 'Action'.
<ls_column>-show_icon = abap_true.
<ls_column>-length = 5.
APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
<ls_column>-name = 'TEXT'.
<ls_column>-text = 'Description'.
li_popups = zcl_abapgit_ui_factory=>get_popups( ). li_popups = zcl_abapgit_ui_factory=>get_popups( ).
li_popups->popup_to_select_from_list( li_popups->popup_to_select_from_list(