new feature: delete branch

branch operations: overview   create   switch   delete moved to new dropdown, instead of the "Advanced" dropdown
This commit is contained in:
larshp 2016-07-14 10:50:43 +00:00
parent a6b14f627a
commit 05477af7c5
8 changed files with 140 additions and 55 deletions

View File

@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100.
* See http://www.abapgit.org
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.15.13'. "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.16.0'. "#EC NOTEXT
********************************************************************************
* The MIT License (MIT)

View File

@ -52,16 +52,12 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt
* called dynamically from function module POPUP_GET_VALUES_USER_BUTTONS
DATA: lv_url TYPE string,
lv_answer TYPE c,
lx_error TYPE REF TO lcx_exception,
lt_selection TYPE TABLE OF spopli,
ls_package_data TYPE scompkdtln,
lt_branches TYPE lcl_git_transport=>ty_branch_list_tt.
ls_branch TYPE lcl_git_transport=>ty_branch_list.
FIELD-SYMBOLS: <ls_fbranch> LIKE LINE OF tt_fields,
<ls_branch> LIKE LINE OF lt_branches,
<ls_sel> LIKE LINE OF lt_selection,
<ls_furl> LIKE LINE OF tt_fields.
FIELD-SYMBOLS: <ls_furl> LIKE LINE OF tt_fields,
<ls_fbranch> LIKE LINE OF tt_fields.
CLEAR cs_error.
@ -77,44 +73,18 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt
lv_url = <ls_furl>-value.
TRY.
lt_branches = lcl_git_transport=>branches( lv_url ).
ls_branch = lcl_popups=>branch_list_popup( lv_url ).
CATCH lcx_exception INTO lx_error.
MESSAGE lx_error TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDTRY.
LOOP AT lt_branches ASSIGNING <ls_branch>.
APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
<ls_sel>-varoption = <ls_branch>-name.
ENDLOOP.
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
textline1 = 'Select branch'
titel = 'Select branch'
IMPORTING
answer = lv_answer
TABLES
t_spopli = lt_selection
EXCEPTIONS
not_enough_answers = 1
too_much_answers = 2
too_much_marks = 3
OTHERS = 4. "#EC NOTEXT
IF sy-subrc <> 0.
_raise 'Error from POPUP_TO_DECIDE_LIST'.
ENDIF.
IF lv_answer = 'A'. " cancel
IF ls_branch IS INITIAL.
RETURN.
ENDIF.
READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
ASSERT sy-subrc = 0.
READ TABLE tt_fields ASSIGNING <ls_fbranch> WITH KEY tabname = 'TEXTL'.
ASSERT sy-subrc = 0.
<ls_fbranch>-value = <ls_sel>-varoption.
<ls_fbranch>-value = ls_branch-name.
ELSEIF pv_code = 'COD2'.
cv_show_popup = abap_true.

View File

@ -1366,6 +1366,11 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain.
iv_from TYPE ty_sha1
RAISING lcx_exception.
CLASS-METHODS delete_branch
IMPORTING io_repo TYPE REF TO lcl_repo_online
is_branch TYPE lcl_git_transport=>ty_branch_list
RAISING lcx_exception.
CLASS-METHODS full_tree
IMPORTING it_objects TYPE ty_objects_tt
iv_branch TYPE ty_sha1
@ -1390,6 +1395,8 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain.
TYPES: ty_folders_tt TYPE STANDARD TABLE OF ty_folder WITH DEFAULT KEY.
CONSTANTS: c_zero TYPE ty_sha1 VALUE '0000000000000000000000000000000000000000'.
CLASS-METHODS build_trees
IMPORTING it_expanded TYPE ty_expanded_tt
RETURNING VALUE(rt_trees) TYPE ty_trees_tt
@ -1505,22 +1512,38 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
ENDMETHOD. "receive_pack
METHOD create_branch.
METHOD delete_branch.
DATA: lv_zero TYPE ty_sha1,
lt_objects TYPE ty_objects_tt,
DATA: lt_objects TYPE ty_objects_tt,
lv_pack TYPE xstring.
lv_zero = '0000000000000000000000000000000000000000'.
* "client MUST send an empty packfile"
* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514
lv_pack = lcl_git_pack=>encode( lt_objects ).
lcl_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = lv_zero
iv_old = is_branch-sha1
iv_new = c_zero
iv_branch_name = is_branch-name
iv_pack = lv_pack ).
ENDMETHOD.
METHOD create_branch.
DATA: lt_objects TYPE ty_objects_tt,
lv_pack TYPE xstring.
* "client MUST send an empty packfile"
* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514
lv_pack = lcl_git_pack=>encode( lt_objects ).
lcl_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = c_zero
iv_new = iv_from
iv_branch_name = iv_name
iv_pack = lv_pack ).

View File

@ -771,11 +771,11 @@ CLASS lcl_object_clas IMPLEMENTATION.
* todo, not sure this is correct, to be tested
SELECT SINGLE changedby FROM seoclassdf INTO rv_user
WHERE clsname = ms_item-obj_name
AND version = '1'.
AND version = '1'. "#EC CI_GENBUFF
IF sy-subrc = 0 AND rv_user IS INITIAL.
SELECT SINGLE author FROM seoclassdf INTO rv_user
WHERE clsname = ms_item-obj_name
AND version = '1'.
AND version = '1'. "#EC CI_GENBUFF
ENDIF.
IF sy-subrc <> 0.
rv_user = c_user_unknown.

View File

@ -25,7 +25,7 @@ CLASS lcl_object_msag IMPLEMENTATION.
METHOD lif_object~changed_by.
SELECT SINGLE lastuser FROM t100a INTO rv_user
WHERE arbgb = ms_item-obj_name.
WHERE arbgb = ms_item-obj_name. "#EC CI_GENBUFF
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ENDIF.

View File

@ -26,7 +26,7 @@ CLASS lcl_object_shlp IMPLEMENTATION.
SELECT SINGLE as4user FROM dd30l INTO rv_user
WHERE shlpname = ms_item-obj_name
AND as4local = 'A'.
AND as4local = 'A'. "#EC CI_GENBUFF
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ENDIF.

View File

@ -16,6 +16,7 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
CONSTANTS: BEGIN OF c_actions,
newoffline TYPE string VALUE 'newoffline' ##NO_TEXT,
switch_branch TYPE string VALUE 'switch_branch' ##NO_TEXT,
delete_branch TYPE string VALUE 'delete_branch' ##NO_TEXT,
install TYPE string VALUE 'install' ##NO_TEXT,
show TYPE string VALUE 'show' ##NO_TEXT,
END OF c_actions.
@ -205,6 +206,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
DATA: lo_toolbar TYPE REF TO lcl_html_toolbar,
lv_key TYPE lcl_persistence_db=>ty_value,
lo_sub TYPE REF TO lcl_html_toolbar,
lo_branch TYPE REF TO lcl_html_toolbar,
lo_repo_online TYPE REF TO lcl_repo_online.
@ -239,14 +241,19 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
ENDIF.
CREATE OBJECT lo_sub.
IF io_repo->is_offline( ) = abap_false.
lo_sub->add( iv_txt = 'Branch overview'
iv_act = |branch_overview?{ lv_key }| ).
lo_sub->add( iv_txt = 'Switch branch'
iv_act = |{ c_actions-switch_branch }?{ lv_key }| ).
lo_sub->add( iv_txt = 'Create branch'
iv_act = |create_branch?{ lv_key }| ).
CREATE OBJECT lo_branch.
lo_branch->add( iv_txt = 'Overview'
iv_act = |branch_overview?{ lv_key }| ).
lo_branch->add( iv_txt = 'Switch'
iv_act = |{ c_actions-switch_branch }?{ lv_key }| ).
lo_branch->add( iv_txt = 'Create'
iv_act = |create_branch?{ lv_key }| ).
lo_branch->add( iv_txt = 'Delete'
iv_act = |{ c_actions-delete_branch }?{ lv_key }| ).
lo_toolbar->add( iv_txt = 'Branch'
io_sub = lo_branch ) ##NO_TEXT.
lo_sub->add( iv_txt = 'Reset local'
iv_act = |reset?{ lv_key }| ).
lo_sub->add( iv_txt = 'Background mode'
@ -255,7 +262,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
lo_sub->add( iv_txt = 'Export &amp; Commit'
iv_act = |files_commit?{ lv_key }| ).
ENDIF.
lo_sub->add( iv_txt = 'Remove'
iv_act = |remove?{ lv_key }| ).
lo_sub->add( iv_txt = 'Uninstall'
@ -602,6 +608,10 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
lcl_app=>user( )->set_repo_show( mv_show ).
ev_state = gc_event_state-re_render.
ENDIF.
WHEN c_actions-delete_branch.
lv_key = iv_getdata.
lcl_popups=>delete_branch( lv_key ).
ev_state = gc_event_state-re_render.
WHEN c_actions-switch_branch.
lv_key = iv_getdata.
lcl_popups=>switch_branch( lv_key ).

View File

@ -26,6 +26,13 @@ CLASS lcl_popups DEFINITION.
switch_branch
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception,
delete_branch
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception,
branch_list_popup
IMPORTING iv_url TYPE string
RETURNING VALUE(rs_branch) TYPE lcl_git_transport=>ty_branch_list
RAISING lcx_exception,
repo_popup
IMPORTING iv_url TYPE string
iv_package TYPE devclass OPTIONAL
@ -184,6 +191,81 @@ CLASS lcl_popups IMPLEMENTATION.
ENDMETHOD. "repo_new_offline
METHOD delete_branch.
DATA: lo_repo TYPE REF TO lcl_repo_online,
ls_branch TYPE lcl_git_transport=>ty_branch_list.
lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ).
ls_branch = branch_list_popup( lo_repo->get_url( ) ).
IF ls_branch IS INITIAL.
RETURN.
ENDIF.
IF ls_branch-name = 'HEAD'.
_raise 'cannot delete HEAD'.
ELSEIF ls_branch-name = lo_repo->get_branch_name( ).
_raise 'switch branch before deleting current'.
ENDIF.
lcl_git_porcelain=>delete_branch(
io_repo = lo_repo
is_branch = ls_branch ).
MESSAGE 'Branch deleted' TYPE 'S'.
ENDMETHOD.
METHOD branch_list_popup.
DATA: lt_branches TYPE lcl_git_transport=>ty_branch_list_tt,
lv_answer TYPE c LENGTH 1,
lt_selection TYPE TABLE OF spopli.
FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection,
<ls_branch> LIKE LINE OF lt_branches.
lt_branches = lcl_git_transport=>branches( iv_url ).
LOOP AT lt_branches ASSIGNING <ls_branch>.
APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
<ls_sel>-varoption = <ls_branch>-name.
ENDLOOP.
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
textline1 = 'Select branch'
titel = 'Select branch'
start_col = 5
start_row = 10
IMPORTING
answer = lv_answer
TABLES
t_spopli = lt_selection
EXCEPTIONS
not_enough_answers = 1
too_much_answers = 2
too_much_marks = 3
OTHERS = 4. "#EC NOTEXT
IF sy-subrc <> 0.
_raise 'Error from POPUP_TO_DECIDE_LIST'.
ENDIF.
IF lv_answer = 'A'. " cancel
RETURN.
ENDIF.
READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
ASSERT sy-subrc = 0.
READ TABLE lt_branches INTO rs_branch WITH KEY name = <ls_sel>-varoption.
ASSERT sy-subrc = 0.
ENDMETHOD.
METHOD switch_branch.
DATA: lo_repo TYPE REF TO lcl_repo_online,