From 56a0dca1344b619009012e79356632e0ea8bc44e Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Sat, 27 Mar 2021 10:46:38 +0100 Subject: [PATCH] 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 --- .../zcl_abapgit_file_deserialize.clas.abap | 245 +++++++++ ...git_file_deserialize.clas.testclasses.abap | 352 +++++++++++++ .../zcl_abapgit_file_deserialize.clas.xml | 17 + .../core/zcl_abapgit_objects_check.clas.abap | 236 +++++++++ ...bapgit_objects_check.clas.testclasses.abap | 116 +++++ .../core/zcl_abapgit_objects_check.clas.xml | 17 + src/objects/zcl_abapgit_objects.clas.abap | 445 +---------------- .../zcl_abapgit_objects.clas.testclasses.abap | 467 ------------------ 8 files changed, 992 insertions(+), 903 deletions(-) create mode 100644 src/objects/core/zcl_abapgit_file_deserialize.clas.abap create mode 100644 src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap create mode 100644 src/objects/core/zcl_abapgit_file_deserialize.clas.xml create mode 100644 src/objects/core/zcl_abapgit_objects_check.clas.abap create mode 100644 src/objects/core/zcl_abapgit_objects_check.clas.testclasses.abap create mode 100644 src/objects/core/zcl_abapgit_objects_check.clas.xml diff --git a/src/objects/core/zcl_abapgit_file_deserialize.clas.abap b/src/objects/core/zcl_abapgit_file_deserialize.clas.abap new file mode 100644 index 000000000..1543bf340 --- /dev/null +++ b/src/objects/core/zcl_abapgit_file_deserialize.clas.abap @@ -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: LIKE LINE OF rt_results. + + rt_results = it_results. + + LOOP AT rt_results ASSIGNING . + REPLACE ALL OCCURRENCES OF '#' IN -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: LIKE LINE OF it_results. + +* WEBI has to be handled before SPRX. + LOOP AT it_results ASSIGNING WHERE obj_type = 'WEBI'. + APPEND TO rt_results. + ENDLOOP. + +* SPRX has to be handled before depended objects CLAS/INFT/TABL etc. + LOOP AT it_results ASSIGNING WHERE obj_type = 'SPRX'. + APPEND TO rt_results. + ENDLOOP. + +* XSLT has to be handled before CLAS/PROG + LOOP AT it_results ASSIGNING WHERE obj_type = 'XSLT'. + APPEND TO rt_results. + ENDLOOP. + +* PROG before internet services, as the services might use the screens + LOOP AT it_results ASSIGNING WHERE obj_type = 'PROG'. + APPEND TO rt_results. + ENDLOOP. + +* ISAP has to be handled before ISRP + LOOP AT it_results ASSIGNING WHERE obj_type = 'IASP'. + APPEND TO rt_results. + ENDLOOP. + +* ENHS has to be handled before ENHO + LOOP AT it_results ASSIGNING WHERE obj_type = 'ENHS'. + APPEND TO rt_results. + ENDLOOP. + +* ENHO has to be handled before ENHC + LOOP AT it_results ASSIGNING WHERE obj_type = 'ENHO'. + APPEND TO rt_results. + ENDLOOP. + +* DDLS has to be handled before DCLS + LOOP AT it_results ASSIGNING WHERE obj_type = 'DDLS'. + APPEND TO rt_results. + ENDLOOP. + +* IOBJ has to be handled before ODSO + LOOP AT it_results ASSIGNING WHERE obj_type = 'IOBJ'. + APPEND TO rt_results. + ENDLOOP. + +* TOBJ has to be handled before SCP1 + LOOP AT it_results ASSIGNING WHERE obj_type = 'TOBJ'. + APPEND TO rt_results. + ENDLOOP. + +* OTGR has to be handled before CHAR + LOOP AT it_results ASSIGNING WHERE obj_type = 'OTGR'. + APPEND TO rt_results. + ENDLOOP. + + LOOP AT it_results ASSIGNING + 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 TO rt_results. + ENDLOOP. + +* PINF after everything as it can expose objects + LOOP AT it_results ASSIGNING WHERE obj_type = 'PINF'. + APPEND TO rt_results. + ENDLOOP. + +* DEVC after PINF, as it can refer for package interface usage + LOOP AT it_results ASSIGNING WHERE obj_type = 'DEVC'. + APPEND TO rt_results. + ENDLOOP. + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap b/src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap new file mode 100644 index 000000000..63a5240ac --- /dev/null +++ b/src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap @@ -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. diff --git a/src/objects/core/zcl_abapgit_file_deserialize.clas.xml b/src/objects/core/zcl_abapgit_file_deserialize.clas.xml new file mode 100644 index 000000000..f33849dfd --- /dev/null +++ b/src/objects/core/zcl_abapgit_file_deserialize.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_FILE_DESERIALIZE + E + abapGit - Files Deserialize + 1 + X + X + X + X + + + + diff --git a/src/objects/core/zcl_abapgit_objects_check.clas.abap b/src/objects/core/zcl_abapgit_objects_check.clas.abap new file mode 100644 index 000000000..55e7720c3 --- /dev/null +++ b/src/objects/core/zcl_abapgit_objects_check.clas.abap @@ -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: 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 . + + READ TABLE it_overwrite INTO ls_overwrite + WITH TABLE KEY object_type_and_name + COMPONENTS obj_type = -obj_type + obj_name = -obj_name. + IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. + zcx_abapgit_exception=>raise( |Overwrite { -obj_type } { + -obj_name } undecided| ). + ENDIF. + + IF ls_overwrite-decision = 'N'. + DELETE ct_results WHERE + obj_type = -obj_type AND + obj_name = -obj_name. + ASSERT sy-subrc = 0. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + + METHOD warning_overwrite_find. + + DATA: ls_overwrite LIKE LINE OF rt_overwrite. + + FIELD-SYMBOLS: LIKE LINE OF it_results. + + LOOP AT it_results ASSIGNING WHERE NOT obj_type IS INITIAL. + IF -lstate IS NOT INITIAL + AND NOT ( -lstate = zif_abapgit_definitions=>c_state-added + AND -rstate IS INITIAL ) + OR ( -lstate IS INITIAL + AND -rstate = zif_abapgit_definitions=>c_state-deleted ). + " current object has been modified or deleted locally, add to table + CLEAR ls_overwrite. + MOVE-CORRESPONDING 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: 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 . + + READ TABLE it_overwrite INTO ls_overwrite + WITH TABLE KEY object_type_and_name + COMPONENTS obj_type = -obj_type + obj_name = -obj_name. + IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. + zcx_abapgit_exception=>raise( |Overwrite of package { -obj_type } { + -obj_name } undecided| ). + ENDIF. + + IF ls_overwrite-decision = 'N'. + DELETE ct_results WHERE + obj_type = -obj_type AND + obj_name = -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: LIKE LINE OF it_results. + + lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ). + LOOP AT it_results ASSIGNING . + + lv_package = lo_folder_logic->path_to_package( + iv_top = io_repo->get_package( ) + io_dot = io_repo->get_dot_abapgit( ) + iv_path = -path + iv_create_if_not_exists = abap_false ). + + ls_tadir = zcl_abapgit_factory=>get_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. + INSERT ls_overwrite INTO TABLE lt_overwrite_unique. + ENDIF. + + ENDLOOP. + + rt_overwrite = lt_overwrite_unique. + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/core/zcl_abapgit_objects_check.clas.testclasses.abap b/src/objects/core/zcl_abapgit_objects_check.clas.testclasses.abap new file mode 100644 index 000000000..6b3d4374f --- /dev/null +++ b/src/objects/core/zcl_abapgit_objects_check.clas.testclasses.abap @@ -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. diff --git a/src/objects/core/zcl_abapgit_objects_check.clas.xml b/src/objects/core/zcl_abapgit_objects_check.clas.xml new file mode 100644 index 000000000..d83b5ff9c --- /dev/null +++ b/src/objects/core/zcl_abapgit_objects_check.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_OBJECTS_CHECK + E + abapGit - Objects Check + 1 + X + X + X + X + + + + diff --git a/src/objects/zcl_abapgit_objects.clas.abap b/src/objects/zcl_abapgit_objects.clas.abap index bd4324c4c..2846c1a8c 100644 --- a/src/objects/zcl_abapgit_objects.clas.abap +++ b/src/objects/zcl_abapgit_objects.clas.abap @@ -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: LIKE LINE OF rt_results. - - rt_results = it_results. - - LOOP AT rt_results ASSIGNING . - REPLACE ALL OCCURRENCES OF '#' IN -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: 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: LIKE LINE OF it_results. - -* WEBI has to be handled before SPRX. - LOOP AT it_results ASSIGNING WHERE obj_type = 'WEBI'. - APPEND TO rt_results. - ENDLOOP. - -* SPRX has to be handled before depended objects CLAS/INFT/TABL etc. - LOOP AT it_results ASSIGNING WHERE obj_type = 'SPRX'. - APPEND TO rt_results. - ENDLOOP. - -* XSLT has to be handled before CLAS/PROG - LOOP AT it_results ASSIGNING WHERE obj_type = 'XSLT'. - APPEND TO rt_results. - ENDLOOP. - -* PROG before internet services, as the services might use the screens - LOOP AT it_results ASSIGNING WHERE obj_type = 'PROG'. - APPEND TO rt_results. - ENDLOOP. - -* ISAP has to be handled before ISRP - LOOP AT it_results ASSIGNING WHERE obj_type = 'IASP'. - APPEND TO rt_results. - ENDLOOP. - -* ENHS has to be handled before ENHO - LOOP AT it_results ASSIGNING WHERE obj_type = 'ENHS'. - APPEND TO rt_results. - ENDLOOP. - -* DDLS has to be handled before DCLS - LOOP AT it_results ASSIGNING WHERE obj_type = 'DDLS'. - APPEND TO rt_results. - ENDLOOP. - -* IOBJ has to be handled before ODSO - LOOP AT it_results ASSIGNING WHERE obj_type = 'IOBJ'. - APPEND TO rt_results. - ENDLOOP. - -* TOBJ has to be handled before SCP1 - LOOP AT it_results ASSIGNING WHERE obj_type = 'TOBJ'. - APPEND TO rt_results. - ENDLOOP. - -* OTGR has to be handled before CHAR - LOOP AT it_results ASSIGNING WHERE obj_type = 'OTGR'. - APPEND TO rt_results. - ENDLOOP. - - LOOP AT it_results ASSIGNING - 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 TO rt_results. - ENDLOOP. - -* PINF after everything as it can expose objects - LOOP AT it_results ASSIGNING WHERE obj_type = 'PINF'. - APPEND TO rt_results. - ENDLOOP. - -* DEVC after PINF, as it can refer for package interface usage - LOOP AT it_results ASSIGNING WHERE obj_type = 'DEVC'. - APPEND 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 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: 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 . - - READ TABLE it_overwrite INTO ls_overwrite - WITH TABLE KEY object_type_and_name - COMPONENTS obj_type = -obj_type - obj_name = -obj_name. - IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. - zcx_abapgit_exception=>raise( |Overwrite { -obj_type } { - -obj_name } undecided| ). - ENDIF. - - IF ls_overwrite-decision = 'N'. - DELETE ct_results WHERE - obj_type = -obj_type AND - obj_name = -obj_name. - ASSERT sy-subrc = 0. - ENDIF. - - ENDLOOP. - - ENDMETHOD. - - - METHOD warning_overwrite_find. - - DATA: ls_overwrite LIKE LINE OF rt_overwrite. - - FIELD-SYMBOLS: LIKE LINE OF it_results. - - LOOP AT it_results ASSIGNING WHERE NOT obj_type IS INITIAL. - IF -lstate IS NOT INITIAL - AND NOT ( -lstate = zif_abapgit_definitions=>c_state-added - AND -rstate IS INITIAL ) - OR ( -lstate IS INITIAL - AND -rstate = zif_abapgit_definitions=>c_state-deleted ). - " current object has been modified or deleted locally, add to table - CLEAR ls_overwrite. - MOVE-CORRESPONDING 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: 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 . - - READ TABLE it_overwrite INTO ls_overwrite - WITH TABLE KEY object_type_and_name - COMPONENTS obj_type = -obj_type - obj_name = -obj_name. - IF sy-subrc <> 0 OR ls_overwrite-decision IS INITIAL. - zcx_abapgit_exception=>raise( |Overwrite of package { -obj_type } { - -obj_name } undecided| ). - ENDIF. - - IF ls_overwrite-decision = 'N'. - DELETE ct_results WHERE - obj_type = -obj_type AND - obj_name = -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: LIKE LINE OF it_results. - - lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ). - LOOP AT it_results ASSIGNING . - - lv_package = lo_folder_logic->path_to_package( - iv_top = io_repo->get_package( ) - io_dot = io_repo->get_dot_abapgit( ) - iv_path = -path - iv_create_if_not_exists = abap_false ). - - ls_tadir = zcl_abapgit_factory=>get_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. - INSERT ls_overwrite INTO TABLE lt_overwrite_unique. - ENDIF. - - ENDLOOP. - - rt_overwrite = lt_overwrite_unique. - - ENDMETHOD. ENDCLASS. diff --git a/src/objects/zcl_abapgit_objects.clas.testclasses.abap b/src/objects/zcl_abapgit_objects.clas.testclasses.abap index c0d5d8c76..cf0f02922 100644 --- a/src/objects/zcl_abapgit_objects.clas.testclasses.abap +++ b/src/objects/zcl_abapgit_objects.clas.testclasses.abap @@ -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.