From 9038b31921211168effa6a7a7cdd116aaef760cc Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Fri, 24 Sep 2021 00:34:01 -0400 Subject: [PATCH] ENHO: Split code into separate files (#4951) * ENHO: Split code into separate files Similarly to class enhancements where enhanced methods are stored as individual files, this change separates the code for implicit enhancements (type `HOOK_IMPL`) into abap-files. This makes the code more readable (instead of being embedded and escaped into XML) and allows for linting. * Switch to filenames with hash * CI * Filenames in XML * Lint Co-authored-by: Lars Hvam --- .../zcl_abapgit_object_enho_hook.clas.abap | 122 ++++++++++++++++-- src/utils/zcl_abapgit_hash.clas.abap | 37 +++++- 2 files changed, 141 insertions(+), 18 deletions(-) diff --git a/src/objects/enh/zcl_abapgit_object_enho_hook.clas.abap b/src/objects/enh/zcl_abapgit_object_enho_hook.clas.abap index 3d8a0f188..27626132a 100644 --- a/src/objects/enh/zcl_abapgit_object_enho_hook.clas.abap +++ b/src/objects/enh/zcl_abapgit_object_enho_hook.clas.abap @@ -10,20 +10,44 @@ CLASS zcl_abapgit_object_enho_hook DEFINITION PUBLIC. PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF ty_spaces, - full_name TYPE string. - TYPES: spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY, + full_name TYPE string, + spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY, END OF ty_spaces. TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY. + TYPES: BEGIN OF ty_file, + name TYPE string, + file TYPE string, + END OF ty_file. + + TYPES: ty_files TYPE HASHED TABLE OF ty_file WITH UNIQUE KEY name. + + CONSTANTS c_enhancement TYPE string VALUE 'ENHANCEMENT 0 *.' ##NO_TEXT. + CONSTANTS c_endenhancement TYPE string VALUE 'ENDENHANCEMENT.' ##NO_TEXT. + DATA: ms_item TYPE zif_abapgit_definitions=>ty_item. DATA: mo_files TYPE REF TO zcl_abapgit_objects_files. + METHODS add_sources + CHANGING + !ct_enhancements TYPE enh_hook_impl_it + !ct_files TYPE ty_files + RAISING + zcx_abapgit_exception . + METHODS read_sources + CHANGING + !ct_enhancements TYPE enh_hook_impl_it + !ct_files TYPE ty_files + RAISING + zcx_abapgit_exception . METHODS hook_impl_deserialize - IMPORTING it_spaces TYPE ty_spaces_tt - CHANGING ct_impl TYPE enh_hook_impl_it - RAISING zcx_abapgit_exception. - + IMPORTING + !it_spaces TYPE ty_spaces_tt + CHANGING + !ct_impl TYPE enh_hook_impl_it + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -31,6 +55,41 @@ ENDCLASS. CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION. + METHOD add_sources. + + DATA lv_source TYPE string. + DATA ls_file LIKE LINE OF ct_files. + + FIELD-SYMBOLS LIKE LINE OF ct_enhancements. + + LOOP AT ct_enhancements ASSIGNING . + " Use hash as filename since full_name is very long + CLEAR ls_file. + ls_file-name = -full_name. + ls_file-file = substring( + val = zcl_abapgit_hash=>sha1_string( -full_name ) + len = 8 ). + INSERT ls_file INTO TABLE ct_files. + + " Add full name as comment and put code between enhancement statements + lv_source = c_enhancement. + REPLACE '*' IN lv_source WITH ms_item-obj_name. + INSERT lv_source INTO -source INDEX 1. + + lv_source = |"Name: { -full_name }|. + INSERT lv_source INTO -source INDEX 1. + + APPEND c_endenhancement TO -source. + + mo_files->add_abap( iv_extra = ls_file-file + it_abap = -source ). + + CLEAR -source. + ENDLOOP. + + ENDMETHOD. + + METHOD constructor. ms_item = is_item. mo_files = io_files. @@ -62,6 +121,36 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION. ENDMETHOD. + METHOD read_sources. + + DATA lv_source TYPE string. + DATA ls_file LIKE LINE OF ct_files. + DATA lv_from TYPE i. + DATA lv_to TYPE i. + + FIELD-SYMBOLS LIKE LINE OF ct_enhancements. + + LOOP AT ct_enhancements ASSIGNING . + READ TABLE ct_files INTO ls_file WITH TABLE KEY name = -full_name. + IF sy-subrc = 0. + -source = mo_files->read_abap( iv_extra = ls_file-file ). + " Get code between enhancement statements + LOOP AT -source INTO lv_source. + IF lv_source CP c_enhancement. + lv_from = sy-tabix. + ENDIF. + IF lv_source CP c_endenhancement. + lv_to = sy-tabix. + ENDIF. + ENDLOOP. + DELETE -source FROM lv_to. + DELETE -source TO lv_from. + ENDIF. + ENDLOOP. + + ENDMETHOD. + + METHOD zif_abapgit_object_enho~deserialize. DATA: lv_shorttext TYPE string, @@ -71,6 +160,7 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION. lv_package TYPE devclass, ls_original_object TYPE enh_hook_admin, lt_spaces TYPE ty_spaces_tt, + lt_files TYPE ty_files, lt_enhancements TYPE enh_hook_impl_it, lx_enh_root TYPE REF TO cx_enh_root. @@ -83,6 +173,8 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION. CHANGING cg_data = ls_original_object ). ii_xml->read( EXPORTING iv_name = 'ENHANCEMENTS' CHANGING cg_data = lt_enhancements ). + ii_xml->read( EXPORTING iv_name = 'FILES' + CHANGING cg_data = lt_files ). ii_xml->read( EXPORTING iv_name = 'SPACES' CHANGING cg_data = lt_spaces ). @@ -90,6 +182,9 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION. hook_impl_deserialize( EXPORTING it_spaces = lt_spaces CHANGING ct_impl = lt_enhancements ). + read_sources( CHANGING ct_enhancements = lt_enhancements + ct_files = lt_files ). + lv_enhname = ms_item-obj_name. lv_package = iv_package. TRY. @@ -139,11 +234,11 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION. 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_files TYPE ty_files, lt_enhancements TYPE enh_hook_impl_it. FIELD-SYMBOLS: LIKE LINE OF lt_enhancements. - lo_hook_impl ?= ii_enh_tool. lv_shorttext = lo_hook_impl->if_enh_object_docu~get_shorttext( ). @@ -163,14 +258,19 @@ CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION. -id. ENDLOOP. + add_sources( CHANGING ct_enhancements = lt_enhancements + ct_files = lt_files ). + ii_xml->add( iv_name = 'TOOL' ig_data = ii_enh_tool->get_tool( ) ). - ii_xml->add( ig_data = lv_shorttext - iv_name = 'SHORTTEXT' ). - ii_xml->add( ig_data = ls_original_object - iv_name = 'ORIGINAL_OBJECT' ). + ii_xml->add( iv_name = 'SHORTTEXT' + ig_data = lv_shorttext ). + ii_xml->add( iv_name = 'ORIGINAL_OBJECT' + ig_data = ls_original_object ). ii_xml->add( iv_name = 'ENHANCEMENTS' ig_data = lt_enhancements ). + ii_xml->add( iv_name = 'FILES' + ig_data = lt_files ). ii_xml->add( iv_name = 'SPACES' ig_data = lt_spaces ). diff --git a/src/utils/zcl_abapgit_hash.clas.abap b/src/utils/zcl_abapgit_hash.clas.abap index 6c2d6a2e5..805fdff96 100644 --- a/src/utils/zcl_abapgit_hash.clas.abap +++ b/src/utils/zcl_abapgit_hash.clas.abap @@ -17,7 +17,6 @@ CLASS zcl_abapgit_hash DEFINITION VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception . - CLASS-METHODS sha1_commit IMPORTING !iv_data TYPE xstring @@ -25,7 +24,6 @@ CLASS zcl_abapgit_hash DEFINITION VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception . - CLASS-METHODS sha1_tree IMPORTING !iv_data TYPE xstring @@ -33,7 +31,6 @@ CLASS zcl_abapgit_hash DEFINITION VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception . - CLASS-METHODS sha1_tag IMPORTING !iv_data TYPE xstring @@ -41,7 +38,6 @@ CLASS zcl_abapgit_hash DEFINITION VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception . - CLASS-METHODS sha1_blob IMPORTING !iv_data TYPE xstring @@ -49,8 +45,6 @@ CLASS zcl_abapgit_hash DEFINITION VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception . - - CLASS-METHODS sha1_raw IMPORTING !iv_data TYPE xstring @@ -58,13 +52,20 @@ CLASS zcl_abapgit_hash DEFINITION VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception . + CLASS-METHODS sha1_string + IMPORTING + !iv_data TYPE string + RETURNING + VALUE(rv_sha1) TYPE zif_abapgit_definitions=>ty_sha1 + RAISING + zcx_abapgit_exception . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. -CLASS ZCL_ABAPGIT_HASH IMPLEMENTATION. +CLASS zcl_abapgit_hash IMPLEMENTATION. METHOD adler32. @@ -172,6 +173,28 @@ CLASS ZCL_ABAPGIT_HASH IMPLEMENTATION. ENDMETHOD. + METHOD sha1_string. + + DATA: lv_hash TYPE string, + lv_key TYPE xstring, + lx_error TYPE REF TO cx_abap_message_digest. + TRY. + cl_abap_hmac=>calculate_hmac_for_char( + EXPORTING + if_key = lv_key + if_data = iv_data + IMPORTING + ef_hmacstring = lv_hash ). + CATCH cx_abap_message_digest INTO lx_error. + zcx_abapgit_exception=>raise_with_text( lx_error ). + ENDTRY. + + rv_sha1 = lv_hash. + TRANSLATE rv_sha1 TO LOWER CASE. + + ENDMETHOD. + + METHOD sha1_tag. rv_sha1 = sha1( iv_type = zif_abapgit_definitions=>c_type-tag iv_data = iv_data ).