diff --git a/abaplint.json b/abaplint.json index b2a79151d..d65088210 100644 --- a/abaplint.json +++ b/abaplint.json @@ -174,6 +174,7 @@ "^cl_srvd_wb_object_data$", "^cl_wb_object_operator_factory$", "^cl_wer_const$", + "^cl_xco_", "^cx_aff_", "^cx_wb_object_operation_error$", "^cx_xco_", @@ -188,10 +189,12 @@ "^if_wb_adt_plugin_resource_co$", "^if_wb_object_data_selection_co$", "^if_wb_object_operator$", + "^if_xco_", "^int4$", "^numc2$", "^sabp_t_tadir_keys$", "^sap_bool$", + "^srcsystem$", "^stringtab$", "^sychar01$", "^sychar10$", diff --git a/src/objects/zcl_abapgit_objects.clas.abap b/src/objects/zcl_abapgit_objects.clas.abap index 739c166bf..08e46f490 100644 --- a/src/objects/zcl_abapgit_objects.clas.abap +++ b/src/objects/zcl_abapgit_objects.clas.abap @@ -149,6 +149,20 @@ CLASS zcl_abapgit_objects DEFINITION !ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt RAISING zcx_abapgit_exception . + CLASS-METHODS check_original_system + IMPORTING + !it_items TYPE zif_abapgit_definitions=>ty_items_tt + !ii_log TYPE REF TO zif_abapgit_log + !io_dot TYPE REF TO zcl_abapgit_dot_abapgit + RAISING + zcx_abapgit_exception . + CLASS-METHODS update_original_system + IMPORTING + !it_items TYPE zif_abapgit_definitions=>ty_items_tt + !ii_log TYPE REF TO zif_abapgit_log + !io_dot TYPE REF TO zcl_abapgit_dot_abapgit + RAISING + zcx_abapgit_exception . CLASS-METHODS check_objects_locked IMPORTING !it_items TYPE zif_abapgit_definitions=>ty_items_tt @@ -340,6 +354,35 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. ENDMETHOD. + METHOD check_original_system. + + DATA: + lv_srcsystem TYPE tadir-srcsystem, + lv_error TYPE abap_bool. + + FIELD-SYMBOLS LIKE LINE OF it_items. + + lv_srcsystem = io_dot->get_original_system( ). + IF lv_srcsystem IS INITIAL. + RETURN. + ENDIF. + + ii_log->add_info( |>> Checking original system| ). + + LOOP AT it_items ASSIGNING WHERE srcsystem <> lv_srcsystem AND srcsystem IS NOT INITIAL. + ii_log->add_error( + iv_msg = |Object belongs to system { -srcsystem }. Can't overwrite it from system { lv_srcsystem }| + is_item = ). + lv_error = abap_true. + ENDLOOP. + + IF lv_error = abap_true. + zcx_abapgit_exception=>raise( 'Error trying to overwrite object from different system' ). + ENDIF. + + ENDMETHOD. + + METHOD class_name. CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type INTO rv_class_name. @@ -678,6 +721,12 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. check_objects_locked( lt_items ). + " Check the original system of all objects to prevent overwritting + check_original_system( + it_items = lt_items + ii_log = ii_log + io_dot = io_repo->get_dot_abapgit( ) ). + lo_i18n_params = zcl_abapgit_i18n_params=>new( is_params = determine_i18n_params( io_dot = io_repo->get_dot_abapgit( ) iv_main_language_only = io_repo->get_local_settings( )-main_language_only ) ). @@ -792,7 +841,6 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. io_files = lo_files ). ENDIF. - CATCH zcx_abapgit_exception INTO lx_exc. ii_log->add_exception( ix_exc = lx_exc is_item = ls_item ). @@ -819,6 +867,12 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. update_package_tree( io_repo->get_package( ) ). + " Set the original system for all updated objects to what's defined in repo settings + update_original_system( + it_items = lt_items + ii_log = ii_log + io_dot = io_repo->get_dot_abapgit( ) ). + zcl_abapgit_factory=>get_default_transport( )->reset( ). lo_timer->end( abap_true ). @@ -1134,9 +1188,11 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. LOOP AT it_results ASSIGNING . - ls_item-devclass = -package. - ls_item-obj_type = -obj_type. - ls_item-obj_name = -obj_name. + ls_item-devclass = -package. + ls_item-obj_type = -obj_type. + ls_item-obj_name = -obj_name. + ls_item-srcsystem = -srcsystem. + ls_item-origlang = -origlang. INSERT ls_item INTO TABLE rt_items. ENDLOOP. @@ -1151,9 +1207,11 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. LOOP AT it_tadir ASSIGNING . - ls_item-devclass = -devclass. - ls_item-obj_type = -object. - ls_item-obj_name = -obj_name. + ls_item-devclass = -devclass. + ls_item-obj_type = -object. + ls_item-obj_name = -obj_name. + ls_item-srcsystem = -srcsystem. + ls_item-origlang = -masterlang. INSERT ls_item INTO TABLE rt_items. ENDLOOP. @@ -1275,6 +1333,72 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. ENDMETHOD. + METHOD update_original_system. + + DATA lv_srcsystem TYPE tadir-srcsystem. + DATA lv_msg TYPE string. + + FIELD-SYMBOLS LIKE LINE OF it_items. + + lv_srcsystem = io_dot->get_original_system( ). + IF lv_srcsystem IS INITIAL. + RETURN. + ENDIF. + + ii_log->add_info( |>> Setting original system| ). + + LOOP AT it_items ASSIGNING . + " Local packages are not stored in TADIR + IF -obj_type = 'DEVC' AND -obj_name(1) = '$'. + CONTINUE. + ENDIF. + IF exists( ) = abap_true. + CALL FUNCTION 'TR_TADIR_INTERFACE' + EXPORTING + wi_tadir_pgmid = 'R3TR' + wi_tadir_object = -obj_type + wi_tadir_obj_name = -obj_name + wi_tadir_srcsystem = lv_srcsystem + wi_test_modus = abap_false + EXCEPTIONS + tadir_entry_not_existing = 1 + tadir_entry_ill_type = 2 + no_systemname = 3 + no_systemtype = 4 + original_system_conflict = 5 + object_reserved_for_devclass = 6 + object_exists_global = 7 + object_exists_local = 8 + object_is_distributed = 9 + obj_specification_not_unique = 10 + no_authorization_to_delete = 11 + devclass_not_existing = 12 + simultanious_set_remove_repair = 13 + order_missing = 14 + no_modification_of_head_syst = 15 + pgmid_object_not_allowed = 16 + masterlanguage_not_specified = 17 + devclass_not_specified = 18 + specify_owner_unique = 19 + loc_priv_objs_no_repair = 20 + gtadir_not_reached = 21 + object_locked_for_order = 22 + change_of_class_not_allowed = 23 + no_change_from_sap_to_tmp = 24 + OTHERS = 25. + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg. + ii_log->add_error( + iv_msg = lv_msg + is_item = ). + ENDIF. + ENDIF. + ENDLOOP. + + ENDMETHOD. + + METHOD update_package_tree. DATA: lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt, diff --git a/src/repo/zcl_abapgit_dot_abapgit.clas.abap b/src/repo/zcl_abapgit_dot_abapgit.clas.abap index f375d4dcb..6e99b6677 100644 --- a/src/repo/zcl_abapgit_dot_abapgit.clas.abap +++ b/src/repo/zcl_abapgit_dot_abapgit.clas.abap @@ -103,6 +103,13 @@ CLASS zcl_abapgit_dot_abapgit DEFINITION METHODS set_abap_language_version IMPORTING !iv_abap_language_version TYPE string . + METHODS get_original_system + RETURNING + VALUE(rv_original_system) TYPE string . + METHODS set_original_system + IMPORTING + !iv_original_system TYPE csequence . + PROTECTED SECTION. PRIVATE SECTION. @@ -234,6 +241,11 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. ENDMETHOD. + METHOD get_original_system. + rv_original_system = ms_data-original_system. + ENDMETHOD. + + METHOD get_requirements. rt_requirements = ms_data-requirements. ENDMETHOD. @@ -343,6 +355,11 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. ENDMETHOD. + METHOD set_original_system. + ms_data-original_system = iv_original_system. + ENDMETHOD. + + METHOD set_requirements. ms_data-requirements = it_requirements. ENDMETHOD. diff --git a/src/repo/zcl_abapgit_repo_status.clas.abap b/src/repo/zcl_abapgit_repo_status.clas.abap index 571ed1990..19088d53f 100644 --- a/src/repo/zcl_abapgit_repo_status.clas.abap +++ b/src/repo/zcl_abapgit_repo_status.clas.abap @@ -220,8 +220,8 @@ CLASS zcl_abapgit_repo_status IMPLEMENTATION. rs_result-obj_type = ls_item-obj_type. rs_result-obj_name = ls_item-obj_name. rs_result-package = ls_item-devclass. - rs_result-srcsystem = sy-sysid. - rs_result-origlang = sy-langu. + rs_result-srcsystem = ''. + rs_result-origlang = ''. READ TABLE it_state_idx INTO ls_file_sig WITH KEY diff --git a/src/repo/zif_abapgit_dot_abapgit.intf.abap b/src/repo/zif_abapgit_dot_abapgit.intf.abap index 4efa71d27..22b28e0ee 100644 --- a/src/repo/zif_abapgit_dot_abapgit.intf.abap +++ b/src/repo/zif_abapgit_dot_abapgit.intf.abap @@ -21,6 +21,7 @@ INTERFACE zif_abapgit_dot_abapgit PUBLIC. requirements TYPE ty_requirement_tt, version_constant TYPE string, abap_language_version TYPE string, + original_system TYPE tadir-srcsystem, END OF ty_dot_abapgit . CONSTANTS: diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap index 52b634a29..e959a83ed 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap @@ -42,6 +42,7 @@ CLASS zcl_abapgit_gui_page_sett_repo DEFINITION version_constant TYPE string VALUE 'version_constant', version_value TYPE string VALUE 'version_value', abap_langu_vers TYPE string VALUE 'abap_langu_vers', + original_system TYPE string VALUE 'original_system', END OF c_id. CONSTANTS: BEGIN OF c_event, @@ -193,7 +194,13 @@ CLASS zcl_abapgit_gui_page_sett_repo IMPLEMENTATION. iv_width = '30%' )->column( iv_label = 'Minimum Patch' - iv_width = '30%' ). + iv_width = '30%' + )->text( + iv_name = c_id-original_system + iv_label = 'Original System' + iv_upper_case = abap_true + iv_max = 3 + iv_hint = 'Sets the source system of objects during deserialize in downstream systems' ). IF zcl_abapgit_feature=>is_enabled( zcl_abapgit_abap_language_vers=>c_feature_flag ) = abap_true. ro_form->radio( @@ -332,6 +339,10 @@ CLASS zcl_abapgit_gui_page_sett_repo IMPLEMENTATION. iv_val = ls_dot-abap_language_version ). ENDIF. + ro_form_data->set( + iv_key = c_id-original_system + iv_val = ls_dot-original_system ). + ENDMETHOD. @@ -350,6 +361,7 @@ CLASS zcl_abapgit_gui_page_sett_repo IMPLEMENTATION. lo_dot->set_folder_logic( mo_form_data->get( c_id-folder_logic ) ). lo_dot->set_starting_folder( mo_form_data->get( c_id-starting_folder ) ). lo_dot->set_version_constant( mo_form_data->get( c_id-version_constant ) ). + lo_dot->set_original_system( mo_form_data->get( c_id-original_system ) ). IF zcl_abapgit_feature=>is_enabled( zcl_abapgit_abap_language_vers=>c_feature_flag ) = abap_true. lo_dot->set_abap_language_version( mo_form_data->get( c_id-abap_langu_vers ) ). @@ -406,6 +418,8 @@ CLASS zcl_abapgit_gui_page_sett_repo IMPLEMENTATION. METHOD validate_form. + CONSTANTS lc_allowed(36) TYPE c VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'. + DATA: lt_lang_list TYPE zif_abapgit_definitions=>ty_languages, lv_folder TYPE string, @@ -414,6 +428,7 @@ CLASS zcl_abapgit_gui_page_sett_repo IMPLEMENTATION. lv_min_release TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_release, lv_min_patch TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_patch, lv_version_constant TYPE string, + lv_original_system TYPE string, lx_exception TYPE REF TO zcx_abapgit_exception. ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ). @@ -470,6 +485,13 @@ CLASS zcl_abapgit_gui_page_sett_repo IMPLEMENTATION. iv_val = 'LXE approach requires a non-empty list of languages' ). ENDIF. + lv_original_system = io_form_data->get( c_id-original_system ). + IF lv_original_system CN lc_allowed. + ro_validation_log->set( + iv_key = c_id-original_system + iv_val = 'System name must be alphanumerical' ). + ENDIF. + ENDMETHOD.