From 6fad60afb52d9f2f7f1330d582dc9979fcb83fa6 Mon Sep 17 00:00:00 2001 From: Alexander Tsybulsky Date: Thu, 2 Mar 2023 18:55:22 +0200 Subject: [PATCH] File status refactoring, part 1 (#6114) Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com> Co-authored-by: Lars Hvam --- .../core/zcl_abapgit_file_status.clas.abap | 302 ++++++++++-------- ..._abapgit_file_status.clas.testclasses.abap | 142 +++++--- 2 files changed, 275 insertions(+), 169 deletions(-) diff --git a/src/objects/core/zcl_abapgit_file_status.clas.abap b/src/objects/core/zcl_abapgit_file_status.clas.abap index 24ffa37df..79cd37150 100644 --- a/src/objects/core/zcl_abapgit_file_status.clas.abap +++ b/src/objects/core/zcl_abapgit_file_status.clas.abap @@ -1,7 +1,7 @@ CLASS zcl_abapgit_file_status DEFINITION PUBLIC FINAL - CREATE PUBLIC . + CREATE PRIVATE . PUBLIC SECTION. @@ -13,13 +13,19 @@ CLASS zcl_abapgit_file_status DEFINITION VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception . + + METHODS constructor + IMPORTING + !iv_root_package TYPE devclass + !io_dot TYPE REF TO zcl_abapgit_dot_abapgit. + PROTECTED SECTION. PRIVATE SECTION. + DATA mv_root_package TYPE devclass. + DATA mo_dot TYPE REF TO zcl_abapgit_dot_abapgit. - CLASS-METHODS calculate_status + METHODS calculate_status IMPORTING - !iv_devclass TYPE devclass - !io_dot TYPE REF TO zcl_abapgit_dot_abapgit !it_local TYPE zif_abapgit_definitions=>ty_files_item_tt !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt !it_cur_state TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt @@ -27,9 +33,8 @@ CLASS zcl_abapgit_file_status DEFINITION VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception . - CLASS-METHODS process_local + METHODS process_local IMPORTING - !io_dot TYPE REF TO zcl_abapgit_dot_abapgit !it_local TYPE zif_abapgit_definitions=>ty_files_item_tt !it_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts CHANGING @@ -38,33 +43,27 @@ CLASS zcl_abapgit_file_status DEFINITION !ct_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception . - CLASS-METHODS process_items + METHODS process_items IMPORTING - !iv_devclass TYPE devclass - !io_dot TYPE REF TO zcl_abapgit_dot_abapgit - !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt + !it_unprocessed_remote TYPE zif_abapgit_git_definitions=>ty_files_tt CHANGING !ct_items TYPE zif_abapgit_definitions=>ty_items_tt RAISING zcx_abapgit_exception . - CLASS-METHODS process_remote + METHODS process_remote IMPORTING - !iv_devclass TYPE devclass - !io_dot TYPE REF TO zcl_abapgit_dot_abapgit !it_local TYPE zif_abapgit_definitions=>ty_files_item_tt - !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt + !it_unprocessed_remote TYPE zif_abapgit_git_definitions=>ty_files_tt !it_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts !it_items_idx TYPE zif_abapgit_definitions=>ty_items_ts CHANGING !ct_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception . - CLASS-METHODS run_checks + METHODS run_checks IMPORTING !ii_log TYPE REF TO zif_abapgit_log !it_results TYPE zif_abapgit_definitions=>ty_results_tt - !io_dot TYPE REF TO zcl_abapgit_dot_abapgit - !iv_top TYPE devclass RAISING zcx_abapgit_exception . CLASS-METHODS build_existing @@ -79,13 +78,11 @@ CLASS zcl_abapgit_file_status DEFINITION !is_local TYPE zif_abapgit_definitions=>ty_file_item RETURNING VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result . - CLASS-METHODS build_new_remote + METHODS build_new_remote IMPORTING - !iv_devclass TYPE devclass - !io_dot TYPE REF TO zcl_abapgit_dot_abapgit !is_remote TYPE zif_abapgit_git_definitions=>ty_file - !it_items TYPE zif_abapgit_definitions=>ty_items_ts - !it_state TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts + !it_items_idx TYPE zif_abapgit_definitions=>ty_items_ts + !it_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts RETURNING VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result RAISING @@ -137,16 +134,29 @@ CLASS zcl_abapgit_file_status DEFINITION !it_results TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception . + CLASS-METHODS check_local_remote_consistency + IMPORTING + !is_local TYPE zif_abapgit_definitions=>ty_file_item + !is_remote TYPE zif_abapgit_git_definitions=>ty_file + RAISING + zcx_abapgit_exception . + CLASS-METHODS ensure_state + IMPORTING + !it_local TYPE zif_abapgit_definitions=>ty_files_item_tt + !it_cur_state TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt + RETURNING + VALUE(rt_state) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt. + ENDCLASS. -CLASS zcl_abapgit_file_status IMPLEMENTATION. +CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. METHOD build_existing. - DATA: ls_file_sig LIKE LINE OF it_state. + DATA ls_file_sig LIKE LINE OF it_state. " Item rs_result-obj_type = is_local-item-obj_type. @@ -158,15 +168,16 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. rs_result-path = is_local-file-path. rs_result-filename = is_local-file-filename. - IF is_local-file-sha1 = is_remote-sha1. - rs_result-match = abap_true. + rs_result-match = boolc( is_local-file-sha1 = is_remote-sha1 ). + IF rs_result-match = abap_true. RETURN. ENDIF. " Match against current state READ TABLE it_state INTO ls_file_sig - WITH KEY path = is_local-file-path - filename = is_local-file-filename + WITH KEY + path = is_local-file-path + filename = is_local-file-filename BINARY SEARCH. IF sy-subrc = 0. @@ -176,18 +187,13 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. IF ls_file_sig-sha1 <> is_remote-sha1. rs_result-rstate = zif_abapgit_definitions=>c_state-modified. ENDIF. - rs_result-match = boolc( rs_result-lstate IS INITIAL - AND rs_result-rstate IS INITIAL ). ELSE. " This is a strange situation. As both local and remote exist " the state should also be present. Maybe this is a first run of the code. " In this case just compare hashes directly and mark both changed " the user will presumably decide what to do after checking the actual diff - rs_result-match = boolc( is_local-file-sha1 = is_remote-sha1 ). - IF rs_result-match = abap_false. - rs_result-lstate = zif_abapgit_definitions=>c_state-modified. - rs_result-rstate = zif_abapgit_definitions=>c_state-modified. - ENDIF. + rs_result-lstate = zif_abapgit_definitions=>c_state-modified. + rs_result-rstate = zif_abapgit_definitions=>c_state-modified. ENDIF. ENDMETHOD. @@ -214,8 +220,8 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. METHOD build_new_remote. - DATA: ls_item LIKE LINE OF it_items, - ls_file_sig LIKE LINE OF it_state. + DATA ls_item LIKE LINE OF it_items_idx. + DATA ls_file_sig LIKE LINE OF it_state_idx. " Common and default part rs_result-path = is_remote-path. @@ -227,15 +233,16 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. EXPORTING iv_filename = is_remote-filename iv_path = is_remote-path - iv_devclass = iv_devclass - io_dot = io_dot + iv_devclass = mv_root_package + io_dot = mo_dot IMPORTING es_item = ls_item ). " Check if in item index + get package - READ TABLE it_items INTO ls_item - WITH KEY obj_type = ls_item-obj_type obj_name = ls_item-obj_name - BINARY SEARCH. + READ TABLE it_items_idx INTO ls_item + WITH KEY + obj_type = ls_item-obj_type + obj_name = ls_item-obj_name. IF sy-subrc = 0. @@ -245,9 +252,10 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. rs_result-package = ls_item-devclass. rs_result-srcsystem = sy-sysid. - READ TABLE it_state INTO ls_file_sig - WITH KEY path = is_remote-path filename = is_remote-filename - BINARY SEARCH. + READ TABLE it_state_idx INTO ls_file_sig + WITH KEY + path = is_remote-path + filename = is_remote-filename. " Existing file but from another package " was not added during local file proc as was not in tadir for repo package @@ -261,7 +269,7 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. " Item is in state and in cache but with no package - it was deleted " OR devclass is the same as repo package (see #532) - IF ls_item-devclass IS INITIAL OR ls_item-devclass = iv_devclass. + IF ls_item-devclass IS INITIAL OR ls_item-devclass = mv_root_package. rs_result-match = abap_false. rs_result-lstate = zif_abapgit_definitions=>c_state-deleted. ENDIF. @@ -277,49 +285,50 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. METHOD calculate_status. DATA: - lt_remote LIKE it_remote, - lt_items TYPE zif_abapgit_definitions=>ty_items_tt, - lt_items_idx TYPE zif_abapgit_definitions=>ty_items_ts, " Sorted by obj_type+obj_name - lt_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts. " Sorted by path+filename + lt_remote LIKE it_remote, + lt_items TYPE zif_abapgit_definitions=>ty_items_tt, + lt_items_by_obj TYPE zif_abapgit_definitions=>ty_items_ts, " Sorted by obj_type+obj_name + lt_state_by_file TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts. " Sorted by path+filename - lt_state_idx = it_cur_state. " Force sort it - - lt_remote = it_remote. - SORT lt_remote BY path filename. + lt_state_by_file = ensure_state( " Index by file + it_cur_state = it_cur_state + it_local = it_local ). + lt_remote = it_remote. " Process local files and new local files process_local( EXPORTING - io_dot = io_dot it_local = it_local - it_state_idx = lt_state_idx + it_state_idx = lt_state_by_file CHANGING ct_remote = lt_remote ct_items = lt_items ct_results = rt_results ). - " Complete item index for unmarked remote files - process_items( - EXPORTING - iv_devclass = iv_devclass - io_dot = io_dot - it_remote = lt_remote - CHANGING - ct_items = lt_items ). + " Remove processed remotes (with cleared SHA1) + DELETE lt_remote WHERE sha1 IS INITIAL. - lt_items_idx = lt_items. " Self protection + UNIQUE records assertion + " Complete item index for unmarked remote files + process_items( " TODO: rename ? + EXPORTING + it_unprocessed_remote = lt_remote + CHANGING + ct_items = lt_items ). + + " The item list was not unique by now, just collected as "mention" list + SORT lt_items DESCENDING. " Default key - type, name, pkg, ... + DELETE ADJACENT DUPLICATES FROM lt_items COMPARING obj_type obj_name devclass. + lt_items_by_obj = lt_items. " Process new remote files (marked above with empty SHA1) process_remote( EXPORTING - iv_devclass = iv_devclass - io_dot = io_dot - it_local = it_local - it_remote = lt_remote - it_state_idx = lt_state_idx - it_items_idx = lt_items_idx + it_local = it_local + it_unprocessed_remote = lt_remote + it_state_idx = lt_state_by_file + it_items_idx = lt_items_by_obj CHANGING - ct_results = rt_results ). + ct_results = rt_results ). SORT rt_results BY obj_type ASCENDING @@ -376,6 +385,21 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. ENDMETHOD. + METHOD check_local_remote_consistency. + IF is_remote-sha1 IS INITIAL. + IF is_local-file-filename = zcl_abapgit_filename_logic=>c_package_file. + zcx_abapgit_exception=>raise( + |Package name conflict { is_local-item-obj_type } { is_local-item-obj_name }. | && + |Rename package or use FULL folder logic| ). + ELSE. + zcx_abapgit_exception=>raise( + |Checksum conflict { is_local-item-obj_type } { is_local-item-obj_name }. | && + |Please create an issue on Github| ). + ENDIF. + ENDIF. + ENDMETHOD. + + METHOD check_multiple_files. DATA: @@ -526,6 +550,31 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. ENDMETHOD. + METHOD constructor. + mv_root_package = iv_root_package. + mo_dot = io_dot. + ENDMETHOD. + + + METHOD ensure_state. + + FIELD-SYMBOLS LIKE LINE OF rt_state. + FIELD-SYMBOLS LIKE LINE OF it_local. + + IF lines( it_cur_state ) = 0. + " Empty state is usually not expected. Maybe for new repos. + " In this case suppose the local state is unchanged + LOOP AT it_local ASSIGNING . + APPEND INITIAL LINE TO rt_state ASSIGNING . + MOVE-CORRESPONDING -file TO . + ENDLOOP. + ELSE. + rt_state = it_cur_state. + ENDIF. + + ENDMETHOD. + + METHOD get_object_package. DATA: lv_name TYPE devclass, li_package TYPE REF TO zif_abapgit_sap_package. @@ -551,18 +600,18 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. lv_is_xml TYPE abap_bool, lv_is_json TYPE abap_bool, lv_sub_fetched TYPE abap_bool, - lt_sub_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt. + lt_sub_packages TYPE SORTED TABLE OF devclass WITH UNIQUE KEY table_line. - FIELD-SYMBOLS LIKE LINE OF it_remote. + FIELD-SYMBOLS LIKE LINE OF it_unprocessed_remote. - LOOP AT it_remote ASSIGNING WHERE sha1 IS NOT INITIAL. + LOOP AT it_unprocessed_remote ASSIGNING . zcl_abapgit_filename_logic=>file_to_object( EXPORTING iv_filename = -filename iv_path = -path - io_dot = io_dot - iv_devclass = iv_devclass + io_dot = mo_dot + iv_devclass = mv_root_package IMPORTING es_item = ls_item ev_is_xml = lv_is_xml @@ -574,17 +623,15 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. iv_object = ls_item-obj_type iv_obj_name = ls_item-obj_name ). - IF NOT ls_item-devclass IS INITIAL AND iv_devclass <> ls_item-devclass. + IF ls_item-devclass IS NOT INITIAL AND mv_root_package <> ls_item-devclass. IF lv_sub_fetched = abap_false. - lt_sub_packages = zcl_abapgit_factory=>get_sap_package( iv_devclass )->list_subpackages( ). - lv_sub_fetched = abap_true. - SORT lt_sub_packages BY table_line. "Optimize Read Access + lt_sub_packages = zcl_abapgit_factory=>get_sap_package( mv_root_package )->list_subpackages( ). + lv_sub_fetched = abap_true. ENDIF. " Make sure the package is under the repo main package READ TABLE lt_sub_packages TRANSPORTING NO FIELDS - WITH KEY table_line = ls_item-devclass - BINARY SEARCH. + WITH KEY table_line = ls_item-devclass. IF sy-subrc <> 0 AND ls_item-obj_type = 'DEVC'. CLEAR ls_item-devclass. ENDIF. @@ -593,16 +640,11 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. APPEND ls_item TO ct_items. ENDLOOP. - SORT ct_items DESCENDING. " Default key - type, name, pkg, inactive - DELETE ADJACENT DUPLICATES FROM ct_items COMPARING obj_type obj_name devclass. - ENDMETHOD. METHOD process_local. - DATA lv_msg TYPE string. - FIELD-SYMBOLS: LIKE LINE OF ct_remote, LIKE LINE OF ct_results, @@ -611,36 +653,34 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. LOOP AT it_local ASSIGNING . " Skip ignored files - IF io_dot->is_ignored( iv_path = -file-path - iv_filename = -file-filename ) = abap_true. - CONTINUE. + CHECK mo_dot->is_ignored( + iv_path = -file-path + iv_filename = -file-filename ) = abap_false. + + IF -item IS NOT INITIAL. + " Collect for item index + APPEND -item TO ct_items. ENDIF. APPEND INITIAL LINE TO ct_results ASSIGNING . - IF -item IS NOT INITIAL. - APPEND -item TO ct_items. " Collect for item index - ENDIF. + -inactive = -item-inactive. + " Find a match in remote READ TABLE ct_remote ASSIGNING - WITH KEY path = -file-path filename = -file-filename - BINARY SEARCH. - IF sy-subrc = 0. " Exist local and remote + WITH KEY file_path + COMPONENTS + path = -file-path + filename = -file-filename. + IF sy-subrc = 0. " Both local and remote exist + check_local_remote_consistency( + is_local = + is_remote = ). = build_existing( is_local = is_remote = it_state = it_state_idx ). - IF -sha1 IS INITIAL. - IF -file-filename = zcl_abapgit_filename_logic=>c_package_file. - lv_msg = |Package name conflict { -item-obj_type } { -item-obj_name }. | && - |Rename package or use FULL folder logic|. - ELSE. - lv_msg = |Checksum conflict { -item-obj_type } { -item-obj_name }. | && - |Please create an issue on Github|. - ENDIF. - zcx_abapgit_exception=>raise( lv_msg ). - ENDIF. CLEAR -sha1. " Mark as processed - ELSE. " Only L exists + ELSE. " Only local exists = build_new_local( ). " Check if same file exists in different location READ TABLE ct_remote ASSIGNING @@ -651,8 +691,9 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. ELSEIF sy-subrc = 4. " Check if file existed before and was deleted remotely READ TABLE it_state_idx ASSIGNING - WITH KEY path = -file-path filename = -file-filename - BINARY SEARCH. + WITH KEY + path = -file-path + filename = -file-filename. IF sy-subrc = 0. IF -file-sha1 = -sha1. -lstate = zif_abapgit_definitions=>c_state-unchanged. @@ -663,7 +704,6 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. ENDIF. ENDIF. ENDIF. - -inactive = -item-inactive. ENDLOOP. ENDMETHOD. @@ -672,19 +712,18 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. METHOD process_remote. FIELD-SYMBOLS: - LIKE LINE OF it_remote, + LIKE LINE OF it_unprocessed_remote, LIKE LINE OF ct_results, LIKE LINE OF it_local. - LOOP AT it_remote ASSIGNING WHERE sha1 IS NOT INITIAL. + LOOP AT it_unprocessed_remote ASSIGNING . + APPEND INITIAL LINE TO ct_results ASSIGNING . = build_new_remote( - iv_devclass = iv_devclass - io_dot = io_dot is_remote = - it_items = it_items_idx - it_state = it_state_idx ). + it_items_idx = it_items_idx + it_state_idx = it_state_idx ). " Check if same file exists in different location (not for generic package files) READ TABLE it_local ASSIGNING @@ -699,10 +738,11 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. ELSE. " Check if file existed before and was deleted locally READ TABLE it_state_idx TRANSPORTING NO FIELDS - WITH KEY path = -path filename = -filename - BINARY SEARCH. + WITH KEY + path = -path + filename = -filename. IF sy-subrc = 0. - -match = abap_false. + -match = abap_false. -lstate = zif_abapgit_definitions=>c_state-deleted. ENDIF. ENDIF. @@ -732,14 +772,14 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. check_package_sub_package( ii_log = ii_log it_results = it_results - iv_top = iv_top ). + iv_top = mv_root_package ). " Check that objects are created in package corresponding to folder check_package_folder( ii_log = ii_log it_results = it_results - io_dot = io_dot - iv_top = iv_top ). + io_dot = mo_dot + iv_top = mv_root_package ). " Check for multiple files with same filename check_multiple_files( @@ -759,6 +799,7 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. DATA lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt. DATA lt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt. DATA li_exit TYPE REF TO zif_abapgit_exit. + DATA lo_instance TYPE REF TO zcl_abapgit_file_status. lt_local = io_repo->get_files_local( ii_log = ii_log ). @@ -780,18 +821,19 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. ct_local = lt_local ct_remote = lt_remote ). - rt_results = calculate_status( - iv_devclass = io_repo->get_package( ) - io_dot = io_repo->get_dot_abapgit( ) + CREATE OBJECT lo_instance + EXPORTING + iv_root_package = io_repo->get_package( ) + io_dot = io_repo->get_dot_abapgit( ). + + rt_results = lo_instance->calculate_status( it_local = lt_local it_remote = lt_remote it_cur_state = io_repo->zif_abapgit_repo~checksums( )->get_checksums_per_file( ) ). - run_checks( + lo_instance->run_checks( ii_log = ii_log - it_results = rt_results - io_dot = io_repo->get_dot_abapgit( ) - iv_top = io_repo->get_package( ) ). + it_results = rt_results ). ENDMETHOD. ENDCLASS. diff --git a/src/objects/core/zcl_abapgit_file_status.clas.testclasses.abap b/src/objects/core/zcl_abapgit_file_status.clas.testclasses.abap index 07ebacfc2..7393732e8 100644 --- a/src/objects/core/zcl_abapgit_file_status.clas.testclasses.abap +++ b/src/objects/core/zcl_abapgit_file_status.clas.testclasses.abap @@ -38,6 +38,7 @@ CLASS ltcl_run_checks DEFINITION FOR TESTING RISK LEVEL HARMLESS PRIVATE SECTION. DATA: mt_results TYPE zif_abapgit_definitions=>ty_results_tt, + mo_instance TYPE REF TO zcl_abapgit_file_status, mo_dot TYPE REF TO zcl_abapgit_dot_abapgit, mi_log TYPE REF TO zif_abapgit_log. @@ -150,6 +151,11 @@ CLASS ltcl_run_checks IMPLEMENTATION. zcl_abapgit_injector=>set_sap_package( iv_package = '$MAIN_SUB' ii_sap_package = me ). + CREATE OBJECT mo_instance + EXPORTING + iv_root_package = '$Z$' + io_dot = mo_dot. + ENDMETHOD. METHOD positive. @@ -191,12 +197,9 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_path = '/' iv_filename = 'zdoma2.doma.xml' ). - - zcl_abapgit_file_status=>run_checks( + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '$Z$' ). + it_results = mt_results ). cl_abap_unit_assert=>assert_equals( act = mi_log->count( ) @@ -243,11 +246,9 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_path = '/' iv_filename = 'zdoma2.doma.xml' ). - zcl_abapgit_file_status=>run_checks( + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '$Z$' ). + it_results = mt_results ). " This one is not pure - incorrect path also triggers path vs package check cl_abap_unit_assert=>assert_equals( @@ -299,11 +300,9 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_path = '/' iv_filename = '$$zdoma2.doma.xml' ). - zcl_abapgit_file_status=>run_checks( + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '$Z$' ). + it_results = mt_results ). cl_abap_unit_assert=>assert_equals( act = mi_log->count( ) @@ -354,11 +353,9 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_path = '/' iv_filename = '$$zdoma1.doma.xml' ). - zcl_abapgit_file_status=>run_checks( + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '$Z$' ). + it_results = mt_results ). cl_abap_unit_assert=>assert_equals( act = mi_log->count( ) @@ -400,11 +397,9 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_path = '/' iv_filename = '' ). - zcl_abapgit_file_status=>run_checks( + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '$Z$' ). + it_results = mt_results ). cl_abap_unit_assert=>assert_equals( act = mi_log->count( ) @@ -479,11 +474,9 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_filename = 'zdoma1.doma.xml' iv_packmove = 'X' ). - zcl_abapgit_file_status=>run_checks( + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '$Z$' ). + it_results = mt_results ). " Three files, but only two msg (for two changed objects) cl_abap_unit_assert=>assert_equals( @@ -508,11 +501,14 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_path = '/' iv_filename = '#notexist#zclass1.clas.xml' ). - zcl_abapgit_file_status=>run_checks( + CREATE OBJECT mo_instance + EXPORTING + iv_root_package = '/NOTEXIST/Z' + io_dot = mo_dot. + + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '/NOTEXIST/Z' ). + it_results = mt_results ). cl_abap_unit_assert=>assert_equals( act = mi_log->count( ) @@ -544,11 +540,14 @@ CLASS ltcl_run_checks IMPLEMENTATION. iv_path = '' iv_filename = 'package.devc.xml' ). - zcl_abapgit_file_status=>run_checks( + CREATE OBJECT mo_instance + EXPORTING + iv_root_package = '$MAIN' + io_dot = mo_dot. + + mo_instance->run_checks( ii_log = mi_log - it_results = mt_results - io_dot = mo_dot - iv_top = '$MAIN' ). + it_results = mt_results ). cl_abap_unit_assert=>assert_equals( act = mi_log->count( ) @@ -749,16 +748,19 @@ CLASS ltcl_status_helper IMPLEMENTATION. METHOD run. - DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, - lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. - + DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, + lo_instance TYPE REF TO zcl_abapgit_file_status, + lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). lo_dot->set_starting_folder( '/' ). " assumed by unit tests - lt_results = zcl_abapgit_file_status=>calculate_status( - iv_devclass = iv_devclass - io_dot = lo_dot + CREATE OBJECT lo_instance + EXPORTING + iv_root_package = iv_devclass + io_dot = lo_dot. + + lt_results = lo_instance->calculate_status( it_local = mt_local it_remote = mt_remote it_cur_state = mt_state ). @@ -893,6 +895,8 @@ CLASS ltcl_calculate_status IMPLEMENTATION. METHOD diff. + " Modified both + CREATE OBJECT mo_helper. mo_helper->add_local( iv_obj_type = 'DOMA' iv_obj_name = '$$ZDOMA1' @@ -903,6 +907,10 @@ CLASS ltcl_calculate_status IMPLEMENTATION. iv_filename = '$$zdoma1.doma.xml' iv_sha1 = '54321' ). + mo_helper->add_state( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = 'xxx' ). + mo_result = mo_helper->run( ). mo_result->assert_lines( 1 ). @@ -915,6 +923,62 @@ CLASS ltcl_calculate_status IMPLEMENTATION. act = mo_result->get_line( 1 )-rstate exp = zif_abapgit_definitions=>c_state-modified ). + " Modified local only + CREATE OBJECT mo_helper. + mo_helper->add_local( + iv_obj_type = 'DOMA' + iv_obj_name = '$$ZDOMA1' + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '12345' ). + + mo_helper->add_remote( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '54321' ). + + mo_helper->add_state( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '54321' ). + + mo_result = mo_helper->run( ). + + mo_result->assert_lines( 1 ). + + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-lstate + exp = zif_abapgit_definitions=>c_state-modified ). + + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-rstate + exp = zif_abapgit_definitions=>c_state-unchanged ). + + " Modified remote only + CREATE OBJECT mo_helper. + mo_helper->add_local( + iv_obj_type = 'DOMA' + iv_obj_name = '$$ZDOMA1' + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '12345' ). + + mo_helper->add_remote( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '54321' ). + + mo_helper->add_state( + iv_filename = '$$zdoma1.doma.xml' + iv_sha1 = '12345' ). + + mo_result = mo_helper->run( ). + + mo_result->assert_lines( 1 ). + + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-lstate + exp = zif_abapgit_definitions=>c_state-unchanged ). + + cl_abap_unit_assert=>assert_equals( + act = mo_result->get_line( 1 )-rstate + exp = zif_abapgit_definitions=>c_state-modified ). + ENDMETHOD. METHOD local_outside_main.