diff --git a/src/objects/aff/zcl_abapgit_aff_registry.clas.abap b/src/objects/aff/zcl_abapgit_aff_registry.clas.abap index a0ca81ef4..589441013 100644 --- a/src/objects/aff/zcl_abapgit_aff_registry.clas.abap +++ b/src/objects/aff/zcl_abapgit_aff_registry.clas.abap @@ -46,6 +46,7 @@ CLASS ZCL_ABAPGIT_AFF_REGISTRY IMPLEMENTATION. METHOD initialize_registry_table. + register( 'APLO' ). register( 'BGQC' ). register( 'CDBO' ). register( 'CHKC' ). @@ -61,6 +62,8 @@ CLASS ZCL_ABAPGIT_AFF_REGISTRY IMPLEMENTATION. register( 'GSMP' ). register( iv_obj_type = 'INTF' iv_experimental = abap_true ). + register( 'SAJT' ). + register( 'SAJC' ). register( 'SMBC' ). register( 'SWCR' ). register( 'NONT' ). diff --git a/src/objects/aff/zcl_abapgit_object_aplo.clas.abap b/src/objects/aff/zcl_abapgit_object_aplo.clas.abap new file mode 100644 index 000000000..70673c92d --- /dev/null +++ b/src/objects/aff/zcl_abapgit_object_aplo.clas.abap @@ -0,0 +1,24 @@ +CLASS zcl_abapgit_object_aplo DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_object_common_aff + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS zif_abapgit_object~changed_by + REDEFINITION . + PROTECTED SECTION. + PRIVATE SECTION. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECT_APLO IMPLEMENTATION. + + + METHOD zif_abapgit_object~changed_by. + CLEAR rv_user. + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/aff/zcl_abapgit_object_aplo.clas.xml b/src/objects/aff/zcl_abapgit_object_aplo.clas.xml new file mode 100644 index 000000000..cfec6c94b --- /dev/null +++ b/src/objects/aff/zcl_abapgit_object_aplo.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_OBJECT_APLO + E + abapGit - APLO - Application Log Object + 1 + X + X + X + + + + diff --git a/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap b/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap index 9ab7c2101..e7e6f7a3b 100644 --- a/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap +++ b/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap @@ -55,7 +55,9 @@ CLASS zcl_abapgit_object_common_aff DEFINITION METHODS create_aff_setting_deserialize FINAL RETURNING - VALUE(ro_settings_deserialize) TYPE REF TO object. + VALUE(ro_settings_deserialize) TYPE REF TO object + RAISING + zcx_abapgit_exception. PRIVATE SECTION. METHODS is_file_empty @@ -110,6 +112,29 @@ CLASS zcl_abapgit_object_common_aff IMPLEMENTATION. ENDMETHOD. + METHOD create_aff_setting_deserialize. + IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version AND + ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_no_abap_language_version. + TRY. + CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE') + EXPORTING + version = 'A' + language = mv_language + user = sy-uname + abap_language_version = ms_item-abap_language_version. + CATCH cx_root. + zcx_abapgit_exception=>raise( |System does not supported ABAP language version for AFF| ). + ENDTRY. + ELSE. + CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE') + EXPORTING + version = 'A' + language = mv_language + user = sy-uname. + ENDIF. + ENDMETHOD. + + METHOD get_additional_extensions. RETURN. ENDMETHOD. @@ -412,25 +437,6 @@ CLASS zcl_abapgit_object_common_aff IMPLEMENTATION. ENDMETHOD. - METHOD create_aff_setting_deserialize. - IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version AND - ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_no_abap_language_version. - CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE') - EXPORTING - version = 'A' - language = mv_language - user = sy-uname - abap_language_version = ms_item-abap_language_version. - ELSE. - CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE') - EXPORTING - version = 'A' - language = mv_language - user = sy-uname. - ENDIF. - ENDMETHOD. - - METHOD zif_abapgit_object~exists. DATA: lr_intf_aff_obj TYPE REF TO data, lo_object_handler TYPE REF TO object, 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 488c13ea8..0d46738a8 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 @@ -226,7 +226,13 @@ CLASS ltcl_aff_settings_deserialize IMPLEMENTATION. is_item = ls_item iv_language = 'E'. - lo_settings_deserialize = lo_cut->create_aff_setting_deserialize( ). + TRY. + lo_settings_deserialize = lo_cut->create_aff_setting_deserialize( ). + 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. diff --git a/src/objects/aff/zcl_abapgit_object_sajc.clas.abap b/src/objects/aff/zcl_abapgit_object_sajc.clas.abap new file mode 100644 index 000000000..31f00d70d --- /dev/null +++ b/src/objects/aff/zcl_abapgit_object_sajc.clas.abap @@ -0,0 +1,38 @@ +CLASS zcl_abapgit_object_sajc DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_object_common_aff + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS zif_abapgit_object~changed_by + REDEFINITION . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECT_SAJC IMPLEMENTATION. + + + METHOD zif_abapgit_object~changed_by. + + CONSTANTS lc_table_name TYPE tabname VALUE 'APJ_W_JCE_ROOT'. + + SELECT SINGLE lst_ch_user_acct + FROM (lc_table_name) + INTO rv_user + WHERE job_catalog_entry_name = ms_item-obj_name + AND job_catalog_entry_version = 'I'. + + IF rv_user IS INITIAL. + SELECT SINGLE lst_ch_user_acct + FROM (lc_table_name) + INTO rv_user + WHERE job_catalog_entry_name = ms_item-obj_name + AND job_catalog_entry_version = 'A'. + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/aff/zcl_abapgit_object_sajc.clas.xml b/src/objects/aff/zcl_abapgit_object_sajc.clas.xml new file mode 100644 index 000000000..6c5841001 --- /dev/null +++ b/src/objects/aff/zcl_abapgit_object_sajc.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_OBJECT_SAJC + E + abapGit - SAJC - Application Job Catalog Entry + 1 + X + X + X + + + + diff --git a/src/objects/aff/zcl_abapgit_object_sajt.clas.abap b/src/objects/aff/zcl_abapgit_object_sajt.clas.abap new file mode 100644 index 000000000..86b19688e --- /dev/null +++ b/src/objects/aff/zcl_abapgit_object_sajt.clas.abap @@ -0,0 +1,39 @@ +CLASS zcl_abapgit_object_sajt DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_object_common_aff + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS zif_abapgit_object~changed_by + REDEFINITION . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECT_SAJT IMPLEMENTATION. + + + METHOD zif_abapgit_object~changed_by. + + CONSTANTS lc_table_name TYPE tabname VALUE 'APJ_W_JT_ROOT'. + + SELECT SINGLE lst_ch_user_acct + FROM (lc_table_name) + INTO rv_user + WHERE job_template_name = ms_item-obj_name + AND job_template_version = 'I'. + + IF rv_user IS INITIAL. + SELECT SINGLE lst_ch_user_acct + FROM (lc_table_name) + INTO rv_user + WHERE job_template_name = ms_item-obj_name + AND job_template_version = 'A'. + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/aff/zcl_abapgit_object_sajt.clas.xml b/src/objects/aff/zcl_abapgit_object_sajt.clas.xml new file mode 100644 index 000000000..7c093d89d --- /dev/null +++ b/src/objects/aff/zcl_abapgit_object_sajt.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_OBJECT_SAJT + E + abapGit - SAJT - Application Job Template + 1 + X + X + X + + + + diff --git a/src/objects/zcl_abapgit_object_shi8.clas.abap b/src/objects/zcl_abapgit_object_shi8.clas.abap index b0ddb12e7..3f287bfaa 100644 --- a/src/objects/zcl_abapgit_object_shi8.clas.abap +++ b/src/objects/zcl_abapgit_object_shi8.clas.abap @@ -76,6 +76,8 @@ CLASS zcl_abapgit_object_shi8 IMPLEMENTATION. ls_node_data-tree_id = ls_assignment_data-tree_id. ls_node_data-node_id = ls_assignment_data-node_id. + tadir_insert( iv_package ). + CALL FUNCTION 'STREE_SFW_ASSIGNMENT_SAVE' EXPORTING assignment_id = ls_assignment_data-sfw_ass_id diff --git a/src/objects/zcl_abapgit_object_wdyn.clas.abap b/src/objects/zcl_abapgit_object_wdyn.clas.abap index 129543cad..a0ffd2f4c 100644 --- a/src/objects/zcl_abapgit_object_wdyn.clas.abap +++ b/src/objects/zcl_abapgit_object_wdyn.clas.abap @@ -59,6 +59,12 @@ CLASS zcl_abapgit_object_wdyn DEFINITION IMPORTING is_view TYPE wdy_md_view_meta_data RETURNING VALUE(rs_delta) TYPE svrs2_xversionable_object RAISING zcx_abapgit_exception, + deserialize_sources + IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input + RAISING zcx_abapgit_exception, + serialize_sources + IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_output + RAISING zcx_abapgit_exception, add_fm_param_exporting IMPORTING iv_name TYPE string ig_value TYPE any @@ -79,7 +85,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION. +CLASS zcl_abapgit_object_wdyn IMPLEMENTATION. METHOD add_fm_exception. @@ -382,6 +388,61 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION. ENDMETHOD. + METHOD deserialize_sources. + + DATA: + lv_extra TYPE string, + lt_extra TYPE string_table, + ls_abap TYPE abaptxt255, + lt_abap TYPE abaptxt255_tab, + lv_line TYPE wdy_ctlr_compo_source_vrs-line_number, + lv_cmpname TYPE wdy_ctlr_compo_source_vrs-cmpname, + ls_sources LIKE LINE OF mt_sources. + + " Old format + ii_xml->read( EXPORTING iv_name = 'SOURCES' + CHANGING cg_data = mt_sources ). + + IF mt_sources IS NOT INITIAL. + RETURN. + ENDIF. + + " New format + ii_xml->read( EXPORTING iv_name = 'FILES' + CHANGING cg_data = lt_extra ). + + LOOP AT lt_extra INTO lv_extra. + lv_line = 0. + lt_abap = mo_files->read_abap( iv_extra = lv_extra ). + LOOP AT lt_abap INTO ls_abap. + " Start of method + FIND REGEX '\s*method\s+(.*)\s*\.' IN ls_abap-line IGNORING CASE SUBMATCHES lv_cmpname. + IF sy-subrc = 0. + lv_line = 1. + ENDIF. + + IF lv_cmpname IS NOT INITIAL AND lv_line > 0. + CLEAR ls_sources. + ls_sources-component_name = ms_item-obj_name. + ls_sources-controller_name = to_upper( lv_extra ). + ls_sources-cmpname = to_upper( lv_cmpname ). + ls_sources-line_number = lv_line. + ls_sources-source_line = ls_abap-line. + INSERT ls_sources INTO TABLE mt_sources. + lv_line = lv_line + 1. + ENDIF. + + " End of method + FIND REGEX '\s*endmethod\s*\.' IN ls_abap-line IGNORING CASE. + IF sy-subrc = 0. + lv_line = 0. + ENDIF. + ENDLOOP. + ENDLOOP. + + ENDMETHOD. + + METHOD get_limu_objects. DATA: lv_name TYPE wdy_component_name. @@ -786,6 +847,47 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION. ENDMETHOD. + METHOD serialize_sources. + + DATA: + lv_extra TYPE string, + lt_extra TYPE string_table, + ls_abap TYPE abaptxt255, + lt_abap TYPE abaptxt255_tab. + + FIELD-SYMBOLS LIKE LINE OF mt_sources. + + " Store code as separate ABAP files instead of XML (assumes sorted data, see "read") + LOOP AT mt_sources ASSIGNING . + AT NEW controller_name. + CLEAR lt_abap. + lv_extra = to_lower( -controller_name ). + ENDAT. + + ls_abap-line = -source_line. + INSERT ls_abap INTO TABLE lt_abap. + + AT END OF cmpname. + CLEAR ls_abap. + INSERT ls_abap INTO TABLE lt_abap. + ENDAT. + AT END OF controller_name. + IF lt_abap IS NOT INITIAL. + mo_files->add_abap( + iv_extra = lv_extra + it_abap = lt_abap ). + INSERT lv_extra INTO TABLE lt_extra. + ENDIF. + ENDAT. + ENDLOOP. + + ii_xml->add( + iv_name = 'FILES' + ig_data = lt_extra ). + + ENDMETHOD. + + METHOD zif_abapgit_object~changed_by. SELECT SINGLE changedby FROM wdy_component INTO rv_user WHERE component_name = ms_item-obj_name AND version = 'A'. @@ -831,8 +933,8 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION. CHANGING cg_data = ls_component ). io_xml->read( EXPORTING iv_name = 'COMPONENTS' CHANGING cg_data = mt_components ). - io_xml->read( EXPORTING iv_name = 'SOURCES' - CHANGING cg_data = mt_sources ). + + deserialize_sources( io_xml ). ls_component-comp_metadata-definition-author = sy-uname. ls_component-comp_metadata-definition-createdon = sy-datum. @@ -944,8 +1046,8 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION. ig_data = ls_component ). io_xml->add( ig_data = mt_components iv_name = 'COMPONENTS' ). - io_xml->add( ig_data = mt_sources - iv_name = 'SOURCES' ). + + serialize_sources( io_xml ). READ TABLE ls_component-comp_metadata-descriptions INTO ls_description INDEX 1. IF sy-subrc = 0. diff --git a/src/objects/zcl_abapgit_objects_program.clas.abap b/src/objects/zcl_abapgit_objects_program.clas.abap index 093c1fa19..fc75e7f71 100644 --- a/src/objects/zcl_abapgit_objects_program.clas.abap +++ b/src/objects/zcl_abapgit_objects_program.clas.abap @@ -131,6 +131,8 @@ CLASS zcl_abapgit_objects_program DEFINITION inactive TYPE r3state VALUE 'I', END OF c_state. + CONSTANTS c_native_dynpro TYPE c LENGTH 2 VALUE 'IN'. + METHODS: uncondense_flow IMPORTING it_flow TYPE swydyflow @@ -359,6 +361,9 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION. it_flow = ls_dynpro-flow_logic it_spaces = ls_dynpro-spaces ). + IF ls_dynpro-flow_logic IS INITIAL. + ls_dynpro-flow_logic = mo_files->read_abap( iv_extra = 'screen_' && ls_dynpro-header-screen ). + ENDIF. LOOP AT ls_dynpro-fields ASSIGNING . * if the DDIC element has a PARAMETER_ID and the flag "from_dict" is active @@ -390,7 +395,7 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION. ENDLOOP. - IF ls_dynpro-header-type = 'N' AND ls_dynpro-nat_header IS NOT INITIAL. + IF ls_dynpro-header-type CA c_native_dynpro AND ls_dynpro-nat_header IS NOT INITIAL. DELETE FROM d021t WHERE prog = ls_dynpro-header-program AND dynr = ls_dynpro-header-screen ##SUBRC_OK. INSERT d021t FROM TABLE ls_dynpro-nat_texts ##SUBRC_OK. @@ -913,11 +918,15 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION. ENDLOOP. APPEND INITIAL LINE TO rt_dynpro ASSIGNING . - -header = ls_header. - -flow_logic = lt_flow_logic. + -header = ls_header. + + " Store flow logic as separate ABAP files instead of XML + mo_files->add_abap( + iv_extra = 'screen_' && ls_header-screen + it_abap = lt_flow_logic ). READ TABLE lt_fieldlist_int TRANSPORTING NO FIELDS WITH KEY fill = 'X'. - IF ls_header-type = 'N' AND sy-subrc = 0. + IF ls_header-type CA c_native_dynpro AND sy-subrc = 0. " In particular for dynpros with splitter -nat_header = . CLEAR: -nat_header-dgen, -nat_header-tgen.