mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
Automatic creation of top repository package (#4431)
* Automatic creation of top repository package When adding a repository, it is not necessary anymore that the top SAP package assigned to the repository exists. Just enter a package name and clone (works for offline, too). The initial diff will now show that the top package exists remotely only. Therefore, when pulling, you will not get the "confirm overwrite package" popup anymore. Yippie! * Typo Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
parent
cd3b29aac1
commit
40efc567f6
|
@ -58,7 +58,7 @@ ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CLASS ZCL_ABAPGIT_DEFAULT_TRANSPORT IMPLEMENTATION.
|
CLASS zcl_abapgit_default_transport IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD clear.
|
METHOD clear.
|
||||||
|
@ -215,7 +215,7 @@ CLASS ZCL_ABAPGIT_DEFAULT_TRANSPORT IMPLEMENTATION.
|
||||||
OTHERS = 7.
|
OTHERS = 7.
|
||||||
|
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc <> 0.
|
||||||
zcx_abapgit_exception=>raise( |Error from TR_TASK_SET. Subrc = { sy-subrc }| ).
|
zcx_abapgit_exception=>raise_t100( ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
|
@ -71,6 +71,10 @@ CLASS ltcl_sap_package IMPLEMENTATION.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD zif_abapgit_sap_package~get_transport_layer. "##needed
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD zif_abapgit_sap_package~list_superpackages. "##needed
|
METHOD zif_abapgit_sap_package~list_superpackages. "##needed
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
|
@ -50,7 +50,7 @@ ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION.
|
CLASS zcl_abapgit_folder_logic IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD get_instance.
|
METHOD get_instance.
|
||||||
|
@ -146,22 +146,32 @@ CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION.
|
||||||
|
|
||||||
DATA: lv_length TYPE i,
|
DATA: lv_length TYPE i,
|
||||||
lv_parent TYPE devclass,
|
lv_parent TYPE devclass,
|
||||||
|
ls_package TYPE scompkdtln,
|
||||||
lv_new TYPE string,
|
lv_new TYPE string,
|
||||||
lv_path TYPE string,
|
lv_path TYPE string,
|
||||||
lv_absolute_name TYPE string,
|
lv_absolute_name TYPE string,
|
||||||
lv_top TYPE devclass,
|
|
||||||
lt_unique_package_names TYPE HASHED TABLE OF devclass WITH UNIQUE KEY table_line.
|
lt_unique_package_names TYPE HASHED TABLE OF devclass WITH UNIQUE KEY table_line.
|
||||||
|
|
||||||
lv_top = iv_top.
|
|
||||||
|
|
||||||
lv_length = strlen( io_dot->get_starting_folder( ) ).
|
lv_length = strlen( io_dot->get_starting_folder( ) ).
|
||||||
IF lv_length > strlen( iv_path ).
|
IF lv_length > strlen( iv_path ).
|
||||||
* treat as not existing locally
|
* treat as not existing locally
|
||||||
RETURN.
|
RETURN.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
lv_path = iv_path+lv_length.
|
lv_path = iv_path+lv_length.
|
||||||
lv_parent = lv_top.
|
lv_parent = iv_top.
|
||||||
rv_package = lv_top.
|
rv_package = iv_top.
|
||||||
|
|
||||||
|
" Automatically create package using minimal properties
|
||||||
|
" Details will be updated during deserialization
|
||||||
|
IF iv_create_if_not_exists = abap_true.
|
||||||
|
IF iv_top(1) = '$'.
|
||||||
|
zcl_abapgit_factory=>get_sap_package( iv_top )->create_local( ).
|
||||||
|
ELSE.
|
||||||
|
ls_package-devclass = ls_package-ctext = iv_top.
|
||||||
|
ls_package-as4user = cl_abap_syst=>get_user_name( ).
|
||||||
|
zcl_abapgit_factory=>get_sap_package( iv_top )->create( ls_package ).
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
INSERT iv_top INTO TABLE lt_unique_package_names.
|
INSERT iv_top INTO TABLE lt_unique_package_names.
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,10 @@ CLASS ltcl_folder_logic IMPLEMENTATION.
|
||||||
RETURN.
|
RETURN.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD zif_abapgit_sap_package~get_transport_layer.
|
||||||
|
RETURN.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD zif_abapgit_sap_package~create.
|
METHOD zif_abapgit_sap_package~create.
|
||||||
RETURN.
|
RETURN.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
@ -217,6 +221,10 @@ CLASS ltcl_folder_logic_namespaces IMPLEMENTATION.
|
||||||
RETURN.
|
RETURN.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD zif_abapgit_sap_package~get_transport_layer.
|
||||||
|
RETURN.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD zif_abapgit_sap_package~create.
|
METHOD zif_abapgit_sap_package~create.
|
||||||
RETURN.
|
RETURN.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
|
@ -1415,7 +1415,8 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
|
||||||
lv_package = lo_folder_logic->path_to_package(
|
lv_package = lo_folder_logic->path_to_package(
|
||||||
iv_top = io_repo->get_package( )
|
iv_top = io_repo->get_package( )
|
||||||
io_dot = io_repo->get_dot_abapgit( )
|
io_dot = io_repo->get_dot_abapgit( )
|
||||||
iv_path = <ls_result>-path ).
|
iv_path = <ls_result>-path
|
||||||
|
iv_create_if_not_exists = abap_false ).
|
||||||
|
|
||||||
ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
|
ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
|
||||||
iv_object = <ls_result>-obj_type
|
iv_object = <ls_result>-obj_type
|
||||||
|
|
|
@ -554,25 +554,24 @@ CLASS zcl_abapgit_repo_srv IMPLEMENTATION.
|
||||||
zcx_abapgit_exception=>raise( 'not possible to use $TMP, create new (local) package' ).
|
zcx_abapgit_exception=>raise( 'not possible to use $TMP, create new (local) package' ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
|
" Check if package owned by SAP is allowed (new packages are ok, since they are created automatically)
|
||||||
SELECT SINGLE as4user FROM tdevc
|
SELECT SINGLE as4user FROM tdevc
|
||||||
INTO lv_as4user
|
INTO lv_as4user
|
||||||
WHERE devclass = iv_package. "#EC CI_GENBUFF
|
WHERE devclass = iv_package. "#EC CI_GENBUFF
|
||||||
IF sy-subrc <> 0.
|
IF sy-subrc = 0 AND lv_as4user = 'SAP' AND
|
||||||
zcx_abapgit_exception=>raise( |Package { iv_package } not found| ).
|
zcl_abapgit_factory=>get_environment( )->is_sap_object_allowed( ) = abap_false.
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
IF zcl_abapgit_factory=>get_environment( )->is_sap_object_allowed( ) = abap_false AND lv_as4user = 'SAP'.
|
|
||||||
zcx_abapgit_exception=>raise( |Package { iv_package } not allowed, responsible user = 'SAP'| ).
|
zcx_abapgit_exception=>raise( |Package { iv_package } not allowed, responsible user = 'SAP'| ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
|
" Check if package is already used in another repo
|
||||||
IF iv_chk_exists = abap_true.
|
IF iv_chk_exists = abap_true.
|
||||||
get_repo_from_package(
|
get_repo_from_package(
|
||||||
EXPORTING
|
EXPORTING
|
||||||
iv_package = iv_package
|
iv_package = iv_package
|
||||||
iv_ign_subpkg = iv_ign_subpkg
|
iv_ign_subpkg = iv_ign_subpkg
|
||||||
IMPORTING
|
IMPORTING
|
||||||
eo_repo = lo_repo
|
eo_repo = lo_repo
|
||||||
ev_reason = lv_reason ).
|
ev_reason = lv_reason ).
|
||||||
|
|
||||||
IF lo_repo IS BOUND.
|
IF lo_repo IS BOUND.
|
||||||
zcx_abapgit_exception=>raise( lv_reason ).
|
zcx_abapgit_exception=>raise( lv_reason ).
|
||||||
|
|
|
@ -605,8 +605,7 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION.
|
||||||
METHOD constructor.
|
METHOD constructor.
|
||||||
|
|
||||||
DATA: lo_settings TYPE REF TO zcl_abapgit_settings,
|
DATA: lo_settings TYPE REF TO zcl_abapgit_settings,
|
||||||
lx_error TYPE REF TO zcx_abapgit_exception,
|
lx_error TYPE REF TO zcx_abapgit_exception.
|
||||||
lv_package TYPE devclass.
|
|
||||||
|
|
||||||
super->constructor( ).
|
super->constructor( ).
|
||||||
|
|
||||||
|
@ -626,8 +625,6 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION.
|
||||||
mv_max_lines = lo_settings->get_max_lines( ).
|
mv_max_lines = lo_settings->get_max_lines( ).
|
||||||
mv_max_setting = mv_max_lines.
|
mv_max_setting = mv_max_lines.
|
||||||
|
|
||||||
lv_package = mo_repo->get_package( ).
|
|
||||||
|
|
||||||
CATCH zcx_abapgit_exception INTO lx_error.
|
CATCH zcx_abapgit_exception INTO lx_error.
|
||||||
" Reset 'last shown repo' so next start will go to repo overview
|
" Reset 'last shown repo' so next start will go to repo overview
|
||||||
" and allow troubleshooting of issue
|
" and allow troubleshooting of issue
|
||||||
|
|
|
@ -302,6 +302,10 @@ CLASS ltcl_sap_package_mock IMPLEMENTATION.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD zif_abapgit_sap_package~get_transport_layer.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD zif_abapgit_sap_package~list_subpackages.
|
METHOD zif_abapgit_sap_package~list_subpackages.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
|
@ -17,7 +17,7 @@ ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CLASS ZCL_ABAPGIT_SAP_PACKAGE IMPLEMENTATION.
|
CLASS zcl_abapgit_sap_package IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD constructor.
|
METHOD constructor.
|
||||||
|
@ -42,11 +42,15 @@ CLASS ZCL_ABAPGIT_SAP_PACKAGE IMPLEMENTATION.
|
||||||
object_locked_and_modified = 5
|
object_locked_and_modified = 5
|
||||||
OTHERS = 6 ).
|
OTHERS = 6 ).
|
||||||
|
|
||||||
IF sy-subrc <> 0.
|
CASE sy-subrc.
|
||||||
zcx_abapgit_exception=>raise_t100( ).
|
WHEN 0.
|
||||||
ENDIF.
|
rv_are_changes_rec_in_tr_req = li_package->wbo_korr_flag.
|
||||||
|
WHEN 1.
|
||||||
rv_are_changes_rec_in_tr_req = li_package->wbo_korr_flag.
|
" For new packages, derive from package name
|
||||||
|
rv_are_changes_rec_in_tr_req = boolc( mv_package(1) <> '$' ).
|
||||||
|
WHEN OTHERS.
|
||||||
|
zcx_abapgit_exception=>raise_t100( ).
|
||||||
|
ENDCASE.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
@ -83,6 +87,11 @@ CLASS ZCL_ABAPGIT_SAP_PACKAGE IMPLEMENTATION.
|
||||||
ls_package-dlvunit = 'HOME'.
|
ls_package-dlvunit = 'HOME'.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
|
" For transportable packages, get default transport and layer
|
||||||
|
IF ls_package-devclass(1) <> '$' AND ls_package-pdevclass IS INITIAL.
|
||||||
|
ls_package-pdevclass = zif_abapgit_sap_package~get_transport_layer( ).
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
cl_package_factory=>create_new_package(
|
cl_package_factory=>create_new_package(
|
||||||
EXPORTING
|
EXPORTING
|
||||||
i_reuse_deleted_object = abap_true
|
i_reuse_deleted_object = abap_true
|
||||||
|
@ -220,27 +229,80 @@ CLASS ZCL_ABAPGIT_SAP_PACKAGE IMPLEMENTATION.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD zif_abapgit_sap_package~get_transport_layer.
|
||||||
|
|
||||||
|
" Get default transport layer
|
||||||
|
CALL FUNCTION 'TR_GET_TRANSPORT_TARGET'
|
||||||
|
EXPORTING
|
||||||
|
iv_use_default = abap_true
|
||||||
|
iv_get_layer_only = abap_true
|
||||||
|
IMPORTING
|
||||||
|
ev_layer = rv_transport_layer
|
||||||
|
EXCEPTIONS
|
||||||
|
wrong_call = 1
|
||||||
|
invalid_input = 2
|
||||||
|
cts_initialization_failure = 3
|
||||||
|
OTHERS = 4.
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
" Return empty layer (i.e. "local workbench request" for the package)
|
||||||
|
CLEAR rv_transport_layer.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
METHOD zif_abapgit_sap_package~get_transport_type.
|
METHOD zif_abapgit_sap_package~get_transport_type.
|
||||||
|
|
||||||
DATA lv_pkg_name TYPE e071-obj_name.
|
DATA:
|
||||||
|
lv_pkg_name TYPE e071-obj_name,
|
||||||
|
lv_obj_name TYPE tadir-obj_name,
|
||||||
|
lv_role TYPE trnrole.
|
||||||
|
|
||||||
lv_pkg_name = mv_package.
|
lv_pkg_name = lv_obj_name = mv_package.
|
||||||
|
|
||||||
CALL FUNCTION 'TRINT_GET_REQUEST_TYPE'
|
CALL FUNCTION 'TR_GET_REQUEST_TYPE'
|
||||||
EXPORTING
|
EXPORTING
|
||||||
iv_pgmid = 'R3TR'
|
iv_pgmid = 'R3TR'
|
||||||
iv_object = 'DEVC'
|
iv_object = 'DEVC'
|
||||||
iv_obj_name = lv_pkg_name
|
iv_obj_name = lv_pkg_name
|
||||||
IMPORTING
|
IMPORTING
|
||||||
ev_request_type = rs_transport_type-request
|
ev_request_type = rs_transport_type-request
|
||||||
ev_task_type = rs_transport_type-task
|
ev_task_type = rs_transport_type-task
|
||||||
EXCEPTIONS
|
EXCEPTIONS
|
||||||
no_request_needed = 1
|
no_request_needed = 1
|
||||||
internal_error = 2
|
invalid_object = 2
|
||||||
cts_initialization_failure = 3.
|
system_error = 3
|
||||||
IF sy-subrc <> 0.
|
OTHERS = 4.
|
||||||
zcx_abapgit_exception=>raise_t100( ).
|
|
||||||
ENDIF.
|
CASE sy-subrc.
|
||||||
|
WHEN 0 OR 1.
|
||||||
|
RETURN.
|
||||||
|
WHEN 2.
|
||||||
|
" For new packages, set to workbench request
|
||||||
|
rs_transport_type-request = 'K'.
|
||||||
|
|
||||||
|
CALL FUNCTION 'TR_GET_NAMESPACE_AND_ROLE'
|
||||||
|
EXPORTING
|
||||||
|
iv_pgmid = 'R3TR'
|
||||||
|
iv_object = 'DEVC'
|
||||||
|
iv_objname = lv_obj_name
|
||||||
|
IMPORTING
|
||||||
|
ev_role = lv_role
|
||||||
|
EXCEPTIONS
|
||||||
|
namespace_not_existing = 1
|
||||||
|
invalid_object = 2
|
||||||
|
namespace_not_determinable = 3
|
||||||
|
OTHERS = 4.
|
||||||
|
IF sy-subrc = 0 AND lv_role = 'C'.
|
||||||
|
" Namespace with repair license requires repair task
|
||||||
|
rs_transport_type-task = 'R'.
|
||||||
|
ELSE.
|
||||||
|
" Otherweise use correction task
|
||||||
|
rs_transport_type-task = 'S'.
|
||||||
|
ENDIF.
|
||||||
|
WHEN OTHERS.
|
||||||
|
zcx_abapgit_exception=>raise_t100( ).
|
||||||
|
ENDCASE.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
|
@ -1,30 +1,52 @@
|
||||||
INTERFACE zif_abapgit_sap_package PUBLIC.
|
INTERFACE zif_abapgit_sap_package
|
||||||
|
PUBLIC .
|
||||||
|
|
||||||
TYPES: ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY.
|
|
||||||
METHODS:
|
|
||||||
create
|
|
||||||
IMPORTING is_package TYPE scompkdtln
|
|
||||||
RAISING zcx_abapgit_exception,
|
|
||||||
create_local
|
|
||||||
RAISING zcx_abapgit_exception,
|
|
||||||
list_subpackages
|
|
||||||
RETURNING VALUE(rt_list) TYPE ty_devclass_tt,
|
|
||||||
list_superpackages
|
|
||||||
RETURNING VALUE(rt_list) TYPE ty_devclass_tt
|
|
||||||
RAISING zcx_abapgit_exception,
|
|
||||||
read_parent
|
|
||||||
RETURNING VALUE(rv_parentcl) TYPE tdevc-parentcl
|
|
||||||
RAISING zcx_abapgit_exception,
|
|
||||||
create_child
|
|
||||||
IMPORTING iv_child TYPE devclass
|
|
||||||
RAISING zcx_abapgit_exception,
|
|
||||||
exists
|
|
||||||
RETURNING VALUE(rv_bool) TYPE abap_bool,
|
|
||||||
are_changes_recorded_in_tr_req
|
|
||||||
RETURNING VALUE(rv_are_changes_rec_in_tr_req) TYPE abap_bool
|
|
||||||
RAISING zcx_abapgit_exception,
|
|
||||||
get_transport_type
|
|
||||||
RETURNING VALUE(rs_transport_type) TYPE zif_abapgit_definitions=>ty_transport_type
|
|
||||||
RAISING zcx_abapgit_exception.
|
|
||||||
|
|
||||||
|
TYPES:
|
||||||
|
ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY .
|
||||||
|
|
||||||
|
METHODS create
|
||||||
|
IMPORTING
|
||||||
|
!is_package TYPE scompkdtln
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
|
METHODS create_local
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
|
METHODS list_subpackages
|
||||||
|
RETURNING
|
||||||
|
VALUE(rt_list) TYPE ty_devclass_tt .
|
||||||
|
METHODS list_superpackages
|
||||||
|
RETURNING
|
||||||
|
VALUE(rt_list) TYPE ty_devclass_tt
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
|
METHODS read_parent
|
||||||
|
RETURNING
|
||||||
|
VALUE(rv_parentcl) TYPE tdevc-parentcl
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
|
METHODS create_child
|
||||||
|
IMPORTING
|
||||||
|
!iv_child TYPE devclass
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
|
METHODS exists
|
||||||
|
RETURNING
|
||||||
|
VALUE(rv_bool) TYPE abap_bool .
|
||||||
|
METHODS are_changes_recorded_in_tr_req
|
||||||
|
RETURNING
|
||||||
|
VALUE(rv_are_changes_rec_in_tr_req) TYPE abap_bool
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
|
METHODS get_transport_type
|
||||||
|
RETURNING
|
||||||
|
VALUE(rs_transport_type) TYPE zif_abapgit_definitions=>ty_transport_type
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
|
METHODS get_transport_layer
|
||||||
|
RETURNING
|
||||||
|
VALUE(rv_transport_layer) TYPE devlayer
|
||||||
|
RAISING
|
||||||
|
zcx_abapgit_exception .
|
||||||
ENDINTERFACE.
|
ENDINTERFACE.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user