From d329ab63389692a48511d67e38ad1736488b12fb Mon Sep 17 00:00:00 2001 From: atsy Date: Sat, 3 Sep 2016 15:01:09 +0300 Subject: [PATCH] #311 part2 lcl_git_branch_list features --- src/zabapgit_git.prog.abap | 179 +++++++++++++++++--- src/zabapgit_gui.prog.abap | 2 +- src/zabapgit_page_branch_overview.prog.abap | 6 +- src/zabapgit_page_merge.prog.abap | 28 +-- src/zabapgit_popups.prog.abap | 4 +- 5 files changed, 172 insertions(+), 47 deletions(-) diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 20300da1d..65f9dae0c 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -110,7 +110,12 @@ ENDCLASS. "lcl_git_utils *----------------------------------------------------------------------* CLASS lcl_git_branch_list DEFINITION FINAL CREATE PRIVATE. PUBLIC SECTION. - DATA mt_branches TYPE ty_git_branch_list_tt READ-ONLY. + CONSTANTS TYPE_BRANCH TYPE ty_git_branch_type VALUE 'HD'. + CONSTANTS TYPE_TAG TYPE ty_git_branch_type VALUE 'TG'. + CONSTANTS TYPE_OTHER TYPE ty_git_branch_type VALUE 'ZZ'. + + DATA mt_branches TYPE ty_git_branch_list_tt READ-ONLY. + DATA mv_head_symref TYPE string READ-ONLY. CLASS-METHODS create IMPORTING iv_data TYPE string @@ -122,12 +127,45 @@ CLASS lcl_git_branch_list DEFINITION FINAL CREATE PRIVATE. RETURNING VALUE(rs_branch) TYPE ty_git_branch RAISING lcx_exception. + METHODS get_head " For potential future use + RETURNING VALUE(rs_branch) TYPE ty_git_branch + RAISING lcx_exception. + + METHODS get_branches_only + RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt + RAISING lcx_exception. + + METHODS get_tags_only " For potential future use + RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt + RAISING lcx_exception. + + CLASS-METHODS is_ignored + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_ignore) TYPE abap_bool. + + CLASS-METHODS get_display_name + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_display_name) TYPE string. + + CLASS-METHODS get_type + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_type) TYPE ty_git_branch_type. + + CLASS-METHODS complete_heads_branch_name + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_name) TYPE string. + PRIVATE SECTION. CLASS-METHODS parse_branch_list IMPORTING iv_data TYPE string - RETURNING VALUE(rt_list) TYPE ty_git_branch_list_tt + EXPORTING et_list TYPE ty_git_branch_list_tt + ev_head_symref TYPE string RAISING lcx_exception. + CLASS-METHODS parse_head_params + IMPORTING iv_data TYPE string + EXPORTING ev_head_symref TYPE string. + ENDCLASS. "lcl_git_branch_list @@ -533,7 +571,6 @@ CLASS lcl_git_transport IMPLEMENTATION. ENDMETHOD. "send_receive - METHOD receive_pack. DATA: li_client TYPE REF TO if_http_client, @@ -712,7 +749,10 @@ CLASS lcl_git_branch_list IMPLEMENTATION. METHOD create. CREATE OBJECT ro_list. - ro_list->mt_branches = parse_branch_list( iv_data = iv_data ). + parse_branch_list( + EXPORTING iv_data = iv_data + IMPORTING et_list = ro_list->mt_branches + ev_head_symref = ro_list->mv_head_symref ). ENDMETHOD. "create METHOD find_by_name. @@ -729,20 +769,27 @@ CLASS lcl_git_branch_list IMPLEMENTATION. ENDMETHOD. "find_by_name + METHOD get_head. + + rs_branch = find_by_name( 'HEAD' ). + + ENDMETHOD. "get_head METHOD parse_branch_list. - DATA: lt_result TYPE TABLE OF string, - lv_hash TYPE ty_sha1, - lv_name TYPE string, - lv_foo TYPE string ##needed, - lv_char TYPE c, - lv_data LIKE LINE OF lt_result. + DATA: lt_result TYPE TABLE OF string, + lv_hash TYPE ty_sha1, + lv_name TYPE string, + lv_head_params TYPE string, + lv_char TYPE c, + lv_data LIKE LINE OF lt_result. - FIELD-SYMBOLS: LIKE LINE OF rt_list. + FIELD-SYMBOLS: LIKE LINE OF et_list. + CLEAR: et_list, ev_head_symref. SPLIT iv_data AT gc_newline INTO TABLE lt_result. + LOOP AT lt_result INTO lv_data. IF sy-tabix = 1. CONTINUE. " current loop @@ -750,7 +797,11 @@ CLASS lcl_git_branch_list IMPLEMENTATION. lv_hash = lv_data+8. lv_name = lv_data+49. lv_char = lcl_git_utils=>get_null( ). - SPLIT lv_name AT lv_char INTO lv_name lv_foo. + + SPLIT lv_name AT lv_char INTO lv_name lv_head_params. + parse_head_params( + EXPORTING iv_data = lv_head_params + IMPORTING ev_head_symref = ev_head_symref ). ELSEIF sy-tabix > 2 AND strlen( lv_data ) > 45. lv_hash = lv_data+4. lv_name = lv_data+45. @@ -760,24 +811,112 @@ CLASS lcl_git_branch_list IMPLEMENTATION. CONTINUE. ENDIF. - IF lv_name CP 'refs/pull/*'. - CONTINUE. - ENDIF. + CHECK is_ignored( lv_name ) = abap_false. + ASSERT lv_name IS NOT INITIAL. - APPEND INITIAL LINE TO rt_list ASSIGNING . - -sha1 = lv_hash. - -name = lv_name. + APPEND INITIAL LINE TO et_list ASSIGNING . + -sha1 = lv_hash. + -name = lv_name. + -display_name = get_display_name( lv_name ). + -type = get_type( lv_name ). + IF -name = 'HEAD' OR -name = ev_head_symref. + -is_head = abap_true. + ENDIF. ENDLOOP. ENDMETHOD. "parse_branch_list + METHOD parse_head_params. + + DATA: ls_match TYPE match_result, + ls_submatch TYPE submatch_result. + + FIND FIRST OCCURRENCE OF REGEX '\ssymref=HEAD:([^\s]+)' IN iv_data RESULTS ls_match. + READ TABLE ls_match-submatches INTO ls_submatch INDEX 1. + IF sy-subrc IS INITIAL. + ev_head_symref = iv_data+ls_submatch-offset(ls_submatch-length). + ENDIF. + + ENDMETHOD. "parse_head_params + + METHOD is_ignored. + + IF iv_branch_name EQ 'refs/heads/gh-pages'. " Github pages + rv_ignore = abap_true. + ENDIF. + + IF iv_branch_name CP 'refs/pull/*' + OR iv_branch_name CP 'refs/merge-requests/*' + OR iv_branch_name CP 'refs/keep-around/*' + OR iv_branch_name CP 'refs/tmp/*'. + rv_ignore = abap_true. + ENDIF. + + ENDMETHOD. "is_ignored + + METHOD get_display_name. + rv_display_name = iv_branch_name. + + IF rv_display_name CP 'refs/heads/*'. + REPLACE FIRST OCCURRENCE OF 'refs/heads/' IN rv_display_name WITH ''. + RETURN. + ENDIF. + + IF rv_display_name CP 'refs/tags/*'. + REPLACE FIRST OCCURRENCE OF 'refs/' IN rv_display_name WITH ''. + RETURN. + ENDIF. + + ENDMETHOD. "get_display_name + + METHOD get_type. + rv_type = TYPE_OTHER. + + IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = 'HEAD'. + rv_type = TYPE_BRANCH. + RETURN. + ENDIF. + + IF iv_branch_name CP 'refs/tags/*'. + rv_type = TYPE_TAG. + RETURN. + ENDIF. + + ENDMETHOD. "get_type + + METHOD complete_heads_branch_name. + IF iv_branch_name CP 'refs/heads/*'. + rv_name = iv_branch_name. + ELSE. + rv_name = 'refs/heads/' && iv_branch_name. + ENDIF. + ENDMETHOD. "complete_heads_branch_name + + METHOD get_branches_only. + FIELD-SYMBOLS LIKE LINE OF mt_branches. + + LOOP AT mt_branches ASSIGNING . + IF -type = TYPE_BRANCH. + APPEND TO rt_branches. + ENDIF. + ENDLOOP. + ENDMETHOD. "get_branches_only + + METHOD get_tags_only. + FIELD-SYMBOLS LIKE LINE OF mt_branches. + + LOOP AT mt_branches ASSIGNING . + IF -type = TYPE_TAG. + APPEND TO rt_branches. + ENDIF. + ENDLOOP. + ENDMETHOD. "get_tags_only ENDCLASS. "lcl_git_branch_list - *----------------------------------------------------------------------* -* CLASS lcl_pack IMPLEMENTATION +* CLASS lcl_git_pack IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index e10bf51b8..cf23604e8 100644 --- a/src/zabapgit_gui.prog.abap +++ b/src/zabapgit_gui.prog.abap @@ -869,7 +869,7 @@ CLASS lcl_gui_router IMPLEMENTATION. lo_repo = lcl_app=>repo_srv( )->new_online( iv_url = lv_url - iv_branch_name = 'refs/heads/master' + iv_branch_name = 'refs/heads/master' "TODO replace with HEAD ? iv_package = lv_target_package ) ##NO_TEXT. lo_repo->status( ). " check for errors diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap index 5bcc04d1b..2bb00cef5 100644 --- a/src/zabapgit_page_branch_overview.prog.abap +++ b/src/zabapgit_page_branch_overview.prog.abap @@ -162,11 +162,7 @@ CLASS lcl_branch_overview IMPLEMENTATION. * the selected branch "TODO refactor - gt_branches = lcl_git_transport=>branches( io_repo->get_url( ) )->mt_branches. - - DELETE gt_branches WHERE name = 'refs/heads/gh-pages' ##NO_TEXT. - DELETE gt_branches WHERE name CP 'refs/tags/*' ##NO_TEXT. - DELETE gt_branches WHERE name CP 'refs/pull/*' ##NO_TEXT. + gt_branches = lcl_git_transport=>branches( io_repo->get_url( ) )->get_branches_only( ). lcl_git_transport=>upload_pack( EXPORTING io_repo = io_repo iv_deepen = abap_false diff --git a/src/zabapgit_page_merge.prog.abap b/src/zabapgit_page_merge.prog.abap index 9d3cb1598..8d447a6bb 100644 --- a/src/zabapgit_page_merge.prog.abap +++ b/src/zabapgit_page_merge.prog.abap @@ -294,30 +294,20 @@ CLASS lcl_merge IMPLEMENTATION. METHOD fetch_git. - DEFINE _find. - lv_name = 'refs/heads/' && &1 ##NO_TEXT. - READ TABLE lt_branches INTO &2 WITH KEY name = lv_name. - IF sy-subrc <> 0. - lcx_exception=>raise( 'branch not found' ). - ENDIF. - APPEND &2 TO lt_upload. - END-OF-DEFINITION. - - DATA: lv_name TYPE string, - lt_branches TYPE ty_git_branch_list_tt, + DATA: lo_branch_list TYPE REF TO lcl_git_branch_list, lt_upload TYPE ty_git_branch_list_tt. + lo_branch_list = lcl_git_transport=>branches( gs_merge-repo->get_url( ) ). + gs_merge-source = lo_branch_list->find_by_name( lcl_git_branch_list=>complete_heads_branch_name( iv_source ) ). + gs_merge-target = lo_branch_list->find_by_name( lcl_git_branch_list=>complete_heads_branch_name( iv_target ) ). - "TODO refactor - lt_branches = lcl_git_transport=>branches( gs_merge-repo->get_url( ) )->mt_branches. + APPEND gs_merge-source TO lt_upload. + APPEND gs_merge-target TO lt_upload. - _find iv_source gs_merge-source. - _find iv_target gs_merge-target. - - lcl_git_transport=>upload_pack( EXPORTING io_repo = gs_merge-repo - iv_deepen = abap_false + lcl_git_transport=>upload_pack( EXPORTING io_repo = gs_merge-repo + iv_deepen = abap_false it_branches = lt_upload - IMPORTING et_objects = gt_objects ). + IMPORTING et_objects = gt_objects ). ENDMETHOD. diff --git a/src/zabapgit_popups.prog.abap b/src/zabapgit_popups.prog.abap index 5c56c5fa3..929602f06 100644 --- a/src/zabapgit_popups.prog.abap +++ b/src/zabapgit_popups.prog.abap @@ -116,7 +116,7 @@ CLASS lcl_popups IMPLEMENTATION. CLEAR ev_cancel. * TAB FLD LABEL DEF ATTR - _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'refs/heads/branch_name' ''. + _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new_branch_name' ''. CALL FUNCTION 'POPUP_GET_VALUES' EXPORTING @@ -137,7 +137,7 @@ CLASS lcl_popups IMPLEMENTATION. ELSE. READ TABLE lt_fields INDEX 1 ASSIGNING . ASSERT sy-subrc = 0. - ev_name = -value. + ev_name = lcl_git_branch_list=>complete_heads_branch_name( -value ). ENDIF. ENDMETHOD.