abapGit/src/cts/zcl_abapgit_transport.clas.abap
Christian Günter 0b71f14f93
'add objects to tr' - fix log display (#5032)
Co-authored-by: Christian Günter <christian.guenter@emineo.ch>
Co-authored-by: Lars Hvam <larshp@hotmail.com>
2021-10-14 16:57:35 +02:00

383 lines
11 KiB
ABAP

CLASS zcl_abapgit_transport DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS zip
IMPORTING
!iv_show_log_popup TYPE abap_bool DEFAULT abap_true
!iv_logic TYPE string OPTIONAL
!is_trkorr TYPE trwbo_request_header OPTIONAL
RETURNING
VALUE(rv_xstr) TYPE xstring
RAISING
zcx_abapgit_exception .
CLASS-METHODS to_tadir
IMPORTING
it_transport_headers TYPE trwbo_request_headers
RETURNING
VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt
RAISING
zcx_abapgit_exception .
CLASS-METHODS add_all_objects_to_trans_req
IMPORTING
iv_key TYPE zif_abapgit_persistence=>ty_value
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
CLASS-METHODS read_requests
IMPORTING
!it_trkorr TYPE trwbo_request_headers
RETURNING
VALUE(rt_requests) TYPE trwbo_requests
RAISING
zcx_abapgit_exception .
CLASS-METHODS find_top_package
IMPORTING
!it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt
RETURNING
VALUE(rv_package) TYPE devclass
RAISING
zcx_abapgit_exception .
CLASS-METHODS resolve
IMPORTING
!it_requests TYPE trwbo_requests
RETURNING
VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt
RAISING
zcx_abapgit_exception .
PRIVATE SECTION.
CLASS-METHODS collect_all_objects
IMPORTING
iv_key TYPE zif_abapgit_persistence=>ty_value
RETURNING
VALUE(rt_objects) TYPE tr_objects
RAISING
zcx_abapgit_exception.
CLASS-METHODS show_log
IMPORTING
it_log TYPE sprot_u_tab
iv_title TYPE string.
ENDCLASS.
CLASS zcl_abapgit_transport IMPLEMENTATION.
METHOD add_all_objects_to_trans_req.
DATA:
ls_request TYPE trwbo_request_header,
lt_e071 TYPE tr_objects,
lv_text TYPE string,
lv_answer TYPE c LENGTH 1,
lv_lock_objects TYPE trparflag,
lt_log TYPE sprot_u_tab.
lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
iv_titlebar = `Lock objects?`
iv_text_question = `Shall all objects be locked in the transport request?`
iv_display_cancel_button = abap_true ).
CASE lv_answer.
WHEN '1'.
lv_lock_objects = abap_true.
WHEN '2'.
lv_lock_objects = abap_false.
WHEN OTHERS.
RETURN.
ENDCASE.
lt_e071 = collect_all_objects( iv_key ).
" We used TR_REQUEST_CHOICE before, but it issues its error log with
" write lists which are not compatible with abapGit.
" There we user TRINT_REQUEST_CHOICE which returns the error log
" and display the log ourselve.
CALL FUNCTION 'TRINT_REQUEST_CHOICE'
EXPORTING
iv_request_types = 'FTCOK'
iv_lock_objects = lv_lock_objects
iv_with_error_log = abap_false
IMPORTING
es_request = ls_request
et_log = lt_log
TABLES
it_e071 = lt_e071
EXCEPTIONS
invalid_request = 1
invalid_request_type = 2
user_not_owner = 3
no_objects_appended = 4
enqueue_error = 5
cancelled_by_user = 6
recursive_call = 7
OTHERS = 8.
IF sy-subrc = 0.
lv_text = |Objects successfully added to { ls_request-trkorr }|.
MESSAGE lv_text TYPE 'S'.
RETURN.
ENDIF.
IF lines( lt_log ) > 0.
show_log(
it_log = lt_log
iv_title = `Error log` ).
ELSE.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
ENDMETHOD.
METHOD collect_all_objects.
DATA:
lt_objects TYPE scts_tadir,
lt_objects_all LIKE lt_objects,
ls_e071 LIKE LINE OF rt_objects,
lo_repo TYPE REF TO zcl_abapgit_repo,
lv_package TYPE zif_abapgit_persistence=>ty_repo-package,
lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
FIELD-SYMBOLS:
<lv_package> TYPE devclass,
<ls_object> TYPE tadir.
lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
lv_package = lo_repo->get_package( ).
lt_packages = zcl_abapgit_factory=>get_sap_package( lv_package )->list_subpackages( ).
INSERT lv_package INTO TABLE lt_packages.
LOOP AT lt_packages ASSIGNING <lv_package>.
CLEAR: lt_objects.
CALL FUNCTION 'TRINT_SELECT_OBJECTS'
EXPORTING
iv_devclass = <lv_package>
iv_via_selscreen = abap_false
IMPORTING
et_objects_tadir = lt_objects
EXCEPTIONS
cancelled_by_user = 1
invalid_input = 2
OTHERS = 3.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
INSERT LINES OF lt_objects INTO TABLE lt_objects_all.
ENDLOOP.
IF lines( lt_objects_all ) = 0.
zcx_abapgit_exception=>raise( |No objects found| ).
ENDIF.
LOOP AT lt_objects_all ASSIGNING <ls_object>.
CLEAR: ls_e071.
MOVE-CORRESPONDING <ls_object> TO ls_e071.
INSERT ls_e071 INTO TABLE rt_objects.
ENDLOOP.
ENDMETHOD.
METHOD find_top_package.
* assumption: all objects in transport share a common super package
DATA: lt_obj TYPE zif_abapgit_sap_package=>ty_devclass_tt,
lt_super TYPE zif_abapgit_sap_package=>ty_devclass_tt,
lv_super LIKE LINE OF lt_super,
lv_index TYPE i.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
READ TABLE it_tadir INDEX 1 ASSIGNING <ls_tadir>.
ASSERT sy-subrc = 0.
lt_super = zcl_abapgit_factory=>get_sap_package( <ls_tadir>-devclass )->list_superpackages( ).
LOOP AT it_tadir ASSIGNING <ls_tadir>.
lt_obj = zcl_abapgit_factory=>get_sap_package( <ls_tadir>-devclass )->list_superpackages( ).
* filter out possibilities from lt_super
LOOP AT lt_super INTO lv_super.
lv_index = sy-tabix.
READ TABLE lt_obj FROM lv_super TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
DELETE lt_super INDEX lv_index.
ENDIF.
ENDLOOP.
ENDLOOP.
READ TABLE lt_super INDEX lines( lt_super ) INTO rv_package.
ENDMETHOD.
METHOD read_requests.
DATA lt_requests LIKE rt_requests.
FIELD-SYMBOLS <ls_trkorr> LIKE LINE OF it_trkorr.
LOOP AT it_trkorr ASSIGNING <ls_trkorr>.
CALL FUNCTION 'TR_READ_REQUEST_WITH_TASKS'
EXPORTING
iv_trkorr = <ls_trkorr>-trkorr
IMPORTING
et_requests = lt_requests
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
APPEND LINES OF lt_requests TO rt_requests.
ENDLOOP.
ENDMETHOD.
METHOD resolve.
DATA: lv_object TYPE tadir-object,
lv_obj_name TYPE tadir-obj_name,
ls_tadir TYPE zif_abapgit_definitions=>ty_tadir,
lv_result TYPE trpari-s_checked,
ls_tadir_sap TYPE tadir.
FIELD-SYMBOLS: <ls_request> LIKE LINE OF it_requests,
<ls_object> LIKE LINE OF <ls_request>-objects.
LOOP AT it_requests ASSIGNING <ls_request>.
LOOP AT <ls_request>-objects ASSIGNING <ls_object>.
" VARX, see https://github.com/abapGit/abapGit/issues/3107
IF <ls_object>-pgmid = 'LIMU' AND <ls_object>-object <> 'VARX'.
CALL FUNCTION 'TR_CHECK_TYPE'
EXPORTING
wi_e071 = <ls_object>
IMPORTING
we_tadir = ls_tadir_sap
pe_result = lv_result.
IF lv_result NA 'TL' OR ls_tadir_sap IS INITIAL.
zcx_abapgit_exception=>raise( 'error from TR_CHECK_TYPE' ).
ENDIF.
lv_object = ls_tadir_sap-object.
lv_obj_name = ls_tadir_sap-obj_name.
ELSE.
lv_object = <ls_object>-object.
lv_obj_name = <ls_object>-obj_name.
ENDIF.
ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
iv_object = lv_object
iv_obj_name = lv_obj_name ).
IF ls_tadir-delflag IS INITIAL.
APPEND ls_tadir TO rt_tadir.
ENDIF.
ENDLOOP.
ENDLOOP.
SORT rt_tadir BY object ASCENDING obj_name ASCENDING.
DELETE ADJACENT DUPLICATES FROM rt_tadir COMPARING object obj_name.
DELETE rt_tadir WHERE table_line IS INITIAL.
ENDMETHOD.
METHOD to_tadir.
DATA: lt_requests TYPE trwbo_requests.
IF lines( it_transport_headers ) = 0.
RETURN.
ENDIF.
lt_requests = read_requests( it_transport_headers ).
rt_tadir = resolve( lt_requests ).
ENDMETHOD.
METHOD zip.
DATA: lt_requests TYPE trwbo_requests,
lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
lv_package TYPE devclass,
lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit,
ls_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings,
lt_trkorr TYPE trwbo_request_headers.
IF is_trkorr IS SUPPLIED.
APPEND is_trkorr TO lt_trkorr.
ELSE.
lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
ENDIF.
IF lines( lt_trkorr ) = 0.
RETURN.
ENDIF.
lt_requests = read_requests( lt_trkorr ).
lt_tadir = resolve( lt_requests ).
IF lines( lt_tadir ) = 0.
zcx_abapgit_exception=>raise( 'empty transport' ).
ENDIF.
lv_package = find_top_package( lt_tadir ).
IF lv_package IS INITIAL.
zcx_abapgit_exception=>raise( 'error finding super package' ).
ENDIF.
lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
IF iv_logic IS SUPPLIED AND iv_logic IS NOT INITIAL.
lo_dot_abapgit->set_folder_logic( iv_logic ).
ELSE.
lo_dot_abapgit->set_folder_logic( zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ) ).
ENDIF.
rv_xstr = zcl_abapgit_zip=>export(
iv_package = lv_package
io_dot_abapgit = lo_dot_abapgit
is_local_settings = ls_local_settings
it_filter = lt_tadir
iv_show_log = iv_show_log_popup ).
ENDMETHOD.
METHOD show_log.
DATA: li_log TYPE REF TO zif_abapgit_log,
lv_message TYPE string.
FIELD-SYMBOLS: <ls_log> TYPE sprot_u.
CREATE OBJECT li_log TYPE zcl_abapgit_log
EXPORTING
iv_title = iv_title.
LOOP AT it_log ASSIGNING <ls_log>.
MESSAGE ID <ls_log>-ag TYPE <ls_log>-severity NUMBER <ls_log>-msgnr
WITH <ls_log>-var1 <ls_log>-var2 <ls_log>-var3 <ls_log>-var4
INTO lv_message.
li_log->add(
iv_msg = lv_message
iv_type = <ls_log>-severity ).
ENDLOOP.
zcl_abapgit_log_viewer=>show_log( li_log ).
ENDMETHOD.
ENDCLASS.