mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-02 04:36:49 +08:00

* Added Buffering to ZCL_ABAPGIT_FOLDER_LOGIC - Converted ZCL_ABAPGIT_FOLDER_LOGIC=>PACKAGE_TO_PATH and ZCL_ABAPGIT_FOLDER_LOGIC=>PATH_TO_PACKAGE to instance methods, so they can work with buffered data when constructiing path information. This gives a performance advantage in repos with a depp tree structure and multiple leaf packages - Adapted all calling code to use an instance of ZCL_ABAPGIT_FOLDER_LOGIC instead of the previously available static methods - Where applicaple PACKAGE_TO_PATH and PATH_TO_PACKAGE were called in an instance of ZCL_ABAPGIT_FOLDER_LOGIC, which was instanced outside of a processing loop and thus profited from the introduced buffering * Fixed errors * Removed obsolete coding artifacts Removed an obsolete parameter, that accidentally got merged into the code when building the pull request * Forwarded FOLDER_LOGIC instance to recursed calls Forwarded ZCL_ABAPGIT_FOLDER_LOGIC instance to subsequent BUILD calls to make use of buffering, until the optimizations in #1725 are in place.
188 lines
5.6 KiB
ABAP
188 lines
5.6 KiB
ABAP
CLASS zcl_abapgit_folder_logic DEFINITION
|
|
PUBLIC
|
|
CREATE PUBLIC .
|
|
|
|
PUBLIC SECTION.
|
|
|
|
METHODS package_to_path
|
|
IMPORTING
|
|
!iv_top TYPE devclass
|
|
!io_dot TYPE REF TO zcl_abapgit_dot_abapgit
|
|
!iv_package TYPE devclass
|
|
RETURNING
|
|
VALUE(rv_path) TYPE string
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS path_to_package
|
|
IMPORTING
|
|
!iv_top TYPE devclass
|
|
!io_dot TYPE REF TO zcl_abapgit_dot_abapgit
|
|
!iv_path TYPE string
|
|
!iv_create_if_not_exists TYPE abap_bool DEFAULT abap_true
|
|
RETURNING
|
|
VALUE(rv_package) TYPE devclass
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
CLASS-METHODS get_instance
|
|
RETURNING
|
|
VALUE(ro_instance) TYPE REF TO zcl_abapgit_folder_logic .
|
|
PROTECTED SECTION.
|
|
METHODS get_parent
|
|
IMPORTING
|
|
!iv_package TYPE devclass
|
|
RETURNING
|
|
VALUE(r_parent) TYPE devclass.
|
|
PRIVATE SECTION.
|
|
TYPES:
|
|
BEGIN OF ty_devclass_info,
|
|
devclass TYPE devclass,
|
|
namespace TYPE namespace,
|
|
parentcl TYPE parentcl,
|
|
END OF ty_devclass_info .
|
|
TYPES:
|
|
ty_devclass_info_tt TYPE SORTED TABLE OF ty_devclass_info
|
|
WITH UNIQUE KEY devclass .
|
|
DATA mt_parent TYPE ty_devclass_info_tt .
|
|
ENDCLASS.
|
|
|
|
|
|
|
|
CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION.
|
|
|
|
|
|
METHOD get_instance.
|
|
CREATE OBJECT ro_instance.
|
|
ENDMETHOD.
|
|
|
|
METHOD get_parent.
|
|
DATA: st_parent LIKE LINE OF mt_parent.
|
|
|
|
"Determine Parent Package
|
|
READ TABLE mt_parent INTO st_parent
|
|
WITH TABLE KEY devclass = iv_package.
|
|
IF sy-subrc <> 0.
|
|
r_parent = zcl_abapgit_factory=>get_sap_package( iv_package )->read_parent( ).
|
|
st_parent-devclass = iv_package.
|
|
st_parent-parentcl = r_parent.
|
|
INSERT st_parent INTO TABLE mt_parent.
|
|
ELSE.
|
|
r_parent = st_parent-parentcl.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD package_to_path.
|
|
|
|
DATA: lv_len TYPE i,
|
|
lv_path TYPE string,
|
|
lv_message TYPE string,
|
|
lv_parentcl TYPE tdevc-parentcl,
|
|
lv_folder_logic TYPE string.
|
|
|
|
IF iv_top = iv_package.
|
|
rv_path = io_dot->get_starting_folder( ).
|
|
ELSE.
|
|
lv_parentcl = get_parent( iv_package ).
|
|
|
|
IF lv_parentcl IS INITIAL.
|
|
zcx_abapgit_exception=>raise( |error, expected parent package, { iv_package }| ).
|
|
ELSE.
|
|
lv_folder_logic = io_dot->get_folder_logic( ).
|
|
CASE lv_folder_logic.
|
|
WHEN zif_abapgit_dot_abapgit=>c_folder_logic-full.
|
|
lv_len = 0.
|
|
IF iv_package(1) = '$'.
|
|
lv_len = 1.
|
|
ENDIF.
|
|
WHEN zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
|
|
lv_len = strlen( lv_parentcl ).
|
|
|
|
IF iv_package(lv_len) <> lv_parentcl.
|
|
* if abapGit project is installed in package ZZZ, all subpackages should be named
|
|
* ZZZ_something. This will define the folder name in the zip file to be "something",
|
|
* similarily with online projects. Alternatively change to FULL folder logic
|
|
lv_message = 'PREFIX: Unexpected package naming (' && iv_package && ')'
|
|
&& 'you might switch to FULL folder logic' ##no_text.
|
|
zcx_abapgit_exception=>raise( lv_message ).
|
|
ENDIF.
|
|
WHEN OTHERS.
|
|
zcx_abapgit_exception=>raise( |Invalid folder logic: { lv_folder_logic }| ).
|
|
ENDCASE.
|
|
|
|
lv_path = iv_package+lv_len.
|
|
IF strlen( lv_path ) = 0.
|
|
zcx_abapgit_exception=>raise( |Folder logic: length = 0, parent: {
|
|
lv_parentcl }, child: { iv_package }| ).
|
|
ENDIF.
|
|
|
|
IF lv_path(1) = '_'.
|
|
lv_path = lv_path+1.
|
|
ENDIF.
|
|
IF strlen( lv_path ) = 0.
|
|
zcx_abapgit_exception=>raise( |Folder logic: length = 0, parent: {
|
|
lv_parentcl }, child: { iv_package }| ).
|
|
ENDIF.
|
|
|
|
TRANSLATE lv_path USING '/#'.
|
|
TRANSLATE lv_path TO LOWER CASE.
|
|
CONCATENATE lv_path '/' INTO lv_path.
|
|
|
|
rv_path = package_to_path( iv_top = iv_top
|
|
io_dot = io_dot
|
|
iv_package = lv_parentcl ).
|
|
|
|
CONCATENATE rv_path lv_path INTO rv_path.
|
|
ENDIF.
|
|
ENDIF.
|
|
|
|
ENDMETHOD. "class_to_path
|
|
|
|
|
|
METHOD path_to_package.
|
|
|
|
DATA: lv_length TYPE i,
|
|
lv_parent TYPE devclass,
|
|
lv_new TYPE string,
|
|
lv_path TYPE string,
|
|
lv_top TYPE devclass.
|
|
|
|
lv_top = iv_top.
|
|
|
|
lv_length = strlen( io_dot->get_starting_folder( ) ).
|
|
IF lv_length > strlen( iv_path ).
|
|
* treat as not existing locally
|
|
RETURN.
|
|
ENDIF.
|
|
lv_path = iv_path+lv_length.
|
|
lv_parent = lv_top.
|
|
rv_package = lv_top.
|
|
|
|
WHILE lv_path CA '/'.
|
|
SPLIT lv_path AT '/' INTO lv_new lv_path.
|
|
|
|
CASE io_dot->get_folder_logic( ).
|
|
WHEN zif_abapgit_dot_abapgit=>c_folder_logic-full.
|
|
rv_package = lv_new.
|
|
TRANSLATE rv_package USING '#/'.
|
|
IF iv_top(1) = '$'.
|
|
CONCATENATE '$' rv_package INTO rv_package.
|
|
ENDIF.
|
|
WHEN zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
|
|
CONCATENATE rv_package '_' lv_new INTO rv_package.
|
|
WHEN OTHERS.
|
|
ASSERT 0 = 1.
|
|
ENDCASE.
|
|
|
|
TRANSLATE rv_package TO UPPER CASE.
|
|
|
|
IF zcl_abapgit_factory=>get_sap_package( rv_package )->exists( ) = abap_false AND
|
|
iv_create_if_not_exists = abap_true.
|
|
|
|
zcl_abapgit_factory=>get_sap_package( lv_parent )->create_child( rv_package ).
|
|
ENDIF.
|
|
|
|
lv_parent = rv_package.
|
|
ENDWHILE.
|
|
|
|
ENDMETHOD.
|
|
ENDCLASS.
|