From 53343a98d61975cdc42a990e524e7582dce63929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Fri, 5 Nov 2021 05:32:39 +0100 Subject: [PATCH] Files: Introduce secondary keys (#5101) Co-authored-by: Lars Hvam --- .../zcl_abapgit_background_push_au.clas.abap | 1 + src/data/zcl_abapgit_data_config.clas.abap | 4 +++- .../zcl_abapgit_data_deserializer.clas.abap | 7 ++++--- .../core/zcl_abapgit_file_status.clas.abap | 3 ++- .../core/zcl_abapgit_objects_files.clas.abap | 20 +++++++++++++------ src/objects/zcl_abapgit_object_smim.clas.abap | 4 +++- src/objects/zcl_abapgit_objects.clas.abap | 3 ++- src/repo/zcl_abapgit_repo.clas.abap | 13 +++++++----- .../zcl_abapgit_repo_content_list.clas.abap | 5 +++-- src/repo/zcl_abapgit_repo_online.clas.abap | 3 ++- src/ui/zcl_abapgit_gui_page_diff.clas.abap | 5 +++-- src/zif_abapgit_definitions.intf.abap | 4 +++- 12 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/background/zcl_abapgit_background_push_au.clas.abap b/src/background/zcl_abapgit_background_push_au.clas.abap index 86e014232..a8bcdfc3c 100644 --- a/src/background/zcl_abapgit_background_push_au.clas.abap +++ b/src/background/zcl_abapgit_background_push_au.clas.abap @@ -153,6 +153,7 @@ CLASS zcl_abapgit_background_push_au IMPLEMENTATION. APPEND TO ls_user_files-local. LOOP AT ls_files-remote ASSIGNING + USING KEY file WHERE filename = -file-filename AND path <> -file-path AND filename <> 'package.devc.xml'. diff --git a/src/data/zcl_abapgit_data_config.clas.abap b/src/data/zcl_abapgit_data_config.clas.abap index 46891fb46..973186ebd 100644 --- a/src/data/zcl_abapgit_data_config.clas.abap +++ b/src/data/zcl_abapgit_data_config.clas.abap @@ -65,7 +65,9 @@ CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION. DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error. CLEAR mt_config. - LOOP AT it_files INTO ls_file WHERE path = zif_abapgit_data_config=>c_default_path + LOOP AT it_files INTO ls_file + USING KEY file_path + WHERE path = zif_abapgit_data_config=>c_default_path AND filename CP |*.{ zif_abapgit_data_config=>c_config }.{ zif_abapgit_data_config=>c_default_format }|. TRY. lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( ls_file-data ) ). diff --git a/src/data/zcl_abapgit_data_deserializer.clas.abap b/src/data/zcl_abapgit_data_deserializer.clas.abap index b4b831286..cd1337e19 100644 --- a/src/data/zcl_abapgit_data_deserializer.clas.abap +++ b/src/data/zcl_abapgit_data_deserializer.clas.abap @@ -185,9 +185,10 @@ CLASS ZCL_ABAPGIT_DATA_DESERIALIZER IMPLEMENTATION. lr_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ). - READ TABLE it_files INTO ls_file WITH KEY - path = zif_abapgit_data_config=>c_default_path - filename = zcl_abapgit_data_utils=>build_filename( ls_config ). + READ TABLE it_files INTO ls_file + WITH KEY file_path + COMPONENTS path = zif_abapgit_data_config=>c_default_path + filename = zcl_abapgit_data_utils=>build_filename( ls_config ). IF sy-subrc = 0. convert_json_to_itab( ir_data = lr_data diff --git a/src/objects/core/zcl_abapgit_file_status.clas.abap b/src/objects/core/zcl_abapgit_file_status.clas.abap index b461f8300..3be6bc00a 100644 --- a/src/objects/core/zcl_abapgit_file_status.clas.abap +++ b/src/objects/core/zcl_abapgit_file_status.clas.abap @@ -656,7 +656,8 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION. = build_new_local( ). " Check if same file exists in different location READ TABLE ct_remote ASSIGNING - WITH KEY filename = -file-filename. + WITH KEY file + COMPONENTS filename = -file-filename. IF sy-subrc = 0 AND -file-sha1 = -sha1. -packmove = abap_true. ELSEIF sy-subrc = 4. diff --git a/src/objects/core/zcl_abapgit_objects_files.clas.abap b/src/objects/core/zcl_abapgit_objects_files.clas.abap index 7a91784bb..10ba90b62 100644 --- a/src/objects/core/zcl_abapgit_objects_files.clas.abap +++ b/src/objects/core/zcl_abapgit_objects_files.clas.abap @@ -212,10 +212,14 @@ CLASS zcl_abapgit_objects_files IMPLEMENTATION. iv_ext = iv_ext ). IF mv_path IS NOT INITIAL. - READ TABLE mt_files TRANSPORTING NO FIELDS WITH KEY path = mv_path - filename = lv_filename. + READ TABLE mt_files TRANSPORTING NO FIELDS + WITH KEY file_path + COMPONENTS path = mv_path + filename = lv_filename. ELSE. - READ TABLE mt_files TRANSPORTING NO FIELDS WITH KEY filename = lv_filename. + READ TABLE mt_files TRANSPORTING NO FIELDS + WITH KEY file + COMPONENTS filename = lv_filename. ENDIF. IF sy-subrc = 0. @@ -277,10 +281,14 @@ CLASS zcl_abapgit_objects_files IMPLEMENTATION. IF mv_path IS NOT INITIAL. - READ TABLE mt_files ASSIGNING WITH KEY path = mv_path - filename = iv_filename. + READ TABLE mt_files ASSIGNING + WITH KEY file_path + COMPONENTS path = mv_path + filename = iv_filename. ELSE. - READ TABLE mt_files ASSIGNING WITH KEY filename = iv_filename. + READ TABLE mt_files ASSIGNING + WITH KEY file + COMPONENTS filename = iv_filename. ENDIF. IF sy-subrc <> 0. diff --git a/src/objects/zcl_abapgit_object_smim.clas.abap b/src/objects/zcl_abapgit_object_smim.clas.abap index 84790362b..7d3ab1ef7 100644 --- a/src/objects/zcl_abapgit_object_smim.clas.abap +++ b/src/objects/zcl_abapgit_object_smim.clas.abap @@ -55,7 +55,9 @@ CLASS zcl_abapgit_object_smim IMPLEMENTATION. lt_files = mo_files->get_files( ). - READ TABLE lt_files ASSIGNING WITH KEY filename = lv_filename. + READ TABLE lt_files ASSIGNING + WITH KEY file + COMPONENTS filename = lv_filename. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'SMIM, file not found' ). ENDIF. diff --git a/src/objects/zcl_abapgit_objects.clas.abap b/src/objects/zcl_abapgit_objects.clas.abap index 4b756d12b..7595acbbd 100644 --- a/src/objects/zcl_abapgit_objects.clas.abap +++ b/src/objects/zcl_abapgit_objects.clas.abap @@ -341,7 +341,8 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. RETURN. ENDIF. - READ TABLE it_remote WITH KEY filename = is_result-filename INTO ls_remote_file. + READ TABLE it_remote WITH KEY file + COMPONENTS filename = is_result-filename INTO ls_remote_file. IF sy-subrc <> 0. "if file does not exist in remote, we don't need to validate RETURN. ENDIF. diff --git a/src/repo/zcl_abapgit_repo.clas.abap b/src/repo/zcl_abapgit_repo.clas.abap index c8a2ef1f0..0e9a0706e 100644 --- a/src/repo/zcl_abapgit_repo.clas.abap +++ b/src/repo/zcl_abapgit_repo.clas.abap @@ -414,8 +414,9 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. get_files_remote( ). READ TABLE mt_remote ASSIGNING - WITH KEY path = zif_abapgit_definitions=>c_root_dir - filename = zif_abapgit_definitions=>c_dot_abapgit. + WITH KEY file_path + COMPONENTS path = zif_abapgit_definitions=>c_root_dir + filename = zif_abapgit_definitions=>c_dot_abapgit. IF sy-subrc = 0. ro_dot = zcl_abapgit_dot_abapgit=>deserialize( -data ). set_dot_abapgit( ro_dot ). @@ -432,8 +433,9 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. get_files_remote( ). READ TABLE mt_remote ASSIGNING - WITH KEY path = zif_abapgit_definitions=>c_root_dir - filename = zif_abapgit_apack_definitions=>c_dot_apack_manifest. + WITH KEY file_path + COMPONENTS path = zif_abapgit_definitions=>c_root_dir + filename = zif_abapgit_apack_definitions=>c_dot_apack_manifest. IF sy-subrc = 0. ro_dot = zcl_abapgit_apack_reader=>deserialize( iv_package_name = ms_data-package iv_xstr = -data ). @@ -458,7 +460,8 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. mi_data_config = ri_config. READ TABLE mt_remote ASSIGNING - WITH KEY path = zif_abapgit_data_config=>c_default_path. + WITH KEY file_path + COMPONENTS path = zif_abapgit_data_config=>c_default_path. IF sy-subrc = 0. ri_config->from_json( mt_remote ). ENDIF. diff --git a/src/repo/zcl_abapgit_repo_content_list.clas.abap b/src/repo/zcl_abapgit_repo_content_list.clas.abap index 0360286d9..8be0511e3 100644 --- a/src/repo/zcl_abapgit_repo_content_list.clas.abap +++ b/src/repo/zcl_abapgit_repo_content_list.clas.abap @@ -226,8 +226,9 @@ CLASS ZCL_ABAPGIT_REPO_CONTENT_LIST IMPLEMENTATION. IF lines( lt_remote ) > lc_new_repo_size. " Less files means it's a new repo (with just readme and license, for example) which is ok READ TABLE lt_remote TRANSPORTING NO FIELDS - WITH KEY path = zif_abapgit_definitions=>c_root_dir - filename = zif_abapgit_definitions=>c_dot_abapgit. + WITH KEY file_path + COMPONENTS path = zif_abapgit_definitions=>c_root_dir + filename = zif_abapgit_definitions=>c_dot_abapgit. IF sy-subrc <> 0. mi_log->add_warning( |Cannot find .abapgit.xml - Is this an abapGit repository?| ). ENDIF. diff --git a/src/repo/zcl_abapgit_repo_online.clas.abap b/src/repo/zcl_abapgit_repo_online.clas.abap index 24a119ee5..ebc4ab51d 100644 --- a/src/repo/zcl_abapgit_repo_online.clas.abap +++ b/src/repo/zcl_abapgit_repo_online.clas.abap @@ -88,7 +88,8 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. IF zcl_abapgit_objects=>exists( ls_item ) = abap_false. " Check if any package is included in remote READ TABLE mt_remote TRANSPORTING NO FIELDS - WITH KEY filename = zcl_abapgit_filename_logic=>c_package_file. + WITH KEY file + COMPONENTS filename = zcl_abapgit_filename_logic=>c_package_file. IF sy-subrc <> 0. " If not, prompt to create it lv_package = zcl_abapgit_services_basis=>create_package( iv_package ). diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap index 4946be47c..0e26ae8b8 100644 --- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap @@ -381,8 +381,9 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. READ TABLE it_remote ASSIGNING - WITH KEY filename = is_status-filename - path = is_status-path. + WITH KEY file_path + COMPONENTS path = is_status-path + filename = is_status-filename. IF sy-subrc <> 0. ASSIGN ls_r_dummy TO . ENDIF. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 63a40838f..abf885be6 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -30,7 +30,9 @@ INTERFACE zif_abapgit_definitions TYPES: data TYPE xstring, END OF ty_file . TYPES: - ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY . + ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY + WITH UNIQUE SORTED KEY file_path COMPONENTS path filename + WITH NON-UNIQUE SORTED KEY file COMPONENTS filename. TYPES: ty_string_tt TYPE STANDARD TABLE OF string WITH DEFAULT KEY . TYPES ty_git_branch_type TYPE c LENGTH 2 .