CLASS zcl_abapgit_tadir DEFINITION PUBLIC FINAL CREATE PRIVATE GLOBAL FRIENDS zcl_abapgit_factory . PUBLIC SECTION. INTERFACES zif_abapgit_tadir . PROTECTED SECTION. PRIVATE SECTION. METHODS exists IMPORTING !is_item TYPE zif_abapgit_definitions=>ty_item RETURNING VALUE(rv_exists) TYPE abap_bool . METHODS check_exists IMPORTING !it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt RETURNING VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . METHODS build IMPORTING !iv_package TYPE tadir-devclass !iv_top TYPE tadir-devclass !io_dot TYPE REF TO zcl_abapgit_dot_abapgit !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false !iv_only_local_objects TYPE abap_bool !ii_log TYPE REF TO zif_abapgit_log OPTIONAL RETURNING VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . ENDCLASS. CLASS ZCL_ABAPGIT_TADIR IMPLEMENTATION. METHOD build. DATA: lv_path TYPE string, lo_skip_objects TYPE REF TO zcl_abapgit_skip_objects, lt_excludes TYPE RANGE OF trobjtype, lt_srcsystem TYPE RANGE OF tadir-srcsystem, ls_srcsystem LIKE LINE OF lt_srcsystem, ls_exclude LIKE LINE OF lt_excludes, lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic, lv_last_package TYPE devclass VALUE cl_abap_char_utilities=>horizontal_tab, lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt. FIELD-SYMBOLS: LIKE LINE OF rt_tadir, LIKE LINE OF lt_packages. "Determine Packages to Read IF iv_ignore_subpackages = abap_false. lt_packages = zcl_abapgit_factory=>get_sap_package( iv_package )->list_subpackages( ). ENDIF. INSERT iv_package INTO lt_packages INDEX 1. ls_exclude-sign = 'I'. ls_exclude-option = 'EQ'. ls_exclude-low = 'SOTR'. APPEND ls_exclude TO lt_excludes. ls_exclude-low = 'SFB1'. APPEND ls_exclude TO lt_excludes. ls_exclude-low = 'SFB2'. APPEND ls_exclude TO lt_excludes. ls_exclude-low = 'STOB'. " auto generated by core data services APPEND ls_exclude TO lt_excludes. IF iv_only_local_objects = abap_true. ls_srcsystem-sign = 'I'. ls_srcsystem-option = 'EQ'. ls_srcsystem-low = sy-sysid. APPEND ls_srcsystem TO lt_srcsystem. ENDIF. IF lt_packages IS NOT INITIAL. SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE rt_tadir FOR ALL ENTRIES IN lt_packages WHERE devclass = lt_packages-table_line AND pgmid = 'R3TR' AND object NOT IN lt_excludes AND delflag = abap_false AND srcsystem IN lt_srcsystem ORDER BY PRIMARY KEY ##TOO_MANY_ITAB_FIELDS. "#EC CI_GENBUFF "#EC CI_SUBRC ENDIF. SORT rt_tadir BY devclass pgmid object obj_name. CREATE OBJECT lo_skip_objects. rt_tadir = lo_skip_objects->skip_sadl_generated_objects( it_tadir = rt_tadir ii_log = ii_log ). LOOP AT lt_packages ASSIGNING . " Local packages are not in TADIR, only in TDEVC, act as if they were IF CP '$*'. " OR CP 'T*' ). APPEND INITIAL LINE TO rt_tadir ASSIGNING . -pgmid = 'R3TR'. -object = 'DEVC'. -obj_name = . -devclass = . ENDIF. ENDLOOP. LOOP AT rt_tadir ASSIGNING . IF lv_last_package <> -devclass. "Change in Package lv_last_package = -devclass. IF NOT io_dot IS INITIAL. "Reuse given Folder Logic Instance IF lo_folder_logic IS NOT BOUND. "Get Folder Logic Instance lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ). ENDIF. lv_path = lo_folder_logic->package_to_path( iv_top = iv_top io_dot = io_dot iv_package = -devclass ). ENDIF. ENDIF. -path = lv_path. IF -object = 'SICF'. * replace the internal GUID with a hash of the path TRY. CALL METHOD ('ZCL_ABAPGIT_OBJECT_SICF')=>read_sicf_url EXPORTING iv_obj_name = -obj_name RECEIVING rv_hash = -obj_name+15. CATCH cx_sy_dyn_call_illegal_method ##NO_HANDLER. * SICF might not be supported in some systems, assume this code is not called ENDTRY. ENDIF. ENDLOOP. ENDMETHOD. METHOD check_exists. DATA: li_progress TYPE REF TO zif_abapgit_progress, ls_item TYPE zif_abapgit_definitions=>ty_item. FIELD-SYMBOLS: LIKE LINE OF it_tadir. li_progress = zcl_abapgit_progress=>get_instance( lines( it_tadir ) ). * rows from database table TADIR are not removed for * transportable objects until the transport is released LOOP AT it_tadir ASSIGNING . IF sy-tabix MOD 200 = 0. li_progress->show( iv_current = sy-tabix iv_text = |Check object exists { -object } { -obj_name }| ). ENDIF. ls_item-obj_type = -object. ls_item-obj_name = -obj_name. ls_item-devclass = -devclass. IF exists( ls_item ) = abap_true. APPEND TO rt_tadir. ENDIF. ENDLOOP. ENDMETHOD. METHOD exists. IF is_item IS INITIAL. RETURN. ENDIF. IF zcl_abapgit_objects=>is_supported( is_item ) = abap_false. rv_exists = abap_true. RETURN. ENDIF. rv_exists = zcl_abapgit_objects=>exists( is_item ). ENDMETHOD. METHOD zif_abapgit_tadir~get_object_package. DATA: ls_tadir TYPE zif_abapgit_definitions=>ty_tadir, ls_item TYPE zif_abapgit_definitions=>ty_item. ls_tadir = zif_abapgit_tadir~read_single( iv_pgmid = iv_pgmid iv_object = iv_object iv_obj_name = iv_obj_name ). IF ls_tadir-delflag = 'X'. RETURN. "Mark for deletion -> return nothing ENDIF. ls_item-obj_type = ls_tadir-object. ls_item-obj_name = ls_tadir-obj_name. ls_item-devclass = ls_tadir-devclass. IF exists( ls_item ) = abap_false. RETURN. ENDIF. rv_devclass = ls_tadir-devclass. ENDMETHOD. METHOD zif_abapgit_tadir~read. DATA: li_exit TYPE REF TO zif_abapgit_exit. * start recursion * hmm, some problems here, should TADIR also build path? rt_tadir = build( iv_package = iv_package iv_top = iv_package io_dot = io_dot iv_ignore_subpackages = iv_ignore_subpackages iv_only_local_objects = iv_only_local_objects ii_log = ii_log ). li_exit = zcl_abapgit_exit=>get_instance( ). li_exit->change_tadir( EXPORTING iv_package = iv_package ii_log = ii_log CHANGING ct_tadir = rt_tadir ). rt_tadir = check_exists( rt_tadir ). ENDMETHOD. METHOD zif_abapgit_tadir~read_single. IF iv_object = 'SICF'. TRY. CALL METHOD ('ZCL_ABAPGIT_OBJECT_SICF')=>read_tadir EXPORTING iv_pgmid = iv_pgmid iv_obj_name = iv_obj_name RECEIVING rs_tadir = rs_tadir. CATCH cx_sy_dyn_call_illegal_method ##NO_HANDLER. * SICF might not be supported in some systems, assume this code is not called ENDTRY. ELSE. SELECT SINGLE * FROM tadir INTO CORRESPONDING FIELDS OF rs_tadir WHERE pgmid = iv_pgmid AND object = iv_object AND obj_name = iv_obj_name. "#EC CI_SUBRC ENDIF. ENDMETHOD. ENDCLASS.