diff --git a/src/zabapgit_dot_abapgit.prog.abap b/src/zabapgit_dot_abapgit.prog.abap index 71684faf5..72147df9f 100644 --- a/src/zabapgit_dot_abapgit.prog.abap +++ b/src/zabapgit_dot_abapgit.prog.abap @@ -4,14 +4,14 @@ CLASS ltcl_dot_abapgit DEFINITION DEFERRED. -CONSTANTS: BEGIN OF c_folder_logic, - prefix TYPE string VALUE 'PREFIX', - full TYPE string VALUE 'FULL', - END 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', + full TYPE string VALUE 'FULL', + END OF c_folder_logic. + CLASS-METHODS: build_default 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, get_folder_logic RETURNING VALUE(rv_logic) TYPE string, -* set_starting_folder -* IMPORTING iv_path TYPE string, + set_folder_logic + IMPORTING iv_logic TYPE string, + set_starting_folder + IMPORTING iv_path TYPE string, get_master_language RETURNING VALUE(rv_language) TYPE spras, * set_master_language @@ -220,9 +222,13 @@ CLASS lcl_dot_abapgit IMPLEMENTATION. rv_logic = ms_data-folder_logic. ENDMETHOD. -* METHOD set_starting_folder. -* ms_data-starting_folder = iv_path. -* ENDMETHOD. + METHOD set_folder_logic. + ms_data-folder_logic = iv_logic. + ENDMETHOD. + + METHOD set_starting_folder. + ms_data-starting_folder = iv_path. + ENDMETHOD. METHOD get_master_language. rv_language = ms_data-master_language. diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap index 306af38c8..ee105864a 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zabapgit_file_status.prog.abap @@ -31,8 +31,9 @@ CLASS lcl_file_status DEFINITION FINAL run_checks IMPORTING io_log TYPE REF TO lcl_log it_results TYPE ty_results_tt - iv_start TYPE string - iv_top TYPE devclass, + io_dot TYPE REF TO lcl_dot_abapgit + iv_top TYPE devclass + RAISING lcx_exception, build_existing IMPORTING is_local TYPE ty_file_item is_remote TYPE ty_file @@ -109,9 +110,9 @@ CLASS lcl_file_status IMPLEMENTATION. " Check that objects are created in package corresponding to folder LOOP AT it_results ASSIGNING WHERE NOT package IS INITIAL AND NOT path IS INITIAL. - lv_path = lcl_folder_logic=>class_to_path( iv_top = iv_top - iv_start = iv_start - iv_package = -package ). + lv_path = lcl_folder_logic=>package_to_path( iv_top = iv_top + io_dot = io_dot + iv_package = -package ). IF lv_path <> -path. io_log->add( iv_msgv1 = 'Package and path does not match for object,' iv_msgv2 = -obj_type @@ -151,7 +152,6 @@ CLASS lcl_file_status IMPLEMENTATION. rt_results = calculate_status( - iv_devclass = io_repo->get_package( ) it_local = io_repo->get_files_local( io_log = io_log ) it_remote = io_repo->get_files_remote( ) @@ -173,7 +173,7 @@ CLASS lcl_file_status IMPLEMENTATION. run_checks( io_log = io_log it_results = rt_results - iv_start = lo_dot_abapgit->get_starting_folder( ) + io_dot = lo_dot_abapgit iv_top = io_repo->get_package( ) ). ENDMETHOD. "status diff --git a/src/zabapgit_folder_logic.prog.abap b/src/zabapgit_folder_logic.prog.abap index 78c5d653d..68141281d 100644 --- a/src/zabapgit_folder_logic.prog.abap +++ b/src/zabapgit_folder_logic.prog.abap @@ -6,21 +6,23 @@ CLASS lcl_folder_logic DEFINITION. PUBLIC SECTION. CLASS-METHODS: - class_to_path + package_to_path IMPORTING iv_top TYPE devclass - iv_start TYPE string + io_dot TYPE REF TO lcl_dot_abapgit iv_package TYPE devclass RETURNING - VALUE(rv_path) TYPE string. - - CLASS-METHODS + VALUE(rv_path) TYPE string + RAISING lcx_exception, path_to_package - IMPORTING iv_top TYPE devclass - iv_start TYPE string - iv_path TYPE string - RETURNING VALUE(rv_package) TYPE devclass - RAISING lcx_exception. + IMPORTING + iv_top TYPE devclass + io_dot TYPE REF TO lcl_dot_abapgit + iv_path TYPE string + RETURNING + VALUE(rv_package) TYPE devclass + RAISING + lcx_exception. ENDCLASS. @@ -34,65 +36,362 @@ CLASS lcl_folder_logic IMPLEMENTATION. lv_path TYPE string. - lv_length = strlen( iv_start ). - lv_path = iv_path+lv_length. - lv_parent = iv_top. + lv_length = strlen( io_dot->get_starting_folder( ) ). + lv_path = iv_path+lv_length. + lv_parent = iv_top. rv_package = iv_top. WHILE lv_path CA '/'. SPLIT lv_path AT '/' INTO lv_new lv_path. - CONCATENATE rv_package '_' lv_new INTO rv_package. + 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. + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + TRANSLATE rv_package TO UPPER CASE. - IF lcl_sap_package=>exists( rv_package ) = abap_false. - lcl_sap_package=>create_child( iv_parent = lv_parent - iv_child = rv_package ). + IF lcl_sap_package=>get( rv_package )->exists( ) = abap_false. + lcl_sap_package=>get( lv_parent )->create_child( rv_package ). ENDIF. lv_parent = rv_package. ENDWHILE. + ENDMETHOD. - METHOD class_to_path. + METHOD package_to_path. DATA: lv_len TYPE i, lv_path TYPE string, + lv_message TYPE string, lv_parentcl TYPE tdevc-parentcl. IF iv_top = iv_package. - rv_path = iv_start. + rv_path = io_dot->get_starting_folder( ). ELSE. - SELECT SINGLE parentcl FROM tdevc INTO lv_parentcl - WHERE devclass = iv_package. "#EC CI_SUBRC "#EC CI_GENBUFF - ASSERT sy-subrc = 0. + lv_parentcl = lcl_sap_package=>get( iv_package )->read_parent( ). IF lv_parentcl IS INITIAL. - rv_path = 'error' ##no_text. + lcx_exception=>raise( 'error, expected parent package' ). ELSE. - lv_len = strlen( lv_parentcl ). + 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 ). + + 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. IF strlen( lv_path ) = 0. - RETURN. " prevent dump + lcx_exception=>raise( 'Folder logic: length = 0' ). ENDIF. + IF lv_path(1) = '_'. lv_path = lv_path+1. ENDIF. + + TRANSLATE lv_path USING '/#'. TRANSLATE lv_path TO LOWER CASE. CONCATENATE lv_path '/' INTO lv_path. - rv_path = class_to_path( iv_top = iv_top - iv_start = iv_start - iv_package = lv_parentcl ). + 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 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: LIKE LINE OF lcl_sap_package=>gt_injected. + + CLEAR lcl_sap_package=>gt_injected. + + APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING . + -package = '$TOP'. + -object = me. + + APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING . + -package = '$TOP_FOO'. + -object = me. + + APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING . + -package = '$FOOBAR'. + -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: LIKE LINE OF lcl_sap_package=>gt_injected. + + CLEAR lcl_sap_package=>gt_injected. + + APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING . + -package = '/TEST/TOOLS'. + -object = me. + + APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING . + -package = '/TEST/T1'. + -object = me. + + APPEND INITIAL LINE TO lcl_sap_package=>gt_injected ASSIGNING . + -package = '/TEST/TOOLS_T1'. + -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. diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index 751fafa78..ced014a35 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -80,12 +80,12 @@ CLASS lcl_objects IMPLEMENTATION. 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_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. LOOP AT lt_packages INTO lv_package. @@ -596,9 +596,9 @@ CLASS lcl_objects IMPLEMENTATION. REPLACE ALL OCCURRENCES OF '#' IN ls_item-obj_name WITH '/'. lv_package = lcl_folder_logic=>path_to_package( - iv_top = io_repo->get_package( ) - iv_start = io_repo->get_dot_abapgit( )->get_starting_folder( ) - iv_path = -path ). + iv_top = io_repo->get_package( ) + io_dot = io_repo->get_dot_abapgit( ) + iv_path = -path ). lv_cancel = warning_package( is_item = ls_item iv_package = lv_package ). diff --git a/src/zabapgit_repo_browser_util.prog.abap b/src/zabapgit_repo_browser_util.prog.abap index 7cab7d7e7..1be3130f0 100644 --- a/src/zabapgit_repo_browser_util.prog.abap +++ b/src/zabapgit_repo_browser_util.prog.abap @@ -181,12 +181,16 @@ CLASS lcl_repo_content_browser IMPLEMENTATION. 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 . APPEND INITIAL LINE TO rt_repo_items ASSIGNING . -obj_type = -object. -obj_name = -obj_name. - -path = '/' && -path. " Add root anchor + -path = -path. -sortkey = c_sortkey-default. " Default sort key ENDLOOP. diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 292f18924..8b0421318 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -537,7 +537,8 @@ CLASS lcl_repo IMPLEMENTATION. lt_cache = mt_local. lt_tadir = lcl_tadir=>read( iv_package = get_package( ) - iv_ignore_subpackages = ignore_subpackages( ) ). + iv_ignore_subpackages = ignore_subpackages( ) + io_dot = get_dot_abapgit( ) ). lt_filter = it_filter. lv_filter_exist = boolc( lines( lt_filter ) > 0 ) . @@ -582,7 +583,7 @@ CLASS lcl_repo IMPLEMENTATION. iv_language = get_master_language( ) io_log = io_log ). LOOP AT lt_files ASSIGNING . - -path = mo_dot_abapgit->get_starting_folder( ) && -path. + -path = -path. -sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = -data ). APPEND INITIAL LINE TO rt_files ASSIGNING . diff --git a/src/zabapgit_sap_package.prog.abap b/src/zabapgit_sap_package.prog.abap index 0aa4622ae..b5b6b4d68 100644 --- a/src/zabapgit_sap_package.prog.abap +++ b/src/zabapgit_sap_package.prog.abap @@ -2,35 +2,65 @@ *& 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_sap_package DEFINITION FINAL. +CLASS lcl_sap_package DEFINITION FINAL CREATE PRIVATE + FRIENDS + ltcl_folder_logic + ltcl_folder_logic_namespaces. PUBLIC SECTION. - TYPES: ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY. - CLASS-METHODS: - list_subpackages IMPORTING iv_package TYPE devclass - RETURNING VALUE(rt_list) TYPE ty_devclass_tt, - list_superpackages IMPORTING iv_package TYPE devclass - RETURNING VALUE(rt_list) TYPE ty_devclass_tt, + get + IMPORTING iv_package TYPE devclass + RETURNING VALUE(ri_package) TYPE REF TO lif_sap_package, + create + IMPORTING is_package TYPE scompkdtln + RAISING lcx_exception, create_local IMPORTING iv_package TYPE devclass - RAISING lcx_exception, - create - IMPORTING is_package TYPE scompkdtln - RETURNING VALUE(ri_package) TYPE REF TO if_package - RAISING lcx_exception, - create_child - IMPORTING iv_parent TYPE devclass - iv_child TYPE devclass - RAISING lcx_exception, - exists - 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 @@ -41,11 +71,31 @@ ENDCLASS. "lcl_package DEFINITION *----------------------------------------------------------------------* CLASS lcl_sap_package IMPLEMENTATION. - METHOD exists. + METHOD get. + + FIELD-SYMBOLS: LIKE LINE OF gt_injected. + + IF lines( gt_injected ) > 0. + READ TABLE gt_injected ASSIGNING WITH KEY package = iv_package. + ASSERT sy-subrc = 0. " unit test should be in control + ri_package = -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( EXPORTING - i_package_name = iv_package + i_package_name = mv_package EXCEPTIONS object_not_existing = 1 unexpected_error = 2 @@ -56,7 +106,7 @@ CLASS lcl_sap_package IMPLEMENTATION. ENDMETHOD. - METHOD create_child. + METHOD lif_sap_package~create_child. DATA: li_parent TYPE REF TO if_package, ls_child TYPE scompkdtln. @@ -64,7 +114,7 @@ CLASS lcl_sap_package IMPLEMENTATION. cl_package_factory=>load_package( EXPORTING - i_package_name = iv_parent + i_package_name = mv_package IMPORTING e_package = li_parent EXCEPTIONS @@ -80,7 +130,7 @@ CLASS lcl_sap_package IMPLEMENTATION. ls_child-devclass = iv_child. ls_child-dlvunit = li_parent->software_component. ls_child-ctext = iv_child. - ls_child-parentcl = iv_parent. + ls_child-parentcl = mv_package. ls_child-pdevclass = li_parent->transport_layer. ls_child-as4user = sy-uname. @@ -91,6 +141,7 @@ CLASS lcl_sap_package IMPLEMENTATION. METHOD create. DATA: lv_err TYPE string, + li_package TYPE REF TO if_package, ls_package LIKE is_package. @@ -122,7 +173,7 @@ CLASS lcl_sap_package IMPLEMENTATION. i_reuse_deleted_object = abap_true * i_suppress_dialog = abap_true " does not exist in 730 IMPORTING - e_package = ri_package + e_package = li_package CHANGING c_package_data = ls_package EXCEPTIONS @@ -152,7 +203,7 @@ CLASS lcl_sap_package IMPLEMENTATION. lcx_exception=>raise( |Package { is_package-devclass } could not be created| ). ENDIF. - ri_package->save( + li_package->save( * EXPORTING * i_suppress_dialog = abap_true " Controls whether popups can be transmitted EXCEPTIONS @@ -169,42 +220,50 @@ CLASS lcl_sap_package IMPLEMENTATION. lcx_exception=>raise( lv_err ). ENDIF. - ri_package->set_changeable( abap_false ). + li_package->set_changeable( abap_false ). 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, lv_parent TYPE tdevc-parentcl, 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 - FROM tdevc WHERE devclass = iv_package. "#EC CI_GENBUFF + FROM tdevc WHERE devclass = mv_package. "#EC CI_GENBUFF IF NOT lv_parent IS INITIAL. 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. ENDIF. ENDMETHOD. - METHOD list_subpackages. + METHOD lif_sap_package~list_subpackages. DATA: lt_list LIKE rt_list, lv_devclass LIKE LINE OF 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 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. ENDLOOP. diff --git a/src/zabapgit_tadir.prog.abap b/src/zabapgit_tadir.prog.abap index 10dd69ff8..7e9f11776 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zabapgit_tadir.prog.abap @@ -14,6 +14,7 @@ CLASS lcl_tadir DEFINITION FINAL. read IMPORTING iv_package TYPE tadir-devclass 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 RAISING lcx_exception, read_single @@ -35,7 +36,8 @@ CLASS lcl_tadir DEFINITION FINAL. RAISING lcx_exception, build 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 RETURNING VALUE(rt_tadir) TYPE ty_tadir_tt RAISING lcx_exception. @@ -112,8 +114,10 @@ CLASS lcl_tadir IMPLEMENTATION. METHOD read. * start recursion +* hmm, some problems here, should TADIR also build path? rt_tadir = build( iv_package = iv_package - iv_path = '' + iv_top = iv_package + io_dot = io_dot iv_ignore_subpackages = iv_ignore_subpackages ). rt_tadir = check_exists( rt_tadir ). @@ -145,15 +149,23 @@ CLASS lcl_tadir IMPLEMENTATION. AND delflag = abap_false 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 . lv_index = sy-tabix. - -path = iv_path. + -path = lv_path. CASE -object. WHEN 'SICF'. -obj_name = -obj_name(15). WHEN 'INTF'. +* todo, move this logic to INTF exists method SELECT SINGLE category FROM seoclassdf INTO lv_category WHERE clsname = -obj_name AND ( version = '1' @@ -172,26 +184,27 @@ CLASS lcl_tadir IMPLEMENTATION. ENDIF. LOOP AT lt_tdevc ASSIGNING . - lv_len = strlen( iv_package ). - IF -devclass(lv_len) <> iv_package. -* 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 - lv_message = 'Unexpected package naming(' && - -devclass && ')' ##no_text. - MESSAGE lv_message TYPE 'I'. - CONTINUE. - ENDIF. - - lv_path = -devclass+lv_len. - IF lv_path(1) = '_'. - lv_path = lv_path+1. - ENDIF. - TRANSLATE lv_path TO LOWER CASE. - CONCATENATE iv_path lv_path '/' INTO lv_path. +* lv_len = strlen( iv_package ). +* IF -devclass(lv_len) <> iv_package. +** 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 +* lv_message = 'Unexpected package naming(' && +* -devclass && ')' ##no_text. +* MESSAGE lv_message TYPE 'I'. +* CONTINUE. +* ENDIF. +* +* lv_path = -devclass+lv_len. +* IF lv_path(1) = '_'. +* lv_path = lv_path+1. +* ENDIF. +* TRANSLATE lv_path TO LOWER CASE. +* CONCATENATE iv_path lv_path '/' INTO lv_path. lt_tadir = build( iv_package = -devclass - iv_path = lv_path ). + iv_top = iv_top + io_dot = io_dot ). APPEND LINES OF lt_tadir TO rt_tadir. ENDLOOP. diff --git a/src/zabapgit_transport.prog.abap b/src/zabapgit_transport.prog.abap index d654b1d53..4d7bc6b6e 100644 --- a/src/zabapgit_transport.prog.abap +++ b/src/zabapgit_transport.prog.abap @@ -69,8 +69,8 @@ CLASS lcl_transport IMPLEMENTATION. METHOD find_top_package. * assumption: all objects in transport share a common super package - DATA: lt_obj TYPE lcl_sap_package=>ty_devclass_tt, - lt_super TYPE lcl_sap_package=>ty_devclass_tt, + DATA: lt_obj TYPE lif_sap_package=>ty_devclass_tt, + lt_super TYPE lif_sap_package=>ty_devclass_tt, lv_super LIKE LINE OF lt_super, lv_index TYPE i. @@ -79,10 +79,10 @@ CLASS lcl_transport IMPLEMENTATION. READ TABLE it_tadir INDEX 1 ASSIGNING . ASSERT sy-subrc = 0. - lt_super = lcl_sap_package=>list_superpackages( -devclass ). + lt_super = lcl_sap_package=>get( -devclass )->list_superpackages( ). LOOP AT it_tadir ASSIGNING . - lt_obj = lcl_sap_package=>list_superpackages( -devclass ). + lt_obj = lcl_sap_package=>get( -devclass )->list_superpackages( ). * filter out possibilities from lt_super LOOP AT lt_super INTO lv_super. diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 0f762c6a2..3c8ae49ae 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1961,7 +1961,7 @@ CLASS ltcl_file_status2 DEFINITION INHERITING FROM cl_aunit_assert. PUBLIC SECTION. - METHODS check FOR TESTING. + METHODS check FOR TESTING RAISING lcx_exception. ENDCLASS. "ltcl_sap_package @@ -1986,7 +1986,7 @@ CLASS ltcl_file_status2 IMPLEMENTATION. lcl_file_status=>run_checks( io_log = lo_log it_results = lt_results - iv_start = '/' + io_dot = lcl_dot_abapgit=>build_default( sy-langu ) iv_top = '$Z$' ). 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 it_results = lt_results - iv_start = '/' + io_dot = lcl_dot_abapgit=>build_default( sy-langu ) iv_top = '$Z$' ). " 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 it_results = lt_results - iv_start = '/' + io_dot = lcl_dot_abapgit=>build_default( sy-langu ) iv_top = '$Z$' ). 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 it_results = lt_results - iv_start = '/' + io_dot = lcl_dot_abapgit=>build_default( sy-langu ) iv_top = '$Z$' ). 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 it_results = lt_results - iv_start = '/' + io_dot = lcl_dot_abapgit=>build_default( sy-langu ) iv_top = '$Z$' ). assert_equals( act = lo_log->count( ) @@ -2242,4 +2242,4 @@ CLASS ltcl_persistence_settings IMPLEMENTATION. ENDCLASS. -INCLUDE ZABAPGIT_UNIT_TEST_CLAS_INTF. +INCLUDE zabapgit_unit_test_clas_intf.