mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 04:08:27 +08:00
#311 part2 lcl_git_branch_list features
This commit is contained in:
parent
6bb3ed474f
commit
d329ab6338
|
@ -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: <ls_branch> LIKE LINE OF rt_list.
|
||||
FIELD-SYMBOLS: <ls_branch> 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 <ls_branch>.
|
||||
<ls_branch>-sha1 = lv_hash.
|
||||
<ls_branch>-name = lv_name.
|
||||
APPEND INITIAL LINE TO et_list ASSIGNING <ls_branch>.
|
||||
<ls_branch>-sha1 = lv_hash.
|
||||
<ls_branch>-name = lv_name.
|
||||
<ls_branch>-display_name = get_display_name( lv_name ).
|
||||
<ls_branch>-type = get_type( lv_name ).
|
||||
IF <ls_branch>-name = 'HEAD' OR <ls_branch>-name = ev_head_symref.
|
||||
<ls_branch>-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 <branch> LIKE LINE OF mt_branches.
|
||||
|
||||
LOOP AT mt_branches ASSIGNING <branch>.
|
||||
IF <branch>-type = TYPE_BRANCH.
|
||||
APPEND <branch> TO rt_branches.
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
ENDMETHOD. "get_branches_only
|
||||
|
||||
METHOD get_tags_only.
|
||||
FIELD-SYMBOLS <branch> LIKE LINE OF mt_branches.
|
||||
|
||||
LOOP AT mt_branches ASSIGNING <branch>.
|
||||
IF <branch>-type = TYPE_TAG.
|
||||
APPEND <branch> TO rt_branches.
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
ENDMETHOD. "get_tags_only
|
||||
|
||||
ENDCLASS. "lcl_git_branch_list
|
||||
|
||||
|
||||
|
||||
*----------------------------------------------------------------------*
|
||||
* CLASS lcl_pack IMPLEMENTATION
|
||||
* CLASS lcl_git_pack IMPLEMENTATION
|
||||
*----------------------------------------------------------------------*
|
||||
*
|
||||
*----------------------------------------------------------------------*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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 <ls_field>.
|
||||
ASSERT sy-subrc = 0.
|
||||
ev_name = <ls_field>-value.
|
||||
ev_name = lcl_git_branch_list=>complete_heads_branch_name( <ls_field>-value ).
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
|
Loading…
Reference in New Issue
Block a user