From e4bafbe7159650d0a465bb6584f950e4add6b21f Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Mon, 24 Aug 2020 05:15:46 -0400 Subject: [PATCH] Validate if branch exists when displaying repo (#3749) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Validate if branch exists when displaying repo * Validate if branch exists when displaying repo * Lint * Lint and 702 * Lint * Rename validate_branch to validate * Fix msg and branch display name * Move msg to UI layer * Lint Co-authored-by: Lars Hvam Co-authored-by: Frederik Hudák --- src/git/zcl_abapgit_git_branch_list.clas.abap | 4 +- .../zcl_abapgit_gui_page_view_repo.clas.abap | 13 ++- src/zcl_abapgit_repo.clas.abap | 8 ++ src/zcl_abapgit_repo_offline.clas.abap | 20 +++- src/zcl_abapgit_repo_online.clas.abap | 105 ++++++++++++------ 5 files changed, 107 insertions(+), 43 deletions(-) diff --git a/src/git/zcl_abapgit_git_branch_list.clas.abap b/src/git/zcl_abapgit_git_branch_list.clas.abap index 4f260e0e4..56dec2c9a 100644 --- a/src/git/zcl_abapgit_git_branch_list.clas.abap +++ b/src/git/zcl_abapgit_git_branch_list.clas.abap @@ -90,7 +90,7 @@ ENDCLASS. -CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. METHOD complete_heads_branch_name. @@ -127,7 +127,7 @@ CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. READ TABLE mt_branches INTO rs_branch WITH KEY name = iv_branch_name. IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Branch not found: { iv_branch_name }| ). + zcx_abapgit_exception=>raise( |Branch not found: { get_display_name( iv_branch_name ) }| ). ENDIF. ENDIF. diff --git a/src/ui/zcl_abapgit_gui_page_view_repo.clas.abap b/src/ui/zcl_abapgit_gui_page_view_repo.clas.abap index 3cd4c09d3..c83e812a6 100644 --- a/src/ui/zcl_abapgit_gui_page_view_repo.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_view_repo.clas.abap @@ -138,7 +138,7 @@ ENDCLASS. -CLASS zcl_abapgit_gui_page_view_repo IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION. METHOD apply_order_by. @@ -648,6 +648,7 @@ CLASS zcl_abapgit_gui_page_view_repo IMPLEMENTATION. lv_add_str TYPE string, li_log TYPE REF TO zif_abapgit_log, lv_render_transports TYPE abap_bool, + lv_msg TYPE string, lo_news TYPE REF TO zcl_abapgit_news. FIELD-SYMBOLS LIKE LINE OF lt_repo_items. @@ -660,6 +661,16 @@ CLASS zcl_abapgit_gui_page_view_repo IMPLEMENTATION. " Reinit, for the case of type change mo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ). + " Check if repo is still valid and reset if necessary to consistent state + TRY. + mo_repo->validate( ). + CATCH zcx_abapgit_exception INTO lx_error. + lv_msg = lx_error->get_text( ) && '. Fallback to master branch.'. + MESSAGE lv_msg TYPE 'S'. + + mo_repo->reset( ). + ENDTRY. + lo_news = zcl_abapgit_news=>create( mo_repo ). CREATE OBJECT ri_html TYPE zcl_abapgit_html. diff --git a/src/zcl_abapgit_repo.clas.abap b/src/zcl_abapgit_repo.clas.abap index acedf8283..7a520feea 100644 --- a/src/zcl_abapgit_repo.clas.abap +++ b/src/zcl_abapgit_repo.clas.abap @@ -139,6 +139,14 @@ CLASS zcl_abapgit_repo DEFINITION RAISING zcx_abapgit_exception . METHODS reset_status . + METHODS validate + ABSTRACT + RAISING + zcx_abapgit_exception . + METHODS reset + ABSTRACT + RAISING + zcx_abapgit_exception . PROTECTED SECTION. DATA mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt . diff --git a/src/zcl_abapgit_repo_offline.clas.abap b/src/zcl_abapgit_repo_offline.clas.abap index ed30dc783..10c8480e8 100644 --- a/src/zcl_abapgit_repo_offline.clas.abap +++ b/src/zcl_abapgit_repo_offline.clas.abap @@ -7,13 +7,17 @@ CLASS zcl_abapgit_repo_offline DEFINITION PUBLIC SECTION. METHODS get_name - REDEFINITION . + REDEFINITION . METHODS has_remote_source - REDEFINITION . + REDEFINITION . + METHODS validate + REDEFINITION . + METHODS reset + REDEFINITION . PROTECTED SECTION. METHODS reset_remote - REDEFINITION . + REDEFINITION . PRIVATE SECTION. ENDCLASS. @@ -36,6 +40,11 @@ CLASS ZCL_ABAPGIT_REPO_OFFLINE IMPLEMENTATION. ENDMETHOD. + METHOD reset. + " Nothing to do so far + ENDMETHOD. + + METHOD reset_remote. DATA lt_backup LIKE mt_remote. @@ -52,4 +61,9 @@ CLASS ZCL_ABAPGIT_REPO_OFFLINE IMPLEMENTATION. set_files_remote( lt_backup ). ENDMETHOD. + + + METHOD validate. + " Nothing to do so far + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap index a3fcb0742..ffb2ab3b6 100644 --- a/src/zcl_abapgit_repo_online.clas.abap +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -39,19 +39,26 @@ CLASS zcl_abapgit_repo_online DEFINITION VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt RAISING zcx_abapgit_exception . + METHODS get_commit_display_url + IMPORTING + !iv_hash TYPE zif_abapgit_definitions=>ty_sha1 + RETURNING + VALUE(rv_url) TYPE zif_abapgit_persistence=>ty_repo-url + RAISING + zcx_abapgit_exception . METHODS get_files_remote - REDEFINITION . + REDEFINITION . METHODS get_name - REDEFINITION . + REDEFINITION . METHODS has_remote_source - REDEFINITION . + REDEFINITION . METHODS rebuild_local_checksums - REDEFINITION . - METHODS get_commit_display_url - IMPORTING iv_hash TYPE zif_abapgit_definitions=>ty_sha1 - RETURNING VALUE(rv_url) TYPE zif_abapgit_persistence=>ty_repo-url - RAISING zcx_abapgit_exception. + REDEFINITION . + METHODS validate + REDEFINITION . + METHODS reset + REDEFINITION . PROTECTED SECTION. PRIVATE SECTION. @@ -75,7 +82,7 @@ ENDCLASS. -CLASS zcl_abapgit_repo_online IMPLEMENTATION. +CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. METHOD fetch_remote. @@ -108,6 +115,33 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. ENDMETHOD. + METHOD get_commit_display_url. + + DATA ls_result TYPE match_result. + FIELD-SYMBOLS TYPE submatch_result. + + rv_url = me->get_url( ). + + FIND REGEX '^https:\/\/(?:www\.)?(github\.com|bitbucket\.org|gitlab\.com)\/' IN rv_url RESULTS ls_result. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |provider not yet supported| ). + ENDIF. + READ TABLE ls_result-submatches INDEX 1 ASSIGNING . + CASE rv_url+-offset(-length). + WHEN 'github.com'. + REPLACE REGEX '\.git$' IN rv_url WITH space. + rv_url = rv_url && |/commit/| && iv_hash. + WHEN 'bitbucket.org'. + REPLACE REGEX '\.git$' IN rv_url WITH space. + rv_url = rv_url && |/commits/| && iv_hash. + WHEN 'gitlab.com'. + REPLACE REGEX '\.git$' IN rv_url WITH space. + rv_url = rv_url && |/-/commit/| && iv_hash. + ENDCASE. + + ENDMETHOD. + + METHOD get_files_remote. fetch_remote( ). rt_files = super->get_files_remote( ). @@ -238,6 +272,16 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. ENDMETHOD. + METHOD reset. + + " Reset repo to master branch + set_branch_name( 'refs/heads/master' ). + + COMMIT WORK AND WAIT. + + ENDMETHOD. + + METHOD set_branch_name. reset_remote( ). @@ -259,6 +303,21 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. ENDMETHOD. + METHOD validate. + + DATA: + lo_branches TYPE REF TO zcl_abapgit_git_branch_list, + ls_branch TYPE zif_abapgit_definitions=>ty_git_branch. + + " Check if branch still exists since it might have been deleted in remote repo + " This will raise exception if not + lo_branches = zcl_abapgit_git_transport=>branches( ms_data-url ). + + ls_branch = lo_branches->find_by_name( ms_data-branch_name ). + + ENDMETHOD. + + METHOD zif_abapgit_git_operations~create_branch. DATA: lv_sha1 TYPE zif_abapgit_definitions=>ty_sha1. @@ -322,32 +381,4 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION. reset_status( ). ENDMETHOD. - - - METHOD get_commit_display_url. - - DATA ls_result TYPE match_result. - FIELD-SYMBOLS TYPE submatch_result. - - rv_url = me->get_url( ). - - FIND REGEX '^https:\/\/(?:www\.)?(github\.com|bitbucket\.org|gitlab\.com)\/' IN rv_url RESULTS ls_result. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |provider not yet supported| ). - ENDIF. - READ TABLE ls_result-submatches INDEX 1 ASSIGNING . - CASE rv_url+-offset(-length). - WHEN 'github.com'. - REPLACE REGEX '\.git$' IN rv_url WITH space. - rv_url = rv_url && |/commit/| && iv_hash. - WHEN 'bitbucket.org'. - REPLACE REGEX '\.git$' IN rv_url WITH space. - rv_url = rv_url && |/commits/| && iv_hash. - WHEN 'gitlab.com'. - REPLACE REGEX '\.git$' IN rv_url WITH space. - rv_url = rv_url && |/-/commit/| && iv_hash. - ENDCASE. - - ENDMETHOD. - ENDCLASS.