diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index d2963f3b4..ce60c9815 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.24.13'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.25.0'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index 80fd4ebf1..95d64ab1e 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -37,7 +37,7 @@ form input:focus, textarea:focus { .grey { color: lightgrey !important; } .darkgrey { color: #808080 !important; } .attention { color: red !important; } -.blue { color: #5e8dc9; !important; } +.blue { color: #5e8dc9 !important; } .red { color: red !important; } /* MODIFIERS */ @@ -111,9 +111,22 @@ div.menu .menu_end { border-right: 0px !important; } div.menu a { padding-left: 0.5em; padding-right: 0.5em; - border-right: 1px solid lightgrey; font-size: 12pt; } + +div.menu > a { + border-right: 1px solid lightgrey; +} +div.menu > div.dropdown > a { + border-right: 1px solid lightgrey; +} +div.menu > a:last-child { + border-right: 0px !important; +} +div.menu > div.dropdown:last-child > a { + border-right: 0px !important; +} + div.menu_vertical { display: inline; } div.menu_vertical a { display: block; @@ -415,8 +428,8 @@ span.diff_banner { padding-right: 0.3em; } .diff_ins { - border-color: #7bea7b; - background-color: #d3f8d3; + border-color: #abf2ab; + background-color: #e0ffe0; } .diff_del { border-color: #ff667d; @@ -500,22 +513,36 @@ table.diff_tab thead.nav_line th { color: #bbb; } table.diff_tab td.num, th.num { - text-align: right; + width: 1%; + min-width: 2em; + padding-right: 8px; + padding-left: 8px; + text-align: right !important; color: #ccc; border-left: 1px solid #eee; border-right: 1px solid #eee; + -ms-user-select: none; + user-select: none; +} +table.diff_tab td.num::before { + content: attr(line-num); } table.diff_tab code { font-family: inherit; white-space: pre; } +table.diff_tab td.code { + word-wrap: break-word; + white-space: pre-wrap; + overflow: visible; +} -table.diff_tab code span.keyword { color: #0a69ce; } -table.diff_tab code span.text { color: #48ce4f; } -table.diff_tab code span.comment { color: #808080; font-style: italic; } -table.diff_tab code span.xml_tag { color: #3370e0; } -table.diff_tab code span.attr { color: #f20707; } -table.diff_tab code span.attr_val { color: #7a02f9; } +table.diff_tab .code span.keyword { color: #0a69ce; } +table.diff_tab .code span.text { color: #48ce4f; } +table.diff_tab .code span.comment { color: #808080; font-style: italic; } +table.diff_tab .code span.xml_tag { color: #457ce3; } +table.diff_tab .code span.attr { color: #b777fb; } +table.diff_tab .code span.attr_val { color: #7a02f9; } table.diff_tab tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; } diff --git a/src/zabapgit_css_common.w3mi.xml b/src/zabapgit_css_common.w3mi.xml index 10d1ffd0d..7f7372fc2 100644 --- a/src/zabapgit_css_common.w3mi.xml +++ b/src/zabapgit_css_common.w3mi.xml @@ -3,7 +3,7 @@ ZABAPGIT_CSS_COMMON - AbapGit common styles + MI diff --git a/src/zabapgit_git_helpers.prog.abap b/src/zabapgit_git_helpers.prog.abap index 41fe042a5..257730392 100644 --- a/src/zabapgit_git_helpers.prog.abap +++ b/src/zabapgit_git_helpers.prog.abap @@ -111,7 +111,7 @@ CLASS lcl_git_branch_list DEFINITION FINAL. tag TYPE ty_git_branch_type VALUE 'TG', other TYPE ty_git_branch_type VALUE 'ZZ', END OF c_type. - CONSTANTS head_name TYPE string VALUE 'HEAD'. + CONSTANTS c_head_name TYPE string VALUE 'HEAD'. METHODS constructor IMPORTING iv_data TYPE string @@ -126,6 +126,9 @@ CLASS lcl_git_branch_list DEFINITION FINAL. RETURNING VALUE(rs_branch) TYPE ty_git_branch RAISING lcx_exception. + METHODS get_head_symref + RETURNING VALUE(rv_head_symref) TYPE string. + METHODS get_branches_only RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt RAISING lcx_exception. @@ -150,6 +153,10 @@ CLASS lcl_git_branch_list DEFINITION FINAL. IMPORTING iv_branch_name TYPE clike RETURNING VALUE(rv_name) TYPE string. + CLASS-METHODS normalize_branch_name + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_name) TYPE string. + PRIVATE SECTION. DATA mt_branches TYPE ty_git_branch_list_tt. DATA mv_head_symref TYPE string. @@ -178,6 +185,10 @@ CLASS lcl_git_branch_list IMPLEMENTATION. ev_head_symref = me->mv_head_symref ). ENDMETHOD. "create + METHOD get_head_symref. + rv_head_symref = mv_head_symref. + ENDMETHOD. " get_head_symref. + METHOD find_by_name. IF iv_branch_name IS INITIAL. @@ -197,7 +208,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION. IF mv_head_symref IS NOT INITIAL. rs_branch = find_by_name( mv_head_symref ). ELSE. - rs_branch = find_by_name( head_name ). + rs_branch = find_by_name( c_head_name ). ENDIF. ENDMETHOD. "get_head @@ -246,7 +257,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION. -name = lv_name. -display_name = get_display_name( lv_name ). -type = get_type( lv_name ). - IF -name = head_name OR -name = ev_head_symref. + IF -name = c_head_name OR -name = ev_head_symref. -is_head = abap_true. ENDIF. ENDLOOP. @@ -295,7 +306,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION. METHOD get_type. rv_type = c_type-other. - IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = head_name. + IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = c_head_name. rv_type = c_type-branch. RETURN. ENDIF. @@ -334,4 +345,11 @@ CLASS lcl_git_branch_list IMPLEMENTATION. ENDLOOP. ENDMETHOD. "get_tags_only + METHOD normalize_branch_name. + + rv_name = iv_branch_name. " Force convert to string + REPLACE ALL OCCURRENCES OF ` ` IN rv_name WITH '-'. " Disallow space in branch name + + ENDMETHOD. " normalize_branch_name. + ENDCLASS. "lcl_git_branch_list \ No newline at end of file diff --git a/src/zabapgit_html.prog.abap b/src/zabapgit_html.prog.abap index 1bddb868f..340f7fadb 100644 --- a/src/zabapgit_html.prog.abap +++ b/src/zabapgit_html.prog.abap @@ -332,8 +332,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION. METHOD render. "TODO refactor DATA: lv_class TYPE string, - lv_is_drop TYPE abap_bool, - lv_last TYPE abap_bool. + lv_is_drop TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF mt_items. @@ -359,13 +358,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION. IF iv_as_angle = abap_true. ro_html->add( '
' ). ELSE. - lv_class = 'dropbtn'. - IF iv_no_separator = abap_true. - lv_class = lv_class && ' menu_end' ##NO_TEXT. - ENDIF. - ro_html->add_a( iv_txt = iv_as_droplist_with_label - iv_class = lv_class + iv_class = 'dropbtn' iv_act = '' ). ENDIF. @@ -386,15 +380,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDIF. LOOP AT mt_items ASSIGNING . - lv_last = boolc( sy-tabix = lines( mt_items ) ). IF -sub IS INITIAL. - CLEAR lv_class. - IF iv_no_separator = abap_true - OR lv_last = abap_true - AND iv_as_droplist_with_label IS INITIAL. - lv_class = 'menu_end'. - ENDIF. IF iv_with_icons = abap_true. ro_html->add( '' ). @@ -405,8 +392,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ro_html->add_a( iv_txt = -txt iv_act = -act iv_opt = -opt - iv_typ = -typ - iv_class = lv_class ). + iv_typ = -typ ). IF iv_with_icons = abap_true. ro_html->add( '' ). @@ -414,9 +400,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDIF. ELSE. - ro_html->add( -sub->render( - iv_as_droplist_with_label = -txt - iv_no_separator = lv_last ) ). + ro_html->add( -sub->render( iv_as_droplist_with_label = -txt ) ). ENDIF. ENDLOOP. @@ -426,7 +410,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDIF. IF lv_is_drop = abap_true. " Dropdown - ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( '' ). ENDIF. ro_html->add( '' ). diff --git a/src/zabapgit_html_chunks.prog.abap b/src/zabapgit_html_chunks.prog.abap index 79d4b4fed..0161e66dd 100644 --- a/src/zabapgit_html_chunks.prog.abap +++ b/src/zabapgit_html_chunks.prog.abap @@ -162,7 +162,8 @@ CLASS lcl_gui_chunk_lib IMPLEMENTATION. lv_text = lcl_git_branch_list=>get_display_name( iv_branch ). - IF iv_branch = io_repo->get_head_branch_name( ) OR iv_branch = lcl_git_branch_list=>head_name. + IF iv_branch = io_repo->get_head_branch_name( ) + OR iv_branch = lcl_git_branch_list=>c_head_name. lv_class = 'branch branch_head'. ELSEIF lcl_git_branch_list=>get_type( iv_branch ) = lcl_git_branch_list=>c_type-branch. lv_class = 'branch branch_branch'. diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 5b3b71791..2ecece5c7 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -8,6 +8,11 @@ * *----------------------------------------------------------------------* INTERFACE lif_object_oriented_object. + TYPES: BEGIN OF ty_includes, + programm TYPE programm, + END OF ty_includes, + ty_includes_tt TYPE STANDARD TABLE OF ty_includes WITH DEFAULT KEY. + METHODS: create IMPORTING @@ -62,7 +67,12 @@ INTERFACE lif_object_oriented_object. iv_object_name TYPE dokhl-object iv_language TYPE spras RAISING - lcx_exception. + lcx_exception, + get_includes + IMPORTING + iv_object_name TYPE sobj_name + RETURNING + VALUE(rt_includes) TYPE ty_includes_tt. ENDINTERFACE. CLASS lcl_object_oriented_base DEFINITION ABSTRACT. @@ -85,7 +95,7 @@ CLASS lcl_object_oriented_base IMPLEMENTATION. METHOD lif_object_oriented_object~create. "Subclass responsibility - RETURN. + ASSERT 0 = 1. ENDMETHOD. METHOD lif_object_oriented_object~deserialize_source. @@ -102,7 +112,7 @@ CLASS lcl_object_oriented_base IMPLEMENTATION. METHOD lif_object_oriented_object~generate_locals. "Subclass responsibility - RETURN. + ASSERT 0 = 1. ENDMETHOD. METHOD deserialize_abap_source_old. @@ -172,12 +182,12 @@ CLASS lcl_object_oriented_base IMPLEMENTATION. ENDMETHOD. METHOD lif_object_oriented_object~insert_text_pool. "Subclass responsibility - RETURN. + ASSERT 0 = 1. ENDMETHOD. METHOD lif_object_oriented_object~create_sotr. "Subclass responsibility - RETURN. + ASSERT 0 = 1. ENDMETHOD. METHOD lif_object_oriented_object~create_documentation. @@ -196,6 +206,11 @@ CLASS lcl_object_oriented_base IMPLEMENTATION. ENDIF. ENDMETHOD. + METHOD lif_object_oriented_object~get_includes. + "Subclass responsibility + ASSERT 0 = 1. + ENDMETHOD. + ENDCLASS. @@ -206,7 +221,8 @@ CLASS lcl_object_oriented_class DEFINITION lif_object_oriented_object~create REDEFINITION, lif_object_oriented_object~generate_locals REDEFINITION, lif_object_oriented_object~insert_text_pool REDEFINITION, - lif_object_oriented_object~create_sotr REDEFINITION. + lif_object_oriented_object~create_sotr REDEFINITION, + lif_object_oriented_object~get_includes REDEFINITION. ENDCLASS. CLASS lcl_object_oriented_class IMPLEMENTATION. @@ -325,13 +341,44 @@ CLASS lcl_object_oriented_class IMPLEMENTATION. ENDLOOP. ENDMETHOD. + METHOD lif_object_oriented_object~get_includes. +* note: includes returned might not exist +* method cl_oo_classname_service=>GET_ALL_CLASS_INCLUDES does not exist in 702 + + DATA: lv_class_name TYPE seoclsname, + lt_methods TYPE seop_methods_w_include. + + FIELD-SYMBOLS: LIKE LINE OF lt_methods. + + lv_class_name = iv_object_name. + + APPEND cl_oo_classname_service=>get_ccdef_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccmac_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccimp_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_cl_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccau_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_pubsec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_prosec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_prisec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_classpool_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ct_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_cs_name( lv_class_name ) TO rt_includes. + + lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_class_name ). + LOOP AT lt_methods ASSIGNING . + APPEND -incname TO rt_includes. + ENDLOOP. + + ENDMETHOD. + ENDCLASS. CLASS lcl_object_oriented_interface DEFINITION INHERITING FROM lcl_object_oriented_base. PUBLIC SECTION. METHODS: - lif_object_oriented_object~create REDEFINITION. + lif_object_oriented_object~create REDEFINITION, + lif_object_oriented_object~get_includes REDEFINITION. ENDCLASS. CLASS lcl_object_oriented_interface IMPLEMENTATION. @@ -354,6 +401,12 @@ CLASS lcl_object_oriented_interface IMPLEMENTATION. lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). ENDIF. ENDMETHOD. + METHOD lif_object_oriented_object~get_includes. + DATA lv_interface_name TYPE seoclsname. + lv_interface_name = iv_object_name. + APPEND cl_oo_classname_service=>get_interfacepool_name( lv_interface_name ) TO rt_includes. + ENDMETHOD. + ENDCLASS. CLASS lth_oo_factory_injector DEFINITION DEFERRED. @@ -403,6 +456,11 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. PUBLIC SECTION. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + METHODS constructor + IMPORTING + is_item TYPE ty_item + iv_language TYPE spras. + PROTECTED SECTION. METHODS deserialize_abap IMPORTING io_xml TYPE REF TO lcl_xml_input @@ -474,10 +532,6 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. METHODS reduce CHANGING ct_source TYPE ty_string_tt. - - METHODS get_all_class_includes - RETURNING VALUE(rt_includes) TYPE seoincl_t. - ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* @@ -487,78 +541,22 @@ ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* CLASS lcl_object_clas IMPLEMENTATION. - METHOD get_all_class_includes. -* note: includes returned might not exist -* method cl_oo_classname_service=>GET_ALL_CLASS_INCLUDES does not exist in 702 - - DATA: lv_clsname TYPE seoclsname, - lt_methods TYPE seop_methods_w_include. - - FIELD-SYMBOLS: LIKE LINE OF lt_methods. - - - lv_clsname = ms_item-obj_name. - - APPEND cl_oo_classname_service=>get_ccdef_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccmac_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccimp_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_cl_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccau_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_pubsec_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_prosec_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_prisec_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_classpool_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ct_name( lv_clsname ) TO rt_includes. - APPEND cl_oo_classname_service=>get_cs_name( lv_clsname ) TO rt_includes. - - lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_clsname ). - LOOP AT lt_methods ASSIGNING . - APPEND -incname TO rt_includes. - ENDLOOP. - - ENDMETHOD. - METHOD lif_object~has_changed_since. + DATA: + lt_includes TYPE seoincl_t. - DATA: lv_clsname TYPE seoclsname, - lv_program TYPE program, - lt_incl TYPE seoincl_t. - - FIELD-SYMBOLS LIKE LINE OF lt_incl. - - lv_clsname = ms_item-obj_name. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - TRY. - CALL METHOD cl_oo_classname_service=>('GET_ALL_CLASS_INCLUDES') - EXPORTING - class_name = lv_clsname - RECEIVING - result = lt_incl. - CATCH cx_sy_dyn_call_illegal_method. -* method does not exist in 702, just report everything as changed - rv_changed = abap_true. - ENDTRY. - LOOP AT lt_incl ASSIGNING . - rv_changed = check_prog_changed_since( - iv_program = - iv_timestamp = iv_timestamp - iv_skip_gui = abap_true ). - IF rv_changed = abap_true. - RETURN. - ENDIF. - ENDLOOP. - WHEN 'INTF'. - lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ). - rv_changed = check_prog_changed_since( - iv_program = lv_program - iv_timestamp = iv_timestamp - iv_skip_gui = abap_true ). - WHEN OTHERS. - lcx_exception=>raise( 'class delete, unknown type' ). - ENDCASE. + FIELD-SYMBOLS LIKE LINE OF lt_includes. + lt_includes = mo_object_oriented_object->get_includes( ms_item-obj_name ). + LOOP AT lt_includes ASSIGNING . + rv_changed = check_prog_changed_since( + iv_program = + iv_timestamp = iv_timestamp + iv_skip_gui = abap_true ). + IF rv_changed = abap_true. + RETURN. + ENDIF. + ENDLOOP. ENDMETHOD. "lif_object~has_changed_since METHOD lif_object~get_metadata. @@ -579,21 +577,10 @@ CLASS lcl_object_clas IMPLEMENTATION. DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc, ls_reposrc LIKE LINE OF lt_reposrc, - lt_includes TYPE STANDARD TABLE OF ty_includes, - lv_clsname TYPE seoclsname. + lt_includes TYPE STANDARD TABLE OF ty_includes. - - lv_clsname = ms_item-obj_name. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - lt_includes = get_all_class_includes( ). - ASSERT lines( lt_includes ) > 0. - WHEN 'INTF'. - APPEND cl_oo_classname_service=>get_interfacepool_name( lv_clsname ) TO lt_includes. - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. + lt_includes = mo_object_oriented_object->get_includes( ms_item-obj_name ). + ASSERT lines( lt_includes ) > 0. SELECT unam udat utime FROM reposrc INTO TABLE lt_reposrc @@ -1099,9 +1086,6 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDMETHOD. "serialize_xml METHOD lif_object~deserialize. - - mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). - deserialize_abap( io_xml = io_xml iv_package = iv_package ). @@ -1237,6 +1221,13 @@ CLASS lcl_object_clas IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. + METHOD constructor. + super->constructor( + is_item = is_item + iv_language = iv_language ). + mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). + ENDMETHOD. + ENDCLASS. "lcl_object_CLAS IMPLEMENTATION *----------------------------------------------------------------------* @@ -1249,15 +1240,14 @@ CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. * https://github.com/larshp/abapGit/issues/21 PUBLIC SECTION. METHODS: - lif_object~deserialize REDEFINITION. + lif_object~deserialize REDEFINITION, + lif_object~has_changed_since REDEFINITION. PROTECTED SECTION. METHODS: deserialize_abap REDEFINITION. ENDCLASS. "lcl_object_intf DEFINITION CLASS lcl_object_intf IMPLEMENTATION. METHOD lif_object~deserialize. - mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). - deserialize_abap( io_xml = io_xml iv_package = iv_package ). @@ -1294,4 +1284,18 @@ CLASS lcl_object_intf IMPLEMENTATION. mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). ENDMETHOD. + METHOD lif_object~has_changed_since. + DATA: + lv_program TYPE program, + lt_includes TYPE seoincl_t. + + lt_includes = mo_object_oriented_object->get_includes( ms_item-obj_name ). + READ TABLE lt_includes INDEX 1 INTO lv_program. + "lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ). + rv_changed = check_prog_changed_since( + iv_program = lv_program + iv_timestamp = iv_timestamp + iv_skip_gui = abap_true ). + ENDMETHOD. + ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_object_enho.prog.abap b/src/zabapgit_object_enho.prog.abap index 16c70ae25..83f9f2cca 100644 --- a/src/zabapgit_object_enho.prog.abap +++ b/src/zabapgit_object_enho.prog.abap @@ -2,21 +2,300 @@ *& Include ZABAPGIT_OBJECT_ENHO *&---------------------------------------------------------------------* -* todo, this include could use some refactoring - -* todo, CL_ENH_TOOL_CLASS inherits from CL_ENH_TOOL_CLIF so this -* should also be reflected in the code in this include - -*----------------------------------------------------------------------* -* CLASS lcl_object_enho DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL. * For complete list of tool_type - see ENHTOOLS table + +INTERFACE lif_object_enho. + + METHODS: + deserialize + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception, + serialize + IMPORTING io_xml TYPE REF TO lcl_xml_output + ii_enh_tool TYPE REF TO if_enh_tool + RAISING lcx_exception. + +ENDINTERFACE. + +CLASS lcl_object_enho_clif DEFINITION. + PUBLIC SECTION. - INTERFACES lif_object. - ALIASES mo_files FOR lif_object~mo_files. + CLASS-METHODS: + deserialize + IMPORTING io_xml TYPE REF TO lcl_xml_input + io_clif TYPE REF TO cl_enh_tool_clif + RAISING lcx_exception + cx_enh_root, + serialize + IMPORTING io_xml TYPE REF TO lcl_xml_output + io_files TYPE REF TO lcl_objects_files + io_clif TYPE REF TO cl_enh_tool_clif + RAISING lcx_exception. + + PRIVATE SECTION. + CLASS-METHODS: serialize_includes + IMPORTING io_files TYPE REF TO lcl_objects_files + io_clif TYPE REF TO cl_enh_tool_clif + RAISING lcx_exception. + +ENDCLASS. + +CLASS lcl_object_enho_clif IMPLEMENTATION. + + METHOD serialize_includes. + + DATA: lt_includes TYPE enhnewmeth_tabincl_plus_enha, + lt_source TYPE TABLE OF abaptxt255, + lv_include TYPE programm. + + FIELD-SYMBOLS: LIKE LINE OF lt_includes. + + + lt_includes = io_clif->get_enh_method_includes( ). + LOOP AT lt_includes ASSIGNING . + lv_include = io_clif->if_enh_tool~get_name( ). + TRANSLATE lv_include USING ' ='. + lv_include+30 = 'EM'. + lv_include+32(8) = -includenr. + + CALL FUNCTION 'RPY_PROGRAM_READ' + EXPORTING + program_name = lv_include + with_lowercase = abap_true + TABLES + source_extended = lt_source + EXCEPTIONS + cancelled = 1 + not_found = 2 + permission_error = 3 + OTHERS = 4. + IF sy-subrc = 0. + io_files->add_abap( iv_extra = |EM{ -includenr }| + it_abap = lt_source ). + ENDIF. + ENDLOOP. + + ENDMETHOD. + + METHOD serialize. + + DATA: lt_tab_attributes TYPE enhclasstabattrib, + lt_tab_methods TYPE enhnewmeth_tab. + + FIELD-SYMBOLS: LIKE LINE OF lt_tab_attributes, + LIKE LINE OF lt_tab_methods. + + + io_clif->get_enhattributes( + IMPORTING + tab_attributes = lt_tab_attributes ). + + io_clif->get_enh_new_methodes( + IMPORTING + tab_methodes = lt_tab_methods ). + + serialize_includes( io_clif = io_clif + io_files = io_files ). + + LOOP AT lt_tab_attributes ASSIGNING . + CLEAR: -author, + -createdon, + -changedby, + -changedon. + ENDLOOP. + + LOOP AT lt_tab_methods ASSIGNING . + CLEAR: -meth_header-author, + -meth_header-createdon, + -meth_header-changedby, + -meth_header-changedon, + -meth_header-descript_id. + ENDLOOP. + + io_xml->add( iv_name = 'TAB_ATTRIBUTES' + ig_data = lt_tab_attributes ). + io_xml->add( iv_name = 'TAB_METHODS' + ig_data = lt_tab_methods ). + + ENDMETHOD. + + METHOD deserialize. + + DATA: lt_tab_attributes TYPE enhclasstabattrib, + lt_tab_methods TYPE enhnewmeth_tab, + ls_header TYPE vseomethod, + ls_param TYPE vseomepara, + ls_exc TYPE vseoexcep. + + FIELD-SYMBOLS: LIKE LINE OF lt_tab_methods, + LIKE LINE OF -meth_param, + LIKE LINE OF -meth_exc. + + + io_xml->read( EXPORTING iv_name = 'TAB_ATTRIBUTES' + CHANGING cg_data = lt_tab_attributes ). + io_xml->read( EXPORTING iv_name = 'TAB_METHODS' + CHANGING cg_data = lt_tab_methods ). + + io_clif->set_enhattributes( tab_attributes = lt_tab_attributes ). + +* todo: deserialize includes + +* SAP standard SET_ENH_NEW_METHOS does not work + + LOOP AT lt_tab_methods ASSIGNING . + + MOVE-CORRESPONDING -meth_header TO ls_header. + + io_clif->add_change_new_enh_method( + methkey = -methkey + method_header = ls_header ). + +* parameters + LOOP AT -meth_param ASSIGNING . + MOVE-CORRESPONDING TO ls_param. + io_clif->add_change_enh_methparam( + methname = -methkey-cmpname + param_line = ls_param ). + ENDLOOP. + +* exceptions + LOOP AT -meth_exc ASSIGNING . + MOVE-CORRESPONDING TO ls_exc. + io_clif->add_change_enh_methexc( + methname = -methkey-cmpname + except_line = ls_exc ). + ENDLOOP. + + ENDLOOP. + + ENDMETHOD. + +ENDCLASS. + +CLASS lcl_object_enho_badi DEFINITION. + + PUBLIC SECTION. + METHODS: constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + INTERFACES: lif_object_enho. + + PRIVATE SECTION. + DATA: ms_item TYPE ty_item, + mo_files TYPE REF TO lcl_objects_files. + +ENDCLASS. + +CLASS lcl_object_enho_badi IMPLEMENTATION. + + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. + + METHOD lif_object_enho~serialize. + + DATA: lo_badi_impl TYPE REF TO cl_enh_tool_badi_impl, + lv_spot_name TYPE enhspotname, + lv_shorttext TYPE string, + lt_impl TYPE enh_badi_impl_data_it. + + FIELD-SYMBOLS: LIKE LINE OF lt_impl, + LIKE LINE OF -filter_values, + LIKE LINE OF -filters. + + + lo_badi_impl ?= ii_enh_tool. + + lv_shorttext = lo_badi_impl->if_enh_object_docu~get_shorttext( ). + lv_spot_name = lo_badi_impl->get_spot_name( ). + lt_impl = lo_badi_impl->get_implementations( ). + + LOOP AT lt_impl ASSIGNING . +* make sure the XML serialization does not dump, field type = N + LOOP AT -filter_values ASSIGNING . + IF -filter_numeric_value1 CA space. + CLEAR -filter_numeric_value1. + ENDIF. + ENDLOOP. + LOOP AT -filters ASSIGNING . + IF -filter_numeric_value1 CA space. + CLEAR -filter_numeric_value1. + ENDIF. + ENDLOOP. + ENDLOOP. + + io_xml->add( iv_name = 'TOOL' + ig_data = ii_enh_tool->get_tool( ) ). + io_xml->add( ig_data = lv_shorttext + iv_name = 'SHORTTEXT' ). + io_xml->add( iv_name = 'SPOT_NAME' + ig_data = lv_spot_name ). + io_xml->add( iv_name = 'IMPL' + ig_data = lt_impl ). + + ENDMETHOD. + + METHOD lif_object_enho~deserialize. + + DATA: lv_spot_name TYPE enhspotname, + lv_shorttext TYPE string, + lv_enhname TYPE enhname, + lo_badi TYPE REF TO cl_enh_tool_badi_impl, + li_tool TYPE REF TO if_enh_tool, + lv_package TYPE devclass, + lt_impl TYPE enh_badi_impl_data_it. + + FIELD-SYMBOLS: LIKE LINE OF lt_impl. + + + io_xml->read( EXPORTING iv_name = 'SHORTTEXT' + CHANGING cg_data = lv_shorttext ). + io_xml->read( EXPORTING iv_name = 'SPOT_NAME' + CHANGING cg_data = lv_spot_name ). + io_xml->read( EXPORTING iv_name = 'IMPL' + CHANGING cg_data = lt_impl ). + + lv_enhname = ms_item-obj_name. + lv_package = iv_package. + TRY. + cl_enh_factory=>create_enhancement( + EXPORTING + enhname = lv_enhname + enhtype = cl_abstract_enh_tool_redef=>credefinition + enhtooltype = cl_enh_tool_badi_impl=>tooltype + IMPORTING + enhancement = li_tool + CHANGING + devclass = lv_package ). + lo_badi ?= li_tool. + + lo_badi->set_spot_name( lv_spot_name ). + lo_badi->if_enh_object_docu~set_shorttext( lv_shorttext ). + LOOP AT lt_impl ASSIGNING . + lo_badi->add_implementation( ). + ENDLOOP. + lo_badi->if_enh_object~save( ). + lo_badi->if_enh_object~unlock( ). + CATCH cx_enh_root. + lcx_exception=>raise( 'error deserializing ENHO badi' ). + ENDTRY. + + ENDMETHOD. + +ENDCLASS. + +CLASS lcl_object_enho_hook DEFINITION. + PUBLIC SECTION. + METHODS: constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + + INTERFACES: lif_object_enho. PRIVATE SECTION. TYPES: BEGIN OF ty_spaces, @@ -26,63 +305,66 @@ CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL. TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY. - METHODS deserialize_badi - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - METHODS deserialize_hook - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - METHODS deserialize_class - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. + DATA: ms_item TYPE ty_item. + DATA: mo_files TYPE REF TO lcl_objects_files. + METHODS hook_impl_deserialize IMPORTING it_spaces TYPE ty_spaces_tt CHANGING ct_impl TYPE enh_hook_impl_it RAISING lcx_exception. - - METHODS serialize_badi - IMPORTING io_xml TYPE REF TO lcl_xml_output - iv_tool TYPE enhtooltype - ii_enh_tool TYPE REF TO if_enh_tool - RAISING lcx_exception. - METHODS serialize_hook - IMPORTING io_xml TYPE REF TO lcl_xml_output - iv_tool TYPE enhtooltype - ii_enh_tool TYPE REF TO if_enh_tool - RAISING lcx_exception. - METHODS serialize_class - IMPORTING io_xml TYPE REF TO lcl_xml_output - iv_tool TYPE enhtooltype - ii_enh_tool TYPE REF TO if_enh_tool - RAISING lcx_exception. METHODS hook_impl_serialize EXPORTING et_spaces TYPE ty_spaces_tt CHANGING ct_impl TYPE enh_hook_impl_it RAISING lcx_exception. -ENDCLASS. "lcl_object_enho DEFINITION +ENDCLASS. -*----------------------------------------------------------------------* -* CLASS lcl_object_enho IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_enho IMPLEMENTATION. +CLASS lcl_object_enho_hook IMPLEMENTATION. - METHOD lif_object~has_changed_since. - rv_changed = abap_true. - ENDMETHOD. "lif_object~has_changed_since + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. "lif_object~get_metadata + METHOD lif_object_enho~serialize. + + DATA: lv_shorttext TYPE string, + lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, + ls_original_object TYPE enh_hook_admin, + lt_spaces TYPE ty_spaces_tt, + lt_enhancements TYPE enh_hook_impl_it. + + + lo_hook_impl ?= ii_enh_tool. + + lv_shorttext = lo_hook_impl->if_enh_object_docu~get_shorttext( ). + lo_hook_impl->get_original_object( + IMPORTING + pgmid = ls_original_object-pgmid + obj_name = ls_original_object-org_obj_name + obj_type = ls_original_object-org_obj_type + main_type = ls_original_object-org_main_type + main_name = ls_original_object-org_main_name + program = ls_original_object-programname ). + ls_original_object-include_bound = lo_hook_impl->get_include_bound( ). + lt_enhancements = lo_hook_impl->get_hook_impls( ). + + hook_impl_serialize( + IMPORTING et_spaces = lt_spaces + CHANGING ct_impl = lt_enhancements ). + + io_xml->add( iv_name = 'TOOL' + ig_data = ii_enh_tool->get_tool( ) ). + io_xml->add( ig_data = lv_shorttext + iv_name = 'SHORTTEXT' ). + io_xml->add( ig_data = ls_original_object + iv_name = 'ORIGINAL_OBJECT' ). + io_xml->add( iv_name = 'ENHANCEMENTS' + ig_data = lt_enhancements ). + io_xml->add( iv_name = 'SPACES' + ig_data = lt_spaces ). - METHOD lif_object~changed_by. - rv_user = c_user_unknown. " todo ENDMETHOD. METHOD hook_impl_serialize. @@ -132,209 +414,7 @@ CLASS lcl_object_enho IMPLEMENTATION. ENDMETHOD. - METHOD lif_object~exists. - - DATA: lv_enh_id TYPE enhname. - - - lv_enh_id = ms_item-obj_name. - TRY. - cl_enh_factory=>get_enhancement( - enhancement_id = lv_enh_id - bypassing_buffer = abap_true ). - rv_bool = abap_true. - CATCH cx_enh_root. - rv_bool = abap_false. - ENDTRY. - - ENDMETHOD. "lif_object~exists - - METHOD lif_object~serialize. - - DATA: lv_enh_id TYPE enhname, - lv_tool TYPE enhtooltype, - li_enh_tool TYPE REF TO if_enh_tool. - - - IF lif_object~exists( ) = abap_false. - RETURN. - ENDIF. - - lv_enh_id = ms_item-obj_name. - TRY. - li_enh_tool = cl_enh_factory=>get_enhancement( - enhancement_id = lv_enh_id - bypassing_buffer = abap_true ). - CATCH cx_enh_root. - lcx_exception=>raise( 'Error from CL_ENH_FACTORY' ). - ENDTRY. - lv_tool = li_enh_tool->get_tool( ). - - CASE lv_tool. - WHEN cl_enh_tool_badi_impl=>tooltype. - serialize_badi( io_xml = io_xml - iv_tool = lv_tool - ii_enh_tool = li_enh_tool ). - WHEN cl_enh_tool_hook_impl=>tooltype. - serialize_hook( io_xml = io_xml - iv_tool = lv_tool - ii_enh_tool = li_enh_tool ). - WHEN cl_enh_tool_class=>tooltype. - serialize_class( io_xml = io_xml - iv_tool = lv_tool - ii_enh_tool = li_enh_tool ). -* ToDo: -* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr -* WHEN cl_enh_tool_intf=>tooltype. -* WHEN cl_wdr_cfg_enhancement=>tooltype. -* WHEN 'ENHWDYN'. "cl_enh_tool_wdy - WHEN OTHERS. - lcx_exception=>raise( |Unsupported ENHO type { lv_tool }| ). - ENDCASE. - - ENDMETHOD. "serialize - - METHOD lif_object~deserialize. - - DATA: lv_tool TYPE enhtooltype. - - IF lif_object~exists( ) = abap_true. - lif_object~delete( ). - ENDIF. - - io_xml->read( EXPORTING iv_name = 'TOOL' - CHANGING cg_data = lv_tool ). - - CASE lv_tool. - WHEN cl_enh_tool_badi_impl=>tooltype. - deserialize_badi( io_xml = io_xml - iv_package = iv_package ). - WHEN cl_enh_tool_hook_impl=>tooltype. - deserialize_hook( io_xml = io_xml - iv_package = iv_package ). - WHEN cl_enh_tool_class=>tooltype. - deserialize_class( io_xml = io_xml - iv_package = iv_package ). -* ToDo: -* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr -* WHEN cl_enh_tool_intf=>tooltype. -* WHEN cl_wdr_cfg_enhancement=>tooltype. -* WHEN 'ENHWDYN'. "cl_enh_tool_wdy - WHEN OTHERS. - lcx_exception=>raise( |Unsupported ENHO type { lv_tool }| ). - ENDCASE. - - lcl_objects_activation=>add_item( ms_item ). - - ENDMETHOD. "deserialize - - METHOD deserialize_badi. - - DATA: lv_spot_name TYPE enhspotname, - lv_shorttext TYPE string, - lv_enhname TYPE enhname, - lo_badi TYPE REF TO cl_enh_tool_badi_impl, - li_tool TYPE REF TO if_enh_tool, - lv_package TYPE devclass, - lt_impl TYPE enh_badi_impl_data_it. - - FIELD-SYMBOLS: LIKE LINE OF lt_impl. - - - io_xml->read( EXPORTING iv_name = 'SHORTTEXT' - CHANGING cg_data = lv_shorttext ). - io_xml->read( EXPORTING iv_name = 'SPOT_NAME' - CHANGING cg_data = lv_spot_name ). - io_xml->read( EXPORTING iv_name = 'IMPL' - CHANGING cg_data = lt_impl ). - - lv_enhname = ms_item-obj_name. - lv_package = iv_package. - TRY. - cl_enh_factory=>create_enhancement( - EXPORTING - enhname = lv_enhname - enhtype = cl_abstract_enh_tool_redef=>credefinition - enhtooltype = cl_enh_tool_badi_impl=>tooltype - IMPORTING - enhancement = li_tool - CHANGING - devclass = lv_package ). - lo_badi ?= li_tool. - - lo_badi->set_spot_name( lv_spot_name ). - lo_badi->if_enh_object_docu~set_shorttext( lv_shorttext ). - LOOP AT lt_impl ASSIGNING . - lo_badi->add_implementation( ). - ENDLOOP. - lo_badi->if_enh_object~save( ). - lo_badi->if_enh_object~unlock( ). - CATCH cx_enh_root. - lcx_exception=>raise( 'error deserializing ENHO badi' ). - ENDTRY. - - ENDMETHOD. "deserialize_badi - - METHOD deserialize_class. - - DATA: lo_enh_class TYPE REF TO cl_enh_tool_class, - lt_owr TYPE enhmeth_tabkeys, - lt_pre TYPE enhmeth_tabkeys, - lt_post TYPE enhmeth_tabkeys, - lt_source TYPE rswsourcet, - li_tool TYPE REF TO if_enh_tool, - lv_shorttext TYPE string, - lv_class TYPE seoclsname, - lv_enhname TYPE enhname, - lv_package TYPE devclass. - - - io_xml->read( EXPORTING iv_name = 'SHORTTEXT' - CHANGING cg_data = lv_shorttext ). - io_xml->read( EXPORTING iv_name = 'OWR_METHODS' - CHANGING cg_data = lt_owr ). - io_xml->read( EXPORTING iv_name = 'PRE_METHODS' - CHANGING cg_data = lt_pre ). - io_xml->read( EXPORTING iv_name = 'POST_METHODS' - CHANGING cg_data = lt_post ). - io_xml->read( EXPORTING iv_name = 'CLASS' - CHANGING cg_data = lv_class ). - lt_source = mo_files->read_abap( ). - - lv_enhname = ms_item-obj_name. - lv_package = iv_package. - TRY. - cl_enh_factory=>create_enhancement( - EXPORTING - enhname = lv_enhname - enhtype = '' - enhtooltype = cl_enh_tool_class=>tooltype - IMPORTING - enhancement = li_tool - CHANGING - devclass = lv_package ). - lo_enh_class ?= li_tool. - - lo_enh_class->if_enh_object_docu~set_shorttext( lv_shorttext ). - lo_enh_class->set_class( lv_class ). - lo_enh_class->set_owr_methods( version = 'I' - owr_methods = lt_owr ). - lo_enh_class->set_pre_methods( version = 'I' - pre_methods = lt_pre ). - lo_enh_class->set_post_methods( version = 'I' - post_methods = lt_post ). - lo_enh_class->set_eimp_include( version = 'I' - eimp_source = lt_source ). - - lo_enh_class->if_enh_object~save( ). - lo_enh_class->if_enh_object~unlock( ). - CATCH cx_enh_root. - lcx_exception=>raise( 'error deserializing ENHO class' ). - ENDTRY. - - ENDMETHOD. - - METHOD deserialize_hook. + METHOD lif_object_enho~deserialize. DATA: lv_shorttext TYPE string, lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, @@ -400,52 +480,130 @@ CLASS lcl_object_enho IMPLEMENTATION. lcx_exception=>raise( 'error deserializing ENHO hook' ). ENDTRY. - ENDMETHOD. "deserialize_hook + ENDMETHOD. - METHOD serialize_badi. +ENDCLASS. - DATA: lo_badi_impl TYPE REF TO cl_enh_tool_badi_impl, - lv_spot_name TYPE enhspotname, - lv_shorttext TYPE string, - lt_impl TYPE enh_badi_impl_data_it. +CLASS lcl_object_enho_interface DEFINITION. - FIELD-SYMBOLS: LIKE LINE OF lt_impl, - LIKE LINE OF -filter_values, - LIKE LINE OF -filters. + PUBLIC SECTION. + METHODS: + constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + INTERFACES: lif_object_enho. + + PRIVATE SECTION. + DATA: ms_item TYPE ty_item, + mo_files TYPE REF TO lcl_objects_files. + +ENDCLASS. + +CLASS lcl_object_enho_interface IMPLEMENTATION. + + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. + + METHOD lif_object_enho~serialize. + + DATA: lo_enh_intf TYPE REF TO cl_enh_tool_intf, + lv_class TYPE seoclsname, + lv_shorttext TYPE string. - lo_badi_impl ?= ii_enh_tool. + lo_enh_intf ?= ii_enh_tool. - lv_shorttext = lo_badi_impl->if_enh_object_docu~get_shorttext( ). - lv_spot_name = lo_badi_impl->get_spot_name( ). - lt_impl = lo_badi_impl->get_implementations( ). - - LOOP AT lt_impl ASSIGNING . -* make sure the XML serialization does not dump, field type = N - LOOP AT -filter_values ASSIGNING . - IF -filter_numeric_value1 CA space. - CLEAR -filter_numeric_value1. - ENDIF. - ENDLOOP. - LOOP AT -filters ASSIGNING . - IF -filter_numeric_value1 CA space. - CLEAR -filter_numeric_value1. - ENDIF. - ENDLOOP. - ENDLOOP. + lv_shorttext = lo_enh_intf->if_enh_object_docu~get_shorttext( ). + lo_enh_intf->get_class( IMPORTING class_name = lv_class ). io_xml->add( iv_name = 'TOOL' - ig_data = iv_tool ). + ig_data = ii_enh_tool->get_tool( ) ). io_xml->add( ig_data = lv_shorttext iv_name = 'SHORTTEXT' ). - io_xml->add( iv_name = 'SPOT_NAME' - ig_data = lv_spot_name ). - io_xml->add( iv_name = 'IMPL' - ig_data = lt_impl ). + io_xml->add( iv_name = 'CLASS' + ig_data = lv_class ). - ENDMETHOD. "serialize_badi + lcl_object_enho_clif=>serialize( + io_xml = io_xml + io_files = mo_files + io_clif = lo_enh_intf ). - METHOD serialize_class. + ENDMETHOD. + + METHOD lif_object_enho~deserialize. + + DATA: lo_enh_intf TYPE REF TO cl_enh_tool_intf, + lt_source TYPE rswsourcet, + li_tool TYPE REF TO if_enh_tool, + lv_shorttext TYPE string, + lv_class TYPE seoclsname, + lv_enhname TYPE enhname, + lv_package TYPE devclass. + + + io_xml->read( EXPORTING iv_name = 'SHORTTEXT' + CHANGING cg_data = lv_shorttext ). + io_xml->read( EXPORTING iv_name = 'CLASS' + CHANGING cg_data = lv_class ). + + lv_enhname = ms_item-obj_name. + lv_package = iv_package. + TRY. + cl_enh_factory=>create_enhancement( + EXPORTING + enhname = lv_enhname + enhtype = '' + enhtooltype = cl_enh_tool_intf=>tooltype + IMPORTING + enhancement = li_tool + CHANGING + devclass = lv_package ). + lo_enh_intf ?= li_tool. + + lo_enh_intf->if_enh_object_docu~set_shorttext( lv_shorttext ). + lo_enh_intf->set_class( lv_class ). + + lcl_object_enho_clif=>deserialize( + io_xml = io_xml + io_clif = lo_enh_intf ). + + lo_enh_intf->if_enh_object~save( ). + lo_enh_intf->if_enh_object~unlock( ). + CATCH cx_enh_root. + lcx_exception=>raise( 'error deserializing ENHO interface' ). + ENDTRY. + + ENDMETHOD. + +ENDCLASS. + +CLASS lcl_object_enho_class DEFINITION. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING + is_item TYPE ty_item + io_files TYPE REF TO lcl_objects_files. + INTERFACES: lif_object_enho. + + PRIVATE SECTION. + DATA: ms_item TYPE ty_item. + DATA: mo_files TYPE REF TO lcl_objects_files. + +ENDCLASS. + +CLASS lcl_object_enho_class IMPLEMENTATION. + + METHOD constructor. + ms_item = is_item. + mo_files = io_files. + ENDMETHOD. + + METHOD lif_object_enho~serialize. DATA: lo_enh_class TYPE REF TO cl_enh_tool_class, lt_owr TYPE enhmeth_tabkeys, @@ -466,7 +624,7 @@ CLASS lcl_object_enho IMPLEMENTATION. lo_enh_class->get_class( IMPORTING class_name = lv_class ). io_xml->add( iv_name = 'TOOL' - ig_data = iv_tool ). + ig_data = ii_enh_tool->get_tool( ) ). io_xml->add( ig_data = lv_shorttext iv_name = 'SHORTTEXT' ). io_xml->add( iv_name = 'CLASS' @@ -480,47 +638,219 @@ CLASS lcl_object_enho IMPLEMENTATION. mo_files->add_abap( lt_source ). + lcl_object_enho_clif=>serialize( + io_xml = io_xml + io_files = mo_files + io_clif = lo_enh_class ). + ENDMETHOD. - METHOD serialize_hook. + METHOD lif_object_enho~deserialize. - DATA: lv_shorttext TYPE string, - lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, - ls_original_object TYPE enh_hook_admin, - lt_spaces TYPE ty_spaces_tt, - lt_enhancements TYPE enh_hook_impl_it. + DATA: lo_enh_class TYPE REF TO cl_enh_tool_class, + lt_owr TYPE enhmeth_tabkeys, + lt_pre TYPE enhmeth_tabkeys, + lt_post TYPE enhmeth_tabkeys, + lt_source TYPE rswsourcet, + li_tool TYPE REF TO if_enh_tool, + lv_shorttext TYPE string, + lv_class TYPE seoclsname, + lv_enhname TYPE enhname, + lv_package TYPE devclass. - lo_hook_impl ?= ii_enh_tool. + io_xml->read( EXPORTING iv_name = 'SHORTTEXT' + CHANGING cg_data = lv_shorttext ). + io_xml->read( EXPORTING iv_name = 'OWR_METHODS' + CHANGING cg_data = lt_owr ). + io_xml->read( EXPORTING iv_name = 'PRE_METHODS' + CHANGING cg_data = lt_pre ). + io_xml->read( EXPORTING iv_name = 'POST_METHODS' + CHANGING cg_data = lt_post ). + io_xml->read( EXPORTING iv_name = 'CLASS' + CHANGING cg_data = lv_class ). + lt_source = mo_files->read_abap( ). - lv_shorttext = lo_hook_impl->if_enh_object_docu~get_shorttext( ). - lo_hook_impl->get_original_object( - IMPORTING - pgmid = ls_original_object-pgmid - obj_name = ls_original_object-org_obj_name - obj_type = ls_original_object-org_obj_type - main_type = ls_original_object-org_main_type - main_name = ls_original_object-org_main_name - program = ls_original_object-programname ). - ls_original_object-include_bound = lo_hook_impl->get_include_bound( ). - lt_enhancements = lo_hook_impl->get_hook_impls( ). + lv_enhname = ms_item-obj_name. + lv_package = iv_package. + TRY. + cl_enh_factory=>create_enhancement( + EXPORTING + enhname = lv_enhname + enhtype = '' + enhtooltype = cl_enh_tool_class=>tooltype + IMPORTING + enhancement = li_tool + CHANGING + devclass = lv_package ). + lo_enh_class ?= li_tool. - hook_impl_serialize( - IMPORTING et_spaces = lt_spaces - CHANGING ct_impl = lt_enhancements ). + lo_enh_class->if_enh_object_docu~set_shorttext( lv_shorttext ). + lo_enh_class->set_class( lv_class ). + lo_enh_class->set_owr_methods( version = 'I' + owr_methods = lt_owr ). + lo_enh_class->set_pre_methods( version = 'I' + pre_methods = lt_pre ). + lo_enh_class->set_post_methods( version = 'I' + post_methods = lt_post ). + lo_enh_class->set_eimp_include( version = 'I' + eimp_source = lt_source ). - io_xml->add( iv_name = 'TOOL' - ig_data = iv_tool ). - io_xml->add( ig_data = lv_shorttext - iv_name = 'SHORTTEXT' ). - io_xml->add( ig_data = ls_original_object - iv_name = 'ORIGINAL_OBJECT' ). - io_xml->add( iv_name = 'ENHANCEMENTS' - ig_data = lt_enhancements ). - io_xml->add( iv_name = 'SPACES' - ig_data = lt_spaces ). + lcl_object_enho_clif=>deserialize( + io_xml = io_xml + io_clif = lo_enh_class ). - ENDMETHOD. "serialize_hook + lo_enh_class->if_enh_object~save( ). + lo_enh_class->if_enh_object~unlock( ). + CATCH cx_enh_root. + lcx_exception=>raise( 'error deserializing ENHO class' ). + ENDTRY. + + ENDMETHOD. + +ENDCLASS. + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + + PRIVATE SECTION. + + METHODS: + factory + IMPORTING + iv_tool TYPE enhtooltype + RETURNING + VALUE(ri_enho) TYPE REF TO lif_object_enho + RAISING + lcx_exception. + +ENDCLASS. "lcl_object_enho DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_enho IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_enho IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~changed_by. + rv_user = c_user_unknown. " todo + ENDMETHOD. + + METHOD lif_object~exists. + + DATA: lv_enh_id TYPE enhname. + + + lv_enh_id = ms_item-obj_name. + TRY. + cl_enh_factory=>get_enhancement( + enhancement_id = lv_enh_id + bypassing_buffer = abap_true ). + rv_bool = abap_true. + CATCH cx_enh_root. + rv_bool = abap_false. + ENDTRY. + + ENDMETHOD. "lif_object~exists + + METHOD lif_object~serialize. + + DATA: lv_enh_id TYPE enhname, + li_enho TYPE REF TO lif_object_enho, + li_enh_tool TYPE REF TO if_enh_tool. + + + IF lif_object~exists( ) = abap_false. + RETURN. + ENDIF. + + lv_enh_id = ms_item-obj_name. + TRY. + li_enh_tool = cl_enh_factory=>get_enhancement( + enhancement_id = lv_enh_id + bypassing_buffer = abap_true ). + CATCH cx_enh_root. + lcx_exception=>raise( 'Error from CL_ENH_FACTORY' ). + ENDTRY. + + li_enho = factory( li_enh_tool->get_tool( ) ). + + li_enho->serialize( io_xml = io_xml + ii_enh_tool = li_enh_tool ). + + ENDMETHOD. "serialize + + METHOD factory. + + CASE iv_tool. + WHEN cl_enh_tool_badi_impl=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_badi + EXPORTING + is_item = ms_item + io_files = mo_files. + WHEN cl_enh_tool_hook_impl=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_hook + EXPORTING + is_item = ms_item + io_files = mo_files. + WHEN cl_enh_tool_class=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_class + EXPORTING + is_item = ms_item + io_files = mo_files. + WHEN cl_enh_tool_intf=>tooltype. + CREATE OBJECT ri_enho TYPE lcl_object_enho_interface + EXPORTING + is_item = ms_item + io_files = mo_files. +* ToDo: +* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr +* WHEN cl_wdr_cfg_enhancement=>tooltype. +* WHEN 'ENHWDYN'. "cl_enh_tool_wdy + WHEN OTHERS. + lcx_exception=>raise( |Unsupported ENHO type { iv_tool }| ). + ENDCASE. + + ENDMETHOD. + + METHOD lif_object~deserialize. + + DATA: lv_tool TYPE enhtooltype, + li_enho TYPE REF TO lif_object_enho. + + + IF lif_object~exists( ) = abap_true. + lif_object~delete( ). + ENDIF. + + io_xml->read( EXPORTING iv_name = 'TOOL' + CHANGING cg_data = lv_tool ). + + li_enho = factory( lv_tool ). + + li_enho->deserialize( io_xml = io_xml + iv_package = iv_package ). + + lcl_objects_activation=>add_item( ms_item ). + + ENDMETHOD. "deserialize METHOD lif_object~delete. diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index c67ed6523..c00b09add 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -7,32 +7,40 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page. PUBLIC SECTION. CONSTANTS: - BEGIN OF c_mod, + BEGIN OF c_fstate, local TYPE char1 VALUE 'L', remote TYPE char1 VALUE 'R', both TYPE char1 VALUE 'B', - END OF c_mod. + END OF c_fstate. TYPES: BEGIN OF ty_file_diff, filename TYPE string, lstate TYPE char1, rstate TYPE char1, - mod TYPE char1, " Abstraction for shorter ifs + fstate TYPE char1, " FILE state - Abstraction for shorter ifs o_diff TYPE REF TO lcl_diff, END OF ty_file_diff, tt_file_diff TYPE STANDARD TABLE OF ty_file_diff. - METHODS: constructor - IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key - is_file TYPE ty_file OPTIONAL - is_object TYPE ty_item OPTIONAL - RAISING lcx_exception. + METHODS: + constructor + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + is_file TYPE ty_file OPTIONAL + is_object TYPE ty_item OPTIONAL + RAISING lcx_exception, + lif_gui_page~on_event REDEFINITION. PROTECTED SECTION. METHODS render_content REDEFINITION. PRIVATE SECTION. - DATA: mt_diff_files TYPE tt_file_diff. + CONSTANTS: BEGIN OF c_actions, + toggle_unified TYPE string VALUE 'toggle_unified', + END OF c_actions. + + DATA: mt_diff_files TYPE tt_file_diff, + mt_delayed_lines TYPE lcl_diff=>ty_diffs_tt, + mv_unified TYPE abap_bool VALUE abap_true. METHODS render_diff IMPORTING is_diff TYPE ty_file_diff @@ -49,16 +57,20 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page. IMPORTING is_diff_line TYPE lcl_diff=>ty_diff is_diff TYPE ty_file_diff RETURNING VALUE(ro_html) TYPE REF TO lcl_html. - METHODS get_line_hl - IMPORTING iv_mod TYPE char1 - iv_result TYPE lcl_diff=>ty_diff-result - EXPORTING ev_lattr TYPE string - ev_rattr TYPE string. + METHODS render_line_split + IMPORTING is_diff_line TYPE lcl_diff=>ty_diff + iv_fstate TYPE char1 + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. + METHODS render_line_unified + IMPORTING is_diff_line TYPE lcl_diff=>ty_diff OPTIONAL + RETURNING VALUE(ro_html) TYPE REF TO lcl_html. METHODS append_diff IMPORTING it_remote TYPE ty_files_tt it_local TYPE ty_files_item_tt is_status TYPE ty_result RAISING lcx_exception. + METHODS build_menu + RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar. ENDCLASS. "lcl_gui_page_diff @@ -75,6 +87,8 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. super->constructor( ). ms_control-page_title = 'DIFF'. + ms_control-page_menu = build_menu( ). + mv_unified = lcl_app=>user( )->get_diff_unified( ). ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed @@ -154,14 +168,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. -rstate = is_status-rstate. IF -lstate IS NOT INITIAL AND -rstate IS NOT INITIAL. - -mod = c_mod-both. + -fstate = c_fstate-both. ELSEIF -lstate IS NOT INITIAL. - -mod = c_mod-local. + -fstate = c_fstate-local. ELSE. "rstate IS NOT INITIAL, lstate = empty. - -mod = c_mod-remote. + -fstate = c_fstate-remote. ENDIF. - IF -mod = c_mod-remote. " Remote file leading changes + IF -fstate = c_fstate-remote. " Remote file leading changes CREATE OBJECT -o_diff EXPORTING iv_new = -data @@ -175,45 +189,46 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ENDMETHOD. "append_diff - METHOD render_diff_head. - DATA: lo_html TYPE REF TO lcl_html, - ls_stats TYPE lcl_diff=>ty_count. + METHOD build_menu. + CREATE OBJECT ro_menu. + ro_menu->add( iv_txt = 'Split/Unified view' + iv_act = c_actions-toggle_unified ) ##NO_TEXT. + ENDMETHOD. " build_menu. - CREATE OBJECT lo_html. +********************************************************************** +* EVENT HANDLING +********************************************************************** - ls_stats = is_diff-o_diff->stats( ). + METHOD lif_gui_page~on_event. - IF is_diff-mod = c_mod-both. " Merge stats into 'update' if both were changed - ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete. - CLEAR: ls_stats-insert, ls_stats-delete. - ENDIF. + CASE iv_action. + WHEN c_actions-toggle_unified. " Toggle file diplay + mv_unified = lcl_app=>user( )->toggle_diff_unified( ). + ev_state = gc_event_state-re_render. + ENDCASE. - lo_html->add( '
' ). "#EC NOTEXT - lo_html->add( |+ { ls_stats-insert }| ). - lo_html->add( |- { ls_stats-delete }| ). - lo_html->add( |~ { ls_stats-update }| ). - lo_html->add( |{ is_diff-filename }| ). "#EC NOTEXT - lo_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_diff-lstate - iv2 = is_diff-rstate ) ). - lo_html->add( '
' ). "#EC NOTEXT + ENDMETHOD. "lif_gui_page~on_event - ro_html = lo_html. - ENDMETHOD. +********************************************************************** +* RENDER LOGIC +********************************************************************** - METHOD render_table_head. + METHOD render_content. + + DATA ls_diff_file LIKE LINE OF mt_diff_files. CREATE OBJECT ro_html. - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( 'LOCAL' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( 'REMOTE' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + LOOP AT mt_diff_files INTO ls_diff_file. + lcl_progress=>show( iv_key = 'Diff' + iv_current = sy-tabix + iv_total = lines( mt_diff_files ) + iv_text = |Render Diff - { ls_diff_file-filename }| ). - ENDMETHOD. " render_table_head. + ro_html->add( render_diff( ls_diff_file ) ). + ENDLOOP. + + ENDMETHOD. "render_content METHOD render_diff. @@ -232,11 +247,70 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ro_html->add( '' ). "#EC NOTEXT + ENDMETHOD. " render_diff + +********************************************************************** +* CHUNKS +********************************************************************** + + METHOD render_diff_head. + + DATA: ls_stats TYPE lcl_diff=>ty_count. + + CREATE OBJECT ro_html. + ls_stats = is_diff-o_diff->stats( ). + + IF is_diff-fstate = c_fstate-both. " Merge stats into 'update' if both were changed + ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete. + CLEAR: ls_stats-insert, ls_stats-delete. + ENDIF. + + ro_html->add( '
' ). "#EC NOTEXT + + ro_html->add( |+ { ls_stats-insert }| ). + ro_html->add( |- { ls_stats-delete }| ). + ro_html->add( |~ { ls_stats-update }| ). + ro_html->add( |{ is_diff-filename }| ). "#EC NOTEXT + ro_html->add( lcl_gui_chunk_lib=>render_item_state( iv1 = is_diff-lstate + iv2 = is_diff-rstate ) ). + + IF is_diff-fstate = c_fstate-both AND mv_unified = abap_true. + ro_html->add( 'Attention: Unified mode' + && ' highlighting for MM assumes local file is newer ! ' ). "#EC NOTEXT + ENDIF. + + ro_html->add( '
' ). "#EC NOTEXT + ENDMETHOD. + METHOD render_table_head. + + CREATE OBJECT ro_html. + + IF mv_unified = abap_true. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'old' ). "#EC NOTEXT + ro_html->add( 'new' ). "#EC NOTEXT + ro_html->add( 'code' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ELSE. + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'LOCAL' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'REMOTE' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ENDIF. + + ENDMETHOD. " render_table_head. + METHOD render_beacon. - DATA: lv_beacon TYPE string. + DATA: lv_beacon TYPE string. CREATE OBJECT ro_html. @@ -246,10 +320,19 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lv_beacon = '---'. ENDIF. + ro_html->add( '' ). ro_html->add( '' ). - ro_html->add( '' ). - ro_html->add( |@@ { is_diff_line-new_line } @@ { lv_beacon }| ). + + IF mv_unified = abap_true. + ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( |@@ { is_diff_line-new_num } @@ { lv_beacon }| ). + ELSE. + ro_html->add( '' ). + ro_html->add( |@@ { is_diff_line-new_num } @@ { lv_beacon }| ). + ENDIF. + ro_html->add( '' ). ro_html->add( '' ). @@ -259,10 +342,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter, lt_diffs TYPE lcl_diff=>ty_diffs_tt, - lv_local TYPE string, - lv_remote TYPE string, - lv_lattr TYPE string, - lv_rattr TYPE string, lv_insert_nav TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF lt_diffs. @@ -283,83 +362,125 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lv_insert_nav = abap_false. ENDIF. - IF is_diff-mod = c_mod-remote. " Remote file leading changes - lv_local = -old. - lv_remote = -new. - ELSE. " Local leading changes or both were modified - lv_local = -new. - lv_remote = -old. - ENDIF. - IF lo_highlighter IS BOUND. - lv_local = lo_highlighter->process_line( lv_local ). - lv_remote = lo_highlighter->process_line( lv_remote ). + -new = lo_highlighter->process_line( -new ). + -old = lo_highlighter->process_line( -old ). ELSE. - lv_local = escape( val = lv_local format = cl_abap_format=>e_html_attr ). - lv_remote = escape( val = lv_remote format = cl_abap_format=>e_html_attr ). + -new = escape( val = -new format = cl_abap_format=>e_html_attr ). + -old = escape( val = -old format = cl_abap_format=>e_html_attr ). ENDIF. - get_line_hl( EXPORTING iv_mod = is_diff-mod - iv_result = -result - IMPORTING ev_lattr = lv_lattr - ev_rattr = lv_rattr ). + CONDENSE -new_num. "get rid of leading spaces + CONDENSE -old_num. - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( |{ -new_line }| ). "#EC NOTEXT - ro_html->add( |{ lv_local }| ). "#EC NOTEXT - ro_html->add( |{ -old_line }| ). "#EC NOTEXT - ro_html->add( |{ lv_remote }| ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + IF mv_unified = abap_true. + ro_html->add( render_line_unified( is_diff_line = ) ). + ELSE. + ro_html->add( render_line_split( is_diff_line = + iv_fstate = is_diff-fstate ) ). + ENDIF. ENDLOOP. - ENDMETHOD. - - METHOD get_line_hl. - - CLEAR: ev_lattr, ev_rattr. " Class for changed lines - - IF iv_result IS INITIAL. - RETURN. + IF mv_unified = abap_true. + ro_html->add( render_line_unified( ) ). " Release delayed lines ENDIF. - " Both file changed ? Or line updated ? - All yellow - IF iv_mod = c_mod-both OR iv_result = lcl_diff=>c_diff-update. - ev_lattr = ' class="diff_upd"'. "#EC NOTEXT - ev_rattr = ' class="diff_upd"'. "#EC NOTEXT - ELSEIF iv_mod = c_mod-local. " Changed locally - CASE iv_result. - WHEN lcl_diff=>c_diff-insert. - ev_lattr = ' class="diff_ins"'. "#EC NOTEXT - WHEN lcl_diff=>c_diff-delete. - ev_rattr = ' class="diff_del"'. "#EC NOTEXT - ENDCASE. - ELSEIF iv_mod = c_mod-remote. " Changed remotely - invert sides - CASE iv_result. - WHEN lcl_diff=>c_diff-insert. - ev_rattr = ' class="diff_ins"'. "#EC NOTEXT - WHEN lcl_diff=>c_diff-delete. - ev_lattr = ' class="diff_del"'. "#EC NOTEXT - ENDCASE. - ENDIF. + ENDMETHOD. "render_lines - ENDMETHOD. " get_line_hl. + METHOD render_line_split. - METHOD render_content. - - DATA ls_diff_file LIKE LINE OF mt_diff_files. + DATA: lv_new TYPE string, + lv_old TYPE string, + lv_mark TYPE string, + lv_bg TYPE string. CREATE OBJECT ro_html. - LOOP AT mt_diff_files INTO ls_diff_file. - lcl_progress=>show( iv_key = 'Diff' - iv_current = sy-tabix - iv_total = lines( mt_diff_files ) - iv_text = |Render Diff - { ls_diff_file-filename }| ). + " New line + lv_mark = ` `. + IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update. + lv_bg = ' diff_upd'. + lv_mark = `~`. + ELSEIF is_diff_line-result = lcl_diff=>c_diff-insert. + lv_bg = ' diff_ins'. + lv_mark = `+`. + ENDIF. + lv_new = || + && |{ lv_mark }{ is_diff_line-new }|. - ro_html->add( render_diff( ls_diff_file ) ). - ENDLOOP. + " Old line + CLEAR lv_bg. + lv_mark = ` `. + IF iv_fstate = c_fstate-both OR is_diff_line-result = lcl_diff=>c_diff-update. + lv_bg = ' diff_upd'. + lv_mark = `~`. + ELSEIF is_diff_line-result = lcl_diff=>c_diff-delete. + lv_bg = ' diff_del'. + lv_mark = `-`. + ENDIF. + lv_old = || + && |{ lv_mark }{ is_diff_line-old }|. - ENDMETHOD. "render_content + " render line, inverse sides if remote is newer + ro_html->add( '' ). "#EC NOTEXT + IF iv_fstate = c_fstate-remote. " Remote file leading changes + ro_html->add( lv_old ). " local + ro_html->add( lv_new ). " remote + ELSE. " Local leading changes or both were modified + ro_html->add( lv_new ). " local + ro_html->add( lv_old ). " remote + ENDIF. + ro_html->add( '' ). "#EC NOTEXT + + ENDMETHOD. "render_line_split + + METHOD render_line_unified. + + DATA lv_line TYPE string. + + FIELD-SYMBOLS LIKE LINE OF mt_delayed_lines. + + CREATE OBJECT ro_html. + + " Release delayed subsequent update lines + IF is_diff_line-result <> lcl_diff=>c_diff-update. + LOOP AT mt_delayed_lines ASSIGNING . + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( || + && || + && |-{ -old }| ). + ro_html->add( '' ). "#EC NOTEXT + ENDLOOP. + LOOP AT mt_delayed_lines ASSIGNING . + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( || + && || + && |+{ -new }| ). + ro_html->add( '' ). "#EC NOTEXT + ENDLOOP. + CLEAR mt_delayed_lines. + ENDIF. + + ro_html->add( '' ). "#EC NOTEXT + CASE is_diff_line-result. + WHEN lcl_diff=>c_diff-update. + APPEND is_diff_line TO mt_delayed_lines. " Delay output of subsequent updates + WHEN lcl_diff=>c_diff-insert. + ro_html->add( || + && || + && |+{ is_diff_line-new }| ). + WHEN lcl_diff=>c_diff-delete. + ro_html->add( || + && || + && |-{ is_diff_line-old }| ). + WHEN OTHERS. "none + ro_html->add( || + && || + && | { is_diff_line-old }| ). + ENDCASE. + ro_html->add( '' ). "#EC NOTEXT + + ENDMETHOD. "render_line_unified ENDCLASS. "lcl_gui_page_diff \ No newline at end of file diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index d5498f8c0..af4d6a437 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -422,6 +422,14 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RETURNING VALUE(rv_changes_only) TYPE abap_bool RAISING lcx_exception. + METHODS toggle_diff_unified + RETURNING VALUE(rv_diff_unified) TYPE abap_bool + RAISING lcx_exception. + + METHODS get_diff_unified + RETURNING VALUE(rv_diff_unified) TYPE abap_bool + RAISING lcx_exception. + METHODS get_favorites RETURNING VALUE(rt_favorites) TYPE tt_favorites RAISING lcx_exception. @@ -454,6 +462,7 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. repo_config TYPE ty_repo_config_tt, hide_files TYPE abap_bool, changes_only TYPE abap_bool, + diff_unified TYPE abap_bool, favorites TYPE tt_favorites, END OF ty_user. @@ -698,6 +707,24 @@ CLASS lcl_persistence_user IMPLEMENTATION. ENDMETHOD. "get_changes_only + METHOD toggle_diff_unified. + + DATA ls_user TYPE ty_user. + + ls_user = read( ). + ls_user-diff_unified = boolc( ls_user-diff_unified = abap_false ). + update( ls_user ). + + rv_diff_unified = ls_user-diff_unified. + + ENDMETHOD. "toggle_diff_unified + + METHOD get_diff_unified. + + rv_diff_unified = read( )-diff_unified. + + ENDMETHOD. "get_diff_unified + METHOD get_favorites. rt_favorites = read( )-favorites. diff --git a/src/zabapgit_popups.prog.abap b/src/zabapgit_popups.prog.abap index 6ee6af2f0..ff7a4238f 100644 --- a/src/zabapgit_popups.prog.abap +++ b/src/zabapgit_popups.prog.abap @@ -174,7 +174,7 @@ CLASS lcl_popups IMPLEMENTATION. CLEAR: ev_name, ev_cancel. * TAB FLD LABEL DEF ATTR - _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new_branch_name' ''. + _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new-branch-name' ''. CALL FUNCTION 'POPUP_GET_VALUES' EXPORTING @@ -195,7 +195,8 @@ CLASS lcl_popups IMPLEMENTATION. ELSE. READ TABLE lt_fields INDEX 1 ASSIGNING . ASSERT sy-subrc = 0. - ev_name = lcl_git_branch_list=>complete_heads_branch_name( -value ). + ev_name = lcl_git_branch_list=>complete_heads_branch_name( + lcl_git_branch_list=>normalize_branch_name( -value ) ). ENDIF. ENDMETHOD. @@ -282,26 +283,42 @@ CLASS lcl_popups IMPLEMENTATION. METHOD branch_list_popup. - DATA: lo_branches TYPE REF TO lcl_git_branch_list, - lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, - lv_answer TYPE c LENGTH 1, - lv_default TYPE i VALUE 1, "Default cursor position - lt_selection TYPE TABLE OF spopli. + DATA: lo_branches TYPE REF TO lcl_git_branch_list, + lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, + lv_head_suffix TYPE string, + lv_answer TYPE c LENGTH 1, + lv_default TYPE i VALUE 1, "Default cursor position + lt_selection TYPE TABLE OF spopli. FIELD-SYMBOLS: LIKE LINE OF lt_selection, LIKE LINE OF lt_branches. - lo_branches = lcl_git_transport=>branches( iv_url ). + lo_branches = lcl_git_transport=>branches( iv_url ). + lt_branches = lo_branches->get_branches_only( ). + lv_head_suffix = | ({ lcl_git_branch_list=>c_head_name })|. - lt_branches = lo_branches->get_branches_only( ). LOOP AT lt_branches ASSIGNING . - APPEND INITIAL LINE TO lt_selection ASSIGNING . - -varoption = -name. + IF -name = lcl_git_branch_list=>c_head_name + AND -name <> lo_branches->get_head_symref( ). + " HEAD but other HEAD symref exist + CONTINUE. + ENDIF. + + APPEND INITIAL LINE TO lt_selection ASSIGNING . IF iv_default_branch IS NOT INITIAL AND iv_default_branch = -name. lv_default = sy-tabix. ENDIF. + + IF -name = lo_branches->get_head_symref( ) + AND -name <> lcl_git_branch_list=>c_head_name. + " HEAD symref but not HEAD itself + -varoption = -display_name && lv_head_suffix. + ELSE. + -varoption = -display_name. + ENDIF. + ENDLOOP. IF iv_show_new_option = abap_true. @@ -339,7 +356,10 @@ CLASS lcl_popups IMPLEMENTATION. IF iv_show_new_option = abap_true AND -varoption = c_new_branch_label. rs_branch-name = c_new_branch_label. ELSE. - rs_branch = lo_branches->find_by_name( -varoption ). + REPLACE FIRST OCCURRENCE OF lv_head_suffix IN -varoption WITH ''. + READ TABLE lt_branches WITH KEY display_name = -varoption ASSIGNING . + ASSERT sy-subrc = 0. + rs_branch = lo_branches->find_by_name( -name ). ENDIF. diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 8fb06bc0c..98f84d9ef 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -242,11 +242,11 @@ CLASS ltcl_diff IMPLEMENTATION. DEFINE _expected. CLEAR ms_expected. - ms_expected-new_line = &1. - ms_expected-new = &2. - ms_expected-result = &3. - ms_expected-old_line = &4. - ms_expected-old = &5. + ms_expected-new_num = &1. + ms_expected-new = &2. + ms_expected-result = &3. + ms_expected-old_num = &4. + ms_expected-old = &5. APPEND ms_expected TO mt_expected. END-OF-DEFINITION. @@ -2210,548 +2210,4 @@ CLASS ltcl_persistence_settings IMPLEMENTATION. ENDCLASS. - -CLASS ltd_spy_oo_object DEFINITION FOR TESTING. - PUBLIC SECTION. - INTERFACES: lif_object_oriented_object. - DATA: - mv_package TYPE devclass, - mv_overwrite TYPE seox_boolean, - ms_interface_properties TYPE vseointerf, - ms_class_properties TYPE vseoclass, - ms_locals_key TYPE seoclskey, - mt_local_definitions TYPE rswsourcet, - mt_local_implementations TYPE rswsourcet, - mt_local_macros TYPE rswsourcet, - mt_local_test_classes TYPE rswsourcet, - mv_force TYPE seoflag, - ms_deserialize_key TYPE seoclskey, - mt_source TYPE ty_string_tt, - ms_item_to_activate TYPE ty_item, - mt_descriptions TYPE ty_seocompotx_tt, - ms_description_key TYPE seoclskey, - mv_text_pool_class_name TYPE seoclsname, - mt_text_pool TYPE textpool_table, - mv_text_pool_inserted TYPE abap_bool, - mt_sotr TYPE ty_sotr_tt, - mt_sotr_package TYPE devclass, - mv_docu_object_name TYPE dokhl-object, - mv_docu_language TYPE spras, - mt_docu_lines TYPE tlinetab. - -ENDCLASS. -CLASS ltd_spy_oo_object IMPLEMENTATION. - METHOD lif_object_oriented_object~create. - DATA lv_properties_structure_name TYPE string. - lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. - IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. - ms_interface_properties = is_properties. - ELSE. - ms_class_properties = is_properties. - ENDIF. - mv_package = iv_package. - mv_overwrite = iv_overwrite. - ENDMETHOD. - METHOD lif_object_oriented_object~generate_locals. - ms_locals_key = is_key. - mt_local_definitions = it_local_definitions. - mt_local_implementations = it_local_implementations. - mt_local_macros = it_local_macros. - mt_local_test_classes = it_local_test_classes. - mv_force = iv_force. - ENDMETHOD. - - METHOD lif_object_oriented_object~deserialize_source. - ms_deserialize_key = is_key. - mt_source = it_source. - ENDMETHOD. - - METHOD lif_object_oriented_object~add_to_activation_list. - ms_item_to_activate = is_item. - ENDMETHOD. - - METHOD lif_object_oriented_object~update_descriptions. - ms_description_key = is_key. - mt_descriptions = it_descriptions. - ENDMETHOD. - - METHOD lif_object_oriented_object~insert_text_pool. - mv_text_pool_inserted = abap_true. - mv_text_pool_class_name = iv_class_name. - mt_text_pool = it_text_pool. - cl_abap_unit_assert=>assert_equals( - act = iv_language - exp = sy-langu ). - ENDMETHOD. - - METHOD lif_object_oriented_object~create_sotr. - mt_sotr = it_sotr. - mt_sotr_package = iv_package. - ENDMETHOD. - - METHOD lif_object_oriented_object~create_documentation. - mv_docu_object_name = iv_object_name. - mv_docu_language = iv_language. - mt_docu_lines = it_lines. - ENDMETHOD. - -ENDCLASS. - -CLASS ltd_fake_object_files DEFINITION FOR TESTING - INHERITING FROM lcl_objects_files. - PUBLIC SECTION. - METHODS constructor. - METHODS read_abap REDEFINITION. - DATA: - mt_sources TYPE seop_source_string, - mt_local_definitions TYPE seop_source_string, - mt_local_implementations TYPE seop_source_string, - mt_local_macros TYPE seop_source_string, - mt_local_test_classes TYPE seop_source_string. -ENDCLASS. -CLASS ltd_fake_object_files IMPLEMENTATION. - METHOD read_abap. - CASE iv_extra. - WHEN 'locals_def'. - rt_abap = mt_local_definitions. - WHEN 'locals_imp'. - rt_abap = mt_local_implementations. - WHEN 'macros'. - rt_abap = mt_local_macros. - WHEN 'testclasses'. - rt_abap = mt_local_test_classes. - WHEN OTHERS. - rt_abap = mt_sources. - RETURN. - ENDCASE. - - cl_abap_unit_assert=>assert_equals( act = iv_error - exp = abap_false ). - ENDMETHOD. - METHOD constructor. - DATA ls_empty_item TYPE ty_item. - super->constructor( ls_empty_item ). - APPEND 'source' TO me->mt_sources. - APPEND 'definition' TO me->mt_local_definitions. - APPEND 'implementation' TO me->mt_local_implementations. - APPEND 'macro' TO me->mt_local_macros. - APPEND 'test' TO me->mt_local_test_classes. - ENDMETHOD. - -ENDCLASS. - -CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. - PROTECTED SECTION. - DATA: - mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, - mo_fake_object_files TYPE REF TO ltd_fake_object_files, - mo_xml_input TYPE REF TO lcl_xml_input, - mo_xml_out TYPE REF TO lcl_xml_output, - mo_oo_object TYPE REF TO lif_object, - ms_item TYPE ty_item. - METHODS: when_deserializing - RAISING - lcx_exception, - then_should_deserialize_source, - given_the_descriptions - IMPORTING - it_descriptions TYPE ty_seocompotx_tt - RAISING - lcx_exception, - then_shuld_update_descriptions - IMPORTING - it_descriptions TYPE ty_seocompotx_tt, - then_it_should_add_activation, - given_documentation_in_xml_as - IMPORTING - it_lines TYPE tlinetab - RAISING - lcx_exception, - then_docu_should_be_created - IMPORTING - it_lines TYPE tlinetab. - -ENDCLASS. -CLASS ltc_oo_test IMPLEMENTATION. - - METHOD then_docu_should_be_created. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_docu_lines - exp = it_lines ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_object_name - exp = ms_item-obj_name ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_language - exp = sy-langu ). - ENDMETHOD. - - METHOD given_documentation_in_xml_as. - mo_xml_out->add( - iv_name = 'LINES' - ig_data = it_lines ). - ENDMETHOD. - - METHOD then_it_should_add_activation. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_item_to_activate - exp = ms_item ). - ENDMETHOD. - - METHOD then_shuld_update_descriptions. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_descriptions - exp = it_descriptions ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_description_key - exp = ms_item-obj_name ). - ENDMETHOD. - - METHOD given_the_descriptions. - mo_xml_out->add( - iv_name = 'DESCRIPTIONS' - ig_data = it_descriptions ). - ENDMETHOD. - - METHOD then_should_deserialize_source. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_source - exp = mo_fake_object_files->mt_sources ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_deserialize_key - exp = ms_item-obj_name ). - ENDMETHOD. - - METHOD when_deserializing. - CREATE OBJECT mo_xml_input - EXPORTING - iv_xml = mo_xml_out->render( ). - mo_oo_object->deserialize( - iv_package = 'package_name' - io_xml = mo_xml_input ). - ENDMETHOD. -ENDCLASS. - -CLASS ltcl_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT -INHERITING FROM ltc_oo_test. - PRIVATE SECTION. - METHODS: - setup, - given_a_class_properties - RAISING - lcx_exception, - then_should_create_class, - then_it_should_generate_locals, - should_create_class FOR TESTING RAISING cx_static_check, - should_generate_locals FOR TESTING RAISING cx_static_check, - should_deserialize_source FOR TESTING RAISING cx_static_check, - should_update_descriptions FOR TESTING RAISING cx_static_check, - should_add_to_activation FOR TESTING RAISING cx_static_check, - no_text_pool_no_insert FOR TESTING RAISING cx_static_check, - insert_text_pool FOR TESTING RAISING cx_static_check, - create_stor_from_xml FOR TESTING RAISING cx_static_check, - create_documentation FOR TESTING RAISING cx_static_check. - DATA: - ms_class_properties TYPE vseoclass. -ENDCLASS. - -CLASS ltcl_class_deserialization IMPLEMENTATION. - METHOD setup. - CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. - CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). - - ms_item-devclass = 'package_name'. - ms_item-obj_name = 'zcl_class'. - ms_item-obj_type = 'CLAS'. - - CREATE OBJECT mo_oo_object TYPE lcl_object_clas - EXPORTING - is_item = ms_item - iv_language = sy-langu. - mo_oo_object->mo_files = mo_fake_object_files. - ENDMETHOD. - - METHOD should_create_class. - ms_class_properties-clsname = ms_item-obj_name. - - given_a_class_properties( ). - - when_deserializing( ). - - then_should_create_class( ). - ENDMETHOD. - - METHOD should_generate_locals. - given_a_class_properties( ). - - when_deserializing( ). - - then_it_should_generate_locals( ). - ENDMETHOD. - - METHOD should_deserialize_source. - given_a_class_properties( ). - - when_deserializing( ). - - then_should_deserialize_source( ). - ENDMETHOD. - - METHOD should_update_descriptions. - DATA: - ls_description TYPE seocompotx, - lt_descriptions TYPE ty_seocompotx_tt. - - given_a_class_properties( ). - - ls_description-clsname = ms_item-obj_name. - ls_description-cmpname = 'a_method'. - APPEND ls_description TO lt_descriptions. - given_the_descriptions( lt_descriptions ). - - when_deserializing( ). - - then_shuld_update_descriptions( lt_descriptions ). - ENDMETHOD. - - METHOD should_add_to_activation. - given_a_class_properties( ). - - when_deserializing( ). - - then_it_should_add_activation( ). - ENDMETHOD. - - METHOD given_a_class_properties. - mo_xml_out->add( - iv_name = 'VSEOCLASS' - ig_data = ms_class_properties ). - ENDMETHOD. - - METHOD then_should_create_class. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_class_properties - exp = ms_class_properties ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite - exp = abap_true ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package - exp = 'package_name' ). - ENDMETHOD. - - - METHOD then_it_should_generate_locals. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_locals_key - exp = ms_item-obj_name ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_force - exp = abap_true ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_definitions - exp = mo_fake_object_files->mt_local_definitions ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_implementations - exp = mo_fake_object_files->mt_local_implementations ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_macros - exp = mo_fake_object_files->mt_local_macros ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_test_classes - exp = mo_fake_object_files->mt_local_test_classes ). - ENDMETHOD. - METHOD no_text_pool_no_insert. - given_a_class_properties( ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_text_pool_inserted - exp = abap_false ). - ENDMETHOD. - - METHOD insert_text_pool. - DATA: lt_pool_external TYPE textpool_table, - ls_pool_external TYPE ty_tpool. - ls_pool_external-id = 'ID'. - ls_pool_external-key = 'KEY'. - APPEND ls_pool_external TO lt_pool_external. - - given_a_class_properties( ). - - mo_xml_out->add( - iv_name = 'TPOOL' - ig_data = lt_pool_external ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_text_pool - exp = lt_pool_external ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_text_pool_class_name - exp = 'zcl_class' ). - ENDMETHOD. - - METHOD create_stor_from_xml. - DATA: - lt_sotr TYPE ty_sotr_tt, - ls_sotr LIKE LINE OF lt_sotr. - - given_a_class_properties( ). - - ls_sotr-header-concept = 'HEADER'. - APPEND ls_sotr TO lt_sotr. - mo_xml_out->add( - iv_name = 'SOTR' - ig_data = lt_sotr ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr - exp = lt_sotr ). - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr_package - exp = 'package_name' ). - ENDMETHOD. - - METHOD create_documentation. - DATA: lt_lines TYPE tlinetab, - ls_line TYPE LINE OF tlinetab. - ls_line-tdline = 'Class Line Doc'. - APPEND ls_line TO lt_lines. - - given_a_class_properties( ). - - given_documentation_in_xml_as( lt_lines ). - - when_deserializing( ). - - then_docu_should_be_created( lt_lines ). - ENDMETHOD. -ENDCLASS. - -CLASS ltcl_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT -INHERITING FROM ltc_oo_test. - PRIVATE SECTION. - METHODS: - setup, - given_an_interface_properties - RAISING - lcx_exception, - then_should_create_interface, - create_interface FOR TESTING RAISING cx_static_check, - update_descriptions FOR TESTING RAISING cx_static_check, - add_to_activation FOR TESTING RAISING cx_static_check, - deserialize_source FOR TESTING RAISING cx_static_check, - create_documentation FOR TESTING RAISING cx_static_check. - DATA: - ms_interface_properties TYPE vseointerf. -ENDCLASS. -CLASS ltcl_interface_deserialization IMPLEMENTATION. - METHOD setup. - CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. - CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). - - ms_item-devclass = 'package_name'. - ms_item-obj_name = 'zif_interface'. - ms_item-obj_type = 'INTF'. - - CREATE OBJECT mo_oo_object TYPE lcl_object_intf - EXPORTING - is_item = ms_item - iv_language = sy-langu. - mo_oo_object->mo_files = mo_fake_object_files. - ENDMETHOD. - - METHOD create_interface. - ms_interface_properties-clsname = ms_item-obj_name. - given_an_interface_properties( ). - - when_deserializing( ). - - then_should_create_interface( ). - ENDMETHOD. - - METHOD update_descriptions. - DATA: - ls_description TYPE seocompotx, - lt_descriptions TYPE ty_seocompotx_tt. - - given_an_interface_properties( ). - - ls_description-clsname = ms_item-obj_name. - ls_description-cmpname = 'a_method'. - APPEND ls_description TO lt_descriptions. - given_the_descriptions( lt_descriptions ). - - when_deserializing( ). - - then_shuld_update_descriptions( lt_descriptions ). - ENDMETHOD. - - METHOD add_to_activation. - given_an_interface_properties( ). - - when_deserializing( ). - - then_it_should_add_activation( ). - ENDMETHOD. - - METHOD deserialize_source. - given_an_interface_properties( ). - - when_deserializing( ). - - then_should_deserialize_source( ). - ENDMETHOD. - - METHOD given_an_interface_properties. - mo_xml_out->add( - iv_name = 'VSEOINTERF' - ig_data = ms_interface_properties ). - ENDMETHOD. - - METHOD then_should_create_interface. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_interface_properties - exp = ms_interface_properties ). - - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite - exp = abap_true ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package - exp = 'package_name' ). - ENDMETHOD. - - METHOD create_documentation. - DATA: lt_lines TYPE tlinetab, - ls_line TYPE LINE OF tlinetab. - ls_line-tdline = 'Interface Line Doc'. - APPEND ls_line TO lt_lines. - - given_an_interface_properties( ). - - given_documentation_in_xml_as( lt_lines ). - - when_deserializing( ). - - then_docu_should_be_created( lt_lines ). - ENDMETHOD. -ENDCLASS. \ No newline at end of file +INCLUDE ZABAPGIT_UNIT_TEST_CLAS_INTF. \ No newline at end of file diff --git a/src/zabapgit_unit_test_clas_intf.prog.abap b/src/zabapgit_unit_test_clas_intf.prog.abap new file mode 100644 index 000000000..d83e798d6 --- /dev/null +++ b/src/zabapgit_unit_test_clas_intf.prog.abap @@ -0,0 +1,646 @@ + +CLASS ltd_spy_oo_object DEFINITION FOR TESTING. + PUBLIC SECTION. + INTERFACES: lif_object_oriented_object. + DATA: + mv_package TYPE devclass, + mv_overwrite TYPE seox_boolean, + ms_interface_properties TYPE vseointerf, + ms_class_properties TYPE vseoclass, + ms_locals_key TYPE seoclskey, + mt_local_definitions TYPE rswsourcet, + mt_local_implementations TYPE rswsourcet, + mt_local_macros TYPE rswsourcet, + mt_local_test_classes TYPE rswsourcet, + mv_force TYPE seoflag, + ms_deserialize_key TYPE seoclskey, + mt_source TYPE ty_string_tt, + ms_item_to_activate TYPE ty_item, + mt_descriptions TYPE ty_seocompotx_tt, + ms_description_key TYPE seoclskey, + mv_text_pool_class_name TYPE seoclsname, + mt_text_pool TYPE textpool_table, + mv_text_pool_inserted TYPE abap_bool, + mt_sotr TYPE ty_sotr_tt, + mt_sotr_package TYPE devclass, + mv_docu_object_name TYPE dokhl-object, + mv_docu_language TYPE spras, + mt_docu_lines TYPE tlinetab, + mv_get_includes_called TYPE abap_bool. +ENDCLASS. +CLASS ltd_spy_oo_object IMPLEMENTATION. + METHOD lif_object_oriented_object~create. + DATA lv_properties_structure_name TYPE string. + lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. + IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. + ms_interface_properties = is_properties. + ELSE. + ms_class_properties = is_properties. + ENDIF. + mv_package = iv_package. + mv_overwrite = iv_overwrite. + ENDMETHOD. + METHOD lif_object_oriented_object~generate_locals. + ms_locals_key = is_key. + mt_local_definitions = it_local_definitions. + mt_local_implementations = it_local_implementations. + mt_local_macros = it_local_macros. + mt_local_test_classes = it_local_test_classes. + mv_force = iv_force. + ENDMETHOD. + + METHOD lif_object_oriented_object~deserialize_source. + ms_deserialize_key = is_key. + mt_source = it_source. + ENDMETHOD. + + METHOD lif_object_oriented_object~add_to_activation_list. + ms_item_to_activate = is_item. + ENDMETHOD. + + METHOD lif_object_oriented_object~update_descriptions. + ms_description_key = is_key. + mt_descriptions = it_descriptions. + ENDMETHOD. + + METHOD lif_object_oriented_object~insert_text_pool. + mv_text_pool_inserted = abap_true. + mv_text_pool_class_name = iv_class_name. + mt_text_pool = it_text_pool. + cl_abap_unit_assert=>assert_equals( + act = iv_language + exp = sy-langu ). + ENDMETHOD. + + METHOD lif_object_oriented_object~create_sotr. + mt_sotr = it_sotr. + mt_sotr_package = iv_package. + ENDMETHOD. + + METHOD lif_object_oriented_object~create_documentation. + mv_docu_object_name = iv_object_name. + mv_docu_language = iv_language. + mt_docu_lines = it_lines. + ENDMETHOD. + + METHOD lif_object_oriented_object~get_includes. + APPEND 'dummy' TO rt_includes. + mv_get_includes_called = abap_true. + ENDMETHOD. + +ENDCLASS. + +CLASS ltd_fake_object_files DEFINITION FOR TESTING + INHERITING FROM lcl_objects_files. + PUBLIC SECTION. + METHODS constructor. + METHODS read_abap REDEFINITION. + DATA: + mt_sources TYPE seop_source_string, + mt_local_definitions TYPE seop_source_string, + mt_local_implementations TYPE seop_source_string, + mt_local_macros TYPE seop_source_string, + mt_local_test_classes TYPE seop_source_string. +ENDCLASS. +CLASS ltd_fake_object_files IMPLEMENTATION. + METHOD read_abap. + CASE iv_extra. + WHEN 'locals_def'. + rt_abap = mt_local_definitions. + WHEN 'locals_imp'. + rt_abap = mt_local_implementations. + WHEN 'macros'. + rt_abap = mt_local_macros. + WHEN 'testclasses'. + rt_abap = mt_local_test_classes. + WHEN OTHERS. + rt_abap = mt_sources. + RETURN. + ENDCASE. + + cl_abap_unit_assert=>assert_equals( act = iv_error + exp = abap_false ). + ENDMETHOD. + METHOD constructor. + DATA ls_empty_item TYPE ty_item. + super->constructor( ls_empty_item ). + APPEND 'source' TO me->mt_sources. + APPEND 'definition' TO me->mt_local_definitions. + APPEND 'implementation' TO me->mt_local_implementations. + APPEND 'macro' TO me->mt_local_macros. + APPEND 'test' TO me->mt_local_test_classes. + ENDMETHOD. + +ENDCLASS. + +CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + DATA: + mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, + mo_fake_object_files TYPE REF TO ltd_fake_object_files, + mo_xml_input TYPE REF TO lcl_xml_input, + mo_xml_out TYPE REF TO lcl_xml_output, + mo_oo_object TYPE REF TO lif_object, + ms_item TYPE ty_item. + METHODS: when_deserializing + RAISING + lcx_exception, + then_should_deserialize_source, + given_the_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt + RAISING + lcx_exception, + then_shuld_update_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt, + then_it_should_add_activation, + given_documentation_in_xml_as + IMPORTING + it_lines TYPE tlinetab + RAISING + lcx_exception, + then_docu_should_be_created + IMPORTING + it_lines TYPE tlinetab. + +ENDCLASS. +CLASS ltc_oo_test IMPLEMENTATION. + + METHOD then_docu_should_be_created. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_docu_lines + exp = it_lines ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_docu_object_name + exp = ms_item-obj_name ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_docu_language + exp = sy-langu ). + ENDMETHOD. + + METHOD given_documentation_in_xml_as. + mo_xml_out->add( + iv_name = 'LINES' + ig_data = it_lines ). + ENDMETHOD. + + METHOD then_it_should_add_activation. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_item_to_activate + exp = ms_item ). + ENDMETHOD. + + METHOD then_shuld_update_descriptions. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_descriptions + exp = it_descriptions ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_description_key + exp = ms_item-obj_name ). + ENDMETHOD. + + METHOD given_the_descriptions. + mo_xml_out->add( + iv_name = 'DESCRIPTIONS' + ig_data = it_descriptions ). + ENDMETHOD. + + METHOD then_should_deserialize_source. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_source + exp = mo_fake_object_files->mt_sources ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_deserialize_key + exp = ms_item-obj_name ). + ENDMETHOD. + + METHOD when_deserializing. + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + mo_oo_object->deserialize( + iv_package = 'package_name' + io_xml = mo_xml_input ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_a_class_properties + RAISING + lcx_exception, + then_should_create_class, + then_it_should_generate_locals, + should_create_class FOR TESTING RAISING cx_static_check, + should_generate_locals FOR TESTING RAISING cx_static_check, + should_deserialize_source FOR TESTING RAISING cx_static_check, + should_update_descriptions FOR TESTING RAISING cx_static_check, + should_add_to_activation FOR TESTING RAISING cx_static_check, + no_text_pool_no_insert FOR TESTING RAISING cx_static_check, + insert_text_pool FOR TESTING RAISING cx_static_check, + create_stor_from_xml FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. + DATA: + ms_class_properties TYPE vseoclass. +ENDCLASS. + +CLASS ltcl_class_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD should_create_class. + ms_class_properties-clsname = ms_item-obj_name. + + given_a_class_properties( ). + + when_deserializing( ). + + then_should_create_class( ). + ENDMETHOD. + + METHOD should_generate_locals. + given_a_class_properties( ). + + when_deserializing( ). + + then_it_should_generate_locals( ). + ENDMETHOD. + + METHOD should_deserialize_source. + given_a_class_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD should_update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_a_class_properties( ). + + ls_description-clsname = ms_item-obj_name. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + given_the_descriptions( lt_descriptions ). + + when_deserializing( ). + + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. + + METHOD should_add_to_activation. + given_a_class_properties( ). + + when_deserializing( ). + + then_it_should_add_activation( ). + ENDMETHOD. + + METHOD given_a_class_properties. + mo_xml_out->add( + iv_name = 'VSEOCLASS' + ig_data = ms_class_properties ). + ENDMETHOD. + + METHOD then_should_create_class. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_class_properties + exp = ms_class_properties ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_package + exp = 'package_name' ). + ENDMETHOD. + + + METHOD then_it_should_generate_locals. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_locals_key + exp = ms_item-obj_name ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_force + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_definitions + exp = mo_fake_object_files->mt_local_definitions ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_implementations + exp = mo_fake_object_files->mt_local_implementations ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_macros + exp = mo_fake_object_files->mt_local_macros ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_test_classes + exp = mo_fake_object_files->mt_local_test_classes ). + ENDMETHOD. + METHOD no_text_pool_no_insert. + given_a_class_properties( ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_text_pool_inserted + exp = abap_false ). + ENDMETHOD. + + METHOD insert_text_pool. + DATA: lt_pool_external TYPE textpool_table, + ls_pool_external TYPE ty_tpool. + ls_pool_external-id = 'ID'. + ls_pool_external-key = 'KEY'. + APPEND ls_pool_external TO lt_pool_external. + + given_a_class_properties( ). + + mo_xml_out->add( + iv_name = 'TPOOL' + ig_data = lt_pool_external ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_text_pool + exp = lt_pool_external ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_text_pool_class_name + exp = 'zcl_class' ). + ENDMETHOD. + + METHOD create_stor_from_xml. + DATA: + lt_sotr TYPE ty_sotr_tt, + ls_sotr LIKE LINE OF lt_sotr. + + given_a_class_properties( ). + + ls_sotr-header-concept = 'HEADER'. + APPEND ls_sotr TO lt_sotr. + mo_xml_out->add( + iv_name = 'SOTR' + ig_data = lt_sotr ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_sotr + exp = lt_sotr ). + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_sotr_package + exp = 'package_name' ). + ENDMETHOD. + + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Class Line Doc'. + APPEND ls_line TO lt_lines. + + given_a_class_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_an_interface_properties + RAISING + lcx_exception, + then_should_create_interface, + create_interface FOR TESTING RAISING cx_static_check, + update_descriptions FOR TESTING RAISING cx_static_check, + add_to_activation FOR TESTING RAISING cx_static_check, + deserialize_source FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. + DATA: + ms_interface_properties TYPE vseointerf. +ENDCLASS. +CLASS ltcl_interface_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD create_interface. + ms_interface_properties-clsname = ms_item-obj_name. + given_an_interface_properties( ). + + when_deserializing( ). + + then_should_create_interface( ). + ENDMETHOD. + + METHOD update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_an_interface_properties( ). + + ls_description-clsname = ms_item-obj_name. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + given_the_descriptions( lt_descriptions ). + + when_deserializing( ). + + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. + + METHOD add_to_activation. + given_an_interface_properties( ). + + when_deserializing( ). + + then_it_should_add_activation( ). + ENDMETHOD. + + METHOD deserialize_source. + given_an_interface_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD given_an_interface_properties. + mo_xml_out->add( + iv_name = 'VSEOINTERF' + ig_data = ms_interface_properties ). + ENDMETHOD. + + METHOD then_should_create_interface. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_interface_properties + exp = ms_interface_properties ). + + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_package + exp = 'package_name' ). + ENDMETHOD. + + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Interface Line Doc'. + APPEND ls_line TO lt_lines. + + given_an_interface_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_class_changed DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + changed_by_call_get_includes FOR TESTING RAISING cx_static_check, + changed_since_call_get_include FOR TESTING RAISING cx_static_check. + +ENDCLASS. +CLASS ltcl_class_changed IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + METHOD changed_by_call_get_includes. + DATA lv_username TYPE xubname. + lv_username = mo_oo_object->changed_by( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_get_includes_called + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = lv_username + exp = lcl_objects_super=>c_user_unknown ). + ENDMETHOD. + METHOD changed_since_call_get_include. + DATA lv_timestamp TYPE timestamp. + GET TIME STAMP FIELD lv_timestamp. + mo_oo_object->has_changed_since( lv_timestamp ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_get_includes_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. +CLASS ltcl_interface_changed DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + changed_by_call_get_includes FOR TESTING RAISING cx_static_check, + changed_since_call_get_include FOR TESTING RAISING cx_static_check. +ENDCLASS. +CLASS ltcl_interface_changed IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + METHOD changed_by_call_get_includes. + DATA lv_username TYPE xubname. + lv_username = mo_oo_object->changed_by( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_get_includes_called + exp = abap_true ). + + cl_abap_unit_assert=>assert_equals( + act = lv_username + exp = lcl_objects_super=>c_user_unknown ). + ENDMETHOD. + METHOD changed_since_call_get_include. + DATA lv_timestamp TYPE timestamp. + GET TIME STAMP FIELD lv_timestamp. + mo_oo_object->has_changed_since( lv_timestamp ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_get_includes_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_unit_test_clas_intf.prog.xml b/src/zabapgit_unit_test_clas_intf.prog.xml new file mode 100644 index 000000000..1d21085bf --- /dev/null +++ b/src/zabapgit_unit_test_clas_intf.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_UNIT_TEST_CLAS_INTF + A + + + X + S + D$ + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + + X + + 0000-00-00 + + 0000-00-00 + + D$S + X + + + + R + + Unit tests for classes and interfaces objecst + 45 + + + + + + diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index 20478551d..9c9ca66dd 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -547,13 +547,13 @@ CLASS lcl_diff DEFINITION FINAL. END OF c_diff. TYPES: BEGIN OF ty_diff, - new_line TYPE c LENGTH 6, - new TYPE string, - result TYPE c LENGTH 1, - old_line TYPE c LENGTH 6, - old TYPE string, - short TYPE abap_bool, - beacon TYPE i, + new_num TYPE c LENGTH 6, + new TYPE string, + result TYPE c LENGTH 1, + old_num TYPE c LENGTH 6, + old TYPE string, + short TYPE abap_bool, + beacon TYPE i, END OF ty_diff. TYPES: ty_diffs_tt TYPE STANDARD TABLE OF ty_diff WITH DEFAULT KEY. @@ -697,16 +697,16 @@ CLASS lcl_diff IMPLEMENTATION. LOOP AT mt_diff ASSIGNING . - -new_line = lv_new. - -old_line = lv_old. + -new_num = lv_new. + -old_num = lv_old. CASE -result. " Line nums WHEN c_diff-delete. lv_old = lv_old + 1. - CLEAR -new_line. + CLEAR -new_num. WHEN c_diff-insert. lv_new = lv_new + 1. - CLEAR -old_line. + CLEAR -old_num. WHEN OTHERS. lv_new = lv_new + 1. lv_old = lv_old + 1. diff --git a/src/zabapgit_zip.prog.abap b/src/zabapgit_zip.prog.abap index 45667324e..497f0b474 100644 --- a/src/zabapgit_zip.prog.abap +++ b/src/zabapgit_zip.prog.abap @@ -27,12 +27,12 @@ CLASS lcl_zip DEFINITION FINAL. PRIVATE SECTION. CLASS-METHODS file_upload - RETURNING value(rv_xstr) TYPE xstring + RETURNING VALUE(rv_xstr) TYPE xstring RAISING lcx_exception. CLASS-METHODS unzip_file IMPORTING iv_xstr TYPE xstring - RETURNING value(rt_files) TYPE ty_files_tt + RETURNING VALUE(rt_files) TYPE ty_files_tt RAISING lcx_exception. CLASS-METHODS normalize_path @@ -52,11 +52,11 @@ CLASS lcl_zip DEFINITION FINAL. CLASS-METHODS encode_files IMPORTING it_files TYPE ty_files_item_tt - RETURNING value(rv_xstr) TYPE xstring + RETURNING VALUE(rv_xstr) TYPE xstring RAISING lcx_exception. CLASS-METHODS get_message - RETURNING value(rv_message) TYPE string + RETURNING VALUE(rv_message) TYPE string RAISING lcx_exception. ENDCLASS. "lcl_zip DEFINITION @@ -341,12 +341,11 @@ CLASS lcl_zip IMPLEMENTATION. METHOD unzip_file. - DATA: lo_zip TYPE REF TO cl_abap_zip, - lv_xstr TYPE xstring, - lt_splice TYPE cl_abap_zip=>t_splice_entries. + DATA: lo_zip TYPE REF TO cl_abap_zip, + lv_data TYPE xstring. - FIELD-SYMBOLS: LIKE LINE OF lt_splice, - LIKE LINE OF rt_files. + FIELD-SYMBOLS: TYPE cl_abap_zip=>t_file, + LIKE LINE OF rt_files. CREATE OBJECT lo_zip. @@ -359,14 +358,13 @@ CLASS lcl_zip IMPLEMENTATION. lcx_exception=>raise( 'error from zip' ). ENDIF. - lt_splice = cl_abap_zip=>splice( iv_xstr ). + LOOP AT lo_zip->files ASSIGNING . - LOOP AT lt_splice ASSIGNING . lo_zip->get( EXPORTING - name = -name + name = -name IMPORTING - content = lv_xstr + content = lv_data EXCEPTIONS zip_index_error = 1 zip_decompression_error = 2 @@ -379,12 +377,12 @@ CLASS lcl_zip IMPLEMENTATION. filename( EXPORTING - iv_str = -name + iv_str = -name IMPORTING ev_path = -path ev_filename = -filename ). - -data = lv_xstr. + -data = lv_data. -sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = -data ).