From 6c87fa3f0536406d27f09cdf87df752efa0087e6 Mon Sep 17 00:00:00 2001 From: Jaime Rodriguez Capote Date: Sat, 12 Dec 2020 08:49:38 +0100 Subject: [PATCH] Several repos for same URL (#4313) * Check URL repo before add * Unit tests Co-authored-by: Lars Hvam --- .../zcl_abapgit_gui_page_addonline.clas.abap | 2 +- src/utils/zcl_abapgit_url.clas.abap | 38 +++++++++- .../zcl_abapgit_url.clas.testclasses.abap | 56 +++++++++++++++ src/zcl_abapgit_repo_srv.clas.abap | 72 ++++++++++++++++++- src/zif_abapgit_repo_srv.intf.abap | 14 ++++ 5 files changed, 178 insertions(+), 4 deletions(-) diff --git a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap index 192913a6b..040e7d6f7 100644 --- a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap @@ -156,7 +156,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. IF io_form_data->get( c_id-url ) IS NOT INITIAL. 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. ro_validation_log->set( iv_key = c_id-url diff --git a/src/utils/zcl_abapgit_url.clas.abap b/src/utils/zcl_abapgit_url.clas.abap index 9f3daf273..a974e3247 100644 --- a/src/utils/zcl_abapgit_url.clas.abap +++ b/src/utils/zcl_abapgit_url.clas.abap @@ -37,6 +37,13 @@ CLASS zcl_abapgit_url DEFINITION !iv_url TYPE string RETURNING 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. PRIVATE SECTION. @@ -53,7 +60,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_URL IMPLEMENTATION. +CLASS zcl_abapgit_url IMPLEMENTATION. METHOD host. @@ -127,4 +134,33 @@ CLASS ZCL_ABAPGIT_URL IMPLEMENTATION. iv_validate = abap_true ). 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. diff --git a/src/utils/zcl_abapgit_url.clas.testclasses.abap b/src/utils/zcl_abapgit_url.clas.testclasses.abap index a1b5ffa94..255d589d7 100644 --- a/src/utils/zcl_abapgit_url.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_url.clas.testclasses.abap @@ -9,6 +9,10 @@ CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. repo_name3 FOR TESTING RAISING zcx_abapgit_exception, repo_name4 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, url_validate1 FOR TESTING, url_validate2 FOR TESTING, @@ -101,6 +105,58 @@ CLASS ltcl_test IMPLEMENTATION. 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. TRY. diff --git a/src/zcl_abapgit_repo_srv.clas.abap b/src/zcl_abapgit_repo_srv.clas.abap index 225f13daa..746ff01fc 100644 --- a/src/zcl_abapgit_repo_srv.clas.abap +++ b/src/zcl_abapgit_repo_srv.clas.abap @@ -11,6 +11,9 @@ CLASS zcl_abapgit_repo_srv DEFINITION ALIASES 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 RETURNING 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 . ALIASES 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 . 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. @@ -334,6 +339,44 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. 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: + 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 . + + lv_check_repo_address = zcl_abapgit_url=>url_address( -url ). + + IF lv_current_repo_address = lv_check_repo_address. + eo_repo = get_instance( )->get( -key ). + lv_repo_path = zcl_abapgit_url=>path_name( iv_url ). + lv_name = eo_repo->get_name( ). + lv_owner = -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. 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 iv_ign_subpkg = iv_ign_subpkg ). - zcl_abapgit_url=>validate( lv_url ). + validate_url( lv_url ). lv_branch_name = determine_branch_name( iv_name = iv_branch_name @@ -545,4 +588,29 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. ENDIF. 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. diff --git a/src/zif_abapgit_repo_srv.intf.abap b/src/zif_abapgit_repo_srv.intf.abap index ff99d5d51..d47b8ba70 100644 --- a/src/zif_abapgit_repo_srv.intf.abap +++ b/src/zif_abapgit_repo_srv.intf.abap @@ -68,6 +68,12 @@ INTERFACE zif_abapgit_repo_srv !iv_chk_exists TYPE abap_bool DEFAULT abap_true RAISING 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 IMPORTING !iv_package TYPE devclass @@ -77,4 +83,12 @@ INTERFACE zif_abapgit_repo_srv !ev_reason TYPE string RAISING 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.