Feature: Objects locked in multiple requests

If an object contains several parts (`LIMU` objects), for example, a function group with includes and several functions, it's possible that changes land in different transports. In such case, abapGit would show only one of the transport requests which is misleading.

The change will show "MULTIPLE" instead of a transport number. Clicking on the link will display all involved transports requests and tasks in a popup.

The feature is available in the repo view as well as in staging.

Closes #2961
This commit is contained in:
Marc Bernard 2025-03-30 16:08:49 +00:00
parent 8e02089f8f
commit b5f7cd3ed5
6 changed files with 67 additions and 11 deletions

View File

@ -89,6 +89,9 @@ CLASS zcl_abapgit_cts_api IMPLEMENTATION.
DATA: lv_object_lockable TYPE abap_bool, DATA: lv_object_lockable TYPE abap_bool,
lv_locked TYPE abap_bool, lv_locked TYPE abap_bool,
lv_transport_request TYPE trkorr, lv_transport_request TYPE trkorr,
ls_tlock TYPE tlock,
lt_tlock TYPE STANDARD TABLE OF tlock WITH DEFAULT KEY,
lt_transports TYPE STANDARD TABLE OF trkorr WITH DEFAULT KEY,
lv_task TYPE trkorr, lv_task TYPE trkorr,
lv_tr_object_name TYPE trobj_name. lv_tr_object_name TYPE trobj_name.
@ -104,6 +107,8 @@ CLASS zcl_abapgit_cts_api IMPLEMENTATION.
we_locked = lv_locked we_locked = lv_locked
we_lock_order = lv_transport_request we_lock_order = lv_transport_request
we_lock_task = lv_task we_lock_task = lv_task
TABLES
wt_tlock = lt_tlock
EXCEPTIONS EXCEPTIONS
empty_key = 1 empty_key = 1
no_systemname = 2 no_systemname = 2
@ -122,7 +127,15 @@ CLASS zcl_abapgit_cts_api IMPLEMENTATION.
zcx_abapgit_exception=>raise( |Object type { iv_program_id }-{ iv_object_type } not lockable| ). zcx_abapgit_exception=>raise( |Object type { iv_program_id }-{ iv_object_type } not lockable| ).
ENDIF. ENDIF.
LOOP AT lt_tlock INTO ls_tlock.
COLLECT ls_tlock-trkorr INTO lt_transports.
ENDLOOP.
IF lines( lt_transports ) = 1.
rv_transport = lv_transport_request. rv_transport = lv_transport_request.
ELSE.
rv_transport = zif_abapgit_definitions=>c_multiple_transports.
ENDIF.
ENDMETHOD. ENDMETHOD.
@ -470,8 +483,12 @@ CLASS zcl_abapgit_cts_api IMPLEMENTATION.
WHERE object = ls_lock_key-obj WHERE object = ls_lock_key-obj
AND hikey >= ls_lock_key-low AND hikey >= ls_lock_key-low
AND lokey <= ls_lock_key-hi. "#EC PORTABLE AND lokey <= ls_lock_key-hi. "#EC PORTABLE
IF lv_request IS INITIAL.
lv_request = <ls_tlock>-trkorr. lv_request = <ls_tlock>-trkorr.
ELSE.
lv_request = zif_abapgit_definitions=>c_multiple_transports.
EXIT. EXIT.
ENDIF.
ENDLOOP. ENDLOOP.
ELSEIF is_object_type_transportable( <ls_item>-obj_type ) = abap_true. ELSEIF is_object_type_transportable( <ls_item>-obj_type ) = abap_true.
lv_request = get_current_transport_from_db( lv_request = get_current_transport_from_db(

View File

@ -141,6 +141,8 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION
CLASS-METHODS render_transport CLASS-METHODS render_transport
IMPORTING IMPORTING
!iv_transport TYPE trkorr !iv_transport TYPE trkorr
!iv_obj_type TYPE zif_abapgit_definitions=>ty_repo_item-obj_type OPTIONAL
!iv_obj_name TYPE zif_abapgit_definitions=>ty_repo_item-obj_name OPTIONAL
!iv_interactive TYPE abap_bool DEFAULT abap_true !iv_interactive TYPE abap_bool DEFAULT abap_true
!iv_icon_only TYPE abap_bool DEFAULT abap_false !iv_icon_only TYPE abap_bool DEFAULT abap_false
RETURNING RETURNING
@ -1279,6 +1281,10 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION.
lv_jump = |{ zif_abapgit_definitions=>c_action-jump_transport }?transport={ iv_transport }|. lv_jump = |{ zif_abapgit_definitions=>c_action-jump_transport }?transport={ iv_transport }|.
IF iv_obj_type IS NOT INITIAL AND iv_obj_name IS NOT INITIAL.
lv_jump = lv_jump && |&type={ iv_obj_type }&name={ iv_obj_name }|.
ENDIF.
IF iv_icon_only = abap_true. IF iv_icon_only = abap_true.
ri_html->add_a( iv_act = lv_jump ri_html->add_a( iv_act = lv_jump
iv_title = |Transport { iv_transport }| iv_title = |Transport { iv_transport }|

View File

@ -981,7 +981,10 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION.
ri_html->add( '<td class="transport">' ). ri_html->add( '<td class="transport">' ).
ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport( is_item-transport ) ). ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport(
iv_transport = is_item-transport
iv_obj_type = is_item-obj_type
iv_obj_name = is_item-obj_name ) ).
ri_html->add( '</td>' ). ri_html->add( '</td>' ).

View File

@ -134,6 +134,7 @@ ENDCLASS.
CLASS zcl_abapgit_gui_page_stage IMPLEMENTATION. CLASS zcl_abapgit_gui_page_stage IMPLEMENTATION.
METHOD constructor. METHOD constructor.
DATA lv_ts TYPE timestamp. DATA lv_ts TYPE timestamp.
@ -439,7 +440,10 @@ CLASS zcl_abapgit_gui_page_stage IMPLEMENTATION.
ri_html->add( '</td>' ). ri_html->add( '</td>' ).
ri_html->add( '<td class="transport">' ). ri_html->add( '<td class="transport">' ).
ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport( iv_transport ) ). ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport(
iv_transport = iv_transport
iv_obj_type = is_item-obj_type
iv_obj_name = is_item-obj_name ) ).
ri_html->add( '</td>' ). ri_html->add( '</td>' ).
ri_html->add( '<td class="status">?</td>' ). ri_html->add( '<td class="status">?</td>' ).

View File

@ -120,6 +120,8 @@ CLASS zcl_abapgit_gui_router DEFINITION
CLASS-METHODS jump_display_transport CLASS-METHODS jump_display_transport
IMPORTING IMPORTING
!iv_transport TYPE trkorr !iv_transport TYPE trkorr
iv_obj_type TYPE tadir-object OPTIONAL
iv_obj_name TYPE tadir-obj_name OPTIONAL
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS jump_display_user CLASS-METHODS jump_display_user
@ -498,20 +500,38 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
METHOD jump_display_transport. METHOD jump_display_transport.
DATA: DATA:
ls_e071 TYPE e071,
lv_adt_link TYPE string, lv_adt_link TYPE string,
lv_adt_jump_enabled TYPE abap_bool. lv_adt_jump_enabled TYPE abap_bool.
lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ). lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
IF lv_adt_jump_enabled = abap_true. IF lv_adt_jump_enabled = abap_true AND iv_transport <> zif_abapgit_definitions=>c_multiple_transports.
TRY. TRY.
lv_adt_link = zcl_abapgit_adt_link=>link_transport( iv_transport ). lv_adt_link = zcl_abapgit_adt_link=>link_transport( iv_transport ).
zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ). zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ).
RETURN.
CATCH zcx_abapgit_exception. CATCH zcx_abapgit_exception.
" Fallback if ADT link execution failed or was cancelled " Fallback if ADT link execution failed or was cancelled
CALL FUNCTION 'TR_DISPLAY_REQUEST'
EXPORTING
i_trkorr = iv_transport.
ENDTRY. ENDTRY.
ENDIF.
IF iv_transport = zif_abapgit_definitions=>c_multiple_transports.
ls_e071-pgmid = 'R3TR'.
ls_e071-object = iv_obj_type.
ls_e071-obj_name = iv_obj_name.
CALL FUNCTION 'TR_SHOW_OBJECT_LOCKS'
EXPORTING
iv_e071 = ls_e071
EXCEPTIONS
object_not_lockable = 1
empty_key = 2
unknown_object = 3
unallowed_locks = 4
OTHERS = 5.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
ELSE. ELSE.
CALL FUNCTION 'TR_DISPLAY_REQUEST' CALL FUNCTION 'TR_DISPLAY_REQUEST'
EXPORTING EXPORTING
@ -732,7 +752,10 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
WHEN zif_abapgit_definitions=>c_action-jump_transport. WHEN zif_abapgit_definitions=>c_action-jump_transport.
jump_display_transport( |{ ii_event->query( )->get( 'TRANSPORT' ) }| ). jump_display_transport(
iv_transport = |{ ii_event->query( )->get( 'TRANSPORT' ) }|
iv_obj_type = |{ ii_event->query( )->get( 'TYPE' ) }|
iv_obj_name = |{ ii_event->query( )->get( 'NAME' ) }| ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
WHEN zif_abapgit_definitions=>c_action-jump_user. WHEN zif_abapgit_definitions=>c_action-jump_user.

View File

@ -415,4 +415,7 @@ INTERFACE zif_abapgit_definitions
use_lxe TYPE abap_bool, use_lxe TYPE abap_bool,
END OF ty_i18n_params . END OF ty_i18n_params .
TYPES ty_trrngtrkor_tt TYPE RANGE OF trkorr. TYPES ty_trrngtrkor_tt TYPE RANGE OF trkorr.
CONSTANTS c_multiple_transports TYPE trkorr VALUE 'MULTIPLE'.
ENDINTERFACE. ENDINTERFACE.