mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 20:03:20 +08:00
delete empty packages
This commit is contained in:
parent
4b36a10d6e
commit
ad5ae2a185
|
@ -20,7 +20,16 @@ CLASS zcl_abapgit_object_devc DEFINITION PUBLIC
|
||||||
RAISING zcx_abapgit_exception,
|
RAISING zcx_abapgit_exception,
|
||||||
set_lock IMPORTING ii_package TYPE REF TO if_package
|
set_lock IMPORTING ii_package TYPE REF TO if_package
|
||||||
iv_lock TYPE abap_bool
|
iv_lock TYPE abap_bool
|
||||||
RAISING zcx_abapgit_exception.
|
RAISING zcx_abapgit_exception,
|
||||||
|
is_empty
|
||||||
|
IMPORTING iv_package_name TYPE devclass
|
||||||
|
RETURNING VALUE(rv_is_empty) TYPE abap_bool
|
||||||
|
RAISING zcx_abapgit_exception,
|
||||||
|
load_package
|
||||||
|
IMPORTING iv_package_name TYPE devclass
|
||||||
|
RETURNING VALUE(ri_package) TYPE REF TO if_package
|
||||||
|
RAISING zcx_abapgit_exception.
|
||||||
|
|
||||||
DATA:
|
DATA:
|
||||||
mv_local_devclass TYPE devclass.
|
mv_local_devclass TYPE devclass.
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
@ -39,24 +48,7 @@ CLASS zcl_abapgit_object_devc IMPLEMENTATION.
|
||||||
|
|
||||||
METHOD get_package.
|
METHOD get_package.
|
||||||
IF me->zif_abapgit_object~exists( ) = abap_true.
|
IF me->zif_abapgit_object~exists( ) = abap_true.
|
||||||
cl_package_factory=>load_package(
|
ri_package = load_package( mv_local_devclass ).
|
||||||
EXPORTING
|
|
||||||
i_package_name = mv_local_devclass
|
|
||||||
i_force_reload = abap_true
|
|
||||||
IMPORTING
|
|
||||||
e_package = ri_package
|
|
||||||
EXCEPTIONS
|
|
||||||
object_not_existing = 1
|
|
||||||
unexpected_error = 2
|
|
||||||
intern_err = 3
|
|
||||||
no_access = 4
|
|
||||||
object_locked_and_modified = 5
|
|
||||||
OTHERS = 6 ).
|
|
||||||
IF sy-subrc = 1.
|
|
||||||
RETURN.
|
|
||||||
ELSEIF sy-subrc <> 0.
|
|
||||||
zcx_abapgit_exception=>raise_t100( ).
|
|
||||||
ENDIF.
|
|
||||||
ENDIF.
|
ENDIF.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
@ -209,12 +201,83 @@ CLASS zcl_abapgit_object_devc IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD zif_abapgit_object~delete.
|
METHOD zif_abapgit_object~delete.
|
||||||
|
|
||||||
|
DATA: li_package TYPE REF TO if_package,
|
||||||
|
lv_package TYPE devclass.
|
||||||
|
|
||||||
" Package deletion is a bit tricky. A package can only be deleted if there are no objects
|
" Package deletion is a bit tricky. A package can only be deleted if there are no objects
|
||||||
" contained in it. This includes subpackages, so first the leaf packages need to be deleted.
|
" contained in it. This includes subpackages, so first the leaf packages need to be deleted.
|
||||||
" Unfortunately deleted objects that are still contained in an unreleased transport request
|
" Unfortunately deleted objects that are still contained in an unreleased transport request
|
||||||
" also count towards the contained objects counter.
|
" also count towards the contained objects counter.
|
||||||
" -> Package deletion is currently not supported by abapGit
|
" -> Currently we delete only empty packages
|
||||||
RETURN.
|
"
|
||||||
|
" If objects are deleted, the TADIR entry is deleted when the transport request is released.
|
||||||
|
" So before we can delete the package, the transport which deletes the objects
|
||||||
|
" in the package has to be released.
|
||||||
|
|
||||||
|
lv_package = ms_item-obj_name.
|
||||||
|
|
||||||
|
IF is_empty( lv_package ) = abap_true.
|
||||||
|
|
||||||
|
li_package = load_package( lv_package ).
|
||||||
|
|
||||||
|
IF li_package IS NOT BOUND.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
li_package->set_changeable(
|
||||||
|
EXPORTING
|
||||||
|
i_changeable = abap_true
|
||||||
|
i_suppress_dialog = abap_true
|
||||||
|
EXCEPTIONS
|
||||||
|
object_locked_by_other_user = 1
|
||||||
|
permission_failure = 2
|
||||||
|
object_already_changeable = 3
|
||||||
|
object_already_unlocked = 4
|
||||||
|
object_just_created = 5
|
||||||
|
object_deleted = 6
|
||||||
|
object_modified = 7
|
||||||
|
object_not_existing = 8
|
||||||
|
object_invalid = 9
|
||||||
|
unexpected_error = 10
|
||||||
|
OTHERS = 11 ).
|
||||||
|
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
zcx_abapgit_exception=>raise_t100( ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
li_package->delete(
|
||||||
|
EXPORTING
|
||||||
|
i_suppress_dialog = abap_true
|
||||||
|
EXCEPTIONS
|
||||||
|
object_not_empty = 1
|
||||||
|
object_not_changeable = 2
|
||||||
|
object_invalid = 3
|
||||||
|
intern_err = 4
|
||||||
|
OTHERS = 5 ).
|
||||||
|
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
zcx_abapgit_exception=>raise_t100( ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
li_package->save(
|
||||||
|
EXPORTING
|
||||||
|
i_suppress_dialog = abap_true
|
||||||
|
EXCEPTIONS
|
||||||
|
object_invalid = 1
|
||||||
|
object_not_changeable = 2
|
||||||
|
cancelled_in_corr = 3
|
||||||
|
permission_failure = 4
|
||||||
|
unexpected_error = 5
|
||||||
|
intern_err = 6
|
||||||
|
OTHERS = 7 ).
|
||||||
|
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
zcx_abapgit_exception=>raise_t100( ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
@ -558,4 +621,51 @@ CLASS zcl_abapgit_object_devc IMPLEMENTATION.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD is_empty.
|
||||||
|
|
||||||
|
DATA: lv_object_name TYPE tadir-obj_name,
|
||||||
|
lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
|
||||||
|
|
||||||
|
lt_subpackages = zcl_abapgit_factory=>get_sap_package( iv_package_name )->list_subpackages( ).
|
||||||
|
|
||||||
|
IF lines( lt_subpackages ) > 0.
|
||||||
|
rv_is_empty = abap_false.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
SELECT SINGLE obj_name
|
||||||
|
FROM tadir
|
||||||
|
INTO lv_object_name
|
||||||
|
WHERE pgmid = 'R3TR'
|
||||||
|
AND NOT ( object = 'DEVC' AND obj_name = iv_package_name )
|
||||||
|
AND devclass = iv_package_name.
|
||||||
|
rv_is_empty = boolc( sy-subrc <> 0 ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD load_package.
|
||||||
|
|
||||||
|
cl_package_factory=>load_package(
|
||||||
|
EXPORTING
|
||||||
|
i_package_name = iv_package_name
|
||||||
|
i_force_reload = abap_true
|
||||||
|
IMPORTING
|
||||||
|
e_package = ri_package
|
||||||
|
EXCEPTIONS
|
||||||
|
object_not_existing = 1
|
||||||
|
unexpected_error = 2
|
||||||
|
intern_err = 3
|
||||||
|
no_access = 4
|
||||||
|
object_locked_and_modified = 5
|
||||||
|
OTHERS = 6 ).
|
||||||
|
IF sy-subrc = 1.
|
||||||
|
RETURN.
|
||||||
|
ELSEIF sy-subrc <> 0.
|
||||||
|
zcx_abapgit_exception=>raise_t100( ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
|
@ -22,7 +22,6 @@ CLASS zcl_abapgit_dependencies DEFINITION
|
||||||
!ct_tadir TYPE ty_tadir_tt
|
!ct_tadir TYPE ty_tadir_tt
|
||||||
RAISING
|
RAISING
|
||||||
zcx_abapgit_exception .
|
zcx_abapgit_exception .
|
||||||
|
|
||||||
PRIVATE SECTION.
|
PRIVATE SECTION.
|
||||||
|
|
||||||
TYPES:
|
TYPES:
|
||||||
|
@ -51,14 +50,17 @@ CLASS zcl_abapgit_dependencies DEFINITION
|
||||||
zcx_abapgit_exception .
|
zcx_abapgit_exception .
|
||||||
CLASS-METHODS get_ddls_dependencies
|
CLASS-METHODS get_ddls_dependencies
|
||||||
IMPORTING
|
IMPORTING
|
||||||
!iv_ddls_name TYPE tadir-obj_name
|
iv_ddls_name TYPE tadir-obj_name
|
||||||
RETURNING
|
RETURNING
|
||||||
VALUE(rt_dependency) TYPE tty_dedenpency .
|
VALUE(rt_dependency) TYPE tty_dedenpency .
|
||||||
|
CLASS-METHODS resolve_packages
|
||||||
|
CHANGING
|
||||||
|
ct_tadir TYPE zcl_abapgit_dependencies=>ty_tadir_tt.
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION.
|
CLASS zcl_abapgit_dependencies IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD get_ddls_dependencies.
|
METHOD get_ddls_dependencies.
|
||||||
|
@ -84,14 +86,16 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION.
|
||||||
|
|
||||||
METHOD resolve.
|
METHOD resolve.
|
||||||
|
|
||||||
DATA: lv_tabclass TYPE dd02l-tabclass.
|
DATA: lv_tabclass TYPE dd02l-tabclass.
|
||||||
|
|
||||||
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir.
|
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir.
|
||||||
|
|
||||||
* misuse field KORRNUM to fix deletion sequence
|
* misuse field KORRNUM to fix deletion sequence
|
||||||
|
|
||||||
LOOP AT ct_tadir ASSIGNING <ls_tadir>.
|
LOOP AT ct_tadir ASSIGNING <ls_tadir>.
|
||||||
CASE <ls_tadir>-object.
|
CASE <ls_tadir>-object.
|
||||||
|
WHEN 'DEVC'.
|
||||||
|
<ls_tadir>-korrnum = '9990'.
|
||||||
WHEN 'IATU'.
|
WHEN 'IATU'.
|
||||||
<ls_tadir>-korrnum = '5500'.
|
<ls_tadir>-korrnum = '5500'.
|
||||||
WHEN 'IARP'.
|
WHEN 'IARP'.
|
||||||
|
@ -137,6 +141,7 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION.
|
||||||
ENDLOOP.
|
ENDLOOP.
|
||||||
|
|
||||||
resolve_ddic( CHANGING ct_tadir = ct_tadir ).
|
resolve_ddic( CHANGING ct_tadir = ct_tadir ).
|
||||||
|
resolve_packages( CHANGING ct_tadir = ct_tadir ).
|
||||||
|
|
||||||
SORT ct_tadir BY korrnum ASCENDING.
|
SORT ct_tadir BY korrnum ASCENDING.
|
||||||
|
|
||||||
|
@ -292,4 +297,36 @@ CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION.
|
||||||
ENDDO.
|
ENDDO.
|
||||||
|
|
||||||
ENDMETHOD. "resolve_ddic
|
ENDMETHOD. "resolve_ddic
|
||||||
|
|
||||||
|
|
||||||
|
METHOD resolve_packages.
|
||||||
|
|
||||||
|
DATA: lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir,
|
||||||
|
<lv_subpackage> LIKE LINE OF lt_subpackages,
|
||||||
|
<ls_tadir_subpackage> LIKE LINE OF ct_tadir.
|
||||||
|
|
||||||
|
" List subpackage before corresponding superpackage
|
||||||
|
|
||||||
|
LOOP AT ct_tadir ASSIGNING <ls_tadir>
|
||||||
|
WHERE object = 'DEVC'.
|
||||||
|
|
||||||
|
lt_subpackages = zcl_abapgit_factory=>get_sap_package( |{ <ls_tadir>-obj_name }| )->list_subpackages( ).
|
||||||
|
|
||||||
|
LOOP AT lt_subpackages ASSIGNING <lv_subpackage>.
|
||||||
|
|
||||||
|
READ TABLE ct_tadir ASSIGNING <ls_tadir_subpackage>
|
||||||
|
WITH KEY object = 'DEVC'
|
||||||
|
obj_name = <lv_subpackage>.
|
||||||
|
IF sy-subrc = 0.
|
||||||
|
<ls_tadir_subpackage>-korrnum = condense( |{ <ls_tadir_subpackage>-korrnum - 1 }| ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
168
src/zcl_abapgit_dependencies.clas.testclasses.abap
Normal file
168
src/zcl_abapgit_dependencies.clas.testclasses.abap
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
*"* use this source file for your ABAP unit test classes
|
||||||
|
CLASS ltd_sap_package DEFINITION FOR TESTING.
|
||||||
|
|
||||||
|
PUBLIC SECTION.
|
||||||
|
TYPES:
|
||||||
|
tty_package TYPE STANDARD TABLE OF devclass
|
||||||
|
WITH NON-UNIQUE DEFAULT KEY.
|
||||||
|
|
||||||
|
METHODS:
|
||||||
|
constructor
|
||||||
|
IMPORTING
|
||||||
|
iv_package TYPE devclass,
|
||||||
|
|
||||||
|
set_sub_packages
|
||||||
|
IMPORTING
|
||||||
|
it_sub_packages TYPE tty_package.
|
||||||
|
|
||||||
|
INTERFACES: zif_abapgit_sap_package PARTIALLY IMPLEMENTED.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA: mv_package TYPE devclass,
|
||||||
|
mt_sub_packages TYPE tty_package.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS ltd_sap_package IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD constructor.
|
||||||
|
|
||||||
|
mv_package = iv_package.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD zif_abapgit_sap_package~list_subpackages.
|
||||||
|
|
||||||
|
DATA: ls_package LIKE LINE OF rt_list.
|
||||||
|
FIELD-SYMBOLS: <lv_package> TYPE devclass.
|
||||||
|
|
||||||
|
IF mv_package = 'Z_MAIN'.
|
||||||
|
|
||||||
|
rt_list = mt_sub_packages.
|
||||||
|
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD set_sub_packages.
|
||||||
|
|
||||||
|
mt_sub_packages = it_sub_packages.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS ltcl_resolve_packages DEFINITION FOR TESTING
|
||||||
|
DURATION SHORT
|
||||||
|
RISK LEVEL HARMLESS.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
DATA:
|
||||||
|
mt_tadir TYPE zcl_abapgit_dependencies=>ty_tadir_tt,
|
||||||
|
mt_sub_packages TYPE ltd_sap_package=>tty_package.
|
||||||
|
|
||||||
|
METHODS:
|
||||||
|
resolve_single FOR TESTING RAISING cx_static_check,
|
||||||
|
|
||||||
|
given_tadir
|
||||||
|
IMPORTING
|
||||||
|
iv_object TYPE tadir-object
|
||||||
|
iv_obj_name TYPE tadir-obj_name
|
||||||
|
iv_korrnum TYPE tadir-korrnum
|
||||||
|
iv_super_package TYPE devclass,
|
||||||
|
|
||||||
|
when_packages_are_resolved,
|
||||||
|
|
||||||
|
then_korrnum_should_be
|
||||||
|
IMPORTING
|
||||||
|
iv_line TYPE i
|
||||||
|
iv_korrnum TYPE tadir-korrnum.
|
||||||
|
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
CLASS zcl_abapgit_dependencies DEFINITION LOCAL FRIENDS ltcl_resolve_packages.
|
||||||
|
|
||||||
|
CLASS ltcl_resolve_packages IMPLEMENTATION.
|
||||||
|
|
||||||
|
METHOD resolve_single.
|
||||||
|
|
||||||
|
|
||||||
|
given_tadir( iv_object = 'DEVC'
|
||||||
|
iv_obj_name = 'Z_MAIN'
|
||||||
|
iv_korrnum = '9990'
|
||||||
|
iv_super_package = '' ).
|
||||||
|
|
||||||
|
given_tadir( iv_object = 'DEVC'
|
||||||
|
iv_obj_name = 'Z_SUB1'
|
||||||
|
iv_korrnum = '9990'
|
||||||
|
iv_super_package = 'Z_MAIN' ).
|
||||||
|
|
||||||
|
given_tadir( iv_object = 'DEVC'
|
||||||
|
iv_obj_name = 'Z_SUB2'
|
||||||
|
iv_korrnum = '9990'
|
||||||
|
iv_super_package = 'Z_MAIN' ).
|
||||||
|
|
||||||
|
when_packages_are_resolved( ).
|
||||||
|
|
||||||
|
then_korrnum_should_be( iv_line = 1
|
||||||
|
iv_korrnum = '9990' ).
|
||||||
|
then_korrnum_should_be( iv_line = 2
|
||||||
|
iv_korrnum = '9989' ).
|
||||||
|
then_korrnum_should_be( iv_line = 3
|
||||||
|
iv_korrnum = '9989' ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD given_tadir.
|
||||||
|
|
||||||
|
DATA: ls_tadir LIKE LINE OF mt_tadir,
|
||||||
|
lv_package TYPE devclass.
|
||||||
|
|
||||||
|
ls_tadir-object = iv_object.
|
||||||
|
ls_tadir-obj_name = iv_obj_name.
|
||||||
|
ls_tadir-korrnum = iv_korrnum.
|
||||||
|
INSERT ls_tadir INTO TABLE mt_tadir.
|
||||||
|
|
||||||
|
IF iv_super_package IS NOT INITIAL.
|
||||||
|
lv_package = iv_obj_name.
|
||||||
|
INSERT lv_package INTO TABLE mt_sub_packages.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD when_packages_are_resolved.
|
||||||
|
|
||||||
|
DATA: lo_mock_sap_package TYPE REF TO ltd_sap_package.
|
||||||
|
|
||||||
|
CREATE OBJECT lo_mock_sap_package
|
||||||
|
EXPORTING
|
||||||
|
iv_package = 'Z_MAIN'.
|
||||||
|
|
||||||
|
lo_mock_sap_package->set_sub_packages( mt_sub_packages ).
|
||||||
|
|
||||||
|
zcl_abapgit_injector=>set_sap_package( iv_package = 'Z_MAIN'
|
||||||
|
ii_sap_package = lo_mock_sap_package ).
|
||||||
|
|
||||||
|
zcl_abapgit_dependencies=>resolve_packages(
|
||||||
|
CHANGING
|
||||||
|
ct_tadir = mt_tadir ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD then_korrnum_should_be.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF mt_tadir.
|
||||||
|
|
||||||
|
READ TABLE mt_tadir INDEX iv_line
|
||||||
|
ASSIGNING <ls_tadir>.
|
||||||
|
|
||||||
|
cl_abap_unit_assert=>assert_equals( exp = iv_korrnum
|
||||||
|
act = <ls_tadir>-korrnum ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
ENDCLASS.
|
|
@ -13,6 +13,7 @@
|
||||||
<CLSCCINCL>X</CLSCCINCL>
|
<CLSCCINCL>X</CLSCCINCL>
|
||||||
<FIXPT>X</FIXPT>
|
<FIXPT>X</FIXPT>
|
||||||
<UNICODE>X</UNICODE>
|
<UNICODE>X</UNICODE>
|
||||||
|
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
||||||
</VSEOCLASS>
|
</VSEOCLASS>
|
||||||
</asx:values>
|
</asx:values>
|
||||||
</asx:abap>
|
</asx:abap>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user