Refactor: Objects Class (#4664)

* Refactor: Objects Class

Splits `zcl_abapgit_objects` into smaller classes

Moves the following methods and related test cases:

`zcl_abapgit_objects_check`
- `deserialize_check`
- `warning_overwrite_find`
- `warning_package_find`
- `checks_adjust`
- `warning_overwrite_adjust`
- `warning_package_adjust`

`zcl_abapgit_files_deserialize`
- `files_to_deserialize`
- `filter_files_to_deserialize`
- `prioritize_deser`
- `adjust_namespaces`

* PP

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2021-03-27 10:46:38 +01:00 committed by GitHub
parent fd49e8dbe6
commit 56a0dca134
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 992 additions and 903 deletions

View File

@ -0,0 +1,245 @@
CLASS zcl_abapgit_file_deserialize DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS get_results
IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
CLASS-METHODS filter_files_to_deserialize
IMPORTING
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt.
CLASS-METHODS prioritize_deser
IMPORTING
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt.
CLASS-METHODS adjust_namespaces
IMPORTING
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt.
ENDCLASS.
CLASS zcl_abapgit_file_deserialize IMPLEMENTATION.
METHOD adjust_namespaces.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF rt_results.
rt_results = it_results.
LOOP AT rt_results ASSIGNING <ls_result>.
REPLACE ALL OCCURRENCES OF '#' IN <ls_result>-obj_name WITH '/'.
ENDLOOP.
ENDMETHOD.
METHOD filter_files_to_deserialize.
DATA lt_objects LIKE rt_results.
DATA lr_object TYPE REF TO zif_abapgit_definitions=>ty_result.
DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
DATA lv_tabix TYPE sy-tabix.
rt_results = it_results.
"preparation for object logging, sort all file entries by objects
IF ii_log IS BOUND.
lt_objects = rt_results.
SORT lt_objects
BY obj_type
obj_name.
DELETE ADJACENT DUPLICATES FROM lt_objects COMPARING obj_type obj_name.
DELETE lt_objects WHERE obj_type IS INITIAL AND obj_name IS INITIAL.
ENDIF.
"ignore objects w/o changes
DELETE rt_results WHERE match = abap_true. " Full match
"log objects w/o changes
IF sy-subrc = 0 AND ii_log IS BOUND.
SORT rt_results BY obj_type obj_name.
LOOP AT lt_objects REFERENCE INTO lr_object.
lv_tabix = sy-tabix.
READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
obj_name = lr_object->obj_name
BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
"all parts of the objects have not changed
ls_item-devclass = lr_object->package.
ls_item-obj_type = lr_object->obj_type.
ls_item-obj_name = lr_object->obj_name.
ii_log->add_success(
iv_msg = |Object { ls_item-obj_name } (type { ls_item-obj_type }) not changed; no import required|
is_item = ls_item ).
"ignore object for further messages
DELETE lt_objects INDEX lv_tabix.
ENDIF.
ENDLOOP.
ENDIF.
"ignore objects w/o object type
DELETE rt_results WHERE obj_type IS INITIAL.
"log objects w/o object type
IF sy-subrc = 0 AND ii_log IS BOUND.
LOOP AT lt_objects REFERENCE INTO lr_object WHERE obj_type IS INITIAL.
CHECK lr_object->obj_name IS NOT INITIAL.
ls_item-devclass = lr_object->package.
ls_item-obj_type = lr_object->obj_type.
ls_item-obj_name = lr_object->obj_name.
ii_log->add_warning(
iv_msg = |Object type for { ls_item-obj_name } not defined - will be ignored by abapGit|
is_item = ls_item ).
ENDLOOP.
DELETE lt_objects WHERE obj_type IS INITIAL.
ENDIF.
"ignore objects that exists only local
DELETE rt_results WHERE lstate = zif_abapgit_definitions=>c_state-added AND rstate IS INITIAL.
"ignore objects that where deleted remotely
DELETE rt_results WHERE rstate = zif_abapgit_definitions=>c_state-deleted.
"log objects that exists only local or where deleted remotely
IF sy-subrc = 0 AND ii_log IS BOUND.
SORT rt_results BY obj_type obj_name.
LOOP AT lt_objects REFERENCE INTO lr_object.
lv_tabix = sy-tabix.
READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
obj_name = lr_object->obj_name
BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
"all parts exists only local
"no log message; ignore object for further messages
DELETE lt_objects INDEX lv_tabix.
ENDIF.
ENDLOOP.
ENDIF.
SORT rt_results
BY obj_type ASCENDING
obj_name ASCENDING
rstate DESCENDING " ensures that non-empty rstate is kept
lstate DESCENDING. " ensures that non-empty lstate is kept
DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name.
ENDMETHOD.
METHOD get_results.
rt_results = adjust_namespaces(
prioritize_deser(
filter_files_to_deserialize(
it_results = zcl_abapgit_file_status=>status( io_repo )
ii_log = ii_log ) ) ).
ENDMETHOD.
METHOD prioritize_deser.
* todo, refactor this method
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
* WEBI has to be handled before SPRX.
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'WEBI'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* SPRX has to be handled before depended objects CLAS/INFT/TABL etc.
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'SPRX'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* XSLT has to be handled before CLAS/PROG
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'XSLT'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* PROG before internet services, as the services might use the screens
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ISAP has to be handled before ISRP
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IASP'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ENHS has to be handled before ENHO
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'ENHS'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ENHO has to be handled before ENHC
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'ENHO'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* DDLS has to be handled before DCLS
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'DDLS'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* IOBJ has to be handled before ODSO
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IOBJ'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* TOBJ has to be handled before SCP1
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'TOBJ'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* OTGR has to be handled before CHAR
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'OTGR'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
LOOP AT it_results ASSIGNING <ls_result>
WHERE obj_type <> 'IASP'
AND obj_type <> 'PROG'
AND obj_type <> 'XSLT'
AND obj_type <> 'PINF'
AND obj_type <> 'DEVC'
AND obj_type <> 'ENHS'
AND obj_type <> 'ENHO'
AND obj_type <> 'DDLS'
AND obj_type <> 'SPRX'
AND obj_type <> 'WEBI'
AND obj_type <> 'IOBJ'
AND obj_type <> 'TOBJ'
AND obj_type <> 'OTGR'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* PINF after everything as it can expose objects
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PINF'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* DEVC after PINF, as it can refer for package interface usage
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'DEVC'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,352 @@
CLASS ltcl_filter_files_to_deser DEFINITION DEFERRED.
CLASS ltcl_adjust_namespaces DEFINITION DEFERRED.
CLASS ltcl_prio_deserialization DEFINITION DEFERRED.
CLASS zcl_abapgit_file_deserialize DEFINITION LOCAL FRIENDS ltcl_filter_files_to_deser.
CLASS zcl_abapgit_file_deserialize DEFINITION LOCAL FRIENDS ltcl_adjust_namespaces.
CLASS zcl_abapgit_file_deserialize DEFINITION LOCAL FRIENDS ltcl_prio_deserialization.
CLASS ltcl_filter_files_to_deser DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA:
mo_objects TYPE REF TO zcl_abapgit_file_deserialize,
mt_result TYPE zif_abapgit_definitions=>ty_results_tt.
METHODS:
setup,
filter_duplicates FOR TESTING RAISING cx_static_check,
filter_duplicates_rstate FOR TESTING RAISING cx_static_check,
filter_duplicates_lstate FOR TESTING RAISING cx_static_check,
filter_duplicates_match FOR TESTING RAISING cx_static_check,
filter_duplicates_init_objtype FOR TESTING RAISING cx_static_check,
filter_duplicates_changes_01 FOR TESTING RAISING cx_static_check,
filter_duplicates_changes_02 FOR TESTING RAISING cx_static_check,
filter_duplicates_deleted FOR TESTING RAISING cx_static_check,
given_result
IMPORTING
iv_result_line TYPE string,
when_filter_is_applied.
ENDCLASS.
CLASS ltcl_filter_files_to_deser IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
ENDMETHOD.
METHOD filter_duplicates.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_rstate.
DATA: ls_exp LIKE LINE OF mt_result,
ls_act LIKE LINE OF mt_result.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;A| ).
READ TABLE mt_result INDEX 2 INTO ls_exp.
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
READ TABLE mt_result INDEX 1 INTO ls_act.
cl_abap_unit_assert=>assert_equals(
exp = ls_exp
act = ls_act ).
ENDMETHOD.
METHOD filter_duplicates_lstate.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;A;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;A;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_match.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;X;;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;X;;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_init_objtype.
given_result( |;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
given_result( |;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_changes_01.
DATA: ls_exp LIKE LINE OF mt_result,
ls_act LIKE LINE OF mt_result.
" test different order since SORT object,obj_name is non-deterministic
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;M;M| ).
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.testclasses.abap;;;;M| ).
READ TABLE mt_result INDEX 1 INTO ls_exp.
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
READ TABLE mt_result INDEX 1 INTO ls_act.
" expect M,M
cl_abap_unit_assert=>assert_equals(
exp = ls_exp
act = ls_act ).
ENDMETHOD.
METHOD filter_duplicates_changes_02.
DATA: ls_exp LIKE LINE OF mt_result,
ls_act LIKE LINE OF mt_result.
" test different order since SORT object,obj_name is non-deterministic
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;;M| ).
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.testclasses.abap;;;M;M| ).
READ TABLE mt_result INDEX 2 INTO ls_exp.
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
READ TABLE mt_result INDEX 1 INTO ls_act.
" expect M,M
cl_abap_unit_assert=>assert_equals(
exp = ls_exp
act = ls_act ).
ENDMETHOD.
METHOD filter_duplicates_deleted.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;D| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD given_result.
DATA: ls_result LIKE LINE OF mt_result.
SPLIT iv_result_line
AT ';'
INTO ls_result-obj_type
ls_result-obj_name
ls_result-inactive
ls_result-path
ls_result-filename
ls_result-package
ls_result-match
ls_result-lstate
ls_result-rstate.
INSERT ls_result INTO TABLE mt_result.
ENDMETHOD.
METHOD when_filter_is_applied.
mt_result = mo_objects->filter_files_to_deserialize( mt_result ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_adjust_namespaces DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
setup,
adjust_namespaces FOR TESTING RAISING cx_static_check.
DATA:
mo_objects TYPE REF TO zcl_abapgit_file_deserialize.
ENDCLASS.
CLASS ltcl_adjust_namespaces IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
ENDMETHOD.
METHOD adjust_namespaces.
DATA: lt_input TYPE zif_abapgit_definitions=>ty_results_tt,
lt_ouptut TYPE zif_abapgit_definitions=>ty_results_tt,
ls_result LIKE LINE OF lt_input.
ls_result-obj_name = |#SAP#ZTEST|.
INSERT ls_result INTO TABLE lt_input.
ls_result-obj_name = |ZTEST|.
INSERT ls_result INTO TABLE lt_input.
lt_ouptut = mo_objects->adjust_namespaces( lt_input ).
READ TABLE lt_ouptut INTO ls_result INDEX 1.
cl_abap_unit_assert=>assert_equals(
exp = |/SAP/ZTEST|
act = ls_result-obj_name ).
READ TABLE lt_ouptut INTO ls_result INDEX 2.
cl_abap_unit_assert=>assert_equals(
exp = |ZTEST|
act = ls_result-obj_name ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_prio_deserialization DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
setup,
ddls_before_dcls FOR TESTING RAISING cx_static_check,
given
IMPORTING
iv_object_type TYPE trobjtype,
when_deser_is_priorized,
then
IMPORTING
iv_exp_object_type TYPE trobjtype.
DATA:
mo_objects TYPE REF TO zcl_abapgit_file_deserialize,
mt_input TYPE zif_abapgit_definitions=>ty_results_tt,
mt_output TYPE zif_abapgit_definitions=>ty_results_tt,
mv_exp_output_tabix TYPE i.
ENDCLASS.
CLASS ltcl_prio_deserialization IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
mv_exp_output_tabix = 0.
ENDMETHOD.
METHOD ddls_before_dcls.
given( 'DCLS' ).
given( 'DDLS' ).
given( 'DCLS' ).
given( 'DDLS' ).
when_deser_is_priorized( ).
then( 'DDLS' ).
then( 'DDLS' ).
then( 'DCLS' ).
then( 'DCLS' ).
ENDMETHOD.
METHOD given.
DATA: ls_input LIKE LINE OF mt_input.
ls_input-obj_type = iv_object_type.
INSERT ls_input INTO TABLE mt_input.
ENDMETHOD.
METHOD when_deser_is_priorized.
mt_output = mo_objects->prioritize_deser( mt_input ).
ENDMETHOD.
METHOD then.
DATA: ls_output LIKE LINE OF mt_output.
mv_exp_output_tabix = mv_exp_output_tabix + 1.
READ TABLE mt_output INTO ls_output INDEX mv_exp_output_tabix.
cl_abap_unit_assert=>assert_equals(
exp = iv_exp_object_type
act = ls_output-obj_type ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_FILE_DESERIALIZE</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Files Deserialize</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,236 @@
CLASS zcl_abapgit_objects_check DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS deserialize_checks
IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo
RETURNING
VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks
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 .
PROTECTED SECTION.
PRIVATE SECTION.
CLASS-METHODS warning_overwrite_adjust
IMPORTING
!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_overwrite_find
IMPORTING
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
RETURNING
VALUE(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt.
CLASS-METHODS warning_package_adjust
IMPORTING
!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(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt
RAISING
zcx_abapgit_exception.
ENDCLASS.
CLASS zcl_abapgit_objects_check IMPLEMENTATION.
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 deserialize_checks.
DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt,
li_package TYPE REF TO zif_abapgit_sap_package.
lt_results = zcl_abapgit_file_deserialize=>get_results( io_repo ).
rs_checks-overwrite = warning_overwrite_find( lt_results ).
rs_checks-warning_package = warning_package_find(
io_repo = io_repo
it_results = lt_results ).
IF lines( lt_results ) > 0.
li_package = zcl_abapgit_factory=>get_sap_package( io_repo->get_package( ) ).
rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ).
IF NOT rs_checks-transport-required IS INITIAL.
rs_checks-transport-type = li_package->get_transport_type( ).
ENDIF.
ENDIF.
ENDMETHOD.
METHOD warning_overwrite_adjust.
DATA: lt_overwrite LIKE it_overwrite,
ls_overwrite LIKE LINE OF lt_overwrite.
FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF lt_overwrite.
* make sure to get the current status, as something might have changed in the meanwhile
lt_overwrite = warning_overwrite_find( ct_results ).
LOOP AT lt_overwrite ASSIGNING <ls_overwrite>.
READ TABLE it_overwrite INTO ls_overwrite
WITH TABLE KEY object_type_and_name
COMPONENTS obj_type = <ls_overwrite>-obj_type
obj_name = <ls_overwrite>-obj_name.
IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL.
zcx_abapgit_exception=>raise( |Overwrite { <ls_overwrite>-obj_type } {
<ls_overwrite>-obj_name } undecided| ).
ENDIF.
IF ls_overwrite-decision = 'N'.
DELETE ct_results WHERE
obj_type = <ls_overwrite>-obj_type AND
obj_name = <ls_overwrite>-obj_name.
ASSERT sy-subrc = 0.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD warning_overwrite_find.
DATA: ls_overwrite LIKE LINE OF rt_overwrite.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
LOOP AT it_results ASSIGNING <ls_result> WHERE NOT obj_type IS INITIAL.
IF <ls_result>-lstate IS NOT INITIAL
AND NOT ( <ls_result>-lstate = zif_abapgit_definitions=>c_state-added
AND <ls_result>-rstate IS INITIAL )
OR ( <ls_result>-lstate IS INITIAL
AND <ls_result>-rstate = zif_abapgit_definitions=>c_state-deleted ).
" current object has been modified or deleted locally, add to table
CLEAR ls_overwrite.
MOVE-CORRESPONDING <ls_result> TO ls_overwrite.
APPEND ls_overwrite TO rt_overwrite.
ENDIF.
ENDLOOP.
SORT rt_overwrite.
DELETE ADJACENT DUPLICATES FROM rt_overwrite.
ENDMETHOD.
METHOD warning_package_adjust.
DATA: lt_overwrite LIKE it_overwrite,
ls_overwrite LIKE LINE OF lt_overwrite.
FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF lt_overwrite.
* 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 ).
LOOP AT lt_overwrite ASSIGNING <ls_overwrite>.
READ TABLE it_overwrite INTO ls_overwrite
WITH TABLE KEY object_type_and_name
COMPONENTS obj_type = <ls_overwrite>-obj_type
obj_name = <ls_overwrite>-obj_name.
IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL.
zcx_abapgit_exception=>raise( |Overwrite of package { <ls_overwrite>-obj_type } {
<ls_overwrite>-obj_name } undecided| ).
ENDIF.
IF ls_overwrite-decision = 'N'.
DELETE ct_results WHERE
obj_type = <ls_overwrite>-obj_type AND
obj_name = <ls_overwrite>-obj_name.
ASSERT sy-subrc = 0.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD warning_package_find.
DATA: lv_package TYPE devclass,
lt_overwrite_unique TYPE HASHED TABLE OF zif_abapgit_definitions=>ty_overwrite
WITH UNIQUE KEY obj_type obj_name devclass,
ls_overwrite LIKE LINE OF rt_overwrite,
ls_tadir TYPE zif_abapgit_definitions=>ty_tadir.
DATA: lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
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>.
lv_package = lo_folder_logic->path_to_package(
iv_top = io_repo->get_package( )
io_dot = io_repo->get_dot_abapgit( )
iv_path = <ls_result>-path
iv_create_if_not_exists = abap_false ).
ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
iv_object = <ls_result>-obj_type
iv_obj_name = <ls_result>-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 = <ls_result>-obj_type.
ls_overwrite-obj_name = <ls_result>-obj_name.
ls_overwrite-devclass = ls_tadir-devclass.
INSERT ls_overwrite INTO TABLE lt_overwrite_unique.
ENDIF.
ENDLOOP.
rt_overwrite = lt_overwrite_unique.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,116 @@
CLASS ltcl_warning_overwrite_find DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA:
mo_objects TYPE REF TO zcl_abapgit_objects_check,
mt_result TYPE zif_abapgit_definitions=>ty_results_tt,
mt_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt.
METHODS:
setup,
warning_overwrite_find_01 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_02 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_03 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_04 FOR TESTING RAISING cx_static_check,
given_result
IMPORTING
iv_result_line TYPE string,
when_warning_overwrite_find.
ENDCLASS.
CLASS zcl_abapgit_objects_check DEFINITION LOCAL FRIENDS ltcl_warning_overwrite_find.
CLASS ltcl_warning_overwrite_find IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
ENDMETHOD.
METHOD warning_overwrite_find_01.
" change remote but not local -> no overwrite
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;;M| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD warning_overwrite_find_02.
" change remote and local -> overwrite
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;M;M| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD warning_overwrite_find_03.
" delete local -> overwrite (since object will be created again from remote)
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;D;| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD warning_overwrite_find_04.
" exists local but not remote -> no overwrite
" (object will be in delete confirmation popup: see ZCL_ABAPGIT_SERVICES_GIT->GET_UNNECESSARY_LOCAL_OBJS)
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;A;| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD given_result.
DATA: ls_result LIKE LINE OF mt_result.
SPLIT iv_result_line
AT ';'
INTO ls_result-obj_type
ls_result-obj_name
ls_result-inactive
ls_result-path
ls_result-filename
ls_result-package
ls_result-match
ls_result-lstate
ls_result-rstate.
INSERT ls_result INTO TABLE mt_result.
ENDMETHOD.
METHOD when_warning_overwrite_find.
mt_overwrite = mo_objects->warning_overwrite_find( mt_result ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_OBJECTS_CHECK</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Objects Check</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -5,7 +5,7 @@ CLASS zcl_abapgit_objects DEFINITION
PUBLIC SECTION.
TYPES:
ty_types_tt TYPE SORTED TABLE OF tadir-object WITH UNIQUE KEY table_line.
ty_types_tt TYPE SORTED TABLE OF tadir-object WITH UNIQUE KEY table_line .
TYPES:
BEGIN OF ty_serialization,
files TYPE zif_abapgit_definitions=>ty_files_tt,
@ -96,65 +96,16 @@ CLASS zcl_abapgit_objects DEFINITION
CLASS-DATA gt_obj_serializer_map TYPE ty_obj_serializer_map .
CLASS-DATA gt_supported_obj_types TYPE ty_types_tt .
CLASS-METHODS files_to_deserialize
IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
RAISING
zcx_abapgit_exception .
CLASS-METHODS check_duplicates
IMPORTING
!it_files TYPE zif_abapgit_definitions=>ty_files_tt
RAISING
zcx_abapgit_exception .
CLASS-METHODS prioritize_deser
IMPORTING
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt .
CLASS-METHODS class_name
IMPORTING
!is_item TYPE zif_abapgit_definitions=>ty_item
RETURNING
VALUE(rv_class_name) TYPE string .
CLASS-METHODS warning_overwrite_adjust
IMPORTING
!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 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
RETURNING
VALUE(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt .
CLASS-METHODS warning_package_adjust
IMPORTING
!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(rt_overwrite) TYPE zif_abapgit_definitions=>ty_overwrite_tt
RAISING
zcx_abapgit_exception .
CLASS-METHODS update_package_tree
IMPORTING
!iv_package TYPE devclass .
@ -206,17 +157,6 @@ CLASS zcl_abapgit_objects DEFINITION
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
RETURNING
VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt .
CLASS-METHODS filter_files_to_deserialize
IMPORTING
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt .
CLASS-METHODS adjust_namespaces
IMPORTING
!it_results TYPE zif_abapgit_definitions=>ty_results_tt
RETURNING
VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt .
CLASS-METHODS get_deserialize_steps
RETURNING
VALUE(rt_steps) TYPE zif_abapgit_objects=>ty_step_data_tt .
@ -230,20 +170,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
METHOD adjust_namespaces.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF rt_results.
rt_results = it_results.
LOOP AT rt_results ASSIGNING <ls_result>.
REPLACE ALL OCCURRENCES OF '#' IN <ls_result>-obj_name WITH '/'.
ENDLOOP.
ENDMETHOD.
CLASS zcl_abapgit_objects IMPLEMENTATION.
METHOD changed_by.
@ -264,22 +191,6 @@ 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,
@ -653,10 +564,11 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
lt_remote = io_repo->get_files_remote( ).
lt_results = files_to_deserialize( io_repo = io_repo
ii_log = ii_log ).
lt_results = zcl_abapgit_file_deserialize=>get_results(
io_repo = io_repo
ii_log = ii_log ).
checks_adjust(
zcl_abapgit_objects_check=>checks_adjust(
EXPORTING
io_repo = io_repo
is_checks = is_checks
@ -770,25 +682,7 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
METHOD deserialize_checks.
DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt,
li_package TYPE REF TO zif_abapgit_sap_package.
lt_results = files_to_deserialize( io_repo ).
rs_checks-overwrite = warning_overwrite_find( lt_results ).
rs_checks-warning_package = warning_package_find(
io_repo = io_repo
it_results = lt_results ).
IF lines( lt_results ) > 0.
li_package = zcl_abapgit_factory=>get_sap_package( io_repo->get_package( ) ).
rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ).
IF NOT rs_checks-transport-required IS INITIAL.
rs_checks-transport-type = li_package->get_transport_type( ).
ENDIF.
ENDIF.
rs_checks = zcl_abapgit_objects_check=>deserialize_checks( io_repo ).
ENDMETHOD.
@ -867,106 +761,6 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
ENDMETHOD.
METHOD files_to_deserialize.
rt_results = adjust_namespaces(
prioritize_deser(
filter_files_to_deserialize(
it_results = zcl_abapgit_file_status=>status( io_repo )
ii_log = ii_log ) ) ).
ENDMETHOD.
METHOD filter_files_to_deserialize.
DATA lt_objects LIKE rt_results.
DATA lr_object TYPE REF TO zif_abapgit_definitions=>ty_result.
DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
DATA lv_tabix TYPE sy-tabix.
rt_results = it_results.
"preparation for object logging, sort all file entries by objects
IF ii_log IS BOUND.
lt_objects = rt_results.
SORT lt_objects
BY obj_type
obj_name.
DELETE ADJACENT DUPLICATES FROM lt_objects COMPARING obj_type obj_name.
DELETE lt_objects WHERE obj_type IS INITIAL AND obj_name IS INITIAL.
ENDIF.
"ignore objects w/o changes
DELETE rt_results WHERE match = abap_true. " Full match
"log objects w/o changes
IF sy-subrc = 0 AND ii_log IS BOUND.
SORT rt_results BY obj_type obj_name.
LOOP AT lt_objects REFERENCE INTO lr_object.
lv_tabix = sy-tabix.
READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
obj_name = lr_object->obj_name
BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
"all parts of the objects have not changed
ls_item-devclass = lr_object->package.
ls_item-obj_type = lr_object->obj_type.
ls_item-obj_name = lr_object->obj_name.
ii_log->add_success(
iv_msg = |Object { ls_item-obj_name } (type { ls_item-obj_type }) not changed; no import required|
is_item = ls_item ).
"ignore object for further messages
DELETE lt_objects INDEX lv_tabix.
ENDIF.
ENDLOOP.
ENDIF.
"ignore objects w/o object type
DELETE rt_results WHERE obj_type IS INITIAL.
"log objects w/o object type
IF sy-subrc = 0 AND ii_log IS BOUND.
LOOP AT lt_objects REFERENCE INTO lr_object WHERE obj_type IS INITIAL.
CHECK lr_object->obj_name IS NOT INITIAL.
ls_item-devclass = lr_object->package.
ls_item-obj_type = lr_object->obj_type.
ls_item-obj_name = lr_object->obj_name.
ii_log->add_warning(
iv_msg = |Object type for { ls_item-obj_name } not defined - will be ignored by abapGit|
is_item = ls_item ).
ENDLOOP.
DELETE lt_objects WHERE obj_type IS INITIAL.
ENDIF.
"ignore objects that exists only local
DELETE rt_results WHERE lstate = zif_abapgit_definitions=>c_state-added AND rstate IS INITIAL.
"ignore objects that where deleted remotely
DELETE rt_results WHERE rstate = zif_abapgit_definitions=>c_state-deleted.
"log objects that exists only local or where deleted remotely
IF sy-subrc = 0 AND ii_log IS BOUND.
SORT rt_results BY obj_type obj_name.
LOOP AT lt_objects REFERENCE INTO lr_object.
lv_tabix = sy-tabix.
READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
obj_name = lr_object->obj_name
BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
"all parts exists only local
"no log message; ignore object for further messages
DELETE lt_objects INDEX lv_tabix.
ENDIF.
ENDLOOP.
ENDIF.
SORT rt_results
BY obj_type ASCENDING
obj_name ASCENDING
rstate DESCENDING " ensures that non-empty rstate is kept
lstate DESCENDING. " ensures that non-empty lstate is kept
DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name.
ENDMETHOD.
METHOD get_deserialize_steps.
FIELD-SYMBOLS: <ls_step> TYPE LINE OF zif_abapgit_objects=>ty_step_data_tt.
@ -1116,91 +910,6 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
ENDMETHOD.
METHOD prioritize_deser.
* todo, refactor this method
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
* WEBI has to be handled before SPRX.
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'WEBI'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* SPRX has to be handled before depended objects CLAS/INFT/TABL etc.
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'SPRX'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* XSLT has to be handled before CLAS/PROG
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'XSLT'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* PROG before internet services, as the services might use the screens
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ISAP has to be handled before ISRP
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IASP'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ENHS has to be handled before ENHO
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'ENHS'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* DDLS has to be handled before DCLS
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'DDLS'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* IOBJ has to be handled before ODSO
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IOBJ'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* TOBJ has to be handled before SCP1
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'TOBJ'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* OTGR has to be handled before CHAR
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'OTGR'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
LOOP AT it_results ASSIGNING <ls_result>
WHERE obj_type <> 'IASP'
AND obj_type <> 'PROG'
AND obj_type <> 'XSLT'
AND obj_type <> 'PINF'
AND obj_type <> 'DEVC'
AND obj_type <> 'ENHS'
AND obj_type <> 'DDLS'
AND obj_type <> 'SPRX'
AND obj_type <> 'WEBI'
AND obj_type <> 'IOBJ'
AND obj_type <> 'TOBJ'
AND obj_type <> 'OTGR'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* PINF after everything as it can expose objects
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PINF'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* DEVC after PINF, as it can refer for package interface usage
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'DEVC'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
ENDMETHOD.
METHOD serialize.
DATA: li_obj TYPE REF TO zif_abapgit_object,
@ -1252,8 +961,8 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
METHOD supported_list.
DATA: lt_objects TYPE STANDARD TABLE OF ko100,
ls_item TYPE zif_abapgit_definitions=>ty_item.
DATA: lt_objects TYPE STANDARD TABLE OF ko100,
ls_item TYPE zif_abapgit_definitions=>ty_item.
FIELD-SYMBOLS <ls_object> LIKE LINE OF lt_objects.
@ -1301,140 +1010,4 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
ENDLOOP.
ENDMETHOD.
METHOD warning_overwrite_adjust.
DATA: lt_overwrite LIKE it_overwrite,
ls_overwrite LIKE LINE OF lt_overwrite.
FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF lt_overwrite.
* make sure to get the current status, as something might have changed in the meanwhile
lt_overwrite = warning_overwrite_find( ct_results ).
LOOP AT lt_overwrite ASSIGNING <ls_overwrite>.
READ TABLE it_overwrite INTO ls_overwrite
WITH TABLE KEY object_type_and_name
COMPONENTS obj_type = <ls_overwrite>-obj_type
obj_name = <ls_overwrite>-obj_name.
IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL.
zcx_abapgit_exception=>raise( |Overwrite { <ls_overwrite>-obj_type } {
<ls_overwrite>-obj_name } undecided| ).
ENDIF.
IF ls_overwrite-decision = 'N'.
DELETE ct_results WHERE
obj_type = <ls_overwrite>-obj_type AND
obj_name = <ls_overwrite>-obj_name.
ASSERT sy-subrc = 0.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD warning_overwrite_find.
DATA: ls_overwrite LIKE LINE OF rt_overwrite.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
LOOP AT it_results ASSIGNING <ls_result> WHERE NOT obj_type IS INITIAL.
IF <ls_result>-lstate IS NOT INITIAL
AND NOT ( <ls_result>-lstate = zif_abapgit_definitions=>c_state-added
AND <ls_result>-rstate IS INITIAL )
OR ( <ls_result>-lstate IS INITIAL
AND <ls_result>-rstate = zif_abapgit_definitions=>c_state-deleted ).
" current object has been modified or deleted locally, add to table
CLEAR ls_overwrite.
MOVE-CORRESPONDING <ls_result> TO ls_overwrite.
APPEND ls_overwrite TO rt_overwrite.
ENDIF.
ENDLOOP.
SORT rt_overwrite.
DELETE ADJACENT DUPLICATES FROM rt_overwrite.
ENDMETHOD.
METHOD warning_package_adjust.
DATA: lt_overwrite LIKE it_overwrite,
ls_overwrite LIKE LINE OF lt_overwrite.
FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF lt_overwrite.
* 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 ).
LOOP AT lt_overwrite ASSIGNING <ls_overwrite>.
READ TABLE it_overwrite INTO ls_overwrite
WITH TABLE KEY object_type_and_name
COMPONENTS obj_type = <ls_overwrite>-obj_type
obj_name = <ls_overwrite>-obj_name.
IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL.
zcx_abapgit_exception=>raise( |Overwrite of package { <ls_overwrite>-obj_type } {
<ls_overwrite>-obj_name } undecided| ).
ENDIF.
IF ls_overwrite-decision = 'N'.
DELETE ct_results WHERE
obj_type = <ls_overwrite>-obj_type AND
obj_name = <ls_overwrite>-obj_name.
ASSERT sy-subrc = 0.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD warning_package_find.
DATA: lv_package TYPE devclass,
lt_overwrite_unique TYPE HASHED TABLE OF zif_abapgit_definitions=>ty_overwrite
WITH UNIQUE KEY obj_type obj_name devclass,
ls_overwrite LIKE LINE OF rt_overwrite,
ls_tadir TYPE zif_abapgit_definitions=>ty_tadir.
DATA: lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
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>.
lv_package = lo_folder_logic->path_to_package(
iv_top = io_repo->get_package( )
io_dot = io_repo->get_dot_abapgit( )
iv_path = <ls_result>-path
iv_create_if_not_exists = abap_false ).
ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
iv_object = <ls_result>-obj_type
iv_obj_name = <ls_result>-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 = <ls_result>-obj_type.
ls_overwrite-obj_name = <ls_result>-obj_name.
ls_overwrite-devclass = ls_tadir-devclass.
INSERT ls_overwrite INTO TABLE lt_overwrite_unique.
ENDIF.
ENDLOOP.
rt_overwrite = lt_overwrite_unique.
ENDMETHOD.
ENDCLASS.

View File

@ -426,470 +426,3 @@ CLASS ltcl_check_objects_locked IMPLEMENTATION.
ENDMETHOD.
ENDCLASS.
CLASS ltcl_filter_files_to_deser DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA:
mo_objects TYPE REF TO zcl_abapgit_objects,
mt_result TYPE zif_abapgit_definitions=>ty_results_tt.
METHODS:
setup,
filter_duplicates FOR TESTING RAISING cx_static_check,
filter_duplicates_rstate FOR TESTING RAISING cx_static_check,
filter_duplicates_lstate FOR TESTING RAISING cx_static_check,
filter_duplicates_match FOR TESTING RAISING cx_static_check,
filter_duplicates_init_objtype FOR TESTING RAISING cx_static_check,
filter_duplicates_changes_01 FOR TESTING RAISING cx_static_check,
filter_duplicates_changes_02 FOR TESTING RAISING cx_static_check,
filter_duplicates_deleted FOR TESTING RAISING cx_static_check,
given_result
IMPORTING
iv_result_line TYPE string,
when_filter_is_applied.
ENDCLASS.
CLASS zcl_abapgit_objects DEFINITION LOCAL FRIENDS ltcl_filter_files_to_deser.
CLASS ltcl_filter_files_to_deser IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
ENDMETHOD.
METHOD filter_duplicates.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_rstate.
DATA: ls_exp LIKE LINE OF mt_result,
ls_act LIKE LINE OF mt_result.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;A| ).
READ TABLE mt_result INDEX 2 INTO ls_exp.
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
READ TABLE mt_result INDEX 1 INTO ls_act.
cl_abap_unit_assert=>assert_equals(
exp = ls_exp
act = ls_act ).
ENDMETHOD.
METHOD filter_duplicates_lstate.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;A;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;A;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_match.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;X;;| ).
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;X;;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_init_objtype.
given_result( |;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
given_result( |;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD filter_duplicates_changes_01.
DATA: ls_exp LIKE LINE OF mt_result,
ls_act LIKE LINE OF mt_result.
" test different order since SORT object,obj_name is non-deterministic
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;M;M| ).
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.testclasses.abap;;;;M| ).
READ TABLE mt_result INDEX 1 INTO ls_exp.
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
READ TABLE mt_result INDEX 1 INTO ls_act.
" expect M,M
cl_abap_unit_assert=>assert_equals(
exp = ls_exp
act = ls_act ).
ENDMETHOD.
METHOD filter_duplicates_changes_02.
DATA: ls_exp LIKE LINE OF mt_result,
ls_act LIKE LINE OF mt_result.
" test different order since SORT object,obj_name is non-deterministic
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;;M| ).
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.testclasses.abap;;;M;M| ).
READ TABLE mt_result INDEX 2 INTO ls_exp.
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_result ) ).
READ TABLE mt_result INDEX 1 INTO ls_act.
" expect M,M
cl_abap_unit_assert=>assert_equals(
exp = ls_exp
act = ls_act ).
ENDMETHOD.
METHOD filter_duplicates_deleted.
given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;D| ).
when_filter_is_applied( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_result ) ).
ENDMETHOD.
METHOD given_result.
DATA: ls_result LIKE LINE OF mt_result.
SPLIT iv_result_line
AT ';'
INTO ls_result-obj_type
ls_result-obj_name
ls_result-inactive
ls_result-path
ls_result-filename
ls_result-package
ls_result-match
ls_result-lstate
ls_result-rstate.
INSERT ls_result INTO TABLE mt_result.
ENDMETHOD.
METHOD when_filter_is_applied.
mt_result = mo_objects->filter_files_to_deserialize( mt_result ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_adjust_namespaces DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
setup,
adjust_namespaces FOR TESTING RAISING cx_static_check.
DATA:
mo_objects TYPE REF TO zcl_abapgit_objects.
ENDCLASS.
CLASS zcl_abapgit_objects DEFINITION LOCAL FRIENDS ltcl_adjust_namespaces.
CLASS ltcl_adjust_namespaces IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
ENDMETHOD.
METHOD adjust_namespaces.
DATA: lt_input TYPE zif_abapgit_definitions=>ty_results_tt,
lt_ouptut TYPE zif_abapgit_definitions=>ty_results_tt,
ls_result LIKE LINE OF lt_input.
ls_result-obj_name = |#SAP#ZTEST|.
INSERT ls_result INTO TABLE lt_input.
ls_result-obj_name = |ZTEST|.
INSERT ls_result INTO TABLE lt_input.
lt_ouptut = mo_objects->adjust_namespaces( lt_input ).
READ TABLE lt_ouptut INTO ls_result INDEX 1.
cl_abap_unit_assert=>assert_equals(
exp = |/SAP/ZTEST|
act = ls_result-obj_name ).
READ TABLE lt_ouptut INTO ls_result INDEX 2.
cl_abap_unit_assert=>assert_equals(
exp = |ZTEST|
act = ls_result-obj_name ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_prio_deserialization DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
setup,
ddls_before_dcls FOR TESTING RAISING cx_static_check,
given
IMPORTING
iv_object_type TYPE trobjtype,
when_deser_is_priorized,
then
IMPORTING
iv_exp_object_type TYPE trobjtype.
DATA:
mo_objects TYPE REF TO zcl_abapgit_objects,
mt_input TYPE zif_abapgit_definitions=>ty_results_tt,
mt_output TYPE zif_abapgit_definitions=>ty_results_tt,
mv_exp_output_tabix TYPE i.
ENDCLASS.
CLASS zcl_abapgit_objects DEFINITION LOCAL FRIENDS ltcl_prio_deserialization.
CLASS ltcl_prio_deserialization IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
mv_exp_output_tabix = 0.
ENDMETHOD.
METHOD ddls_before_dcls.
given( 'DCLS' ).
given( 'DDLS' ).
given( 'DCLS' ).
given( 'DDLS' ).
when_deser_is_priorized( ).
then( 'DDLS' ).
then( 'DDLS' ).
then( 'DCLS' ).
then( 'DCLS' ).
ENDMETHOD.
METHOD given.
DATA: ls_input LIKE LINE OF mt_input.
ls_input-obj_type = iv_object_type.
INSERT ls_input INTO TABLE mt_input.
ENDMETHOD.
METHOD when_deser_is_priorized.
mt_output = mo_objects->prioritize_deser( mt_input ).
ENDMETHOD.
METHOD then.
DATA: ls_output LIKE LINE OF mt_output.
mv_exp_output_tabix = mv_exp_output_tabix + 1.
READ TABLE mt_output INTO ls_output INDEX mv_exp_output_tabix.
cl_abap_unit_assert=>assert_equals(
exp = iv_exp_object_type
act = ls_output-obj_type ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_warning_overwrite_find DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA:
mo_objects TYPE REF TO zcl_abapgit_objects,
mt_result TYPE zif_abapgit_definitions=>ty_results_tt,
mt_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt.
METHODS:
setup,
warning_overwrite_find_01 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_02 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_03 FOR TESTING RAISING cx_static_check,
warning_overwrite_find_04 FOR TESTING RAISING cx_static_check,
given_result
IMPORTING
iv_result_line TYPE string,
when_warning_overwrite_find.
ENDCLASS.
CLASS zcl_abapgit_objects DEFINITION LOCAL FRIENDS ltcl_warning_overwrite_find.
CLASS ltcl_warning_overwrite_find IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_objects.
ENDMETHOD.
METHOD warning_overwrite_find_01.
" change remote but not local -> no overwrite
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;;M| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD warning_overwrite_find_02.
" change remote and local -> overwrite
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;M;M| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD warning_overwrite_find_03.
" delete local -> overwrite (since object will be created again from remote)
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;D;| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD warning_overwrite_find_04.
" exists local but not remote -> no overwrite
" (object will be in delete confirmation popup: see ZCL_ABAPGIT_SERVICES_GIT->GET_UNNECESSARY_LOCAL_OBJS)
given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;A;| ).
when_warning_overwrite_find( ).
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines( mt_overwrite ) ).
ENDMETHOD.
METHOD given_result.
DATA: ls_result LIKE LINE OF mt_result.
SPLIT iv_result_line
AT ';'
INTO ls_result-obj_type
ls_result-obj_name
ls_result-inactive
ls_result-path
ls_result-filename
ls_result-package
ls_result-match
ls_result-lstate
ls_result-rstate.
INSERT ls_result INTO TABLE mt_result.
ENDMETHOD.
METHOD when_warning_overwrite_find.
mt_overwrite = mo_objects->warning_overwrite_find( mt_result ).
ENDMETHOD.
ENDCLASS.