From ec12f18b62942dad749c9ad0417e5456c3b45b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Sat, 29 Mar 2025 08:34:20 +0100 Subject: [PATCH 1/9] using existing secondary keys (#7169) --- src/cts/zcl_abapgit_transport_objects.clas.abap | 1 + src/repo/utils/zcl_abapgit_repo_news.clas.abap | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cts/zcl_abapgit_transport_objects.clas.abap b/src/cts/zcl_abapgit_transport_objects.clas.abap index 39e698275..40eafd332 100644 --- a/src/cts/zcl_abapgit_transport_objects.clas.abap +++ b/src/cts/zcl_abapgit_transport_objects.clas.abap @@ -38,6 +38,7 @@ CLASS zcl_abapgit_transport_objects IMPLEMENTATION. LOOP AT mt_transport_objects INTO ls_transport_object. LOOP AT it_object_statuses INTO ls_object_status + USING KEY sec_key WHERE obj_name = ls_transport_object-obj_name AND obj_type = ls_transport_object-object AND NOT lstate IS INITIAL. diff --git a/src/repo/utils/zcl_abapgit_repo_news.clas.abap b/src/repo/utils/zcl_abapgit_repo_news.clas.abap index 875c75b47..20e0768ae 100644 --- a/src/repo/utils/zcl_abapgit_repo_news.clas.abap +++ b/src/repo/utils/zcl_abapgit_repo_news.clas.abap @@ -154,8 +154,10 @@ CLASS zcl_abapgit_repo_news IMPLEMENTATION. RETURN. ENDTRY. - LOOP AT lt_remote ASSIGNING WHERE path = lc_log_path - AND ( filename CP lc_log_filename OR filename CP lc_log_filename_up ). + LOOP AT lt_remote ASSIGNING + USING KEY file_path + WHERE path = lc_log_path + AND ( filename CP lc_log_filename OR filename CP lc_log_filename_up ). CREATE OBJECT ro_instance EXPORTING From b45a4969baa3d0a71f56021a9c1406fbff76cf20 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Sat, 29 Mar 2025 10:10:48 +0100 Subject: [PATCH 2/9] Fix syntax errors in lower releases (table keys) (#7172) --- src/cts/zcl_abapgit_transport_objects.clas.abap | 2 +- src/repo/utils/zcl_abapgit_repo_news.clas.abap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cts/zcl_abapgit_transport_objects.clas.abap b/src/cts/zcl_abapgit_transport_objects.clas.abap index 40eafd332..3bf344e33 100644 --- a/src/cts/zcl_abapgit_transport_objects.clas.abap +++ b/src/cts/zcl_abapgit_transport_objects.clas.abap @@ -38,7 +38,7 @@ CLASS zcl_abapgit_transport_objects IMPLEMENTATION. LOOP AT mt_transport_objects INTO ls_transport_object. LOOP AT it_object_statuses INTO ls_object_status - USING KEY sec_key + " USING KEY sec_key " syntax error in 754 WHERE obj_name = ls_transport_object-obj_name AND obj_type = ls_transport_object-object AND NOT lstate IS INITIAL. diff --git a/src/repo/utils/zcl_abapgit_repo_news.clas.abap b/src/repo/utils/zcl_abapgit_repo_news.clas.abap index 20e0768ae..2c8ea7ffc 100644 --- a/src/repo/utils/zcl_abapgit_repo_news.clas.abap +++ b/src/repo/utils/zcl_abapgit_repo_news.clas.abap @@ -155,7 +155,7 @@ CLASS zcl_abapgit_repo_news IMPLEMENTATION. ENDTRY. LOOP AT lt_remote ASSIGNING - USING KEY file_path + " USING KEY file_path " syntax error in 754 WHERE path = lc_log_path AND ( filename CP lc_log_filename OR filename CP lc_log_filename_up ). From 464afa8193eef33b4c75052ed9907761a0e5f449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Sat, 29 Mar 2025 12:37:24 +0100 Subject: [PATCH 3/9] Page Stage: fix case logic (#7168) Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com> --- .../zcl_abapgit_gui_page_stage.clas.abap | 125 +---- ...bapgit_gui_page_stage.clas.locals_imp.abap | 198 ++++++++ ...apgit_gui_page_stage.clas.testclasses.abap | 459 ++++++++++++++++++ .../pages/zcl_abapgit_gui_page_stage.clas.xml | 1 + 4 files changed, 663 insertions(+), 120 deletions(-) create mode 100644 src/ui/pages/zcl_abapgit_gui_page_stage.clas.locals_imp.abap create mode 100644 src/ui/pages/zcl_abapgit_gui_page_stage.clas.testclasses.abap diff --git a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap index 0e1eb9531..2dda8610d 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap @@ -61,11 +61,6 @@ CLASS zcl_abapgit_gui_page_stage DEFINITION DATA mv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result. DATA mi_obj_filter TYPE REF TO zif_abapgit_object_filter. - METHODS check_selected - IMPORTING - !io_files TYPE REF TO zcl_abapgit_string_map - RAISING - zcx_abapgit_exception . METHODS find_changed_by IMPORTING !it_files TYPE zif_abapgit_definitions=>ty_stage_files @@ -137,51 +132,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. - - - METHOD check_selected. - - DATA: - ls_file TYPE zif_abapgit_git_definitions=>ty_file, - lv_pattern TYPE string, - lv_msg TYPE string. - - FIELD-SYMBOLS: - LIKE LINE OF io_files->mt_entries, - LIKE LINE OF io_files->mt_entries. - - " Check all added files if the exist in different paths (packages) without being removed - LOOP AT io_files->mt_entries ASSIGNING WHERE v = zif_abapgit_definitions=>c_method-add. - - " Allow mixed case path, but check filename to lower case - zcl_abapgit_path=>split_file_location( - EXPORTING - iv_fullpath = -k - IMPORTING - ev_path = ls_file-path - ev_filename = ls_file-filename ). - - ls_file-filename = to_lower( ls_file-filename ). - - " Skip packages since they all have identical filenames - IF ls_file-filename <> 'package.devc.xml'. - lv_pattern = '*/' && to_upper( ls_file-filename ). - REPLACE ALL OCCURRENCES OF '#' IN lv_pattern WITH '##'. " for CP - - LOOP AT io_files->mt_entries ASSIGNING - WHERE k CP lv_pattern AND k <> -k AND v <> zif_abapgit_definitions=>c_method-rm. - - lv_msg = |In order to add { to_lower( -k ) }, | && - |you have to remove { to_lower( -k ) }|. - zcx_abapgit_exception=>raise( lv_msg ). - - ENDLOOP. - ENDIF. - ENDLOOP. - - ENDMETHOD. - +CLASS zcl_abapgit_gui_page_stage IMPLEMENTATION. METHOD constructor. @@ -719,76 +670,10 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. METHOD stage_selected. - DATA ls_file TYPE zif_abapgit_git_definitions=>ty_file. - DATA lo_files TYPE REF TO zcl_abapgit_string_map. - - FIELD-SYMBOLS: - LIKE LINE OF ms_files-local, - LIKE LINE OF ms_files-status, - LIKE LINE OF lo_files->mt_entries. - - lo_files = ii_event->form_data( ). - - IF lo_files->size( ) = 0. - zcx_abapgit_exception=>raise( 'process_stage_list: empty list' ). - ENDIF. - - check_selected( lo_files ). - - CREATE OBJECT ro_stage. - - LOOP AT lo_files->mt_entries ASSIGNING - "Ignore Files that we don't want to stage, so any errors don't stop the staging process - WHERE v <> zif_abapgit_definitions=>c_method-skip. - - " Allow mixed case path, but check filename to lower case - zcl_abapgit_path=>split_file_location( - EXPORTING - iv_fullpath = -k - IMPORTING - ev_path = ls_file-path - ev_filename = ls_file-filename ). - - ls_file-filename = to_lower( ls_file-filename ). - - READ TABLE ms_files-status ASSIGNING - WITH TABLE KEY - path = ls_file-path - filename = ls_file-filename. - IF sy-subrc <> 0. -* see https://github.com/abapGit/abapGit/issues/3073 - zcx_abapgit_exception=>raise( - |Unable to stage { ls_file-filename }. If the filename contains spaces, this is a known issue.| && - | Consider ignoring or staging the file at a later time.| ). - ENDIF. - - CASE -v. - WHEN zif_abapgit_definitions=>c_method-add. - READ TABLE ms_files-local ASSIGNING - WITH KEY file-path = ls_file-path - file-filename = ls_file-filename. - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |process_stage_list: unknown file { ls_file-path }{ ls_file-filename }| ). - ENDIF. - - ro_stage->add( iv_path = -file-path - iv_filename = -file-filename - is_status = - iv_data = -file-data ). - WHEN zif_abapgit_definitions=>c_method-ignore. - ro_stage->ignore( iv_path = ls_file-path - iv_filename = ls_file-filename ). - WHEN zif_abapgit_definitions=>c_method-rm. - ro_stage->rm( iv_path = ls_file-path - is_status = - iv_filename = ls_file-filename ). - WHEN zif_abapgit_definitions=>c_method-skip. - " Do nothing - WHEN OTHERS. - zcx_abapgit_exception=>raise( |process_stage_list: unknown method { -v }| ). - ENDCASE. - ENDLOOP. + ro_stage = lcl_selected=>get_instance( )->stage_selected( + ii_event = ii_event + it_status = ms_files-status + it_local = ms_files-local ). ENDMETHOD. diff --git a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.locals_imp.abap b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.locals_imp.abap new file mode 100644 index 000000000..a8ba1cf55 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.locals_imp.abap @@ -0,0 +1,198 @@ +*"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + +INTERFACE lif_selected. + + METHODS stage_selected + IMPORTING + ii_event TYPE REF TO zif_abapgit_gui_event + it_status TYPE zif_abapgit_definitions=>ty_results_ts_path + it_local TYPE zif_abapgit_definitions=>ty_files_item_tt + RETURNING + VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage + RAISING + zcx_abapgit_exception. + +ENDINTERFACE. + +CLASS lcl_selected DEFINITION CREATE PRIVATE. + + PUBLIC SECTION. + CLASS-METHODS get_instance + RETURNING + VALUE(ro_instance) TYPE REF TO lif_selected. + + INTERFACES lif_selected. + + PRIVATE SECTION. + METHODS check_selected + IMPORTING + io_files TYPE REF TO zcl_abapgit_string_map + RAISING + zcx_abapgit_exception. + + METHODS read_status_case_insensitive + IMPORTING + is_file TYPE zif_abapgit_git_definitions=>ty_file + it_status TYPE zif_abapgit_definitions=>ty_results_ts_path + RETURNING + VALUE(rs_status) TYPE zif_abapgit_definitions=>ty_result + RAISING + zcx_abapgit_exception. + + CLASS-DATA: + gi_instance TYPE REF TO lif_selected. + +ENDCLASS. + + +CLASS lcl_selected IMPLEMENTATION. + + METHOD lif_selected~stage_selected. + + DATA ls_file TYPE zif_abapgit_git_definitions=>ty_file. + DATA ls_status LIKE LINE OF it_status. + DATA lo_files TYPE REF TO zcl_abapgit_string_map. + + FIELD-SYMBOLS: + LIKE LINE OF it_local, + LIKE LINE OF lo_files->mt_entries. + + lo_files = ii_event->form_data( ). + + IF lo_files->size( ) = 0. + zcx_abapgit_exception=>raise( 'process_stage_list: empty list' ). + ENDIF. + + check_selected( lo_files ). + + CREATE OBJECT ro_stage. + + LOOP AT lo_files->mt_entries ASSIGNING + "Ignore Files that we don't want to stage, so any errors don't stop the staging process + WHERE v <> zif_abapgit_definitions=>c_method-skip. + + zcl_abapgit_path=>split_file_location( + EXPORTING + iv_fullpath = -k + IMPORTING + ev_path = ls_file-path + ev_filename = ls_file-filename ). + + " you should remember that ls_file is sent from the client and is always uppercase, + " whereas it_status and it_local path could be lower, upper or mixed case. + ls_status = read_status_case_insensitive( + is_file = ls_file + it_status = it_status ). + + " ls_status has the right case, therefore use it also for ls_file + ls_file-path = ls_status-path. + ls_file-filename = ls_status-filename. + + CASE -v. + WHEN zif_abapgit_definitions=>c_method-add. + READ TABLE it_local ASSIGNING + WITH KEY file-path = ls_file-path + file-filename = ls_file-filename. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |process_stage_list: unknown file { ls_file-path }{ ls_file-filename }| ). + ENDIF. + + ro_stage->add( iv_path = -file-path + iv_filename = -file-filename + is_status = ls_status + iv_data = -file-data ). + WHEN zif_abapgit_definitions=>c_method-ignore. + ro_stage->ignore( iv_path = ls_file-path + iv_filename = ls_file-filename ). + WHEN zif_abapgit_definitions=>c_method-rm. + ro_stage->rm( iv_path = ls_file-path + is_status = ls_status + iv_filename = ls_file-filename ). + WHEN zif_abapgit_definitions=>c_method-skip. + " Do nothing. Never happens as it is filtered out before. Just for completeness. + WHEN OTHERS. + zcx_abapgit_exception=>raise( |process_stage_list: unknown method { -v }| ). + ENDCASE. + ENDLOOP. + ENDMETHOD. + + + METHOD check_selected. + + DATA: + ls_file TYPE zif_abapgit_git_definitions=>ty_file, + lv_pattern TYPE string, + lv_msg TYPE string. + + FIELD-SYMBOLS: + LIKE LINE OF io_files->mt_entries, + LIKE LINE OF io_files->mt_entries. + + " Check all added files if the exist in different paths (packages) without being removed + LOOP AT io_files->mt_entries ASSIGNING WHERE v = zif_abapgit_definitions=>c_method-add. + + " Allow mixed case path, but check filename to lower case + zcl_abapgit_path=>split_file_location( + EXPORTING + iv_fullpath = -k + IMPORTING + ev_path = ls_file-path + ev_filename = ls_file-filename ). + + ls_file-filename = to_lower( ls_file-filename ). + + " Skip packages since they all have identical filenames + IF ls_file-filename <> 'package.devc.xml'. + lv_pattern = '*/' && to_upper( ls_file-filename ). + REPLACE ALL OCCURRENCES OF '#' IN lv_pattern WITH '##'. " for CP + + LOOP AT io_files->mt_entries ASSIGNING + WHERE k CP lv_pattern AND k <> -k AND v <> zif_abapgit_definitions=>c_method-rm. + + lv_msg = |In order to add { to_lower( -k ) }, | && + |you have to remove { to_lower( -k ) }|. + zcx_abapgit_exception=>raise( lv_msg ). + + ENDLOOP. + ENDIF. + ENDLOOP. + + ENDMETHOD. + + + METHOD get_instance. + + IF gi_instance IS INITIAL. + CREATE OBJECT gi_instance TYPE lcl_selected. + ENDIF. + + ro_instance = gi_instance. + + ENDMETHOD. + + + METHOD read_status_case_insensitive. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result. + + LOOP AT it_status ASSIGNING . + + IF to_upper( -filename ) = to_upper( is_file-filename ) + AND to_upper( -path ) = to_upper( is_file-path ). + rs_status = . + RETURN. + ENDIF. + + ENDLOOP. + + " see https://github.com/abapGit/abapGit/issues/3073 + zcx_abapgit_exception=>raise( + |Unable to stage { is_file-filename }. If the filename contains spaces, this is a known issue.| && + | Consider ignoring or staging the file at a later time.| ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.testclasses.abap b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.testclasses.abap new file mode 100644 index 000000000..cbf555507 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.testclasses.abap @@ -0,0 +1,459 @@ +*"* use this source file for your ABAP unit test classes +CLASS lcl_mock_event DEFINITION. + + PUBLIC SECTION. + INTERFACES zif_abapgit_gui_event. + METHODS constructor. + METHODS set_file + IMPORTING + iv_key TYPE csequence + iv_value TYPE csequence + RAISING + zcx_abapgit_exception. + + PRIVATE SECTION. + DATA mo_files TYPE REF TO zcl_abapgit_string_map. + +ENDCLASS. + + +CLASS ltcl_stage DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: + mo_mock_event TYPE REF TO lcl_mock_event, + mt_status TYPE zif_abapgit_definitions=>ty_results_ts_path, + mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + mo_stage TYPE REF TO zcl_abapgit_stage, + mx_error TYPE REF TO zcx_abapgit_exception. + + METHODS: setup RAISING cx_static_check, + emtpy_list FOR TESTING RAISING cx_static_check, + unknown_file FOR TESTING RAISING cx_static_check, + add FOR TESTING RAISING cx_static_check, + uppercase_path FOR TESTING RAISING cx_static_check, + uppercase_status_path FOR TESTING RAISING cx_static_check, + mixed_case FOR TESTING RAISING cx_static_check, + unknown_method FOR TESTING RAISING cx_static_check, + status_missing FOR TESTING RAISING cx_static_check, + remove FOR TESTING RAISING cx_static_check, + check_selected_rm FOR TESTING RAISING cx_static_check, + skip FOR TESTING RAISING cx_static_check, + when_stage_selected + RAISING + zcx_abapgit_exception, + given_file + IMPORTING + iv_key TYPE csequence + iv_value TYPE csequence + RAISING + zcx_abapgit_exception, + given_status + IMPORTING + iv_path TYPE csequence + iv_filename TYPE csequence, + then_file_is_ignored + IMPORTING + iv_path TYPE csequence + iv_filename TYPE csequence, + then_file_is_added + IMPORTING + iv_path TYPE csequence + iv_filename TYPE csequence, + then_error_contains + IMPORTING + iv_exp_error TYPE csequence, + given_local + IMPORTING + iv_path TYPE csequence + iv_filename TYPE csequence, + then_file_is_removed + IMPORTING + iv_path TYPE csequence + iv_filename TYPE csequence, + then_there_is_nothing_to_stage, + assert_table_contains + IMPORTING + is_stage TYPE zif_abapgit_definitions=>ty_stage + it_stage TYPE zif_abapgit_definitions=>ty_stage_tt. + +ENDCLASS. + +CLASS lcl_mock_event IMPLEMENTATION. + + METHOD constructor. + + CREATE OBJECT mo_files. + + ENDMETHOD. + + METHOD zif_abapgit_gui_event~form_data. + + ro_string_map = mo_files. + + ENDMETHOD. + + + METHOD zif_abapgit_gui_event~query. + + ENDMETHOD. + + + METHOD set_file. + + mo_files->set( + iv_key = iv_key + iv_val = iv_value ). + + ENDMETHOD. + +ENDCLASS. + + +CLASS ltcl_stage IMPLEMENTATION. + + METHOD setup. + + CREATE OBJECT mo_mock_event TYPE lcl_mock_event. + + ENDMETHOD. + + + METHOD emtpy_list. + + when_stage_selected( ). + then_error_contains( 'empty list' ). + + ENDMETHOD. + + + METHOD unknown_file. + + given_file( + iv_key = '/src/zddls.ddls.baseinfo' + iv_value = zif_abapgit_definitions=>c_method-add ). + + given_status( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + when_stage_selected( ). + + then_error_contains( 'unknown file' ). + + ENDMETHOD. + + + METHOD add. + + given_file( + iv_key = '/src/zddls.ddls.baseinfo' + iv_value = zif_abapgit_definitions=>c_method-add ). + + given_status( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + given_local( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + when_stage_selected( ). + + then_file_is_added( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + ENDMETHOD. + + + METHOD uppercase_path. + + given_file( + iv_key = '/SRC/ZDDLS.DDLS.BASEINFO' + iv_value = zif_abapgit_definitions=>c_method-ignore ). + + given_status( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + when_stage_selected( ). + + then_file_is_ignored( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + ENDMETHOD. + + + METHOD uppercase_status_path. + + given_file( + iv_key = '/CODE/ZFALV.FUGR.SCREEN_0200.ABAP' + iv_value = zif_abapgit_definitions=>c_method-ignore ). + + given_status( + iv_path = '/CODE/' + iv_filename = 'zfalv.fugr.screen_0200.abap' ). + + given_local( + iv_path = '/CODE/' + iv_filename = 'zfalv.fugr.screen_0200.abap' ). + + when_stage_selected( ). + + then_file_is_ignored( + iv_path = '/CODE/' + iv_filename = 'zfalv.fugr.screen_0200.abap' ). + + ENDMETHOD. + + + METHOD mixed_case. + + given_file( + iv_key = '/SRC/PACKAGE.DEVC.XML' + iv_value = zif_abapgit_definitions=>c_method-add ). + + given_status( + iv_path = '/SrC/' + iv_filename = 'package.devc.xml' ). + + given_local( + iv_path = '/SrC/' + iv_filename = 'package.devc.xml' ). + + when_stage_selected( ). + + then_file_is_added( + iv_path = '/SrC/' + iv_filename = 'package.devc.xml' ). + + ENDMETHOD. + + + METHOD unknown_method. + + given_file( + iv_key = '/SRC/ZDDLS.DDLS.BASEINFO' + iv_value = 'X' ). + + given_status( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + when_stage_selected( ). + + then_error_contains( 'unknown method' ). + + ENDMETHOD. + + + METHOD status_missing. + + given_file( + iv_key = '/SRC/ZDDLS.DDLS.BASEINFO' + iv_value = zif_abapgit_definitions=>c_method-add ). + + when_stage_selected( ). + + then_error_contains( 'Unable to stage' ). + ENDMETHOD. + + + METHOD remove. + + given_file( + iv_key = '/src/zddls.ddls.baseinfo' + iv_value = zif_abapgit_definitions=>c_method-rm ). + + given_status( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + given_local( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + when_stage_selected( ). + + then_file_is_removed( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + ENDMETHOD. + + + METHOD check_selected_rm. + + given_file( + iv_key = '/src/p1/zddls.ddls.baseinfo' + iv_value = zif_abapgit_definitions=>c_method-add ). + + given_file( + iv_key = '/src/p2/zddls.ddls.baseinfo' + iv_value = zif_abapgit_definitions=>c_method-add ). + + given_status( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + given_local( + iv_path = '/src/' + iv_filename = 'zddls.ddls.baseinfo' ). + + when_stage_selected( ). + + then_error_contains( |you have to remove| ). + + ENDMETHOD. + + + METHOD skip. + + given_file( + iv_key = '/src/zddls.ddls.baseinfo' + iv_value = zif_abapgit_definitions=>c_method-skip ). + + when_stage_selected( ). + + then_there_is_nothing_to_stage( ). + + ENDMETHOD. + + + METHOD when_stage_selected. + + TRY. + mo_stage = lcl_selected=>get_instance( )->stage_selected( + ii_event = mo_mock_event + it_status = mt_status + it_local = mt_local ). + + CATCH zcx_abapgit_exception INTO mx_error. + ENDTRY. + + ENDMETHOD. + + + METHOD given_file. + + mo_mock_event->set_file( + iv_key = iv_key + iv_value = iv_value ). + + ENDMETHOD. + + + METHOD given_status. + + DATA ls_status LIKE LINE OF mt_status. + + ls_status-path = iv_path. + ls_status-filename = iv_filename. + INSERT ls_status INTO TABLE mt_status. + + ENDMETHOD. + + + METHOD then_file_is_ignored. + + DATA: lt_stage TYPE zif_abapgit_definitions=>ty_stage_tt. + DATA: ls_exp LIKE LINE OF lt_stage. + + lt_stage = mo_stage->get_all( ). + + ls_exp-file-path = iv_path. + ls_exp-file-filename = iv_filename. + ls_exp-method = zif_abapgit_definitions=>c_method-ignore. + + assert_table_contains( + is_stage = ls_exp + it_stage = lt_stage ). + + ENDMETHOD. + + + METHOD then_file_is_added. + + DATA: lt_stage TYPE zif_abapgit_definitions=>ty_stage_tt. + DATA: ls_exp LIKE LINE OF lt_stage. + + lt_stage = mo_stage->get_all( ). + + ls_exp-file-path = iv_path. + ls_exp-file-filename = iv_filename. + ls_exp-method = zif_abapgit_definitions=>c_method-add. + ls_exp-status-filename = iv_filename. + ls_exp-status-path = iv_path. + + assert_table_contains( + is_stage = ls_exp + it_stage = lt_stage ). + + ENDMETHOD. + + + METHOD then_error_contains. + cl_abap_unit_assert=>assert_text_matches( + pattern = iv_exp_error + text = mx_error->get_text( ) ). + ENDMETHOD. + + + METHOD given_local. + + DATA ls_local LIKE LINE OF mt_local. + + ls_local-file-path = iv_path. + ls_local-file-filename = iv_filename. + INSERT ls_local INTO TABLE mt_local. + + ENDMETHOD. + + + METHOD then_file_is_removed. + + DATA: lt_stage TYPE zif_abapgit_definitions=>ty_stage_tt. + DATA: ls_exp LIKE LINE OF lt_stage. + + lt_stage = mo_stage->get_all( ). + + ls_exp-file-path = iv_path. + ls_exp-file-filename = iv_filename. + ls_exp-method = zif_abapgit_definitions=>c_method-rm. + ls_exp-status-filename = iv_filename. + ls_exp-status-path = iv_path. + + assert_table_contains( + is_stage = ls_exp + it_stage = lt_stage ). + + ENDMETHOD. + + + METHOD then_there_is_nothing_to_stage. + + cl_abap_unit_assert=>assert_initial( mo_stage->get_all( ) ). + + ENDMETHOD. + + + METHOD assert_table_contains. + + FIELD-SYMBOLS: LIKE LINE OF it_stage. + + READ TABLE it_stage WITH TABLE KEY file-path = is_stage-file-path + file-filename = is_stage-file-filename + ASSIGNING . + cl_abap_unit_assert=>assert_subrc( 0 ). + + cl_abap_unit_assert=>assert_equals( + act = + exp = is_stage ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.xml b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.xml index 65bcbede9..c9142c5c2 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.xml +++ b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.xml @@ -10,6 +10,7 @@ X X X + X From 0af09e13bdd19a76548000fba0994e5baabc6842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Sat, 29 Mar 2025 12:43:01 +0100 Subject: [PATCH 4/9] add pragma for secondary key warnings (#7173) Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com> --- src/cts/zcl_abapgit_transport_objects.clas.abap | 2 +- src/repo/utils/zcl_abapgit_repo_news.clas.abap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cts/zcl_abapgit_transport_objects.clas.abap b/src/cts/zcl_abapgit_transport_objects.clas.abap index 3bf344e33..856a9a986 100644 --- a/src/cts/zcl_abapgit_transport_objects.clas.abap +++ b/src/cts/zcl_abapgit_transport_objects.clas.abap @@ -41,7 +41,7 @@ CLASS zcl_abapgit_transport_objects IMPLEMENTATION. " USING KEY sec_key " syntax error in 754 WHERE obj_name = ls_transport_object-obj_name AND obj_type = ls_transport_object-object - AND NOT lstate IS INITIAL. + AND NOT lstate IS INITIAL ##PRIMKEY[SEC_KEY]. CASE ls_object_status-lstate. WHEN zif_abapgit_definitions=>c_state-added OR zif_abapgit_definitions=>c_state-modified. diff --git a/src/repo/utils/zcl_abapgit_repo_news.clas.abap b/src/repo/utils/zcl_abapgit_repo_news.clas.abap index 2c8ea7ffc..3e2b81200 100644 --- a/src/repo/utils/zcl_abapgit_repo_news.clas.abap +++ b/src/repo/utils/zcl_abapgit_repo_news.clas.abap @@ -157,7 +157,7 @@ CLASS zcl_abapgit_repo_news IMPLEMENTATION. LOOP AT lt_remote ASSIGNING " USING KEY file_path " syntax error in 754 WHERE path = lc_log_path - AND ( filename CP lc_log_filename OR filename CP lc_log_filename_up ). + AND ( filename CP lc_log_filename OR filename CP lc_log_filename_up ) ##PRIMKEY[FILE_PATH]. CREATE OBJECT ro_instance EXPORTING From 8984655d8668a211eb9153159d81c174534a3a58 Mon Sep 17 00:00:00 2001 From: Jon Friesen <86265883+frij-aws@users.noreply.github.com> Date: Sat, 29 Mar 2025 07:48:56 -0400 Subject: [PATCH 5/9] delete obsolete objects when pulling in the bgd (#7170) Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com> --- .../zcl_abapgit_background_pull.clas.abap | 9 +++++- .../zcl_abapgit_services_repo.clas.abap | 30 +++++++++---------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/background/zcl_abapgit_background_pull.clas.abap b/src/background/zcl_abapgit_background_pull.clas.abap index 414e248e6..cd5c4585f 100644 --- a/src/background/zcl_abapgit_background_pull.clas.abap +++ b/src/background/zcl_abapgit_background_pull.clas.abap @@ -11,7 +11,7 @@ ENDCLASS. -CLASS zcl_abapgit_background_pull IMPLEMENTATION. +CLASS ZCL_ABAPGIT_BACKGROUND_PULL IMPLEMENTATION. METHOD zif_abapgit_background~get_description. @@ -46,6 +46,13 @@ CLASS zcl_abapgit_background_pull IMPLEMENTATION. lo_settings->set_activate_wo_popup( abap_true ). + + " pass decisions to delete + zcl_abapgit_services_repo=>delete_unnecessary_objects( + io_repo = io_repo + is_checks = ls_checks + ii_log = ii_log ). + io_repo->deserialize( is_checks = ls_checks ii_log = ii_log ). diff --git a/src/ui/routing/zcl_abapgit_services_repo.clas.abap b/src/ui/routing/zcl_abapgit_services_repo.clas.abap index 64b8e73f7..7fdd8215b 100644 --- a/src/ui/routing/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/routing/zcl_abapgit_services_repo.clas.abap @@ -69,23 +69,14 @@ CLASS zcl_abapgit_services_repo DEFINITION RETURNING VALUE(ri_log) TYPE REF TO zif_abapgit_log RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS create_package IMPORTING !iv_prefill_package TYPE devclass OPTIONAL RETURNING VALUE(rv_package) TYPE devclass RAISING - zcx_abapgit_exception. - PROTECTED SECTION. - PRIVATE SECTION. - CLASS-METHODS check_package_exists - IMPORTING - !iv_package TYPE devclass - !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt - RAISING - zcx_abapgit_exception. - + zcx_abapgit_exception . CLASS-METHODS delete_unnecessary_objects IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo @@ -93,6 +84,15 @@ CLASS zcl_abapgit_services_repo DEFINITION !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks RAISING zcx_abapgit_exception . + PROTECTED SECTION. + PRIVATE SECTION. + + CLASS-METHODS check_package_exists + IMPORTING + !iv_package TYPE devclass + !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt + RAISING + zcx_abapgit_exception . CLASS-METHODS popup_decisions IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo @@ -118,17 +118,17 @@ CLASS zcl_abapgit_services_repo DEFINITION zcx_abapgit_exception . CLASS-METHODS raise_error_if_package_exists IMPORTING - iv_devclass TYPE devclass + !iv_devclass TYPE devclass RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS check_for_restart IMPORTING - !io_repo TYPE REF TO zif_abapgit_repo. + !io_repo TYPE REF TO zif_abapgit_repo . ENDCLASS. -CLASS zcl_abapgit_services_repo IMPLEMENTATION. +CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. METHOD activate_objects. From 8e02089f8febfdd15be09d0ccf69bb2d6c441c66 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Sat, 29 Mar 2025 14:05:18 +0100 Subject: [PATCH 6/9] Add "Back" button to diff and where-used pages (#7174) --- src/ui/pages/codi/zcl_abapgit_gui_page_whereused.clas.abap | 5 ++++- src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ui/pages/codi/zcl_abapgit_gui_page_whereused.clas.abap b/src/ui/pages/codi/zcl_abapgit_gui_page_whereused.clas.abap index d20f3e02d..ba7f4383d 100644 --- a/src/ui/pages/codi/zcl_abapgit_gui_page_whereused.clas.abap +++ b/src/ui/pages/codi/zcl_abapgit_gui_page_whereused.clas.abap @@ -229,7 +229,10 @@ CLASS zcl_abapgit_gui_page_whereused IMPLEMENTATION. )->add( iv_txt = 'Refresh' iv_act = c_action-refresh - iv_hotkey = 'r' ). + iv_hotkey = 'r' + )->add( + iv_txt = 'Back' + iv_act = zif_abapgit_definitions=>c_action-go_back ). ENDMETHOD. diff --git a/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap index 5ebd28a75..300b64acc 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_diff_base.clas.abap @@ -398,6 +398,9 @@ CLASS zcl_abapgit_gui_page_diff_base IMPLEMENTATION. add_view_sub_menu( io_menu ). + io_menu->add( iv_txt = 'Back' + iv_act = zif_abapgit_definitions=>c_action-go_back ). + ENDMETHOD. From bc104e396e72ef12d438dc6e5aadcbbe5837e30e Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Mon, 31 Mar 2025 10:14:41 +0200 Subject: [PATCH 7/9] Add "Refresh" to repository list (#7179) --- src/ui/lib/zcl_abapgit_gui_buttons.clas.abap | 17 ++++++++++++++--- .../zcl_abapgit_gui_page_repo_over.clas.abap | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap b/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap index f1a437e63..93d30c86b 100644 --- a/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap +++ b/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap @@ -1,9 +1,10 @@ CLASS zcl_abapgit_gui_buttons DEFINITION PUBLIC FINAL - CREATE PUBLIC . + CREATE PUBLIC. PUBLIC SECTION. + CLASS-METHODS new_online RETURNING VALUE(rv_html_string) TYPE string. @@ -28,6 +29,9 @@ CLASS zcl_abapgit_gui_buttons DEFINITION CLASS-METHODS experimental RETURNING VALUE(rv_html_string) TYPE string. + CLASS-METHODS refresh + RETURNING VALUE(rv_html_string) TYPE string. + PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. @@ -51,6 +55,11 @@ CLASS zcl_abapgit_gui_buttons IMPLEMENTATION. ENDMETHOD. + METHOD flow. + rv_html_string = zcl_abapgit_html=>icon( 'flow' ) && ' Flow'. + ENDMETHOD. + + METHOD help. rv_html_string = zcl_abapgit_html=>icon( iv_name = 'question-circle-solid' @@ -68,8 +77,10 @@ CLASS zcl_abapgit_gui_buttons IMPLEMENTATION. ENDMETHOD. - METHOD flow. - rv_html_string = zcl_abapgit_html=>icon( 'flow' ) && ' Flow'. + METHOD refresh. + rv_html_string = zcl_abapgit_html=>icon( + iv_name = 'redo-alt-solid' + iv_hint = 'Refresh' ). ENDMETHOD. diff --git a/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap index 6b79e09d3..46e2dc81d 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap @@ -56,6 +56,7 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION select TYPE string VALUE 'select', apply_filter TYPE string VALUE 'apply_filter', label_filter TYPE string VALUE 'label_filter', + refresh_list TYPE string VALUE 'refresh_list', END OF c_action, c_label_filter_prefix TYPE string VALUE `label:`, c_raw_field_suffix TYPE string VALUE `_RAW` ##NO_TEXT. @@ -932,6 +933,11 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. save_settings( ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_action-refresh_list. + + zcl_abapgit_repo_srv=>get_instance( )->init( ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ENDCASE. ENDMETHOD. @@ -983,6 +989,11 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. ls_hotkey_action-hotkey = |a|. INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. + ls_hotkey_action-description = |Refresh|. + ls_hotkey_action-action = c_action-refresh_list. + ls_hotkey_action-hotkey = |r|. + INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. + " registered/handled in js ls_hotkey_action-description = |Previous Repository|. ls_hotkey_action-action = `#`. @@ -1024,6 +1035,9 @@ CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. )->add( iv_txt = zcl_abapgit_gui_buttons=>settings( ) iv_act = zif_abapgit_definitions=>c_action-go_settings + )->add( + iv_txt = zcl_abapgit_gui_buttons=>refresh( ) + iv_act = c_action-refresh_list )->add( iv_txt = zcl_abapgit_gui_buttons=>advanced( ) io_sub = zcl_abapgit_gui_menus=>advanced( ) From a0e7a47f7af2791bd385749e3ed4ec5d444a4254 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Mon, 31 Mar 2025 10:43:06 +0200 Subject: [PATCH 8/9] Refactor: Decouple code inspection from factory (#7180) Co-authored-by: Lars Hvam --- .../zcl_abapgit_code_inspector.clas.abap | 62 +++++++++++++++++++ src/repo/zcl_abapgit_repo_online.clas.abap | 2 +- .../zcl_abapgit_gui_page_code_insp.clas.abap | 4 +- .../zcl_abapgit_gui_page_syntax.clas.abap | 4 +- .../zcl_abapgit_gui_page_sett_locl.clas.abap | 4 +- .../zcl_abapgit_popup_code_insp.clas.abap | 2 +- src/zcl_abapgit_factory.clas.abap | 41 ------------ src/zcl_abapgit_injector.clas.abap | 27 -------- 8 files changed, 70 insertions(+), 76 deletions(-) diff --git a/src/inspect/zcl_abapgit_code_inspector.clas.abap b/src/inspect/zcl_abapgit_code_inspector.clas.abap index 9044cb34c..15b99876f 100644 --- a/src/inspect/zcl_abapgit_code_inspector.clas.abap +++ b/src/inspect/zcl_abapgit_code_inspector.clas.abap @@ -13,6 +13,19 @@ CLASS zcl_abapgit_code_inspector DEFINITION RAISING zcx_abapgit_exception . + CLASS-METHODS get_code_inspector + IMPORTING + !iv_package TYPE devclass + RETURNING + VALUE(ri_code_inspector) TYPE REF TO zif_abapgit_code_inspector + RAISING + zcx_abapgit_exception. + + CLASS-METHODS set_code_inspector + IMPORTING + !iv_package TYPE devclass + !ii_code_inspector TYPE REF TO zif_abapgit_code_inspector. + PROTECTED SECTION. DATA mv_package TYPE devclass . @@ -35,6 +48,15 @@ CLASS zcl_abapgit_code_inspector DEFINITION VALUE(rv_skip) TYPE abap_bool. PRIVATE SECTION. + TYPES: + BEGIN OF ty_code_inspector_pack, + package TYPE devclass, + instance TYPE REF TO zif_abapgit_code_inspector, + END OF ty_code_inspector_pack, + ty_code_inspector_packs TYPE HASHED TABLE OF ty_code_inspector_pack WITH UNIQUE KEY package. + + CLASS-DATA gt_code_inspector TYPE ty_code_inspector_packs. + DATA mv_success TYPE abap_bool . DATA mv_summary TYPE string. @@ -266,6 +288,28 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION. ENDMETHOD. + METHOD get_code_inspector. + + DATA ls_code_inspector LIKE LINE OF gt_code_inspector. + + FIELD-SYMBOLS TYPE ty_code_inspector_pack. + + READ TABLE gt_code_inspector ASSIGNING WITH TABLE KEY package = iv_package. + IF sy-subrc <> 0. + ls_code_inspector-package = iv_package. + + CREATE OBJECT ls_code_inspector-instance TYPE zcl_abapgit_code_inspector + EXPORTING + iv_package = iv_package. + + INSERT ls_code_inspector INTO TABLE gt_code_inspector ASSIGNING . + ENDIF. + + ri_code_inspector = -instance. + + ENDMETHOD. + + METHOD run_inspection. io_inspection->run( @@ -290,6 +334,24 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION. ENDMETHOD. + METHOD set_code_inspector. + + DATA ls_code_inspector LIKE LINE OF gt_code_inspector. + + FIELD-SYMBOLS LIKE LINE OF gt_code_inspector. + + READ TABLE gt_code_inspector ASSIGNING WITH TABLE KEY package = iv_package. + IF sy-subrc <> 0. + ls_code_inspector-package = iv_package. + + INSERT ls_code_inspector INTO TABLE gt_code_inspector ASSIGNING . + ENDIF. + + -instance = ii_code_inspector. + + ENDMETHOD. + + METHOD skip_object. DATA ls_program_type TYPE subc. diff --git a/src/repo/zcl_abapgit_repo_online.clas.abap b/src/repo/zcl_abapgit_repo_online.clas.abap index 735977e77..c187a9396 100644 --- a/src/repo/zcl_abapgit_repo_online.clas.abap +++ b/src/repo/zcl_abapgit_repo_online.clas.abap @@ -273,7 +273,7 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. ENDIF. IF ms_data-local_settings-block_commit = abap_true - AND zcl_abapgit_factory=>get_code_inspector( get_package( ) + AND zcl_abapgit_code_inspector=>get_code_inspector( get_package( ) )->is_successful( ) = abap_false. zcx_abapgit_exception=>raise( |A successful code inspection is required| ). ENDIF. diff --git a/src/ui/pages/codi/zcl_abapgit_gui_page_code_insp.clas.abap b/src/ui/pages/codi/zcl_abapgit_gui_page_code_insp.clas.abap index 1c9182175..dffcc35b9 100644 --- a/src/ui/pages/codi/zcl_abapgit_gui_page_code_insp.clas.abap +++ b/src/ui/pages/codi/zcl_abapgit_gui_page_code_insp.clas.abap @@ -70,7 +70,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_CODE_INSP IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION. METHOD ask_user_for_check_variant. @@ -151,7 +151,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_CODE_INSP IMPLEMENTATION. DATA li_code_inspector TYPE REF TO zif_abapgit_code_inspector. - li_code_inspector = zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) ). + li_code_inspector = zcl_abapgit_code_inspector=>get_code_inspector( mo_repo->get_package( ) ). mt_result = li_code_inspector->run( iv_variant = |{ mv_check_variant }| diff --git a/src/ui/pages/codi/zcl_abapgit_gui_page_syntax.clas.abap b/src/ui/pages/codi/zcl_abapgit_gui_page_syntax.clas.abap index 5b84eb3c1..6b8ad4509 100644 --- a/src/ui/pages/codi/zcl_abapgit_gui_page_syntax.clas.abap +++ b/src/ui/pages/codi/zcl_abapgit_gui_page_syntax.clas.abap @@ -41,7 +41,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_syntax IMPLEMENTATION. METHOD constructor. @@ -68,7 +68,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SYNTAX IMPLEMENTATION. DATA: li_syntax_check TYPE REF TO zif_abapgit_code_inspector. - li_syntax_check = zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) ). + li_syntax_check = zcl_abapgit_code_inspector=>get_code_inspector( mo_repo->get_package( ) ). TRY. mt_result = li_syntax_check->run( c_variant ). diff --git a/src/ui/pages/sett/zcl_abapgit_gui_page_sett_locl.clas.abap b/src/ui/pages/sett/zcl_abapgit_gui_page_sett_locl.clas.abap index b45fb66d0..7ff290df6 100644 --- a/src/ui/pages/sett/zcl_abapgit_gui_page_sett_locl.clas.abap +++ b/src/ui/pages/sett/zcl_abapgit_gui_page_sett_locl.clas.abap @@ -104,7 +104,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_sett_locl IMPLEMENTATION. METHOD choose_check_variant. @@ -471,7 +471,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. lv_check_variant = to_upper( io_form_data->get( c_id-code_inspector_check_variant ) ). IF lv_check_variant IS NOT INITIAL. TRY. - zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) + zcl_abapgit_code_inspector=>get_code_inspector( mo_repo->get_package( ) )->validate_check_variant( lv_check_variant ). CATCH zcx_abapgit_exception INTO lx_error. ro_validation_log->set( diff --git a/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap index 09b14720c..c845fc8f6 100644 --- a/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap +++ b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap @@ -34,7 +34,7 @@ CLASS zcl_abapgit_popup_code_insp IMPLEMENTATION. METHOD fetch_list. - rt_list = zcl_abapgit_factory=>get_code_inspector( '$TMP' )->list_global_variants( ). + rt_list = zcl_abapgit_code_inspector=>get_code_inspector( '$TMP' )->list_global_variants( ). ENDMETHOD. diff --git a/src/zcl_abapgit_factory.clas.abap b/src/zcl_abapgit_factory.clas.abap index 3ce5e27db..edab35a26 100644 --- a/src/zcl_abapgit_factory.clas.abap +++ b/src/zcl_abapgit_factory.clas.abap @@ -13,13 +13,6 @@ CLASS zcl_abapgit_factory DEFINITION !iv_package TYPE devclass RETURNING VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package . - CLASS-METHODS get_code_inspector - IMPORTING - !iv_package TYPE devclass - RETURNING - VALUE(ri_code_inspector) TYPE REF TO zif_abapgit_code_inspector - RAISING - zcx_abapgit_exception . CLASS-METHODS get_cts_api RETURNING VALUE(ri_cts_api) TYPE REF TO zif_abapgit_cts_api . @@ -60,18 +53,9 @@ CLASS zcl_abapgit_factory DEFINITION TYPES: ty_sap_packages TYPE HASHED TABLE OF ty_sap_package WITH UNIQUE KEY package . - TYPES: - BEGIN OF ty_code_inspector_pack, - package TYPE devclass, - instance TYPE REF TO zif_abapgit_code_inspector, - END OF ty_code_inspector_pack . - TYPES: - ty_code_inspector_packs TYPE HASHED TABLE OF ty_code_inspector_pack - WITH UNIQUE KEY package . CLASS-DATA gi_tadir TYPE REF TO zif_abapgit_tadir . CLASS-DATA gt_sap_package TYPE ty_sap_packages . - CLASS-DATA gt_code_inspector TYPE ty_code_inspector_packs . CLASS-DATA gi_cts_api TYPE REF TO zif_abapgit_cts_api . CLASS-DATA gi_environment TYPE REF TO zif_abapgit_environment . CLASS-DATA gi_longtext TYPE REF TO zif_abapgit_longtexts . @@ -88,31 +72,6 @@ ENDCLASS. CLASS zcl_abapgit_factory IMPLEMENTATION. - METHOD get_code_inspector. - - DATA: ls_code_inspector LIKE LINE OF gt_code_inspector. - FIELD-SYMBOLS: TYPE ty_code_inspector_pack. - - READ TABLE gt_code_inspector ASSIGNING - WITH TABLE KEY package = iv_package. - IF sy-subrc <> 0. - ls_code_inspector-package = iv_package. - - CREATE OBJECT ls_code_inspector-instance TYPE zcl_abapgit_code_inspector - EXPORTING - iv_package = iv_package. - - INSERT ls_code_inspector - INTO TABLE gt_code_inspector - ASSIGNING . - - ENDIF. - - ri_code_inspector = -instance. - - ENDMETHOD. - - METHOD get_cts_api. IF gi_cts_api IS NOT BOUND. CREATE OBJECT gi_cts_api TYPE zcl_abapgit_cts_api. diff --git a/src/zcl_abapgit_injector.clas.abap b/src/zcl_abapgit_injector.clas.abap index ca20461a8..2261c7d8c 100644 --- a/src/zcl_abapgit_injector.clas.abap +++ b/src/zcl_abapgit_injector.clas.abap @@ -12,10 +12,6 @@ CLASS zcl_abapgit_injector DEFINITION IMPORTING !iv_package TYPE devclass !ii_sap_package TYPE REF TO zif_abapgit_sap_package . - CLASS-METHODS set_code_inspector - IMPORTING - !iv_package TYPE devclass - !ii_code_inspector TYPE REF TO zif_abapgit_code_inspector . CLASS-METHODS set_cts_api IMPORTING !ii_cts_api TYPE REF TO zif_abapgit_cts_api . @@ -52,29 +48,6 @@ ENDCLASS. CLASS zcl_abapgit_injector IMPLEMENTATION. - METHOD set_code_inspector. - - DATA: ls_code_inspector LIKE LINE OF zcl_abapgit_factory=>gt_code_inspector. - FIELD-SYMBOLS: LIKE LINE OF zcl_abapgit_factory=>gt_code_inspector. - - READ TABLE zcl_abapgit_factory=>gt_code_inspector - ASSIGNING - WITH TABLE KEY package = iv_package. - IF sy-subrc <> 0. - - ls_code_inspector-package = iv_package. - - INSERT ls_code_inspector - INTO TABLE zcl_abapgit_factory=>gt_code_inspector - ASSIGNING . - - ENDIF. - - -instance = ii_code_inspector. - - ENDMETHOD. - - METHOD set_cts_api. zcl_abapgit_factory=>gi_cts_api = ii_cts_api. ENDMETHOD. From d9c4483cc209a832c068f4f5e59622c0bb58c0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Mon, 31 Mar 2025 13:55:41 +0200 Subject: [PATCH 9/9] Fix AFF unit tests for lower releases (#7181) --- ...it_object_common_aff.clas.testclasses.abap | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap b/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap index 0d46738a8..fb8fefa33 100644 --- a/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap +++ b/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap @@ -228,39 +228,40 @@ CLASS ltcl_aff_settings_deserialize IMPLEMENTATION. TRY. lo_settings_deserialize = lo_cut->create_aff_setting_deserialize( ). + + CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_ABAP_LANGUAGE_VERSION') + RECEIVING + result = lv_act_setting_abap_lv. + cl_abap_unit_assert=>assert_equals( msg = 'Unexpected ABAP language version in settings' + act = lv_act_setting_abap_lv + exp = iv_exp_setting_abap_lv ). + + CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_VERSION') + RECEIVING + result = lv_act_setting_version. + cl_abap_unit_assert=>assert_equals( msg = 'Unexpected Version in settings' + act = lv_act_setting_version + exp = 'A' ). + + CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_LANGUAGE') + RECEIVING + result = lv_act_setting_language. + cl_abap_unit_assert=>assert_equals( msg = 'Unexpected Language in settings' + act = lv_act_setting_language + exp = 'E' ). + + CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_USER') + RECEIVING + result = lv_act_setting_user. + cl_abap_unit_assert=>assert_equals( msg = 'Unexpected User in settings' + act = lv_act_setting_user + exp = sy-uname ). + CATCH cx_root. " System doesn't support AFF with ABAP language version RETURN. ENDTRY. - CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_ABAP_LANGUAGE_VERSION') - RECEIVING - result = lv_act_setting_abap_lv. - cl_abap_unit_assert=>assert_equals( msg = 'Unexpected ABAP language version in settings' - act = lv_act_setting_abap_lv - exp = iv_exp_setting_abap_lv ). - - CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_VERSION') - RECEIVING - result = lv_act_setting_version. - cl_abap_unit_assert=>assert_equals( msg = 'Unexpected Version in settings' - act = lv_act_setting_version - exp = 'A' ). - - CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_LANGUAGE') - RECEIVING - result = lv_act_setting_language. - cl_abap_unit_assert=>assert_equals( msg = 'Unexpected Language in settings' - act = lv_act_setting_language - exp = 'E' ). - - CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_USER') - RECEIVING - result = lv_act_setting_user. - cl_abap_unit_assert=>assert_equals( msg = 'Unexpected User in settings' - act = lv_act_setting_user - exp = sy-uname ). - ENDMETHOD. METHOD abap_language_version_standard.