Merge branch 'main' into mbtools/srvb_issues

This commit is contained in:
Lars Hvam 2024-11-29 13:01:20 +01:00 committed by GitHub
commit 3670c4a652
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 443 additions and 147 deletions

View File

@ -8,6 +8,44 @@ Legend
+ : added
- : removed
2024-11-04 v1.130.0
-------------------
! PROG: Store flow logic as separate ABAP files (#7066)
! WDYN: Store controller code as separate ABAP files (#7069)
! SSFO: Store smartform code as separate ABAP files (#7071)
+ CLIF: Add missing translations for classes and interfaces (#6963)
+ UIAD: Add support for Launchpad App Descriptor Item (#6969)
+ BGQC: Add support for Background Processing Context (#6974)
+ DSFD: CDS Scalar Function Definition (#6951)
+ DRAS: CDS Aspect (#6953)
+ DSFI: CDS Scalar Function Implementation (#6952)
+ Add support for Software Component Relations (#7012)
* ENHO: Fix diff in generated comments of class enhancements (#6962)
* SXSD: Fix check if BADI exists (#6961)
* CDBO: Fix missing parameters in `constructor` (#6966)
* Fix dump in activation error handling (#6967)
* Fix deserialize SEOCLASSTX for INTF [AFF] (#6983)
* Allow staging for empty repositories (#6981)
* fix: syst_langu does not exist on older releases (#6999)
* fix sticky header with browser control warning (#6997)
* DSFI: Updated object handler to match the latest AFF definition (#7013)
* Filenames for translation are case sensitive (#6995)
* Enable deserialization of DSFD, DSFI and DRAS (#7029)
* PROG: Support dynpros with splitter control (#7035, #7038)
* Fix `CX_SY_ZERODIVIDE` dump in progress bar (#7036)
* JOBD: Clear `changedby` field (#7039)
* SFPF: Add syntax highlighting for `xdp` files (#7040)
* SFPF: Fix check if object exists (#7041)
* Add package check when creating repository (#7037)
* FUGS: serialization (#7045)
* Enable CDS types (#7048)
* Don't discard includes of nonexistent FUGR (#7053)
* Added enhanced method resolution for background exit (#7059)
* TABU: Display transport requests (#7063)
* Show diffs in case of trailing spaces (#7062)
- remove 200% icon scaling (#7003)
2024-07-01 v1.129.0
-------------------

View File

@ -345,6 +345,9 @@ CLASS zcl_abapgit_cts_api IMPLEMENTATION.
DATA lt_table_keys TYPE STANDARD TABLE OF e071k.
DATA lv_with_dialog TYPE abap_bool.
FIELD-SYMBOLS <ls_table> LIKE LINE OF lt_tables.
FIELD-SYMBOLS <ls_table_key> LIKE LINE OF lt_table_keys.
cl_table_utilities_brf=>create_transport_entries(
EXPORTING
it_table_ins = it_table_ins
@ -360,6 +363,7 @@ CLASS zcl_abapgit_cts_api IMPLEMENTATION.
CALL FUNCTION 'TR_OBJECTS_CHECK'
TABLES
wt_ko200 = lt_tables
wt_e071k = lt_table_keys
EXCEPTIONS
cancel_edit_other_error = 1
show_only_other_error = 2
@ -372,15 +376,24 @@ CLASS zcl_abapgit_cts_api IMPLEMENTATION.
lv_with_dialog = abap_true.
ENDIF.
CALL FUNCTION 'TRINT_OBJECTS_CHECK_AND_INSERT'
READ TABLE lt_tables ASSIGNING <ls_table> INDEX 1.
ASSERT sy-subrc = 0.
LOOP AT lt_table_keys ASSIGNING <ls_table_key>.
<ls_table_key>-objfunc = <ls_table>-objfunc.
ENDLOOP.
CALL FUNCTION 'TR_OBJECT_INSERT'
EXPORTING
iv_order = iv_transport
iv_with_dialog = lv_with_dialog
CHANGING
ct_ko200 = lt_tables
ct_e071k = lt_table_keys
wi_order = iv_transport
wi_ko200 = <ls_table>
iv_no_show_option = abap_true
TABLES
wt_e071k = lt_table_keys
EXCEPTIONS
OTHERS = 1.
cancel_edit_other_error = 1
show_only_other_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.

View File

@ -60,9 +60,9 @@ INTERFACE zif_abapgit_cts_api
METHODS create_transport_entries
IMPORTING
!iv_transport TYPE trkorr
!it_table_ins TYPE ANY TABLE
!it_table_upd TYPE ANY TABLE
!it_table_del TYPE ANY TABLE
!it_table_ins TYPE ANY TABLE OPTIONAL
!it_table_upd TYPE ANY TABLE OPTIONAL
!it_table_del TYPE ANY TABLE OPTIONAL
!iv_tabname TYPE tabname
RAISING
zcx_abapgit_exception .

View File

@ -77,10 +77,12 @@ CLASS ltcl_abap_language_version DEFINITION FOR TESTING RISK LEVEL HARMLESS
PRIVATE SECTION.
" Cloud package hardcoded in cl_abap_language_version
CONSTANTS c_cloud_package TYPE devclass VALUE 'TEST_LANGUAGE_VERSION_SCP'.
CONSTANTS c_language_cfg TYPE seoclsname VALUE 'CL_ABAP_LANGUAGE_VERSION_CFG'.
DATA:
mt_versions TYPE string_table,
mv_has_cloud_package TYPE abap_bool,
mv_has_language_cfg TYPE abap_bool,
mo_environment TYPE REF TO lcl_environment,
mi_persistency TYPE REF TO zif_abapgit_persist_settings,
mo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit,
@ -364,9 +366,11 @@ CLASS ltcl_abap_language_version IMPLEMENTATION.
" Assume on-prem (no cloud)
set_environment( abap_false ).
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( '$TMP' ) " existing standard package
exp = iv_standard ).
IF mv_has_language_cfg = abap_true.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( '$TMP' ) " existing standard package
exp = iv_standard ).
ENDIF.
IF mv_has_cloud_package = abap_true.
cl_abap_unit_assert=>assert_equals(
@ -381,9 +385,11 @@ CLASS ltcl_abap_language_version IMPLEMENTATION.
" Assume cloud platform
set_environment( abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( '$TMP' ) " existing standard package
exp = iv_standard ).
IF mv_has_language_cfg = abap_true.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->is_import_allowed( '$TMP' ) " existing standard package
exp = iv_standard ).
ENDIF.
IF mv_has_cloud_package = abap_true.
cl_abap_unit_assert=>assert_equals(
@ -401,6 +407,19 @@ CLASS ltcl_abap_language_version IMPLEMENTATION.
METHOD is_import_allowed.
DATA lv_version TYPE string.
DATA ls_clskey TYPE seoclskey.
ls_clskey-clsname = c_language_cfg.
" Tests using ABAP language version "standard" only work if the required
" SAP class is available. In older releases, all packages will have
" ABAP language version "undefined" and are handled like a new package
CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK'
EXPORTING
clskey = ls_clskey
EXCEPTIONS
OTHERS = 1.
mv_has_language_cfg = boolc( sy-subrc = 0 ).
LOOP AT mt_versions INTO lv_version.

View File

@ -37,10 +37,7 @@ CLASS ltcl_field_rules DEFINITION FOR TESTING RISK LEVEL HARMLESS
RETURNING
VALUE(ri_rules) TYPE REF TO zif_abapgit_field_rules,
apply_clear_logic FOR TESTING,
apply_fill_logic FOR TESTING,
get_utc_timestamp
RETURNING
VALUE(rv_timestamp) TYPE timestamp.
apply_fill_logic FOR TESTING.
ENDCLASS.
@ -88,7 +85,7 @@ CLASS ltcl_field_rules IMPLEMENTATION.
METHOD fill3.
DATA lv_timestamp TYPE timestamp.
lv_timestamp = get_utc_timestamp( ).
GET TIME STAMP FIELD lv_timestamp.
fill_value(
iv_rule = zif_abapgit_field_rules=>c_fill_rule-timestamp
iv_len = 10
@ -205,6 +202,8 @@ CLASS ltcl_field_rules IMPLEMENTATION.
lv_ts TYPE string,
lv_timestamp TYPE timestamp.
GET TIME STAMP FIELD lv_timestamp.
ls_act-key = 1.
INSERT ls_act INTO TABLE lt_act.
ls_act-key = 2.
@ -241,17 +240,16 @@ CLASS ltcl_field_rules IMPLEMENTATION.
act = ls_act-time(4)
exp = sy-uzeit(4) ). " avoid comparing seconds
lv_timestamp = get_utc_timestamp( ).
lv_ts = ls_act-ts.
lv_ts = lv_ts(12).
lv_ts = lv_ts(10).
cl_abap_unit_assert=>assert_equals(
act = lv_ts
exp = |{ lv_timestamp DIV 100 }| ). " avoid comparing second
exp = |{ lv_timestamp DIV 10000 }| ). " avoid comparing second
lv_ts = ls_act-tl.
lv_ts = lv_ts(12).
lv_ts = lv_ts(10).
cl_abap_unit_assert=>assert_equals(
act = lv_ts
exp = |{ lv_timestamp DIV 100 }| ). " avoid comparing seconds
exp = |{ lv_timestamp DIV 10000 }| ). " avoid comparing seconds
READ TABLE lt_act INTO ls_act INDEX 2.
@ -269,21 +267,4 @@ CLASS ltcl_field_rules IMPLEMENTATION.
exp = sy-uzeit(4) ). " avoid comparing seconds
ENDMETHOD.
METHOD get_utc_timestamp.
DATA lv_syst_timezone TYPE timezone.
CALL FUNCTION 'GET_SYSTEM_TIMEZONE'
IMPORTING
timezone = lv_syst_timezone
EXCEPTIONS
customizing_missing = 1
OTHERS = 2.
IF sy-subrc <> 0.
cl_abap_unit_assert=>fail( 'Could not get system timezone' ).
ENDIF.
CONVERT DATE sy-datum TIME sy-uzeit
INTO TIME STAMP rv_timestamp
TIME ZONE lv_syst_timezone.
ENDMETHOD.
ENDCLASS.

View File

@ -77,19 +77,21 @@ CLASS zcl_abapgit_longtexts IMPLEMENTATION.
ENDIF.
ELSEIF iv_longtext_id IS NOT INITIAL.
IF iv_main_lang_only = abap_true.
SELECT * FROM dokil
INTO TABLE lt_dokil
WHERE id = iv_longtext_id
AND object LIKE lv_object ESCAPE '#'
AND masterlang = abap_true
ORDER BY PRIMARY KEY.
ELSE.
SELECT * FROM dokil
INTO TABLE lt_dokil
WHERE id = iv_longtext_id
AND object LIKE lv_object ESCAPE '#'
ORDER BY PRIMARY KEY.
IF lv_object NA '#'.
IF iv_main_lang_only = abap_true.
SELECT * FROM dokil
INTO TABLE lt_dokil
WHERE id = iv_longtext_id
AND object LIKE lv_object ESCAPE '#'
AND masterlang = abap_true
ORDER BY PRIMARY KEY.
ELSE.
SELECT * FROM dokil
INTO TABLE lt_dokil
WHERE id = iv_longtext_id
AND object LIKE lv_object ESCAPE '#'
ORDER BY PRIMARY KEY.
ENDIF.
ENDIF.
ELSE.

View File

@ -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

View File

@ -7,6 +7,7 @@ CLASS zcl_abapgit_object_ssfo DEFINITION
PUBLIC SECTION.
INTERFACES zif_abapgit_object.
PROTECTED SECTION.
PRIVATE SECTION.
@ -14,7 +15,7 @@ CLASS zcl_abapgit_object_ssfo DEFINITION
ty_string_range TYPE RANGE OF string .
CLASS-DATA gt_range_node_codes TYPE ty_string_range .
CONSTANTS c_attrib_abapgit_leadig_spaces TYPE string VALUE 'abapgit-leadig-spaces' ##NO_TEXT.
CONSTANTS c_prefix TYPE string VALUE 'File:'.
METHODS fix_ids
IMPORTING
@ -24,25 +25,26 @@ CLASS zcl_abapgit_object_ssfo DEFINITION
!ii_xml_doc TYPE REF TO if_ixml_document
RAISING
zcx_abapgit_exception .
METHODS handle_attrib_leading_spaces
IMPORTING
!iv_name TYPE string
!ii_node TYPE REF TO if_ixml_node
CHANGING
!cv_within_code_section TYPE abap_bool .
METHODS get_range_node_codes
RETURNING
VALUE(rt_range_node_codes) TYPE ty_string_range .
METHODS code_item_section_handling
METHODS deserialize_sources
IMPORTING
!iv_name TYPE string
!ii_node TYPE REF TO if_ixml_node
EXPORTING
!ei_code_item_element TYPE REF TO if_ixml_element
CHANGING
!cv_within_code_section TYPE abap_bool
!ii_node TYPE REF TO if_ixml_node
RAISING
zcx_abapgit_exception .
zcx_abapgit_exception.
METHODS serialize_sources
IMPORTING
!ii_node TYPE REF TO if_ixml_node
RAISING
zcx_abapgit_exception.
METHODS get_hash_for_path
IMPORTING
!ii_node TYPE REF TO if_ixml_node
RETURNING
VALUE(rv_hash) TYPE string
RAISING
zcx_abapgit_exception.
ENDCLASS.
@ -50,29 +52,36 @@ ENDCLASS.
CLASS zcl_abapgit_object_ssfo IMPLEMENTATION.
METHOD code_item_section_handling.
CONSTANTS: lc_node_item TYPE string VALUE 'item'.
CONSTANTS: lc_node_text TYPE string VALUE '#text'.
METHOD deserialize_sources.
IF iv_name IN get_range_node_codes( ).
cv_within_code_section = abap_true.
DATA:
lv_extra TYPE string,
ls_abap TYPE abaptxt255,
lt_abap TYPE abaptxt255_tab,
li_node TYPE REF TO if_ixml_node,
li_ixml TYPE REF TO if_ixml,
li_xml_doc TYPE REF TO if_ixml_document.
li_ixml = cl_ixml=>create( ).
li_xml_doc = li_ixml->create_document( ).
" Old format
lv_extra = ii_node->get_value( ).
IF lv_extra NS c_prefix.
RETURN.
ENDIF.
IF cv_within_code_section = abap_true.
IF iv_name = lc_node_item.
TRY.
ei_code_item_element ?= ii_node.
RETURN.
CATCH cx_sy_move_cast_error ##NO_HANDLER.
ENDTRY.
" New format
lv_extra = lv_extra+5(*).
ELSEIF iv_name NOT IN get_range_node_codes( ) AND
iv_name <> lc_node_text.
cv_within_code_section = abap_false.
ENDIF.
ENDIF.
lt_abap = mo_files->read_abap( iv_extra = lv_extra ).
RAISE EXCEPTION TYPE zcx_abapgit_exception.
ii_node->set_value( '' ).
LOOP AT lt_abap INTO ls_abap.
li_node = li_xml_doc->create_element( 'item' ).
li_node->set_value( |{ ls_abap-line }| ).
ii_node->append_child( li_node ).
ENDLOOP.
ENDMETHOD.
@ -150,6 +159,35 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION.
ENDMETHOD.
METHOD get_hash_for_path.
DATA:
lv_name TYPE string,
lv_path TYPE string,
li_node TYPE REF TO if_ixml_node,
li_name TYPE REF TO if_ixml_node,
li_iname TYPE REF TO if_ixml_node.
li_node = ii_node->get_parent( ).
WHILE NOT li_node IS INITIAL.
lv_name = li_node->get_name( ).
IF ( lv_name = 'CODE' OR lv_name = 'WINDOW' OR lv_name = 'PAGE' )
AND li_node->get_namespace_prefix( ) IS NOT INITIAL.
li_name = li_node->get_first_child( ).
li_iname = li_node->get_first_child( ).
lv_name = lv_name && ':' && li_iname->get_value( ).
ENDIF.
lv_path = lv_name && '/' && lv_path.
li_node = li_node->get_parent( ).
ENDWHILE.
rv_hash = substring(
val = zcl_abapgit_hash=>sha1_string( lv_path )
len = 8 ).
ENDMETHOD.
METHOD get_range_node_codes.
DATA: ls_range_node_code TYPE LINE OF ty_string_range.
@ -172,28 +210,36 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION.
ENDMETHOD.
METHOD handle_attrib_leading_spaces.
METHOD serialize_sources.
DATA li_element TYPE REF TO if_ixml_element.
DATA lv_leading_spaces TYPE string.
DATA lv_coding_line TYPE string.
DATA:
lv_extra TYPE string,
ls_abap TYPE abaptxt255,
lt_abap TYPE abaptxt255_tab,
li_node TYPE REF TO if_ixml_node,
li_iterator TYPE REF TO if_ixml_node_iterator.
TRY.
code_item_section_handling( EXPORTING iv_name = iv_name
ii_node = ii_node
IMPORTING ei_code_item_element = li_element
CHANGING cv_within_code_section = cv_within_code_section ).
" Store code as separate ABAP files instead of XML
lv_extra = to_lower( ii_node->get_name( ) ).
li_iterator = ii_node->get_children( )->create_iterator( ).
li_node = li_iterator->get_next( ).
WHILE NOT li_node IS INITIAL.
ls_abap-line = li_node->get_value( ).
INSERT ls_abap INTO TABLE lt_abap.
* for downwards compatibility, this code can be removed sometime in the future
lv_leading_spaces = li_element->get_attribute_ns( c_attrib_abapgit_leadig_spaces ).
li_node = li_iterator->get_next( ).
ENDWHILE.
lv_coding_line = li_element->get_value( ).
IF strlen( lv_coding_line ) >= 1 AND lv_coding_line(1) <> | |.
SHIFT lv_coding_line RIGHT BY lv_leading_spaces PLACES.
li_element->set_value( lv_coding_line ).
ENDIF.
CATCH zcx_abapgit_exception ##NO_HANDLER.
ENDTRY.
" For CODE sections, get full path and hash it
IF lv_extra = 'code'.
lv_extra = get_hash_for_path( ii_node ).
ENDIF.
mo_files->add_abap(
iv_extra = lv_extra
it_abap = lt_abap ).
ii_node->set_value( c_prefix && lv_extra ).
ENDMETHOD.
@ -303,15 +349,15 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION.
METHOD zif_abapgit_object~deserialize.
* see function module FB_UPLOAD_FORM
DATA: li_node TYPE REF TO if_ixml_node,
lv_formname TYPE tdsfname,
lv_name TYPE string,
li_iterator TYPE REF TO if_ixml_node_iterator,
lo_sf TYPE REF TO cl_ssf_fb_smart_form,
lo_res TYPE REF TO cl_ssf_fb_smart_form,
lx_error TYPE REF TO cx_ssf_fb,
lv_text TYPE string,
lv_within_code_section TYPE abap_bool.
DATA:
li_node TYPE REF TO if_ixml_node,
lv_formname TYPE tdsfname,
lv_name TYPE string,
li_iterator TYPE REF TO if_ixml_node_iterator,
lo_sf TYPE REF TO cl_ssf_fb_smart_form,
lo_res TYPE REF TO cl_ssf_fb_smart_form,
lx_error TYPE REF TO cx_ssf_fb,
lv_text TYPE string.
CREATE OBJECT lo_sf.
@ -330,9 +376,9 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION.
ENDCASE.
handle_attrib_leading_spaces( EXPORTING iv_name = lv_name
ii_node = li_node
CHANGING cv_within_code_section = lv_within_code_section ).
IF lv_name IN get_range_node_codes( ) AND li_node->get_namespace_prefix( ) IS INITIAL.
deserialize_sources( li_node ).
ENDIF.
li_node = li_iterator->get_next( ).
ENDWHILE.
@ -530,6 +576,11 @@ CLASS zcl_abapgit_object_ssfo IMPLEMENTATION.
OR lv_name = 'LASTUSER'.
li_node->set_value( 'DUMMY' ).
ENDIF.
IF lv_name IN get_range_node_codes( ) AND li_node->get_namespace_prefix( ) IS INITIAL.
serialize_sources( li_node ).
ENDIF.
li_node = li_iterator->get_next( ).
ENDWHILE.

View File

@ -5,18 +5,41 @@ CLASS zcl_abapgit_object_view DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
PROTECTED SECTION.
"! get additional data like table authorization group
"! @parameter iv_name | name of the view
METHODS read_extras IMPORTING iv_name TYPE ddobjname
RETURNING VALUE(rs_tabl_extras) TYPE zif_abapgit_object_tabl=>ty_tabl_extras.
METHODS read_extras
IMPORTING
iv_name TYPE ddobjname
RETURNING
VALUE(rs_tabl_extras) TYPE zif_abapgit_object_tabl=>ty_tabl_extras.
"! Update additional data
"! @parameter iv_name | name of the table
"! @parameter iv_transport | transport request
"! @parameter is_tabl_extras | additional view data
METHODS update_extras IMPORTING iv_name TYPE ddobjname
is_tabl_extras TYPE zif_abapgit_object_tabl=>ty_tabl_extras.
METHODS update_extras
IMPORTING
iv_name TYPE ddobjname
iv_transport TYPE trkorr
is_tabl_extras TYPE zif_abapgit_object_tabl=>ty_tabl_extras
RAISING
zcx_abapgit_exception.
"! Delete additional data
"! @parameter iv_name | name of the view
METHODS delete_extras IMPORTING iv_name TYPE ddobjname.
"! @parameter iv_transport | transport request
METHODS delete_extras
IMPORTING
iv_name TYPE ddobjname
iv_transport TYPE trkorr
RAISING
zcx_abapgit_exception.
METHODS insert_transport
IMPORTING
iv_name TYPE ddobjname
iv_transport TYPE trkorr
RAISING
zcx_abapgit_exception.
PRIVATE SECTION.
TYPES: ty_dd26v TYPE STANDARD TABLE OF dd26v
WITH NON-UNIQUE DEFAULT KEY,
@ -66,13 +89,17 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECT_VIEW IMPLEMENTATION.
CLASS zcl_abapgit_object_view IMPLEMENTATION.
METHOD delete_extras.
DELETE FROM tddat WHERE tabname = iv_name.
insert_transport(
iv_name = iv_name
iv_transport = iv_transport ).
ENDMETHOD.
@ -130,6 +157,27 @@ CLASS ZCL_ABAPGIT_OBJECT_VIEW IMPLEMENTATION.
ENDMETHOD.
METHOD insert_transport.
DATA:
ls_key TYPE tddat,
lt_keys TYPE TABLE OF tddat.
IF iv_transport IS INITIAL.
RETURN.
ENDIF.
ls_key-tabname = iv_name.
INSERT ls_key INTO TABLE lt_keys.
zcl_abapgit_factory=>get_cts_api( )->create_transport_entries(
iv_transport = iv_transport
it_table_ins = lt_keys
iv_tabname = 'TDDAT' ).
ENDMETHOD.
METHOD read_extras.
SELECT SINGLE * FROM tddat INTO rs_tabl_extras-tddat WHERE tabname = iv_name.
@ -238,9 +286,15 @@ CLASS ZCL_ABAPGIT_OBJECT_VIEW IMPLEMENTATION.
METHOD update_extras.
IF is_tabl_extras-tddat IS INITIAL.
delete_extras( iv_name ).
delete_extras(
iv_name = iv_name
iv_transport = iv_transport ).
ELSE.
MODIFY tddat FROM is_tabl_extras-tddat.
insert_transport(
iv_name = iv_name
iv_transport = iv_transport ).
ENDIF.
ENDMETHOD.
@ -269,7 +323,10 @@ CLASS ZCL_ABAPGIT_OBJECT_VIEW IMPLEMENTATION.
lv_objname = ms_item-obj_name.
delete_ddic( 'V' ).
delete_extras( lv_objname ).
delete_extras(
iv_name = lv_objname
iv_transport = iv_transport ).
ENDMETHOD.
@ -350,6 +407,7 @@ CLASS ZCL_ABAPGIT_OBJECT_VIEW IMPLEMENTATION.
iv_longtext_id = c_longtext_id_view ).
update_extras( iv_name = lv_name
iv_transport = iv_transport
is_tabl_extras = ls_extras ).
zcl_abapgit_objects_activation=>add_item( ms_item ).

View File

@ -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 <ls_sources> LIKE LINE OF mt_sources.
" Store code as separate ABAP files instead of XML (assumes sorted data, see "read")
LOOP AT mt_sources ASSIGNING <ls_sources>.
AT NEW controller_name.
CLEAR lt_abap.
lv_extra = to_lower( <ls_sources>-controller_name ).
ENDAT.
ls_abap-line = <ls_sources>-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.

View File

@ -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 <ls_field>.
* 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 <ls_dynpro>.
<ls_dynpro>-header = ls_header.
<ls_dynpro>-flow_logic = lt_flow_logic.
<ls_dynpro>-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
<ls_dynpro>-nat_header = <ls_d020s>.
CLEAR: <ls_dynpro>-nat_header-dgen, <ls_dynpro>-nat_header-tgen.

View File

@ -739,6 +739,10 @@ CLASS lcl_bcp47_language_table IMPLEMENTATION.
fill_language_mapping( im_sap1 = 'C0C1'
im_sap2 = 'WA'
im_bcp47 = 'wa' ).
fill_language_mapping( im_sap1 = 'A'
im_sap2 = 'AR'
im_bcp47 = 'ar-SA' ).
ENDMETHOD.

View File

@ -331,12 +331,15 @@ CLASS ltcl_bcp47_to_sap1 IMPLEMENTATION.
DATA lv_result TYPE sy-langu.
lv_result = zcl_abapgit_convert=>language_bcp47_to_sap1( im_from ).
cl_abap_unit_assert=>assert_equals( exp = im_to
act = lv_result ).
cl_abap_unit_assert=>assert_equals(
exp = im_to
act = lv_result
msg = |Converting "{ im_from }" should result in "{ im_to }"| ).
ENDMETHOD.
METHOD assert_bcp47_to_sap1_fail.
DATA lv_result TYPE string.
DATA lv_act TYPE sy-subrc.
zcl_abapgit_convert=>language_bcp47_to_sap1(
EXPORTING
@ -345,10 +348,15 @@ CLASS ltcl_bcp47_to_sap1 IMPLEMENTATION.
re_lang_sap1 = lv_result
EXCEPTIONS
no_assignment = 1
OTHERS = 2 ).
OTHERS = 2 ).
cl_abap_unit_assert=>assert_equals( exp = 1
act = sy-subrc ).
" Assert itself might change sy-subrc (it does in 702!)
lv_act = sy-subrc.
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lv_act
msg = |Converting "{ im_from }" should fail| ).
ENDMETHOD.
METHOD english.
@ -466,14 +474,18 @@ CLASS ltcl_sap1_to_bcp47 IMPLEMENTATION.
METHOD assert_sap1_to_bcp47.
DATA lv_result TYPE string.
lv_result = zcl_abapgit_convert=>language_sap1_to_bcp47( im_from ).
cl_abap_unit_assert=>assert_equals( exp = im_to
act = lv_result ).
cl_abap_unit_assert=>assert_equals(
exp = im_to
act = lv_result
msg = |Converting "{ im_from }" should result in "{ im_to }"| ).
ENDMETHOD.
METHOD assert_sap1_to_bcp47_fail.
DATA lv_result TYPE string.
DATA lv_act TYPE sy-subrc.
zcl_abapgit_convert=>language_sap1_to_bcp47(
EXPORTING
@ -482,10 +494,15 @@ CLASS ltcl_sap1_to_bcp47 IMPLEMENTATION.
re_lang_bcp47 = lv_result
EXCEPTIONS
no_assignment = 1
OTHERS = 2 ).
OTHERS = 2 ).
cl_abap_unit_assert=>assert_equals( exp = 1
act = sy-subrc ).
" Assert itself might change sy-subrc (it does in 702!)
lv_act = sy-subrc.
cl_abap_unit_assert=>assert_equals(
exp = 1
act = lv_act
msg = |Converting "{ im_from }" should fail| ).
ENDMETHOD.
METHOD english.

View File

@ -2,6 +2,6 @@ INTERFACE zif_abapgit_version
PUBLIC .
CONSTANTS c_xml_version TYPE string VALUE 'v1.0.0' ##NO_TEXT.
CONSTANTS c_abap_version TYPE string VALUE '1.129.0' ##NO_TEXT.
CONSTANTS c_abap_version TYPE string VALUE '1.130.0' ##NO_TEXT.
ENDINTERFACE.