Several repos for same URL (#4313)

* Check URL repo before add

* Unit tests

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Jaime Rodriguez Capote 2020-12-12 08:49:38 +01:00 committed by GitHub
parent d0983cf386
commit 6c87fa3f05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 178 additions and 4 deletions

View File

@ -156,7 +156,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION.
IF io_form_data->get( c_id-url ) IS NOT INITIAL. IF io_form_data->get( c_id-url ) IS NOT INITIAL.
TRY. TRY.
zcl_abapgit_url=>validate( io_form_data->get( c_id-url ) ). zcl_abapgit_repo_srv=>get_instance( )->validate_url( io_form_data->get( c_id-url ) ).
CATCH zcx_abapgit_exception INTO lx_err. CATCH zcx_abapgit_exception INTO lx_err.
ro_validation_log->set( ro_validation_log->set(
iv_key = c_id-url iv_key = c_id-url

View File

@ -37,6 +37,13 @@ CLASS zcl_abapgit_url DEFINITION
!iv_url TYPE string !iv_url TYPE string
RETURNING RETURNING
VALUE(rv_abapgit) TYPE abap_bool . VALUE(rv_abapgit) TYPE abap_bool .
CLASS-METHODS url_address
IMPORTING
!iv_url TYPE string
RETURNING
VALUE(rv_adress) TYPE string
RAISING
zcx_abapgit_exception.
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
@ -53,7 +60,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_URL IMPLEMENTATION. CLASS zcl_abapgit_url IMPLEMENTATION.
METHOD host. METHOD host.
@ -127,4 +134,33 @@ CLASS ZCL_ABAPGIT_URL IMPLEMENTATION.
iv_validate = abap_true ). iv_validate = abap_true ).
ENDMETHOD. ENDMETHOD.
METHOD url_address.
DATA:
lv_host TYPE string,
lv_path TYPE string,
lv_name TYPE string,
lv_len TYPE i.
regex( EXPORTING iv_url = iv_url
IMPORTING ev_host = lv_host
ev_path = lv_path
ev_name = lv_name ).
IF lv_path IS INITIAL AND lv_name IS INITIAL.
zcx_abapgit_exception=>raise( 'Malformed URL' ).
ELSEIF lv_name IS INITIAL.
lv_len = strlen( lv_path ) - 1.
IF lv_path+lv_len(1) = '/'.
lv_path = lv_path(lv_len).
ENDIF.
ENDIF.
rv_adress = |{ lv_host }{ lv_path }{ lv_name }|.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -9,6 +9,10 @@ CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
repo_name3 FOR TESTING RAISING zcx_abapgit_exception, repo_name3 FOR TESTING RAISING zcx_abapgit_exception,
repo_name4 FOR TESTING RAISING zcx_abapgit_exception, repo_name4 FOR TESTING RAISING zcx_abapgit_exception,
repo_name5 FOR TESTING RAISING zcx_abapgit_exception, repo_name5 FOR TESTING RAISING zcx_abapgit_exception,
repo_address1 FOR TESTING RAISING zcx_abapgit_exception,
repo_address2 FOR TESTING RAISING zcx_abapgit_exception,
repo_address3 FOR TESTING RAISING zcx_abapgit_exception,
repo_address4 FOR TESTING RAISING zcx_abapgit_exception,
repo_error FOR TESTING, repo_error FOR TESTING,
url_validate1 FOR TESTING, url_validate1 FOR TESTING,
url_validate2 FOR TESTING, url_validate2 FOR TESTING,
@ -101,6 +105,58 @@ CLASS ltcl_test IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD repo_address1.
DATA:
lv_url_address TYPE string.
lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/abapGit/abapGit.git' ).
cl_abap_unit_assert=>assert_equals(
exp = 'https://github.com/abapGit/abapGit'
act = lv_url_address ).
ENDMETHOD.
METHOD repo_address2.
DATA:
lv_url_address TYPE string.
lv_url_address = zcl_abapgit_url=>url_address( 'https://git.hanatrial.ondemand.com/abapGit/abapGit.git' ).
cl_abap_unit_assert=>assert_equals(
exp = 'https://git.hanatrial.ondemand.com/abapGit/abapGit'
act = lv_url_address ).
ENDMETHOD.
METHOD repo_address3.
DATA:
lv_url_address TYPE string.
lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/abapGit/abapGit/' ).
cl_abap_unit_assert=>assert_equals(
exp = 'https://github.com/abapGit/abapGit'
act = lv_url_address ).
ENDMETHOD.
METHOD repo_address4.
DATA:
lv_url_address TYPE string.
lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/abapGit/abapGit' ).
cl_abap_unit_assert=>assert_equals(
exp = 'https://github.com/abapGit/abapGit'
act = lv_url_address ).
ENDMETHOD.
METHOD url_validate1. METHOD url_validate1.
TRY. TRY.

View File

@ -11,6 +11,9 @@ CLASS zcl_abapgit_repo_srv DEFINITION
ALIASES get_repo_from_package ALIASES get_repo_from_package
FOR zif_abapgit_repo_srv~get_repo_from_package . FOR zif_abapgit_repo_srv~get_repo_from_package .
ALIASES get_repo_from_url
FOR zif_abapgit_repo_srv~get_repo_from_url .
CLASS-METHODS get_instance CLASS-METHODS get_instance
RETURNING RETURNING
VALUE(ri_srv) TYPE REF TO zif_abapgit_repo_srv . VALUE(ri_srv) TYPE REF TO zif_abapgit_repo_srv .
@ -25,6 +28,8 @@ CLASS zcl_abapgit_repo_srv DEFINITION
FOR zif_abapgit_repo_srv~list . FOR zif_abapgit_repo_srv~list .
ALIASES validate_package ALIASES validate_package
FOR zif_abapgit_repo_srv~validate_package . FOR zif_abapgit_repo_srv~validate_package .
ALIASES validate_url
FOR zif_abapgit_repo_srv~validate_url .
CLASS-DATA gi_ref TYPE REF TO zif_abapgit_repo_srv . CLASS-DATA gi_ref TYPE REF TO zif_abapgit_repo_srv .
DATA mv_init TYPE abap_bool VALUE abap_false ##NO_TEXT. DATA mv_init TYPE abap_bool VALUE abap_false ##NO_TEXT.
@ -76,7 +81,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. CLASS zcl_abapgit_repo_srv IMPLEMENTATION.
METHOD add. METHOD add.
@ -334,6 +339,44 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_repo_srv~get_repo_from_url.
DATA:
lt_repos TYPE zif_abapgit_persistence=>ty_repos,
lv_current_repo_address TYPE string,
lv_check_repo_address TYPE string,
lv_repo_path TYPE string,
lv_name TYPE zif_abapgit_persistence=>ty_local_settings-display_name,
lv_owner TYPE zif_abapgit_persistence=>ty_local_settings-display_name.
FIELD-SYMBOLS:
<ls_repo> LIKE LINE OF lt_repos.
CLEAR:
eo_repo, ev_reason.
lv_current_repo_address = zcl_abapgit_url=>url_address( iv_url ).
" check if url is already in use for a different package
lt_repos = zcl_abapgit_persist_factory=>get_repo( )->list( ).
LOOP AT lt_repos ASSIGNING <ls_repo>.
lv_check_repo_address = zcl_abapgit_url=>url_address( <ls_repo>-url ).
IF lv_current_repo_address = lv_check_repo_address.
eo_repo = get_instance( )->get( <ls_repo>-key ).
lv_repo_path = zcl_abapgit_url=>path_name( iv_url ).
lv_name = eo_repo->get_name( ).
lv_owner = <ls_repo>-created_by.
ev_reason = |Repository { lv_repo_path } already versioned as { lv_name } by { lv_owner }|.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~is_repo_installed. METHOD zif_abapgit_repo_srv~is_repo_installed.
DATA: lt_repo TYPE zif_abapgit_repo_srv=>ty_repo_list, DATA: lt_repo TYPE zif_abapgit_repo_srv=>ty_repo_list,
@ -441,7 +484,7 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION.
validate_package( iv_package = iv_package validate_package( iv_package = iv_package
iv_ign_subpkg = iv_ign_subpkg ). iv_ign_subpkg = iv_ign_subpkg ).
zcl_abapgit_url=>validate( lv_url ). validate_url( lv_url ).
lv_branch_name = determine_branch_name( lv_branch_name = determine_branch_name(
iv_name = iv_branch_name iv_name = iv_branch_name
@ -545,4 +588,29 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION.
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_repo_srv~validate_url.
DATA:
lo_repo TYPE REF TO zcl_abapgit_repo,
lv_reason TYPE string.
zcl_abapgit_url=>validate( iv_url ).
IF iv_chk_exists = abap_true.
get_repo_from_url(
EXPORTING
iv_url = iv_url
IMPORTING
eo_repo = lo_repo
ev_reason = lv_reason ).
IF lo_repo IS BOUND.
zcx_abapgit_exception=>raise( lv_reason ).
ENDIF.
ENDIF.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -68,6 +68,12 @@ INTERFACE zif_abapgit_repo_srv
!iv_chk_exists TYPE abap_bool DEFAULT abap_true !iv_chk_exists TYPE abap_bool DEFAULT abap_true
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS validate_url
IMPORTING
!iv_url TYPE string
!iv_chk_exists TYPE abap_bool DEFAULT abap_true
RAISING
zcx_abapgit_exception .
METHODS get_repo_from_package METHODS get_repo_from_package
IMPORTING IMPORTING
!iv_package TYPE devclass !iv_package TYPE devclass
@ -77,4 +83,12 @@ INTERFACE zif_abapgit_repo_srv
!ev_reason TYPE string !ev_reason TYPE string
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS get_repo_from_url
IMPORTING
!iv_url TYPE string
EXPORTING
!eo_repo TYPE REF TO zcl_abapgit_repo
!ev_reason TYPE string
RAISING
zcx_abapgit_exception .
ENDINTERFACE. ENDINTERFACE.