Change Package Assignment (#4980)

* Change Package Assignment

Previously, if an object was assigned to another package (but not changed otherwise), AG would delete and re-create the object. This was also visible in the "Selective Pull" popups:



The new process is smarter and detects such changes. It re-assigns the package (via a TADIR change) and avoids dropping and re-creating. The package overwrite popup is also avoided (it will still appear if the object itself was changed, too):

* Better icon

* Add unit test

Co-authored-by: Lars Hvam <larshp@hotmail.com>
Co-authored-by: Alexander Tsybulsky <sbcgua@users.noreply.github.com>
This commit is contained in:
Marc Bernard 2021-10-05 00:02:20 -04:00 committed by GitHub
parent 3e14313f32
commit 0379bc6d11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 91 additions and 25 deletions

View File

@ -151,30 +151,36 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION.
APPEND INITIAL LINE TO lt_changes ASSIGNING <ls_changes>.
MOVE-CORRESPONDING <ls_result> TO <ls_changes>.
CONCATENATE <ls_result>-lstate <ls_result>-rstate INTO lv_status RESPECTING BLANKS.
IF <ls_result>-packmove = abap_true.
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-packmove.
<ls_changes>-icon = icon_package_standard.
<ls_changes>-text = 'Change package assignment'.
ELSE.
CONCATENATE <ls_result>-lstate <ls_result>-rstate INTO lv_status RESPECTING BLANKS.
CASE lv_status.
WHEN ' '. " no changes
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-none.
WHEN ' A' OR 'D ' OR 'DM'. " added remotely or deleted locally
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-add.
<ls_changes>-icon = icon_create.
<ls_changes>-text = 'Add local object'.
WHEN 'A ' OR ' D' OR 'MD'. " added locally or deleted remotely
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-delete.
<ls_changes>-icon = icon_delete.
<ls_changes>-text = 'Delete local object'.
WHEN 'M ' OR 'MM'. " modified locally
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-overwrite.
<ls_changes>-icon = icon_change.
<ls_changes>-text = 'Overwrite local object'.
WHEN ' M'. " modified only remotely
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-update.
<ls_changes>-icon = icon_change.
<ls_changes>-text = 'Update local object'.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
CASE lv_status.
WHEN ' '. " no changes
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-none.
WHEN ' A' OR 'D ' OR 'DM'. " added remotely or deleted locally
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-add.
<ls_changes>-icon = icon_create.
<ls_changes>-text = 'Add local object'.
WHEN 'A ' OR ' D' OR 'MD'. " added locally or deleted remotely
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-delete.
<ls_changes>-icon = icon_delete.
<ls_changes>-text = 'Delete local object'.
WHEN 'M ' OR 'MM'. " modified locally
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-overwrite.
<ls_changes>-icon = icon_change.
<ls_changes>-text = 'Overwrite local object'.
WHEN ' M'. " modified only remotely
<ls_changes>-action = zif_abapgit_objects=>c_deserialize_action-update.
<ls_changes>-icon = icon_change.
<ls_changes>-text = 'Update local object'.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
ENDIF.
ENDLOOP.
@ -259,7 +265,7 @@ CLASS zcl_abapgit_objects_check IMPLEMENTATION.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
LOOP AT it_results ASSIGNING <ls_result> WHERE match IS INITIAL.
LOOP AT it_results ASSIGNING <ls_result> WHERE match IS INITIAL AND packmove IS INITIAL.
lv_package = lo_folder_logic->path_to_package(
iv_top = io_repo->get_package( )

View File

@ -17,6 +17,7 @@ CLASS ltcl_warning_overwrite_find DEFINITION FINAL FOR TESTING
warning_overwrite_find_03 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_04 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_05 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_06 FOR TESTING RAISING cx_static_check,
given_result
IMPORTING
@ -151,6 +152,27 @@ CLASS ltcl_warning_overwrite_find IMPLEMENTATION.
ENDMETHOD.
METHOD warning_overwrite_find_06.
" changed package assignment
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;D;;X| ).
given_result( |CLAS;ZAG_UNIT_TEST;;/src/sub;zag_unit_test.clas.abap;;;A;;X| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_overwrite ) ).
READ TABLE mt_overwrite INTO ms_overwrite INDEX 1.
ASSERT sy-subrc = 0.
cl_abap_unit_assert=>assert_equals(
exp = zif_abapgit_objects=>c_deserialize_action-packmove
act = ms_overwrite-action ).
ENDMETHOD.
METHOD given_result.
DATA: ls_result LIKE LINE OF mt_result.
@ -165,7 +187,8 @@ CLASS ltcl_warning_overwrite_find IMPLEMENTATION.
ls_result-package
ls_result-match
ls_result-lstate
ls_result-rstate.
ls_result-rstate
ls_result-packmove.
INSERT ls_result INTO TABLE mt_result.

View File

@ -169,6 +169,10 @@ CLASS zcl_abapgit_objects DEFINITION
!iv_obj_type TYPE tadir-object
RAISING
zcx_abapgit_exception .
CLASS-METHODS change_package_assignments
IMPORTING
!is_item TYPE zif_abapgit_definitions=>ty_item
!ii_log TYPE REF TO zif_abapgit_log.
ENDCLASS.
@ -202,6 +206,28 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
ENDMETHOD.
METHOD change_package_assignments.
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = is_item-obj_type
wi_tadir_obj_name = is_item-obj_name
wi_tadir_devclass = is_item-devclass
wi_test_modus = abap_false
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
ii_log->add_success( iv_msg = |Object { is_item-obj_name } assigned to package { is_item-devclass }|
is_item = is_item ).
ELSE.
ii_log->add_error( iv_msg = |Package change of object { is_item-obj_name } failed|
is_item = is_item ).
ENDIF.
ENDMETHOD.
METHOD check_duplicates.
DATA: lt_files TYPE zif_abapgit_definitions=>ty_files_tt,
@ -623,6 +649,16 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
lv_path = <ls_result>-path.
ENDIF.
IF <ls_result>-packmove = abap_true.
" Move object to new package
ls_item-devclass = lv_package.
change_package_assignments( is_item = ls_item
ii_log = ii_log ).
" No other changes required
CONTINUE.
ENDIF.
" Create or update object
CREATE OBJECT lo_files
EXPORTING
is_item = ls_item

View File

@ -37,6 +37,7 @@ INTERFACE zif_abapgit_objects
overwrite TYPE i VALUE 3,
delete TYPE i VALUE 4,
delete_add TYPE i VALUE 5,
packmove TYPE i VALUE 6,
END OF c_deserialize_action.
ENDINTERFACE.