Merge pull request #624 from larshp/issue_521

FULL folder logic
This commit is contained in:
Lars Hvam 2017-02-17 15:13:55 +01:00 committed by GitHub
commit 8b3c782ae2
10 changed files with 504 additions and 122 deletions

View File

@ -4,14 +4,14 @@
CLASS ltcl_dot_abapgit DEFINITION DEFERRED. CLASS ltcl_dot_abapgit DEFINITION DEFERRED.
CONSTANTS: BEGIN OF c_folder_logic, CLASS lcl_dot_abapgit DEFINITION CREATE PRIVATE FINAL FRIENDS ltcl_dot_abapgit.
PUBLIC SECTION.
CONSTANTS: BEGIN OF c_folder_logic,
prefix TYPE string VALUE 'PREFIX', prefix TYPE string VALUE 'PREFIX',
full TYPE string VALUE 'FULL', full TYPE string VALUE 'FULL',
END OF c_folder_logic. END OF c_folder_logic.
CLASS lcl_dot_abapgit DEFINITION CREATE PRIVATE FINAL FRIENDS ltcl_dot_abapgit.
PUBLIC SECTION.
CLASS-METHODS: CLASS-METHODS:
build_default build_default
IMPORTING iv_master_language TYPE spras IMPORTING iv_master_language TYPE spras
@ -39,8 +39,10 @@ CLASS lcl_dot_abapgit DEFINITION CREATE PRIVATE FINAL FRIENDS ltcl_dot_abapgit.
RETURNING VALUE(rv_path) TYPE string, RETURNING VALUE(rv_path) TYPE string,
get_folder_logic get_folder_logic
RETURNING VALUE(rv_logic) TYPE string, RETURNING VALUE(rv_logic) TYPE string,
* set_starting_folder set_folder_logic
* IMPORTING iv_path TYPE string, IMPORTING iv_logic TYPE string,
set_starting_folder
IMPORTING iv_path TYPE string,
get_master_language get_master_language
RETURNING VALUE(rv_language) TYPE spras, RETURNING VALUE(rv_language) TYPE spras,
* set_master_language * set_master_language
@ -220,9 +222,13 @@ CLASS lcl_dot_abapgit IMPLEMENTATION.
rv_logic = ms_data-folder_logic. rv_logic = ms_data-folder_logic.
ENDMETHOD. ENDMETHOD.
* METHOD set_starting_folder. METHOD set_folder_logic.
* ms_data-starting_folder = iv_path. ms_data-folder_logic = iv_logic.
* ENDMETHOD. ENDMETHOD.
METHOD set_starting_folder.
ms_data-starting_folder = iv_path.
ENDMETHOD.
METHOD get_master_language. METHOD get_master_language.
rv_language = ms_data-master_language. rv_language = ms_data-master_language.

View File

@ -31,8 +31,9 @@ CLASS lcl_file_status DEFINITION FINAL
run_checks run_checks
IMPORTING io_log TYPE REF TO lcl_log IMPORTING io_log TYPE REF TO lcl_log
it_results TYPE ty_results_tt it_results TYPE ty_results_tt
iv_start TYPE string io_dot TYPE REF TO lcl_dot_abapgit
iv_top TYPE devclass, iv_top TYPE devclass
RAISING lcx_exception,
build_existing build_existing
IMPORTING is_local TYPE ty_file_item IMPORTING is_local TYPE ty_file_item
is_remote TYPE ty_file is_remote TYPE ty_file
@ -109,8 +110,8 @@ CLASS lcl_file_status IMPLEMENTATION.
" Check that objects are created in package corresponding to folder " Check that objects are created in package corresponding to folder
LOOP AT it_results ASSIGNING <ls_res1> LOOP AT it_results ASSIGNING <ls_res1>
WHERE NOT package IS INITIAL AND NOT path IS INITIAL. WHERE NOT package IS INITIAL AND NOT path IS INITIAL.
lv_path = lcl_folder_logic=>class_to_path( iv_top = iv_top lv_path = lcl_folder_logic=>package_to_path( iv_top = iv_top
iv_start = iv_start io_dot = io_dot
iv_package = <ls_res1>-package ). iv_package = <ls_res1>-package ).
IF lv_path <> <ls_res1>-path. IF lv_path <> <ls_res1>-path.
io_log->add( iv_msgv1 = 'Package and path does not match for object,' io_log->add( iv_msgv1 = 'Package and path does not match for object,'
@ -151,7 +152,6 @@ CLASS lcl_file_status IMPLEMENTATION.
rt_results = calculate_status( rt_results = calculate_status(
iv_devclass = io_repo->get_package( ) iv_devclass = io_repo->get_package( )
it_local = io_repo->get_files_local( io_log = io_log ) it_local = io_repo->get_files_local( io_log = io_log )
it_remote = io_repo->get_files_remote( ) it_remote = io_repo->get_files_remote( )
@ -173,7 +173,7 @@ CLASS lcl_file_status IMPLEMENTATION.
run_checks( run_checks(
io_log = io_log io_log = io_log
it_results = rt_results it_results = rt_results
iv_start = lo_dot_abapgit->get_starting_folder( ) io_dot = lo_dot_abapgit
iv_top = io_repo->get_package( ) ). iv_top = io_repo->get_package( ) ).
ENDMETHOD. "status ENDMETHOD. "status

View File

@ -6,21 +6,23 @@ CLASS lcl_folder_logic DEFINITION.
PUBLIC SECTION. PUBLIC SECTION.
CLASS-METHODS: CLASS-METHODS:
class_to_path package_to_path
IMPORTING IMPORTING
iv_top TYPE devclass iv_top TYPE devclass
iv_start TYPE string io_dot TYPE REF TO lcl_dot_abapgit
iv_package TYPE devclass iv_package TYPE devclass
RETURNING RETURNING
VALUE(rv_path) TYPE string. VALUE(rv_path) TYPE string
RAISING lcx_exception,
CLASS-METHODS
path_to_package path_to_package
IMPORTING iv_top TYPE devclass IMPORTING
iv_start TYPE string iv_top TYPE devclass
io_dot TYPE REF TO lcl_dot_abapgit
iv_path TYPE string iv_path TYPE string
RETURNING VALUE(rv_package) TYPE devclass RETURNING
RAISING lcx_exception. VALUE(rv_package) TYPE devclass
RAISING
lcx_exception.
ENDCLASS. ENDCLASS.
@ -34,7 +36,7 @@ CLASS lcl_folder_logic IMPLEMENTATION.
lv_path TYPE string. lv_path TYPE string.
lv_length = strlen( iv_start ). lv_length = strlen( io_dot->get_starting_folder( ) ).
lv_path = iv_path+lv_length. lv_path = iv_path+lv_length.
lv_parent = iv_top. lv_parent = iv_top.
rv_package = iv_top. rv_package = iv_top.
@ -42,57 +44,354 @@ CLASS lcl_folder_logic IMPLEMENTATION.
WHILE lv_path CA '/'. WHILE lv_path CA '/'.
SPLIT lv_path AT '/' INTO lv_new lv_path. SPLIT lv_path AT '/' INTO lv_new lv_path.
CASE io_dot->get_folder_logic( ).
WHEN lcl_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 lcl_dot_abapgit=>c_folder_logic-prefix.
CONCATENATE rv_package '_' lv_new INTO rv_package. CONCATENATE rv_package '_' lv_new INTO rv_package.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
TRANSLATE rv_package TO UPPER CASE. TRANSLATE rv_package TO UPPER CASE.
IF lcl_sap_package=>exists( rv_package ) = abap_false. IF lcl_sap_package=>get( rv_package )->exists( ) = abap_false.
lcl_sap_package=>create_child( iv_parent = lv_parent lcl_sap_package=>get( lv_parent )->create_child( rv_package ).
iv_child = rv_package ).
ENDIF. ENDIF.
lv_parent = rv_package. lv_parent = rv_package.
ENDWHILE. ENDWHILE.
ENDMETHOD. ENDMETHOD.
METHOD class_to_path. METHOD package_to_path.
DATA: lv_len TYPE i, DATA: lv_len TYPE i,
lv_path TYPE string, lv_path TYPE string,
lv_message TYPE string,
lv_parentcl TYPE tdevc-parentcl. lv_parentcl TYPE tdevc-parentcl.
IF iv_top = iv_package. IF iv_top = iv_package.
rv_path = iv_start. rv_path = io_dot->get_starting_folder( ).
ELSE. ELSE.
SELECT SINGLE parentcl FROM tdevc INTO lv_parentcl lv_parentcl = lcl_sap_package=>get( iv_package )->read_parent( ).
WHERE devclass = iv_package. "#EC CI_SUBRC "#EC CI_GENBUFF
ASSERT sy-subrc = 0.
IF lv_parentcl IS INITIAL. IF lv_parentcl IS INITIAL.
rv_path = 'error' ##no_text. lcx_exception=>raise( 'error, expected parent package' ).
ELSE. ELSE.
CASE io_dot->get_folder_logic( ).
WHEN lcl_dot_abapgit=>c_folder_logic-full.
lv_len = 0.
IF iv_package(1) = '$'.
lv_len = 1.
ENDIF.
WHEN lcl_dot_abapgit=>c_folder_logic-prefix.
lv_len = strlen( lv_parentcl ). 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 && ')' ##no_text.
lcx_exception=>raise( lv_message ).
ENDIF.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
lv_path = iv_package+lv_len. lv_path = iv_package+lv_len.
IF strlen( lv_path ) = 0. IF strlen( lv_path ) = 0.
RETURN. " prevent dump lcx_exception=>raise( 'Folder logic: length = 0' ).
ENDIF. ENDIF.
IF lv_path(1) = '_'. IF lv_path(1) = '_'.
lv_path = lv_path+1. lv_path = lv_path+1.
ENDIF. ENDIF.
TRANSLATE lv_path USING '/#'.
TRANSLATE lv_path TO LOWER CASE. TRANSLATE lv_path TO LOWER CASE.
CONCATENATE lv_path '/' INTO lv_path. CONCATENATE lv_path '/' INTO lv_path.
rv_path = class_to_path( iv_top = iv_top rv_path = package_to_path( iv_top = iv_top
iv_start = iv_start io_dot = io_dot
iv_package = lv_parentcl ). iv_package = lv_parentcl ).
CONCATENATE rv_path lv_path INTO rv_path. CONCATENATE rv_path lv_path INTO rv_path.
ENDIF. ENDIF.
ENDIF. ENDIF.
ENDMETHOD. "class_to_path ENDMETHOD. "class_to_path
ENDCLASS. ENDCLASS.
CLASS ltcl_folder_logic_helper DEFINITION FOR TESTING FINAL.
PUBLIC SECTION.
CLASS-METHODS: test
IMPORTING
iv_starting TYPE string
iv_top TYPE devclass
iv_logic TYPE string
iv_package TYPE devclass
iv_path TYPE string
RAISING lcx_exception.
ENDCLASS.
CLASS ltcl_folder_logic_helper IMPLEMENTATION.
METHOD test.
DATA: lv_path TYPE string,
lv_package TYPE devclass,
lo_dot TYPE REF TO lcl_dot_abapgit.
lo_dot = lcl_dot_abapgit=>build_default( sy-langu ).
lo_dot->set_starting_folder( iv_starting ).
lo_dot->set_folder_logic( iv_logic ).
lv_package = lcl_folder_logic=>path_to_package(
iv_top = iv_top
io_dot = lo_dot
iv_path = iv_path ).
lv_path = lcl_folder_logic=>package_to_path(
iv_top = iv_top
io_dot = lo_dot
iv_package = iv_package ).
cl_abap_unit_assert=>assert_equals(
act = lv_package
exp = iv_package ).
cl_abap_unit_assert=>assert_equals(
act = lv_path
exp = iv_path ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_folder_logic DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
PUBLIC SECTION.
INTERFACES: lif_sap_package.
PRIVATE SECTION.
CONSTANTS: lc_top TYPE devclass VALUE '$TOP',
lc_src TYPE string VALUE '/src/'.
METHODS:
setup,
teardown,
prefix1 FOR TESTING RAISING lcx_exception,
prefix2 FOR TESTING RAISING lcx_exception,
prefix_error1 FOR TESTING RAISING lcx_exception,
full1 FOR TESTING RAISING lcx_exception,
full2 FOR TESTING RAISING lcx_exception.
ENDCLASS. "ltcl_convert DEFINITION
CLASS ltcl_folder_logic IMPLEMENTATION.
METHOD lif_sap_package~list_subpackages.
RETURN.
ENDMETHOD.
METHOD lif_sap_package~list_superpackages.
RETURN.
ENDMETHOD.
METHOD lif_sap_package~read_parent.
rv_parentcl = '$TOP'.
ENDMETHOD.
METHOD lif_sap_package~create_child.
RETURN.
ENDMETHOD.
METHOD lif_sap_package~exists.
rv_bool = abap_true.
ENDMETHOD.
METHOD setup.
FIELD-SYMBOLS: <ls_inject> LIKE LINE OF lcl_sap_package=>gt_injected.
CLEAR lcl_sap_package=>gt_injected.
APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING <ls_inject>.
<ls_inject>-package = '$TOP'.
<ls_inject>-object = me.
APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING <ls_inject>.
<ls_inject>-package = '$TOP_FOO'.
<ls_inject>-object = me.
APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING <ls_inject>.
<ls_inject>-package = '$FOOBAR'.
<ls_inject>-object = me.
ENDMETHOD.
METHOD teardown.
CLEAR lcl_sap_package=>gt_injected.
ENDMETHOD.
METHOD prefix1.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-prefix
iv_package = lc_top
iv_path = lc_src ).
ENDMETHOD.
METHOD prefix2.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-prefix
iv_package = '$TOP_FOO'
iv_path = '/src/foo/' ).
ENDMETHOD.
METHOD prefix_error1.
* PREFIX mode, top package is $TOP, so all subpackages should be named $TOP_something
TRY.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-prefix
iv_package = '$FOOBAR'
iv_path = '/src/' ).
cl_abap_unit_assert=>fail( 'Error expected' ).
CATCH lcx_exception.
ENDTRY.
ENDMETHOD.
METHOD full1.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-full
iv_package = lc_top
iv_path = lc_src ).
ENDMETHOD.
METHOD full2.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-full
iv_package = '$TOP_FOO'
iv_path = '/src/top_foo/' ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_folder_logic_namespaces DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
PUBLIC SECTION.
INTERFACES: lif_sap_package.
PRIVATE SECTION.
CONSTANTS: lc_top TYPE devclass VALUE '/TEST/TOOLS',
lc_src TYPE string VALUE '/src/'.
METHODS:
setup,
teardown,
prefix1 FOR TESTING RAISING lcx_exception,
prefix2 FOR TESTING RAISING lcx_exception,
full1 FOR TESTING RAISING lcx_exception,
full2 FOR TESTING RAISING lcx_exception.
ENDCLASS. "ltcl_convert DEFINITION
CLASS ltcl_folder_logic_namespaces IMPLEMENTATION.
METHOD lif_sap_package~list_subpackages.
RETURN.
ENDMETHOD.
METHOD lif_sap_package~list_superpackages.
RETURN.
ENDMETHOD.
METHOD lif_sap_package~read_parent.
rv_parentcl = lc_top.
ENDMETHOD.
METHOD lif_sap_package~create_child.
RETURN.
ENDMETHOD.
METHOD lif_sap_package~exists.
rv_bool = abap_true.
ENDMETHOD.
METHOD setup.
FIELD-SYMBOLS: <ls_inject> LIKE LINE OF lcl_sap_package=>gt_injected.
CLEAR lcl_sap_package=>gt_injected.
APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING <ls_inject>.
<ls_inject>-package = '/TEST/TOOLS'.
<ls_inject>-object = me.
APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING <ls_inject>.
<ls_inject>-package = '/TEST/T1'.
<ls_inject>-object = me.
APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING <ls_inject>.
<ls_inject>-package = '/TEST/TOOLS_T1'.
<ls_inject>-object = me.
ENDMETHOD.
METHOD teardown.
CLEAR lcl_sap_package=>gt_injected.
ENDMETHOD.
METHOD prefix1.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-prefix
iv_package = lc_top
iv_path = lc_src ).
ENDMETHOD.
METHOD prefix2.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-prefix
iv_package = '/TEST/TOOLS_T1'
iv_path = '/src/t1/' ).
ENDMETHOD.
METHOD full1.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-full
iv_package = lc_top
iv_path = lc_src ).
ENDMETHOD.
METHOD full2.
ltcl_folder_logic_helper=>test(
iv_starting = lc_src
iv_top = lc_top
iv_logic = lcl_dot_abapgit=>c_folder_logic-full
iv_package = '/TEST/T1'
iv_path = '/src/#test#t1/' ).
ENDMETHOD.
ENDCLASS.

View File

@ -80,12 +80,12 @@ CLASS lcl_objects IMPLEMENTATION.
METHOD update_package_tree. METHOD update_package_tree.
DATA: lt_packages TYPE lcl_sap_package=>ty_devclass_tt, DATA: lt_packages TYPE lif_sap_package=>ty_devclass_tt,
lv_package LIKE LINE OF lt_packages, lv_package LIKE LINE OF lt_packages,
lv_tree TYPE dirtree-tname. lv_tree TYPE dirtree-tname.
lt_packages = lcl_sap_package=>list_subpackages( iv_package ). lt_packages = lcl_sap_package=>get( iv_package )->list_subpackages( ).
APPEND iv_package TO lt_packages. APPEND iv_package TO lt_packages.
LOOP AT lt_packages INTO lv_package. LOOP AT lt_packages INTO lv_package.
@ -597,7 +597,7 @@ CLASS lcl_objects IMPLEMENTATION.
lv_package = lcl_folder_logic=>path_to_package( lv_package = lcl_folder_logic=>path_to_package(
iv_top = io_repo->get_package( ) iv_top = io_repo->get_package( )
iv_start = io_repo->get_dot_abapgit( )->get_starting_folder( ) io_dot = io_repo->get_dot_abapgit( )
iv_path = <ls_result>-path ). iv_path = <ls_result>-path ).
lv_cancel = warning_package( is_item = ls_item lv_cancel = warning_package( is_item = ls_item

View File

@ -181,12 +181,16 @@ CLASS lcl_repo_content_browser IMPLEMENTATION.
<ls_tadir> LIKE LINE OF lt_tadir. <ls_tadir> LIKE LINE OF lt_tadir.
lt_tadir = lcl_tadir=>read( mo_repo->get_package( ) ). * todo, offline projects should have an dot abapgit too
lt_tadir = lcl_tadir=>read(
iv_package = mo_repo->get_package( )
io_dot = lcl_dot_abapgit=>build_default( sy-langu ) ).
LOOP AT lt_tadir ASSIGNING <ls_tadir>. LOOP AT lt_tadir ASSIGNING <ls_tadir>.
APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>. APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.
<ls_repo_item>-obj_type = <ls_tadir>-object. <ls_repo_item>-obj_type = <ls_tadir>-object.
<ls_repo_item>-obj_name = <ls_tadir>-obj_name. <ls_repo_item>-obj_name = <ls_tadir>-obj_name.
<ls_repo_item>-path = '/' && <ls_tadir>-path. " Add root anchor <ls_repo_item>-path = <ls_tadir>-path.
<ls_repo_item>-sortkey = c_sortkey-default. " Default sort key <ls_repo_item>-sortkey = c_sortkey-default. " Default sort key
ENDLOOP. ENDLOOP.

View File

@ -537,7 +537,8 @@ CLASS lcl_repo IMPLEMENTATION.
lt_cache = mt_local. lt_cache = mt_local.
lt_tadir = lcl_tadir=>read( lt_tadir = lcl_tadir=>read(
iv_package = get_package( ) iv_package = get_package( )
iv_ignore_subpackages = ignore_subpackages( ) ). iv_ignore_subpackages = ignore_subpackages( )
io_dot = get_dot_abapgit( ) ).
lt_filter = it_filter. lt_filter = it_filter.
lv_filter_exist = boolc( lines( lt_filter ) > 0 ) . lv_filter_exist = boolc( lines( lt_filter ) > 0 ) .
@ -582,7 +583,7 @@ CLASS lcl_repo IMPLEMENTATION.
iv_language = get_master_language( ) iv_language = get_master_language( )
io_log = io_log ). io_log = io_log ).
LOOP AT lt_files ASSIGNING <ls_file>. LOOP AT lt_files ASSIGNING <ls_file>.
<ls_file>-path = mo_dot_abapgit->get_starting_folder( ) && <ls_tadir>-path. <ls_file>-path = <ls_tadir>-path.
<ls_file>-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = <ls_file>-data ). <ls_file>-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = <ls_file>-data ).
APPEND INITIAL LINE TO rt_files ASSIGNING <ls_return>. APPEND INITIAL LINE TO rt_files ASSIGNING <ls_return>.

View File

@ -2,35 +2,65 @@
*& Include ZABAPGIT_SAP_PACKAGE *& Include ZABAPGIT_SAP_PACKAGE
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
INTERFACE lif_sap_package.
TYPES: ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY.
METHODS:
list_subpackages
RETURNING VALUE(rt_list) TYPE ty_devclass_tt,
list_superpackages
RETURNING VALUE(rt_list) TYPE ty_devclass_tt,
read_parent
RETURNING VALUE(rv_parentcl) TYPE tdevc-parentcl,
create_child
IMPORTING iv_child TYPE devclass
RAISING lcx_exception,
exists
RETURNING VALUE(rv_bool) TYPE abap_bool.
ENDINTERFACE.
CLASS ltcl_folder_logic DEFINITION DEFERRED.
CLASS ltcl_folder_logic_namespaces DEFINITION DEFERRED.
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS lcl_package DEFINITION * CLASS lcl_package DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* *
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_sap_package DEFINITION FINAL. CLASS lcl_sap_package DEFINITION FINAL CREATE PRIVATE
FRIENDS
ltcl_folder_logic
ltcl_folder_logic_namespaces.
PUBLIC SECTION. PUBLIC SECTION.
TYPES: ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY.
CLASS-METHODS: CLASS-METHODS:
list_subpackages IMPORTING iv_package TYPE devclass get
RETURNING VALUE(rt_list) TYPE ty_devclass_tt,
list_superpackages IMPORTING iv_package TYPE devclass
RETURNING VALUE(rt_list) TYPE ty_devclass_tt,
create_local
IMPORTING iv_package TYPE devclass IMPORTING iv_package TYPE devclass
RAISING lcx_exception, RETURNING VALUE(ri_package) TYPE REF TO lif_sap_package,
create create
IMPORTING is_package TYPE scompkdtln IMPORTING is_package TYPE scompkdtln
RETURNING VALUE(ri_package) TYPE REF TO if_package
RAISING lcx_exception, RAISING lcx_exception,
create_child create_local
IMPORTING iv_parent TYPE devclass
iv_child TYPE devclass
RAISING lcx_exception,
exists
IMPORTING iv_package TYPE devclass IMPORTING iv_package TYPE devclass
RETURNING VALUE(rv_bool) TYPE abap_bool. RAISING lcx_exception.
METHODS:
constructor
IMPORTING iv_package TYPE devclass.
INTERFACES: lif_sap_package.
PRIVATE SECTION.
TYPES: BEGIN OF ty_injected,
package TYPE devclass,
object TYPE REF TO lif_sap_package,
END OF ty_injected.
CLASS-DATA: gt_injected TYPE STANDARD TABLE OF ty_injected.
DATA: mv_package TYPE devclass.
ENDCLASS. "lcl_package DEFINITION ENDCLASS. "lcl_package DEFINITION
@ -41,11 +71,31 @@ ENDCLASS. "lcl_package DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_sap_package IMPLEMENTATION. CLASS lcl_sap_package IMPLEMENTATION.
METHOD exists. METHOD get.
FIELD-SYMBOLS: <ls_injected> LIKE LINE OF gt_injected.
IF lines( gt_injected ) > 0.
READ TABLE gt_injected ASSIGNING <ls_injected> WITH KEY package = iv_package.
ASSERT sy-subrc = 0. " unit test should be in control
ri_package = <ls_injected>-object.
ELSE.
CREATE OBJECT ri_package TYPE lcl_sap_package
EXPORTING
iv_package = iv_package.
ENDIF.
ENDMETHOD.
METHOD constructor.
mv_package = iv_package.
ENDMETHOD.
METHOD lif_sap_package~exists.
cl_package_factory=>load_package( cl_package_factory=>load_package(
EXPORTING EXPORTING
i_package_name = iv_package i_package_name = mv_package
EXCEPTIONS EXCEPTIONS
object_not_existing = 1 object_not_existing = 1
unexpected_error = 2 unexpected_error = 2
@ -56,7 +106,7 @@ CLASS lcl_sap_package IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD create_child. METHOD lif_sap_package~create_child.
DATA: li_parent TYPE REF TO if_package, DATA: li_parent TYPE REF TO if_package,
ls_child TYPE scompkdtln. ls_child TYPE scompkdtln.
@ -64,7 +114,7 @@ CLASS lcl_sap_package IMPLEMENTATION.
cl_package_factory=>load_package( cl_package_factory=>load_package(
EXPORTING EXPORTING
i_package_name = iv_parent i_package_name = mv_package
IMPORTING IMPORTING
e_package = li_parent e_package = li_parent
EXCEPTIONS EXCEPTIONS
@ -80,7 +130,7 @@ CLASS lcl_sap_package IMPLEMENTATION.
ls_child-devclass = iv_child. ls_child-devclass = iv_child.
ls_child-dlvunit = li_parent->software_component. ls_child-dlvunit = li_parent->software_component.
ls_child-ctext = iv_child. ls_child-ctext = iv_child.
ls_child-parentcl = iv_parent. ls_child-parentcl = mv_package.
ls_child-pdevclass = li_parent->transport_layer. ls_child-pdevclass = li_parent->transport_layer.
ls_child-as4user = sy-uname. ls_child-as4user = sy-uname.
@ -91,6 +141,7 @@ CLASS lcl_sap_package IMPLEMENTATION.
METHOD create. METHOD create.
DATA: lv_err TYPE string, DATA: lv_err TYPE string,
li_package TYPE REF TO if_package,
ls_package LIKE is_package. ls_package LIKE is_package.
@ -122,7 +173,7 @@ CLASS lcl_sap_package IMPLEMENTATION.
i_reuse_deleted_object = abap_true i_reuse_deleted_object = abap_true
* i_suppress_dialog = abap_true " does not exist in 730 * i_suppress_dialog = abap_true " does not exist in 730
IMPORTING IMPORTING
e_package = ri_package e_package = li_package
CHANGING CHANGING
c_package_data = ls_package c_package_data = ls_package
EXCEPTIONS EXCEPTIONS
@ -152,7 +203,7 @@ CLASS lcl_sap_package IMPLEMENTATION.
lcx_exception=>raise( |Package { is_package-devclass } could not be created| ). lcx_exception=>raise( |Package { is_package-devclass } could not be created| ).
ENDIF. ENDIF.
ri_package->save( li_package->save(
* EXPORTING * EXPORTING
* i_suppress_dialog = abap_true " Controls whether popups can be transmitted * i_suppress_dialog = abap_true " Controls whether popups can be transmitted
EXCEPTIONS EXCEPTIONS
@ -169,42 +220,50 @@ CLASS lcl_sap_package IMPLEMENTATION.
lcx_exception=>raise( lv_err ). lcx_exception=>raise( lv_err ).
ENDIF. ENDIF.
ri_package->set_changeable( abap_false ). li_package->set_changeable( abap_false ).
ENDMETHOD. ENDMETHOD.
METHOD list_superpackages. METHOD lif_sap_package~read_parent.
SELECT SINGLE parentcl FROM tdevc INTO rv_parentcl
WHERE devclass = mv_package. "#EC CI_SUBRC "#EC CI_GENBUFF
ASSERT sy-subrc = 0.
ENDMETHOD.
METHOD lif_sap_package~list_superpackages.
DATA: lt_list LIKE rt_list, DATA: lt_list LIKE rt_list,
lv_parent TYPE tdevc-parentcl, lv_parent TYPE tdevc-parentcl,
lv_devclass LIKE LINE OF rt_list. lv_devclass LIKE LINE OF rt_list.
APPEND iv_package TO rt_list. APPEND mv_package TO rt_list.
SELECT SINGLE parentcl INTO lv_parent SELECT SINGLE parentcl INTO lv_parent
FROM tdevc WHERE devclass = iv_package. "#EC CI_GENBUFF FROM tdevc WHERE devclass = mv_package. "#EC CI_GENBUFF
IF NOT lv_parent IS INITIAL. IF NOT lv_parent IS INITIAL.
APPEND lv_parent TO rt_list. APPEND lv_parent TO rt_list.
lt_list = list_superpackages( lv_devclass ). lt_list = get( lv_devclass )->list_superpackages( ).
APPEND LINES OF lt_list TO rt_list. APPEND LINES OF lt_list TO rt_list.
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD list_subpackages. METHOD lif_sap_package~list_subpackages.
DATA: lt_list LIKE rt_list, DATA: lt_list LIKE rt_list,
lv_devclass LIKE LINE OF rt_list. lv_devclass LIKE LINE OF rt_list.
SELECT devclass INTO TABLE rt_list SELECT devclass INTO TABLE rt_list
FROM tdevc WHERE parentcl = iv_package. "#EC CI_GENBUFF FROM tdevc WHERE parentcl = mv_package. "#EC CI_GENBUFF
* note the recursion, since packages are added to the list * note the recursion, since packages are added to the list
LOOP AT rt_list INTO lv_devclass. LOOP AT rt_list INTO lv_devclass.
lt_list = list_subpackages( lv_devclass ). lt_list = get( lv_devclass )->list_subpackages( ).
APPEND LINES OF lt_list TO rt_list. APPEND LINES OF lt_list TO rt_list.
ENDLOOP. ENDLOOP.

View File

@ -14,6 +14,7 @@ CLASS lcl_tadir DEFINITION FINAL.
read read
IMPORTING iv_package TYPE tadir-devclass IMPORTING iv_package TYPE tadir-devclass
iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
io_dot TYPE REF TO lcl_dot_abapgit OPTIONAL
RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt
RAISING lcx_exception, RAISING lcx_exception,
read_single read_single
@ -35,7 +36,8 @@ CLASS lcl_tadir DEFINITION FINAL.
RAISING lcx_exception, RAISING lcx_exception,
build build
IMPORTING iv_package TYPE tadir-devclass IMPORTING iv_package TYPE tadir-devclass
iv_path TYPE string iv_top TYPE tadir-devclass
io_dot TYPE REF TO lcl_dot_abapgit
iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt
RAISING lcx_exception. RAISING lcx_exception.
@ -112,8 +114,10 @@ CLASS lcl_tadir IMPLEMENTATION.
METHOD read. METHOD read.
* start recursion * start recursion
* hmm, some problems here, should TADIR also build path?
rt_tadir = build( iv_package = iv_package rt_tadir = build( iv_package = iv_package
iv_path = '' iv_top = iv_package
io_dot = io_dot
iv_ignore_subpackages = iv_ignore_subpackages ). iv_ignore_subpackages = iv_ignore_subpackages ).
rt_tadir = check_exists( rt_tadir ). rt_tadir = check_exists( rt_tadir ).
@ -145,15 +149,23 @@ CLASS lcl_tadir IMPLEMENTATION.
AND delflag = abap_false AND delflag = abap_false
ORDER BY PRIMARY KEY. "#EC CI_GENBUFF "#EC CI_SUBRC ORDER BY PRIMARY KEY. "#EC CI_GENBUFF "#EC CI_SUBRC
IF NOT io_dot IS INITIAL.
lv_path = lcl_folder_logic=>package_to_path(
iv_top = iv_top
io_dot = io_dot
iv_package = iv_package ).
ENDIF.
LOOP AT rt_tadir ASSIGNING <ls_tadir>. LOOP AT rt_tadir ASSIGNING <ls_tadir>.
lv_index = sy-tabix. lv_index = sy-tabix.
<ls_tadir>-path = iv_path. <ls_tadir>-path = lv_path.
CASE <ls_tadir>-object. CASE <ls_tadir>-object.
WHEN 'SICF'. WHEN 'SICF'.
<ls_tadir>-obj_name = <ls_tadir>-obj_name(15). <ls_tadir>-obj_name = <ls_tadir>-obj_name(15).
WHEN 'INTF'. WHEN 'INTF'.
* todo, move this logic to INTF exists method
SELECT SINGLE category FROM seoclassdf INTO lv_category SELECT SINGLE category FROM seoclassdf INTO lv_category
WHERE clsname = <ls_tadir>-obj_name WHERE clsname = <ls_tadir>-obj_name
AND ( version = '1' AND ( version = '1'
@ -172,26 +184,27 @@ CLASS lcl_tadir IMPLEMENTATION.
ENDIF. ENDIF.
LOOP AT lt_tdevc ASSIGNING <ls_tdevc>. LOOP AT lt_tdevc ASSIGNING <ls_tdevc>.
lv_len = strlen( iv_package ). * lv_len = strlen( iv_package ).
IF <ls_tdevc>-devclass(lv_len) <> iv_package. * IF <ls_tdevc>-devclass(lv_len) <> iv_package.
* if abapGit project is installed in package ZZZ, all subpackages should be named ** 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", ** ZZZ_something. This will define the folder name in the zip file to be "something",
* similarily with online projects ** similarily with online projects
lv_message = 'Unexpected package naming(' && * lv_message = 'Unexpected package naming(' &&
<ls_tdevc>-devclass && ')' ##no_text. * <ls_tdevc>-devclass && ')' ##no_text.
MESSAGE lv_message TYPE 'I'. * MESSAGE lv_message TYPE 'I'.
CONTINUE. * CONTINUE.
ENDIF. * ENDIF.
*
lv_path = <ls_tdevc>-devclass+lv_len. * lv_path = <ls_tdevc>-devclass+lv_len.
IF lv_path(1) = '_'. * IF lv_path(1) = '_'.
lv_path = lv_path+1. * lv_path = lv_path+1.
ENDIF. * ENDIF.
TRANSLATE lv_path TO LOWER CASE. * TRANSLATE lv_path TO LOWER CASE.
CONCATENATE iv_path lv_path '/' INTO lv_path. * CONCATENATE iv_path lv_path '/' INTO lv_path.
lt_tadir = build( iv_package = <ls_tdevc>-devclass lt_tadir = build( iv_package = <ls_tdevc>-devclass
iv_path = lv_path ). iv_top = iv_top
io_dot = io_dot ).
APPEND LINES OF lt_tadir TO rt_tadir. APPEND LINES OF lt_tadir TO rt_tadir.
ENDLOOP. ENDLOOP.

View File

@ -69,8 +69,8 @@ CLASS lcl_transport IMPLEMENTATION.
METHOD find_top_package. METHOD find_top_package.
* assumption: all objects in transport share a common super package * assumption: all objects in transport share a common super package
DATA: lt_obj TYPE lcl_sap_package=>ty_devclass_tt, DATA: lt_obj TYPE lif_sap_package=>ty_devclass_tt,
lt_super TYPE lcl_sap_package=>ty_devclass_tt, lt_super TYPE lif_sap_package=>ty_devclass_tt,
lv_super LIKE LINE OF lt_super, lv_super LIKE LINE OF lt_super,
lv_index TYPE i. lv_index TYPE i.
@ -79,10 +79,10 @@ CLASS lcl_transport IMPLEMENTATION.
READ TABLE it_tadir INDEX 1 ASSIGNING <ls_tadir>. READ TABLE it_tadir INDEX 1 ASSIGNING <ls_tadir>.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
lt_super = lcl_sap_package=>list_superpackages( <ls_tadir>-devclass ). lt_super = lcl_sap_package=>get( <ls_tadir>-devclass )->list_superpackages( ).
LOOP AT it_tadir ASSIGNING <ls_tadir>. LOOP AT it_tadir ASSIGNING <ls_tadir>.
lt_obj = lcl_sap_package=>list_superpackages( <ls_tadir>-devclass ). lt_obj = lcl_sap_package=>get( <ls_tadir>-devclass )->list_superpackages( ).
* filter out possibilities from lt_super * filter out possibilities from lt_super
LOOP AT lt_super INTO lv_super. LOOP AT lt_super INTO lv_super.

View File

@ -1961,7 +1961,7 @@ CLASS ltcl_file_status2 DEFINITION
INHERITING FROM cl_aunit_assert. INHERITING FROM cl_aunit_assert.
PUBLIC SECTION. PUBLIC SECTION.
METHODS check FOR TESTING. METHODS check FOR TESTING RAISING lcx_exception.
ENDCLASS. "ltcl_sap_package ENDCLASS. "ltcl_sap_package
@ -1986,7 +1986,7 @@ CLASS ltcl_file_status2 IMPLEMENTATION.
lcl_file_status=>run_checks( io_log = lo_log lcl_file_status=>run_checks( io_log = lo_log
it_results = lt_results it_results = lt_results
iv_start = '/' io_dot = lcl_dot_abapgit=>build_default( sy-langu )
iv_top = '$Z$' ). iv_top = '$Z$' ).
assert_equals( act = lo_log->count( ) exp = 0 ). assert_equals( act = lo_log->count( ) exp = 0 ).
@ -2004,7 +2004,7 @@ CLASS ltcl_file_status2 IMPLEMENTATION.
lcl_file_status=>run_checks( io_log = lo_log lcl_file_status=>run_checks( io_log = lo_log
it_results = lt_results it_results = lt_results
iv_start = '/' io_dot = lcl_dot_abapgit=>build_default( sy-langu )
iv_top = '$Z$' ). iv_top = '$Z$' ).
" This one is not pure - incorrect path also triggers path vs package check " This one is not pure - incorrect path also triggers path vs package check
@ -2024,7 +2024,7 @@ CLASS ltcl_file_status2 IMPLEMENTATION.
lcl_file_status=>run_checks( io_log = lo_log lcl_file_status=>run_checks( io_log = lo_log
it_results = lt_results it_results = lt_results
iv_start = '/' io_dot = lcl_dot_abapgit=>build_default( sy-langu )
iv_top = '$Z$' ). iv_top = '$Z$' ).
assert_equals( act = lo_log->count( ) exp = 1 ). assert_equals( act = lo_log->count( ) exp = 1 ).
@ -2043,7 +2043,7 @@ CLASS ltcl_file_status2 IMPLEMENTATION.
lcl_file_status=>run_checks( io_log = lo_log lcl_file_status=>run_checks( io_log = lo_log
it_results = lt_results it_results = lt_results
iv_start = '/' io_dot = lcl_dot_abapgit=>build_default( sy-langu )
iv_top = '$Z$' ). iv_top = '$Z$' ).
assert_equals( act = lo_log->count( ) exp = 1 ). assert_equals( act = lo_log->count( ) exp = 1 ).
@ -2061,7 +2061,7 @@ CLASS ltcl_file_status2 IMPLEMENTATION.
lcl_file_status=>run_checks( io_log = lo_log lcl_file_status=>run_checks( io_log = lo_log
it_results = lt_results it_results = lt_results
iv_start = '/' io_dot = lcl_dot_abapgit=>build_default( sy-langu )
iv_top = '$Z$' ). iv_top = '$Z$' ).
assert_equals( act = lo_log->count( ) assert_equals( act = lo_log->count( )
@ -2242,4 +2242,4 @@ CLASS ltcl_persistence_settings IMPLEMENTATION.
ENDCLASS. ENDCLASS.
INCLUDE ZABAPGIT_UNIT_TEST_CLAS_INTF. INCLUDE zabapgit_unit_test_clas_intf.