Skip to content

Instantly share code, notes, and snippets.

@g-back
Created November 16, 2021 15:43
Show Gist options
  • Save g-back/68480930d24a9798e6172c7ba8f3013b to your computer and use it in GitHub Desktop.
Save g-back/68480930d24a9798e6172c7ba8f3013b to your computer and use it in GitHub Desktop.
Example, CTS BAdI: Check if objects are included in abapGit repos
CLASS zcl_im_cts_request_check DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_ex_cts_request_check.
PROTECTED SECTION.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_type,
workbench TYPE trfunction VALUE 'K',
customizing TYPE trfunction VALUE 'W',
copies TYPE trfunction VALUE 'T',
development_task TYPE trfunction VALUE 'S',
repair TYPE trfunction VALUE 'R',
unclassified_task TYPE trfunction VALUE 'X',
customizing_task TYPE trfunction VALUE 'Q',
END OF c_type.
ENDCLASS.
CLASS zcl_im_cts_request_check IMPLEMENTATION.
METHOD if_ex_cts_request_check~check_before_add_objects.
RETURN.
ENDMETHOD.
METHOD if_ex_cts_request_check~check_before_changing_owner.
RETURN.
ENDMETHOD.
METHOD if_ex_cts_request_check~check_before_creation.
RETURN.
ENDMETHOD.
METHOD if_ex_cts_request_check~check_before_release.
IF type <> c_type-development_task OR lines( objects ) = 0.
RETURN.
ENDIF.
" special case: methods can be transported separately from the class itself
" extract class name to check the class itself
DATA(objects_cpy) = objects.
LOOP AT objects_cpy REFERENCE INTO DATA(obj) WHERE pgmid = 'LIMU' AND object = 'METH'.
SPLIT obj->obj_name AT ' ' INTO DATA(_class_name) DATA(_method_name).
obj->pgmid = 'R3TR'.
obj->object = 'CLAS'.
obj->obj_name = _class_name.
ENDLOOP.
" get all packages for transport objects
SELECT DISTINCT devclass
FROM tadir
INTO TABLE @DATA(packages)
FOR ALL ENTRIES IN @objects_cpy
WHERE pgmid = @objects_cpy-pgmid
AND object = @objects_cpy-object
AND obj_name = @objects_cpy-obj_name(40).
IF sy-subrc <> 0.
RETURN.
ENDIF.
" determine if packages are included in abapgit repos
DATA(repo_srv) = zcl_abapgit_repo_srv=>get_instance( ).
TYPES:
BEGIN OF ty_found,
package TYPE devclass,
repo_name TYPE string,
END OF ty_found.
DATA found TYPE STANDARD TABLE OF ty_found WITH EMPTY KEY.
LOOP AT packages REFERENCE INTO DATA(pack).
TRY.
repo_srv->get_repo_from_package(
EXPORTING
iv_package = pack->devclass
iv_ign_subpkg = abap_true
IMPORTING
eo_repo = DATA(lo_repo)
ev_reason = DATA(lv_reason) ).
" it's only bound if a repo has been found
IF lo_repo IS BOUND.
INSERT VALUE #( package = pack->devclass repo_name = lo_repo->get_name( ) ) INTO TABLE found.
ENDIF.
CATCH zcx_abapgit_exception.
ENDTRY.
ENDLOOP.
IF lines( found ) = 0.
RETURN.
ENDIF.
"inform user
cl_demo_output=>write_text( 'Packages serialized in abapGit found:' ).
cl_demo_output=>display( found ).
ENDMETHOD.
METHOD if_ex_cts_request_check~check_before_release_slin.
ENDMETHOD.
ENDCLASS.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment