implement annotated tags

This commit is contained in:
Christian Guenter 2018-05-26 20:53:38 +02:00
parent 983d6410f4
commit 2c80628de3
18 changed files with 1187 additions and 399 deletions

View File

@ -30,9 +30,9 @@ CLASS zcl_abapgit_git_branch_list DEFINITION
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS get_tags_only " For potential future use METHODS get_tags_only " For potential future use
RETURNING RETURNING
VALUE(rt_branches) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt VALUE(rt_tags) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception.
CLASS-METHODS is_ignored CLASS-METHODS is_ignored
IMPORTING IMPORTING
!iv_branch_name TYPE clike !iv_branch_name TYPE clike
@ -45,9 +45,11 @@ CLASS zcl_abapgit_git_branch_list DEFINITION
VALUE(rv_display_name) TYPE string . VALUE(rv_display_name) TYPE string .
CLASS-METHODS get_type CLASS-METHODS get_type
IMPORTING IMPORTING
!iv_branch_name TYPE clike !iv_branch_name TYPE clike
it_result TYPE stringtab OPTIONAL
iv_current_row_index TYPE sytabix OPTIONAL
RETURNING RETURNING
VALUE(rv_type) TYPE zif_abapgit_definitions=>ty_git_branch_type . VALUE(rv_type) TYPE zif_abapgit_definitions=>ty_git_branch_type .
CLASS-METHODS complete_heads_branch_name CLASS-METHODS complete_heads_branch_name
IMPORTING IMPORTING
!iv_branch_name TYPE clike !iv_branch_name TYPE clike
@ -80,7 +82,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION. CLASS zcl_abapgit_git_branch_list IMPLEMENTATION.
METHOD complete_heads_branch_name. METHOD complete_heads_branch_name.
@ -157,15 +159,21 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION.
METHOD get_tags_only. METHOD get_tags_only.
FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches. FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches.
LOOP AT mt_branches ASSIGNING <ls_branch>. LOOP AT mt_branches ASSIGNING <ls_branch>
IF <ls_branch>-type = zif_abapgit_definitions=>c_git_branch_type-tag. WHERE type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag
APPEND <ls_branch> TO rt_branches. OR type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag.
ENDIF. APPEND <ls_branch> TO rt_tags.
ENDLOOP. ENDLOOP.
ENDMETHOD. "get_tags_only ENDMETHOD. "get_tags_only
METHOD get_type. METHOD get_type.
DATA: lv_annotated_tag_with_suffix TYPE string.
FIELD-SYMBOLS: <ls_result> TYPE LINE OF stringtab.
rv_type = zif_abapgit_definitions=>c_git_branch_type-other. rv_type = zif_abapgit_definitions=>c_git_branch_type-other.
IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = zif_abapgit_definitions=>c_head_name. IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = zif_abapgit_definitions=>c_head_name.
@ -174,7 +182,17 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION.
ENDIF. ENDIF.
IF iv_branch_name CP 'refs/tags/*'. IF iv_branch_name CP 'refs/tags/*'.
rv_type = zif_abapgit_definitions=>c_git_branch_type-tag.
lv_annotated_tag_with_suffix = iv_branch_name && '^{}'.
READ TABLE it_result ASSIGNING <ls_result>
INDEX iv_current_row_index + 1.
IF sy-subrc = 0 AND <ls_result> CP '*' && lv_annotated_tag_with_suffix.
rv_type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag.
ELSE.
rv_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag.
ENDIF.
ENDIF. ENDIF.
ENDMETHOD. "get_type ENDMETHOD. "get_type
@ -193,6 +211,10 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION.
rv_ignore = abap_true. rv_ignore = abap_true.
ENDIF. ENDIF.
IF iv_branch_name CP 'refs/tags/*^{}'. " 2nd ref of annotated tag
rv_ignore = abap_true.
ENDIF.
ENDMETHOD. "is_ignored ENDMETHOD. "is_ignored
@ -206,12 +228,13 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION.
METHOD parse_branch_list. METHOD parse_branch_list.
DATA: lt_result TYPE TABLE OF string, DATA: lt_result TYPE TABLE OF string,
lv_hash TYPE zif_abapgit_definitions=>ty_sha1, lv_hash TYPE zif_abapgit_definitions=>ty_sha1,
lv_name TYPE string, lv_name TYPE string,
lv_head_params TYPE string, lv_head_params TYPE string,
lv_char TYPE c, lv_char TYPE c,
lv_data LIKE LINE OF lt_result. lv_data LIKE LINE OF lt_result,
lv_current_row_index TYPE syst-tabix.
FIELD-SYMBOLS: <ls_branch> LIKE LINE OF et_list. FIELD-SYMBOLS: <ls_branch> LIKE LINE OF et_list.
@ -220,6 +243,9 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION.
SPLIT iv_data AT zif_abapgit_definitions=>gc_newline INTO TABLE lt_result. SPLIT iv_data AT zif_abapgit_definitions=>gc_newline INTO TABLE lt_result.
LOOP AT lt_result INTO lv_data. LOOP AT lt_result INTO lv_data.
lv_current_row_index = sy-tabix.
IF sy-tabix = 1. IF sy-tabix = 1.
CONTINUE. " current loop CONTINUE. " current loop
ELSEIF sy-tabix = 2 AND strlen( lv_data ) > 49. ELSEIF sy-tabix = 2 AND strlen( lv_data ) > 49.
@ -245,7 +271,9 @@ CLASS ZCL_ABAPGIT_GIT_BRANCH_LIST IMPLEMENTATION.
<ls_branch>-sha1 = lv_hash. <ls_branch>-sha1 = lv_hash.
<ls_branch>-name = lv_name. <ls_branch>-name = lv_name.
<ls_branch>-display_name = get_display_name( lv_name ). <ls_branch>-display_name = get_display_name( lv_name ).
<ls_branch>-type = get_type( lv_name ). <ls_branch>-type = get_type( iv_branch_name = lv_name
it_result = lt_result
iv_current_row_index = lv_current_row_index ).
IF <ls_branch>-name = zif_abapgit_definitions=>c_head_name OR <ls_branch>-name = ev_head_symref. IF <ls_branch>-name = zif_abapgit_definitions=>c_head_name OR <ls_branch>-name = ev_head_symref.
<ls_branch>-is_head = abap_true. <ls_branch>-is_head = abap_true.
ENDIF. ENDIF.

View File

@ -20,7 +20,16 @@ CLASS zcl_abapgit_git_pack DEFINITION
author TYPE string, author TYPE string,
committer TYPE string, committer TYPE string,
body TYPE string, body TYPE string,
END OF ty_commit . END OF ty_commit,
BEGIN OF ty_tag,
object TYPE string,
type TYPE string,
tag TYPE string,
tagger_name TYPE string,
tagger_email TYPE string,
message TYPE string,
body TYPE string,
END OF ty_tag .
TYPES: TYPES:
BEGIN OF ty_adler32, BEGIN OF ty_adler32,
sha1 TYPE zif_abapgit_definitions=>ty_sha1, sha1 TYPE zif_abapgit_definitions=>ty_sha1,
@ -48,6 +57,13 @@ CLASS zcl_abapgit_git_pack DEFINITION
VALUE(rs_commit) TYPE ty_commit VALUE(rs_commit) TYPE ty_commit
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS decode_tag
IMPORTING
!iv_data TYPE xstring
RETURNING
VALUE(rs_tag) TYPE ty_tag
RAISING
zcx_abapgit_exception .
CLASS-METHODS encode CLASS-METHODS encode
IMPORTING IMPORTING
!it_objects TYPE zif_abapgit_definitions=>ty_objects_tt !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
@ -62,9 +78,16 @@ CLASS zcl_abapgit_git_pack DEFINITION
VALUE(rv_data) TYPE xstring . VALUE(rv_data) TYPE xstring .
CLASS-METHODS encode_commit CLASS-METHODS encode_commit
IMPORTING IMPORTING
!is_commit TYPE ty_commit is_commit TYPE ty_commit
RETURNING RETURNING
VALUE(rv_data) TYPE xstring . VALUE(rv_data) TYPE xstring .
CLASS-METHODS encode_tag
IMPORTING
is_tag TYPE zcl_abapgit_git_pack=>ty_tag
RETURNING
VALUE(rv_data) TYPE xstring
RAISING
zcx_abapgit_exception.
PRIVATE SECTION. PRIVATE SECTION.
CONSTANTS: CONSTANTS:
@ -128,7 +151,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. CLASS zcl_abapgit_git_pack IMPLEMENTATION.
METHOD decode. METHOD decode.
@ -336,6 +359,68 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
ENDMETHOD. "decode_deltas ENDMETHOD. "decode_deltas
METHOD decode_tag.
DATA: lv_string TYPE string,
lv_word TYPE string,
lv_length TYPE i,
lv_trash TYPE string ##NEEDED,
lt_string TYPE TABLE OF string.
FIELD-SYMBOLS: <lv_string> LIKE LINE OF lt_string.
lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_data ).
SPLIT lv_string AT zif_abapgit_definitions=>gc_newline INTO TABLE lt_string.
LOOP AT lt_string ASSIGNING <lv_string>.
SPLIT <lv_string> AT space INTO lv_word lv_trash.
CASE lv_word.
WHEN 'object'.
rs_tag-object = lv_trash.
WHEN 'type'.
rs_tag-type = lv_trash.
WHEN 'tag'.
rs_tag-tag = lv_trash.
WHEN 'tagger'.
FIND FIRST OCCURRENCE OF REGEX `(.*)<(.*)>`
IN lv_trash
SUBMATCHES rs_tag-tagger_name
rs_tag-tagger_email.
rs_tag-tagger_name = condense( rs_tag-tagger_name ).
WHEN ''.
" ignore blank lines
CONTINUE.
WHEN OTHERS.
" these are the non empty line which don't start with a key word
" the first one is the message, the rest are cumulated to the body
IF rs_tag-message IS INITIAL.
rs_tag-message = <lv_string>.
ELSE.
IF rs_tag-body IS NOT INITIAL.
rs_tag-body = rs_tag-body && zif_abapgit_definitions=>gc_newline.
ENDIF.
rs_tag-body = rs_tag-body && <lv_string>.
ENDIF.
ENDCASE.
ENDLOOP.
ENDMETHOD.
METHOD decode_tree. METHOD decode_tree.
CONSTANTS: lc_sha_length TYPE i VALUE 20, CONSTANTS: lc_sha_length TYPE i VALUE 20,
@ -757,6 +842,8 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
lv_type = 32. lv_type = 32.
WHEN zif_abapgit_definitions=>gc_type-blob. WHEN zif_abapgit_definitions=>gc_type-blob.
lv_type = 48. lv_type = 48.
WHEN zif_abapgit_definitions=>gc_type-tag.
lv_type = 64.
WHEN zif_abapgit_definitions=>gc_type-ref_d. WHEN zif_abapgit_definitions=>gc_type-ref_d.
lv_type = 112. lv_type = 112.
WHEN OTHERS. WHEN OTHERS.
@ -839,4 +926,25 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
zcx_abapgit_exception=>raise( 'Wrong Adler checksum' ). zcx_abapgit_exception=>raise( 'Wrong Adler checksum' ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD encode_tag.
DATA: lv_string TYPE string,
lv_tmp TYPE string,
lv_time TYPE zcl_abapgit_time=>ty_unixtime.
lv_time = zcl_abapgit_time=>get( ).
lv_string = |object { is_tag-object }{ zif_abapgit_definitions=>gc_newline }|
&& |type { is_tag-type }{ zif_abapgit_definitions=>gc_newline }|
&& |tag { zcl_abapgit_tag=>remove_tag_prefix( is_tag-tag ) }{ zif_abapgit_definitions=>gc_newline }|
&& |tagger { is_tag-tagger_name } <{ is_tag-tagger_email }> { lv_time }|
&& |{ zif_abapgit_definitions=>gc_newline }|
&& |{ zif_abapgit_definitions=>gc_newline }|
&& |{ is_tag-message }|.
rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -567,3 +567,60 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.
CLASS ltcl_tag DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
decode_tag FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_tag IMPLEMENTATION.
METHOD decode_tag.
DATA: lv_test_data TYPE string,
lv_xstring TYPE xstring,
ls_tag TYPE zcl_abapgit_git_pack=>ty_tag.
lv_test_data = |object 175f9a21b15a9012c97a3dd15aea6d74d4204b6b\n|
&& |type commit\n|
&& |tag tag_1\n|
&& |tagger Christian Guenter <christianguenter@googlemail.com> 1526718052 +0000\n|
&& |\n|
&& |This is an annotated tag\n|.
lv_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( lv_test_data ).
ls_tag = zcl_abapgit_git_pack=>decode_tag( lv_xstring ).
cl_abap_unit_assert=>assert_equals(
exp = |175f9a21b15a9012c97a3dd15aea6d74d4204b6b|
act = ls_tag-object ).
cl_abap_unit_assert=>assert_equals(
exp = 'commit'
act = ls_tag-type ).
cl_abap_unit_assert=>assert_equals(
exp = 'tag_1'
act = ls_tag-tag ).
cl_abap_unit_assert=>assert_equals(
exp = 'Christian Guenter'
act = ls_tag-tagger_name ).
cl_abap_unit_assert=>assert_equals(
exp = 'christianguenter@googlemail.com'
act = ls_tag-tagger_email ).
cl_abap_unit_assert=>assert_equals(
exp = 'This is an annotated tag'
act = ls_tag-message ).
ENDMETHOD.
ENDCLASS.

View File

@ -32,9 +32,10 @@ CLASS zcl_abapgit_git_porcelain DEFINITION
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS create_tag CLASS-METHODS create_tag
IMPORTING IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo_online !io_repo TYPE REF TO zcl_abapgit_repo_online
!iv_name TYPE string is_tag TYPE zif_abapgit_definitions=>ty_git_tag
!iv_from TYPE zif_abapgit_definitions=>ty_sha1 RETURNING
VALUE(rv_created_tag_type) TYPE zif_abapgit_definitions=>ty_git_branch_type
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS delete_branch CLASS-METHODS delete_branch
@ -46,7 +47,7 @@ CLASS zcl_abapgit_git_porcelain DEFINITION
CLASS-METHODS delete_tag CLASS-METHODS delete_tag
IMPORTING IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo_online !io_repo TYPE REF TO zcl_abapgit_repo_online
!is_tag TYPE zif_abapgit_definitions=>ty_git_branch !is_tag TYPE zif_abapgit_definitions=>ty_git_tag
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS full_tree CLASS-METHODS full_tree
@ -56,9 +57,9 @@ CLASS zcl_abapgit_git_porcelain DEFINITION
RETURNING RETURNING
VALUE(rt_expanded) TYPE zif_abapgit_definitions=>ty_expanded_tt VALUE(rt_expanded) TYPE zif_abapgit_definitions=>ty_expanded_tt
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception.
PRIVATE SECTION.
PRIVATE SECTION.
TYPES: BEGIN OF ty_tree, TYPES: BEGIN OF ty_tree,
path TYPE string, path TYPE string,
data TYPE xstring, data TYPE xstring,
@ -100,7 +101,7 @@ CLASS zcl_abapgit_git_porcelain DEFINITION
RETURNING VALUE(rt_expanded) TYPE zif_abapgit_definitions=>ty_expanded_tt RETURNING VALUE(rt_expanded) TYPE zif_abapgit_definitions=>ty_expanded_tt
RAISING zcx_abapgit_exception. RAISING zcx_abapgit_exception.
CLASS-METHODS receive_pack CLASS-METHODS receive_pack_push
IMPORTING is_comment TYPE zif_abapgit_definitions=>ty_comment IMPORTING is_comment TYPE zif_abapgit_definitions=>ty_comment
io_repo TYPE REF TO zcl_abapgit_repo_online io_repo TYPE REF TO zcl_abapgit_repo_online
it_trees TYPE ty_trees_tt it_trees TYPE ty_trees_tt
@ -108,11 +109,16 @@ CLASS zcl_abapgit_git_porcelain DEFINITION
io_stage TYPE REF TO zcl_abapgit_stage io_stage TYPE REF TO zcl_abapgit_stage
RETURNING VALUE(rv_branch) TYPE zif_abapgit_definitions=>ty_sha1 RETURNING VALUE(rv_branch) TYPE zif_abapgit_definitions=>ty_sha1
RAISING zcx_abapgit_exception. RAISING zcx_abapgit_exception.
CLASS-METHODS receive_pack_create_tag
IMPORTING is_tag TYPE zif_abapgit_definitions=>ty_git_tag
io_repo TYPE REF TO zcl_abapgit_repo_online
RAISING zcx_abapgit_exception.
ENDCLASS. ENDCLASS.
CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION. CLASS zcl_abapgit_git_porcelain IMPLEMENTATION.
METHOD build_trees. METHOD build_trees.
@ -202,20 +208,36 @@ CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION.
DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
lv_pack TYPE xstring. lv_pack TYPE xstring.
IF iv_name CS ` `. IF is_tag-name CS ` `.
zcx_abapgit_exception=>raise( 'Tag name cannot contain blank spaces' ). zcx_abapgit_exception=>raise( 'Tag name cannot contain blank spaces' ).
ENDIF. ENDIF.
" It the message is filled we must create an annotated tag.
" Otherwise a lightweight tag is created
IF is_tag-message IS NOT INITIAL.
receive_pack_create_tag(
is_tag = is_tag
io_repo = io_repo ).
rv_created_tag_type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag.
ELSE.
* "client MUST send an empty packfile" * "client MUST send an empty packfile"
* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 * https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514
lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
zcl_abapgit_git_transport=>receive_pack( zcl_abapgit_git_transport=>receive_pack(
iv_url = io_repo->get_url( ) iv_url = io_repo->get_url( )
iv_old = c_zero iv_old = c_zero
iv_new = iv_from iv_new = io_repo->get_sha1_local( )
iv_branch_name = iv_name iv_branch_name = is_tag-name
iv_pack = lv_pack ). iv_pack = lv_pack ).
rv_created_tag_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag.
ENDIF.
ENDMETHOD. ENDMETHOD.
@ -435,16 +457,16 @@ CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION.
lt_trees = build_trees( lt_expanded ). lt_trees = build_trees( lt_expanded ).
ev_branch = receive_pack( is_comment = is_comment ev_branch = receive_pack_push( is_comment = is_comment
io_repo = io_repo io_repo = io_repo
it_trees = lt_trees it_trees = lt_trees
it_blobs = lt_blobs it_blobs = lt_blobs
io_stage = io_stage ). io_stage = io_stage ).
ENDMETHOD. "push ENDMETHOD. "push
METHOD receive_pack. METHOD receive_pack_push.
DATA: lv_time TYPE zcl_abapgit_time=>ty_unixtime, DATA: lv_time TYPE zcl_abapgit_time=>ty_unixtime,
lv_commit TYPE xstring, lv_commit TYPE xstring,
@ -630,4 +652,49 @@ CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION.
ENDLOOP. ENDLOOP.
ENDMETHOD. ENDMETHOD.
METHOD receive_pack_create_tag.
DATA: lv_tag TYPE xstring,
lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
lv_pack TYPE xstring,
lt_files TYPE zif_abapgit_definitions=>ty_files_tt,
ls_object LIKE LINE OF lt_objects,
ls_tag TYPE zcl_abapgit_git_pack=>ty_tag,
lv_new_tag_sha1 TYPE zif_abapgit_definitions=>ty_sha1.
* new tag
ls_tag-object = is_tag-sha1.
ls_tag-type = zif_abapgit_definitions=>gc_type-commit.
ls_tag-tag = is_tag-name.
ls_tag-tagger_name = is_tag-tagger_name.
ls_tag-tagger_email = is_tag-tagger_email.
ls_tag-message = is_tag-message
&& |{ zif_abapgit_definitions=>gc_newline }|
&& |{ zif_abapgit_definitions=>gc_newline }|
&& is_tag-body.
lv_tag = zcl_abapgit_git_pack=>encode_tag( ls_tag ).
lv_new_tag_sha1 = zcl_abapgit_hash=>sha1(
iv_type = zif_abapgit_definitions=>gc_type-tag
iv_data = lv_tag ).
CLEAR ls_object.
ls_object-sha1 = lv_new_tag_sha1.
ls_object-type = zif_abapgit_definitions=>gc_type-tag.
ls_object-data = lv_tag.
APPEND ls_object TO lt_objects.
lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
zcl_abapgit_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = c_zero
iv_new = lv_new_tag_sha1
iv_branch_name = is_tag-name
iv_pack = lv_pack ).
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -57,7 +57,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION. CLASS zcl_abapgit_git_transport IMPLEMENTATION.
METHOD branches. METHOD branches.
@ -209,6 +209,8 @@ CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION.
zcx_abapgit_exception=>raise( 'funny refname' ). zcx_abapgit_exception=>raise( 'funny refname' ).
ELSEIF lv_string CP '*failed to update ref*'. ELSEIF lv_string CP '*failed to update ref*'.
zcx_abapgit_exception=>raise( 'failed to update ref' ). zcx_abapgit_exception=>raise( 'failed to update ref' ).
ELSEIF lv_string CP '*missing necessary objects*'.
zcx_abapgit_exception=>raise( 'missing necessary objects' ).
ENDIF. ENDIF.
ENDMETHOD. "receive_pack ENDMETHOD. "receive_pack

View File

@ -7,21 +7,22 @@ CLASS zcl_abapgit_tag DEFINITION
CLASS-METHODS: CLASS-METHODS:
add_tag_prefix add_tag_prefix
IMPORTING IMPORTING
!iv_text TYPE csequence iv_text TYPE csequence
RETURNING RETURNING
VALUE(rv_text) TYPE string, VALUE(rv_text) TYPE string,
remove_tag_prefix remove_tag_prefix
IMPORTING IMPORTING
!iv_text TYPE string iv_text TYPE string
RETURNING RETURNING
VALUE(rv_text) TYPE string . VALUE(rv_text) TYPE string.
ENDCLASS. ENDCLASS.
CLASS zcl_abapgit_tag IMPLEMENTATION. CLASS ZCL_ABAPGIT_TAG IMPLEMENTATION.
METHOD add_tag_prefix. METHOD add_tag_prefix.
@ -39,5 +40,4 @@ CLASS zcl_abapgit_tag IMPLEMENTATION.
WITH ''. WITH ''.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -14,9 +14,10 @@ CLASS zcl_abapgit_gui_page_boverview DEFINITION
METHODS render_content REDEFINITION. METHODS render_content REDEFINITION.
PRIVATE SECTION. PRIVATE SECTION.
DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online,
mv_compress TYPE abap_bool VALUE abap_false, mv_compress TYPE abap_bool VALUE abap_false,
mt_commits TYPE zif_abapgit_definitions=>ty_commit_tt. mt_commits TYPE zif_abapgit_definitions=>ty_commit_tt,
mo_branch_overview TYPE REF TO zcl_abapgit_branch_overview.
CONSTANTS: BEGIN OF c_actions, CONSTANTS: BEGIN OF c_actions,
uncompress TYPE string VALUE 'uncompress' ##NO_TEXT, uncompress TYPE string VALUE 'uncompress' ##NO_TEXT,
@ -58,7 +59,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION. CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION.
METHOD body. METHOD body.
@ -234,7 +235,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
lt_branches = zcl_abapgit_branch_overview=>get_branches( ). lt_branches = mo_branch_overview->get_branches( ).
ro_html->add( |<select name="{ iv_name }">| ). ro_html->add( |<select name="{ iv_name }">| ).
LOOP AT lt_branches ASSIGNING <ls_branch>. LOOP AT lt_branches ASSIGNING <ls_branch>.
@ -248,9 +249,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION.
METHOD refresh. METHOD refresh.
mt_commits = zcl_abapgit_branch_overview=>run( mo_repo ). mo_branch_overview = zcl_abapgit_branch_overview=>run( mo_repo ).
mt_commits = mo_branch_overview->get_commits( ).
IF mv_compress = abap_true. IF mv_compress = abap_true.
mt_commits = zcl_abapgit_branch_overview=>compress( mt_commits ). mt_commits = mo_branch_overview->compress( mt_commits ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.

View File

@ -0,0 +1,254 @@
CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL
CREATE PUBLIC INHERITING FROM zcl_abapgit_gui_page.
PUBLIC SECTION.
CONSTANTS: BEGIN OF c_action,
commit_post TYPE string VALUE 'commit_post',
commit_cancel TYPE string VALUE 'commit_cancel',
END OF c_action.
METHODS:
constructor
IMPORTING io_repo TYPE REF TO zcl_abapgit_repo
RAISING zcx_abapgit_exception,
zif_abapgit_gui_page~on_event REDEFINITION.
PROTECTED SECTION.
METHODS:
render_content REDEFINITION,
scripts REDEFINITION.
PRIVATE SECTION.
DATA: mo_repo_online TYPE REF TO zcl_abapgit_repo_online.
METHODS:
render_menu
RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html,
render_form
RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html
RAISING zcx_abapgit_exception,
render_text_input
IMPORTING iv_name TYPE string
iv_label TYPE string
iv_value TYPE string OPTIONAL
iv_max_length TYPE string OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html,
create_tag
IMPORTING
it_postdata TYPE cnht_post_data_tab
RAISING
zcx_abapgit_exception.
ENDCLASS.
CLASS zcl_abapgit_gui_page_tag IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
mo_repo_online ?= io_repo.
ms_control-page_title = 'TAG'.
ENDMETHOD.
METHOD render_content.
CREATE OBJECT ro_html.
ro_html->add( '<div class="repo">' ).
ro_html->add( render_menu( ) ).
ro_html->add( render_form( ) ).
ro_html->add( '</div>' ).
ENDMETHOD. "render_content
METHOD render_form.
CONSTANTS: lc_body_col_max TYPE i VALUE 150.
DATA: lo_user TYPE REF TO zcl_abapgit_persistence_user,
lv_user TYPE string,
lv_email TYPE string,
lv_s_param TYPE string,
lo_settings TYPE REF TO zcl_abapgit_settings,
lv_body_size TYPE i.
lo_user = zcl_abapgit_persistence_user=>get_instance( ).
lv_user = lo_user->get_repo_git_user_name( mo_repo_online->get_url( ) ).
IF lv_user IS INITIAL.
lv_user = lo_user->get_default_git_user_name( ).
ENDIF.
IF lv_user IS INITIAL.
" get default from user master record
lv_user = zcl_abapgit_user_master_record=>get_instance( sy-uname )->get_name( ).
ENDIF.
lv_email = lo_user->get_repo_git_user_email( mo_repo_online->get_url( ) ).
IF lv_email IS INITIAL.
lv_email = lo_user->get_default_git_user_email( ).
ENDIF.
IF lv_email IS INITIAL.
" get default from user master record
lv_email = zcl_abapgit_user_master_record=>get_instance( sy-uname )->get_email( ).
ENDIF.
CREATE OBJECT ro_html.
ro_html->add( |<h3>If comment and body are empty a lightweight tag will be created, |
&& |otherwise an annotated tag.</h3>| ).
ro_html->add( '<div class="form-container">' ).
ro_html->add( '<form id="commit_form" class="aligned-form"'
&& ' method="post" action="sapevent:commit_post">' ).
ro_html->add( render_text_input( iv_name = 'sha1'
iv_label = 'SHA1'
iv_value = mo_repo_online->get_sha1_local( ) ) ).
ro_html->add( render_text_input( iv_name = 'name'
iv_label = 'tag name' ) ).
ro_html->add( render_text_input( iv_name = 'tagger_name'
iv_label = 'tagger name'
iv_value = lv_user ) ).
ro_html->add( render_text_input( iv_name = 'tagger_email'
iv_label = 'tagger e-mail'
iv_value = lv_email ) ).
lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ).
lv_s_param = lo_settings->get_commitmsg_comment_length( ).
ro_html->add( render_text_input( iv_name = 'message'
iv_label = 'message'
iv_max_length = lv_s_param ) ).
ro_html->add( '<div class="row">' ).
ro_html->add( '<label for="c-body">body</label>' ).
lv_body_size = lo_settings->get_commitmsg_body_size( ).
IF lv_body_size > lc_body_col_max.
lv_body_size = lc_body_col_max.
ENDIF.
ro_html->add( |<textarea id="c-body" name="body" rows="10" cols="| &&
|{ lv_body_size }"></textarea>| ).
ro_html->add( '<input type="submit" class="hidden-submit">' ).
ro_html->add( '</div>' ).
ro_html->add( '</form>' ).
ro_html->add( '</div>' ).
ENDMETHOD. "render_form
METHOD render_menu.
DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
CREATE OBJECT ro_html.
CREATE OBJECT lo_toolbar.
lo_toolbar->add( iv_act = 'submitFormById(''commit_form'');'
iv_txt = 'Create'
iv_typ = zif_abapgit_definitions=>gc_action_type-onclick
iv_opt = zif_abapgit_definitions=>gc_html_opt-strong ) ##NO_TEXT.
lo_toolbar->add( iv_act = c_action-commit_cancel
iv_txt = 'Cancel'
iv_opt = zif_abapgit_definitions=>gc_html_opt-cancel ) ##NO_TEXT.
ro_html->add( '<div class="paddings">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
ENDMETHOD. "render_menu
METHOD render_text_input.
DATA lv_attrs TYPE string.
CREATE OBJECT ro_html.
IF iv_value IS NOT INITIAL.
lv_attrs = | value="{ iv_value }"|.
ENDIF.
IF iv_max_length IS NOT INITIAL.
lv_attrs = | maxlength="{ iv_max_length }"|.
ENDIF.
ro_html->add( '<div class="row">' ).
ro_html->add( |<label for="{ iv_name }">{ iv_label }</label>| ).
ro_html->add( |<input id="{ iv_name }" name="{ iv_name }" type="text"{ lv_attrs }>| ).
ro_html->add( '</div>' ).
ENDMETHOD. " render_text_input
METHOD scripts.
CREATE OBJECT ro_html.
ro_html->add( 'setInitialFocus("tag_name");' ).
ENDMETHOD. "scripts
METHOD zif_abapgit_gui_page~on_event.
CASE iv_action.
WHEN c_action-commit_post.
create_tag( it_postdata ).
ev_state = zif_abapgit_definitions=>gc_event_state-go_back.
WHEN c_action-commit_cancel.
ev_state = zif_abapgit_definitions=>gc_event_state-go_back.
ENDCASE.
ENDMETHOD.
METHOD create_tag.
DATA:
ls_tag TYPE zif_abapgit_definitions=>ty_git_tag,
lx_error TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string,
lv_tag_type TYPE zif_abapgit_definitions=>ty_git_branch_type.
zcl_abapgit_html_action_utils=>parse_tag_request(
EXPORTING it_postdata = it_postdata
IMPORTING es_fields = ls_tag ).
ls_tag-name = zcl_abapgit_tag=>add_tag_prefix( ls_tag-name ).
ASSERT ls_tag-name CP 'refs/tags/+*'.
TRY.
lv_tag_type = zcl_abapgit_git_porcelain=>create_tag( io_repo = mo_repo_online
is_tag = ls_tag ).
CATCH zcx_abapgit_exception INTO lx_error.
zcx_abapgit_exception=>raise( |Cannot create tag { ls_tag-name }. Error: '{ lx_error->get_text( ) }'| ).
ENDTRY.
IF lv_tag_type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag.
lv_text = |Lightweight tag { zcl_abapgit_tag=>remove_tag_prefix( ls_tag-name ) } created| ##NO_TEXT.
ELSE.
lv_text = |Annotated tag { zcl_abapgit_tag=>remove_tag_prefix( ls_tag-name ) } created| ##NO_TEXT.
ENDIF.
MESSAGE lv_text TYPE 'S'.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_GUI_PAGE_TAG</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>GUI - Commit page</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSFINAL>X</CLSFINAL>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -44,7 +44,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. CLASS zcl_abapgit_gui_router IMPLEMENTATION.
METHOD get_page_background. METHOD get_page_background.
@ -341,9 +341,10 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
zcl_abapgit_services_git=>tag_overview( lv_key ). zcl_abapgit_services_git=>tag_overview( lv_key ).
ev_state = zif_abapgit_definitions=>gc_event_state-re_render. ev_state = zif_abapgit_definitions=>gc_event_state-re_render.
WHEN zif_abapgit_definitions=>gc_action-git_tag_create. " GIT Tag create WHEN zif_abapgit_definitions=>gc_action-git_tag_create. " GIT Tag create
zcl_abapgit_services_git=>create_tag( lv_key ). CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_tag
zcl_abapgit_services_repo=>refresh( lv_key ). EXPORTING
ev_state = zif_abapgit_definitions=>gc_event_state-re_render. io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
ev_state = zif_abapgit_definitions=>gc_event_state-new_page.
WHEN zif_abapgit_definitions=>gc_action-git_tag_delete. " GIT Tag create WHEN zif_abapgit_definitions=>gc_action-git_tag_delete. " GIT Tag create
zcl_abapgit_services_git=>delete_tag( lv_key ). zcl_abapgit_services_git=>delete_tag( lv_key ).
zcl_abapgit_services_repo=>refresh( lv_key ). zcl_abapgit_services_repo=>refresh( lv_key ).

View File

@ -96,6 +96,11 @@ CLASS zcl_abapgit_html_action_utils DEFINITION
!it_postdata TYPE cnht_post_data_tab !it_postdata TYPE cnht_post_data_tab
EXPORTING EXPORTING
!es_fields TYPE any . !es_fields TYPE any .
CLASS-METHODS parse_tag_request
IMPORTING
!it_postdata TYPE cnht_post_data_tab
EXPORTING
!es_fields TYPE any .
CLASS-METHODS decode_bg_update CLASS-METHODS decode_bg_update
IMPORTING IMPORTING
!iv_getdata TYPE clike !iv_getdata TYPE clike
@ -118,7 +123,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. CLASS zcl_abapgit_html_action_utils IMPLEMENTATION.
METHOD add_field. METHOD add_field.
@ -430,4 +435,34 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'. REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'.
ENDMETHOD. ENDMETHOD.
METHOD parse_tag_request.
CONSTANTS: lc_replace TYPE string VALUE '<<new>>'.
DATA: lv_string TYPE string,
lt_fields TYPE tihttpnvp.
FIELD-SYMBOLS <lv_body> TYPE string.
CLEAR es_fields.
CONCATENATE LINES OF it_postdata INTO lv_string.
REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_crlf IN lv_string WITH lc_replace.
REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>gc_newline IN lv_string WITH lc_replace.
lt_fields = parse_fields_upper_case_name( lv_string ).
get_field( EXPORTING name = 'SHA1' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'TAGGER_NAME' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'TAGGER_EMAIL' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'MESSAGE' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ).
ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO <lv_body>.
ASSERT <lv_body> IS ASSIGNED.
REPLACE ALL OCCURRENCES OF lc_replace IN <lv_body> WITH zif_abapgit_definitions=>gc_newline.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -37,15 +37,7 @@ CLASS zcl_abapgit_popups DEFINITION
!ev_cancel TYPE abap_bool !ev_cancel TYPE abap_bool
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS create_tag_popup
IMPORTING
!iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1
EXPORTING
!ev_name TYPE string
!ev_sha1 TYPE zif_abapgit_definitions=>ty_sha1
!ev_cancel TYPE abap_bool
RAISING
zcx_abapgit_exception .
CLASS-METHODS run_page_class_popup CLASS-METHODS run_page_class_popup
EXPORTING EXPORTING
!ev_name TYPE string !ev_name TYPE string
@ -66,14 +58,8 @@ CLASS zcl_abapgit_popups DEFINITION
VALUE(rs_branch) TYPE zif_abapgit_definitions=>ty_git_branch VALUE(rs_branch) TYPE zif_abapgit_definitions=>ty_git_branch
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS tag_list_popup
IMPORTING
!iv_url TYPE string
!iv_select_mode TYPE abap_bool DEFAULT abap_true
RETURNING
VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_branch
RAISING
zcx_abapgit_exception .
CLASS-METHODS repo_popup CLASS-METHODS repo_popup
IMPORTING IMPORTING
!iv_url TYPE string !iv_url TYPE string
@ -162,7 +148,7 @@ CLASS zcl_abapgit_popups DEFINITION
PRIVATE SECTION. PRIVATE SECTION.
TYPES: TYPES:
ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY . ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY.
CONSTANTS c_fieldname_selected TYPE lvc_fname VALUE `SELECTED` ##NO_TEXT. CONSTANTS c_fieldname_selected TYPE lvc_fname VALUE `SELECTED` ##NO_TEXT.
CLASS-DATA go_select_list_popup TYPE REF TO cl_salv_table . CLASS-DATA go_select_list_popup TYPE REF TO cl_salv_table .
@ -197,11 +183,12 @@ CLASS zcl_abapgit_popups DEFINITION
!e_salv_function . !e_salv_function .
CLASS-METHODS extract_field_values CLASS-METHODS extract_field_values
IMPORTING IMPORTING
!it_fields TYPE ty_sval_tt it_fields TYPE ty_sval_tt
EXPORTING EXPORTING
!ev_url TYPE abaptxt255-line ev_url TYPE abaptxt255-line
!ev_package TYPE tdevc-devclass ev_package TYPE tdevc-devclass
!ev_branch TYPE textl-line . ev_branch TYPE textl-line .
ENDCLASS. ENDCLASS.
@ -473,75 +460,6 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD create_tag_popup.
DATA: lv_answer TYPE c LENGTH 1,
lt_fields TYPE TABLE OF sval,
lv_exit_while_loop TYPE abap_bool.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
CLEAR: ev_name, ev_cancel, ev_sha1.
add_field( EXPORTING iv_tabname = 'TBDTPPT'
iv_fieldname = 'P_TEXT'
iv_fieldtext = 'SHA'
iv_value = iv_sha1
iv_obligatory = abap_true
CHANGING ct_fields = lt_fields ).
add_field( EXPORTING iv_tabname = 'TEXTL'
iv_fieldname = 'LINE'
iv_fieldtext = 'Name'
iv_obligatory = abap_true
CHANGING ct_fields = lt_fields ).
WHILE lv_exit_while_loop = abap_false.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = 'Create tag'
IMPORTING
returncode = lv_answer
TABLES
fields = lt_fields
EXCEPTIONS
error_in_fields = 1
OTHERS = 2 ##NO_TEXT.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ).
ENDIF.
IF lv_answer = 'A'.
ev_cancel = abap_true.
RETURN.
ENDIF.
READ TABLE lt_fields WITH KEY fieldname = 'P_TEXT'
ASSIGNING <ls_field>.
ASSERT sy-subrc = 0.
ev_sha1 = <ls_field>-value.
READ TABLE lt_fields WITH KEY fieldname = 'LINE'
ASSIGNING <ls_field>.
ASSERT sy-subrc = 0.
IF condense( <ls_field>-value ) CS ` `.
CLEAR: lv_exit_while_loop.
MESSAGE 'Tag name cannot contain blank spaces' TYPE 'S' DISPLAY LIKE 'E'.
CONTINUE.
ENDIF.
ev_name = zcl_abapgit_tag=>add_tag_prefix( <ls_field>-value ).
lv_exit_while_loop = abap_true.
ENDWHILE.
ENDMETHOD.
METHOD extract_field_values. METHOD extract_field_values.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF it_fields. FIELD-SYMBOLS: <ls_field> LIKE LINE OF it_fields.
@ -1358,118 +1276,4 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION.
ENDIF. ENDIF.
ENDMETHOD. "run_page_class_popup ENDMETHOD. "run_page_class_popup
METHOD tag_list_popup.
DATA: lo_branches TYPE REF TO zcl_abapgit_git_branch_list,
lt_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt,
lv_answer TYPE c LENGTH 1,
lt_selection TYPE TABLE OF spopli,
lv_name_with_prefix TYPE string,
lo_alv TYPE REF TO cl_salv_table,
lo_table_header TYPE REF TO cl_salv_form_text,
lo_columns TYPE REF TO cl_salv_columns_table,
lx_alv TYPE REF TO cx_salv_error.
FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection,
<ls_tag> LIKE LINE OF lt_tags.
lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
lt_tags = lo_branches->get_tags_only( ).
IF lines( lt_tags ) = 0.
zcx_abapgit_exception=>raise( `There are no tags for this repository` ).
ENDIF.
IF iv_select_mode = abap_true.
LOOP AT lt_tags ASSIGNING <ls_tag>.
INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING <ls_sel>.
<ls_sel>-varoption = zcl_abapgit_tag=>remove_tag_prefix( <ls_tag>-name ).
ENDLOOP.
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
textline1 = 'Select tag'
titel = 'Select tag'
start_col = 30
start_row = 5
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.
zcx_abapgit_exception=>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.
lv_name_with_prefix = zcl_abapgit_tag=>add_tag_prefix( <ls_sel>-varoption ).
READ TABLE lt_tags ASSIGNING <ls_tag> WITH KEY name = lv_name_with_prefix.
ASSERT sy-subrc = 0.
rs_tag = <ls_tag>.
ELSE.
LOOP AT lt_tags ASSIGNING <ls_tag>.
<ls_tag>-name = zcl_abapgit_tag=>remove_tag_prefix( <ls_tag>-name ).
ENDLOOP.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = lt_tags ).
lo_columns = lo_alv->get_columns( ).
lo_columns->get_column( `TYPE` )->set_technical( ).
lo_columns->get_column( `IS_HEAD` )->set_technical( ).
lo_columns->get_column( `DISPLAY_NAME` )->set_technical( ).
lo_columns->get_column( `SHA1` )->set_output_length( 30 ).
lo_columns->get_column( `SHA1` )->set_medium_text( 'SHA' ).
lo_columns->get_column( `NAME` )->set_medium_text( 'Tag name' ).
lo_columns->set_optimize( ).
lo_alv->set_screen_popup( start_column = 5
end_column = 70
start_line = 5
end_line = 25 ).
CREATE OBJECT lo_table_header
EXPORTING
text = `Tags`.
lo_alv->set_top_of_list( lo_table_header ).
lo_alv->display( ).
CATCH cx_salv_error INTO lx_alv.
zcx_abapgit_exception=>raise( lx_alv->get_text( ) ).
ENDTRY.
ENDIF.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -4,7 +4,6 @@ CLASS zcl_abapgit_services_git DEFINITION
CREATE PUBLIC . CREATE PUBLIC .
PUBLIC SECTION. PUBLIC SECTION.
TYPES: TYPES:
BEGIN OF ty_commit_fields, BEGIN OF ty_commit_fields,
repo_key TYPE zif_abapgit_persistence=>ty_repo-key, repo_key TYPE zif_abapgit_persistence=>ty_repo-key,
@ -14,7 +13,7 @@ CLASS zcl_abapgit_services_git DEFINITION
author_email TYPE string, author_email TYPE string,
comment TYPE string, comment TYPE string,
body TYPE string, body TYPE string,
END OF ty_commit_fields . END OF ty_commit_fields.
CLASS-METHODS pull CLASS-METHODS pull
IMPORTING IMPORTING
@ -46,12 +45,7 @@ CLASS zcl_abapgit_services_git DEFINITION
RAISING RAISING
zcx_abapgit_exception zcx_abapgit_exception
zcx_abapgit_cancel . zcx_abapgit_cancel .
CLASS-METHODS create_tag
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
RAISING
zcx_abapgit_exception
zcx_abapgit_cancel .
CLASS-METHODS delete_tag CLASS-METHODS delete_tag
IMPORTING IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
@ -77,7 +71,8 @@ CLASS zcl_abapgit_services_git DEFINITION
!io_stage TYPE REF TO zcl_abapgit_stage !io_stage TYPE REF TO zcl_abapgit_stage
RAISING RAISING
zcx_abapgit_exception zcx_abapgit_exception
zcx_abapgit_cancel . zcx_abapgit_cancel.
ENDCLASS. ENDCLASS.
@ -157,55 +152,6 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD create_tag.
" Here we create a 'lightweight' tag. Which means that
" the tag only contains the commit checksum but no meta data
"
" Later we probably want to add also 'annotated' tags.
" Which include more detailed information besides the commit. Like message, date and the tagger
"
" https://git-scm.com/book/en/v2/Git-Basics-Tagging
DATA: lv_name TYPE string,
lv_cancel TYPE abap_bool,
lx_error TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string,
lo_repo TYPE REF TO zcl_abapgit_repo_online,
lv_sha1 TYPE zif_abapgit_definitions=>ty_sha1.
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
zcl_abapgit_popups=>create_tag_popup(
EXPORTING
iv_sha1 = lo_repo->get_sha1_local( )
IMPORTING
ev_name = lv_name
ev_sha1 = lv_sha1
ev_cancel = lv_cancel ).
IF lv_cancel = abap_true.
RAISE EXCEPTION TYPE zcx_abapgit_cancel.
ENDIF.
ASSERT lv_name CP 'refs/tags/+*'.
TRY.
zcl_abapgit_git_porcelain=>create_tag( io_repo = lo_repo
iv_name = lv_name
iv_from = lv_sha1 ).
CATCH zcx_abapgit_exception INTO lx_error.
zcx_abapgit_exception=>raise( |Cannot create tag { lv_name }. Error: '{ lx_error->get_text( ) }'| ).
ENDTRY.
lv_text = |Tag { zcl_abapgit_tag=>remove_tag_prefix( lv_name ) } created| ##NO_TEXT.
MESSAGE lv_text TYPE 'S'.
ENDMETHOD.
METHOD delete_branch. METHOD delete_branch.
DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
@ -237,12 +183,12 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION.
METHOD delete_tag. METHOD delete_tag.
DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
ls_tag TYPE zif_abapgit_definitions=>ty_git_branch, ls_tag TYPE zif_abapgit_definitions=>ty_git_tag,
lv_text TYPE string. lv_text TYPE string.
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
ls_tag = zcl_abapgit_popups=>tag_list_popup( lo_repo->get_url( ) ). ls_tag = zcl_abapgit_tag_popups=>tag_select_popup( lo_repo ).
IF ls_tag IS INITIAL. IF ls_tag IS INITIAL.
RAISE EXCEPTION TYPE zcx_abapgit_cancel. RAISE EXCEPTION TYPE zcx_abapgit_cancel.
ENDIF. ENDIF.
@ -361,11 +307,11 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION.
METHOD switch_tag. METHOD switch_tag.
DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
ls_tag TYPE zif_abapgit_definitions=>ty_git_branch. ls_tag TYPE zif_abapgit_definitions=>ty_git_tag.
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
ls_tag = zcl_abapgit_popups=>tag_list_popup( lo_repo->get_url( ) ). ls_tag = zcl_abapgit_tag_popups=>tag_select_popup( lo_repo ).
IF ls_tag IS INITIAL. IF ls_tag IS INITIAL.
RAISE EXCEPTION TYPE zcx_abapgit_cancel. RAISE EXCEPTION TYPE zcx_abapgit_cancel.
ENDIF. ENDIF.
@ -385,8 +331,8 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION.
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
zcl_abapgit_popups=>tag_list_popup( iv_url = lo_repo->get_url( ) zcl_abapgit_tag_popups=>tag_list_popup( io_repo = lo_repo ).
iv_select_mode = abap_false ).
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -0,0 +1,336 @@
CLASS zcl_abapgit_tag_popups DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS:
tag_list_popup
IMPORTING
io_repo TYPE REF TO zcl_abapgit_repo_online
RETURNING
VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag
RAISING
zcx_abapgit_exception,
tag_select_popup
IMPORTING
io_repo TYPE REF TO zcl_abapgit_repo_online
RETURNING
VALUE(rs_tag) TYPE zif_abapgit_definitions=>ty_git_tag
RAISING
zcx_abapgit_exception .
PRIVATE SECTION.
TYPES:
BEGIN OF ty_tag_out.
INCLUDE TYPE zif_abapgit_definitions=>ty_git_tag.
TYPES: body_icon TYPE icon_d,
END OF ty_tag_out,
tty_tag_out TYPE STANDARD TABLE OF ty_tag_out
WITH NON-UNIQUE DEFAULT KEY.
CLASS-DATA:
mt_tags TYPE tty_tag_out,
mo_docking_container TYPE REF TO cl_gui_docking_container,
mo_text_control TYPE REF TO cl_gui_textedit.
CLASS-METHODS:
on_double_click FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column,
prepare_tags_for_display
IMPORTING
it_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt
RETURNING
VALUE(rt_tags_out) TYPE zcl_abapgit_tag_popups=>tty_tag_out,
clean_up,
show_docking_container_with
IMPORTING
iv_text TYPE string.
ENDCLASS.
CLASS zcl_abapgit_tag_popups IMPLEMENTATION.
METHOD on_double_click.
FIELD-SYMBOLS: <ls_tag> TYPE zcl_abapgit_tag_popups=>ty_tag_out.
READ TABLE mt_tags ASSIGNING <ls_tag>
INDEX row.
IF sy-subrc <> 0 OR <ls_tag>-body IS INITIAL.
RETURN.
ENDIF.
show_docking_container_with( <ls_tag>-body ).
ENDMETHOD.
METHOD prepare_tags_for_display.
DATA: ls_tag_out LIKE LINE OF rt_tags_out.
FIELD-SYMBOLS: <ls_tag> TYPE zif_abapgit_definitions=>ty_git_tag.
LOOP AT it_tags ASSIGNING <ls_tag>.
CLEAR: ls_tag_out.
MOVE-CORRESPONDING <ls_tag> TO ls_tag_out.
ls_tag_out-name = zcl_abapgit_tag=>remove_tag_prefix( ls_tag_out-name ).
IF ls_tag_out-body IS NOT INITIAL.
ls_tag_out-body_icon = |{ icon_display_text }|.
ENDIF.
INSERT ls_tag_out INTO TABLE rt_tags_out.
ENDLOOP.
ENDMETHOD.
METHOD tag_list_popup.
DATA: lo_alv TYPE REF TO cl_salv_table,
lo_table_header TYPE REF TO cl_salv_form_header_info,
lo_columns TYPE REF TO cl_salv_columns_table,
lx_alv TYPE REF TO cx_salv_error,
lt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt,
lo_event TYPE REF TO cl_salv_events_table.
CLEAR: mt_tags.
lt_tags = zcl_abapgit_branch_overview=>run( io_repo = io_repo )->get_tags( ).
IF lines( lt_tags ) = 0.
zcx_abapgit_exception=>raise( `There are no tags for this repository` ).
ENDIF.
mt_tags = prepare_tags_for_display( lt_tags ).
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = mt_tags ).
lo_columns = lo_alv->get_columns( ).
lo_columns->get_column( `TYPE` )->set_technical( ).
lo_columns->get_column( `DISPLAY_NAME` )->set_technical( ).
lo_columns->get_column( `BODY` )->set_technical( ).
lo_columns->get_column( `NAME` )->set_medium_text( 'Tag name' ).
lo_columns->set_column_position( columnname = 'NAME'
position = 1 ).
lo_columns->get_column( `TAGGER_NAME` )->set_medium_text( 'Tagger' ).
lo_columns->set_column_position( columnname = 'TAGGER_NAME'
position = 2 ).
lo_columns->get_column( `TAGGER_EMAIL` )->set_medium_text( 'Tagger E-Mail' ).
lo_columns->set_column_position( columnname = 'TAGGER_EMAIL'
position = 3 ).
lo_columns->get_column( `MESSAGE` )->set_medium_text( 'Tag message' ).
lo_columns->set_column_position( columnname = 'MESSAGE'
position = 4 ).
lo_columns->get_column( `BODY_ICON` )->set_medium_text( 'Body' ).
lo_columns->get_column( `BODY_ICON` )->set_output_length( 4 ).
lo_columns->set_column_position( columnname = 'BODY_ICON'
position = 5 ).
lo_columns->get_column( `SHA1` )->set_output_length( 15 ).
lo_columns->get_column( `SHA1` )->set_medium_text( 'SHA' ).
lo_columns->set_column_position( columnname = 'SHA1'
position = 6 ).
lo_columns->get_column( `OBJECT` )->set_output_length( 15 ).
lo_columns->get_column( `OBJECT` )->set_medium_text( 'Object' ).
lo_columns->set_column_position( columnname = 'OBJECT'
position = 7 ).
lo_columns->set_optimize( ).
lo_alv->set_screen_popup( start_column = 7
end_column = 200
start_line = 1
end_line = 25 ).
CREATE OBJECT lo_table_header
EXPORTING
text = `Tags`.
lo_alv->set_top_of_list( lo_table_header ).
lo_event = lo_alv->get_event( ).
SET HANDLER on_double_click FOR lo_event.
lo_alv->display( ).
CATCH cx_salv_error INTO lx_alv.
zcx_abapgit_exception=>raise( lx_alv->get_text( ) ).
ENDTRY.
clean_up( ).
ENDMETHOD.
METHOD tag_select_popup.
DATA: lt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt,
lv_answer TYPE c LENGTH 1,
lt_selection TYPE TABLE OF spopli,
lv_name_with_prefix TYPE string.
FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection,
<ls_tag> LIKE LINE OF lt_tags.
lt_tags = zcl_abapgit_branch_overview=>run( io_repo = io_repo )->get_tags( ).
IF lines( lt_tags ) = 0.
zcx_abapgit_exception=>raise( `There are no tags for this repository` ).
ENDIF.
LOOP AT lt_tags ASSIGNING <ls_tag>.
INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING <ls_sel>.
<ls_sel>-varoption = zcl_abapgit_tag=>remove_tag_prefix( <ls_tag>-name ).
ENDLOOP.
CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
EXPORTING
textline1 = 'Select tag'
titel = 'Select tag'
start_col = 30
start_row = 5
IMPORTING
answer = lv_answer
TABLES
t_spopli = lt_selection
EXCEPTIONS
not_enough_answers = 1
too_much_answers = 2
too_much_marks = 3
OTHERS = 4.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Error from POPUP_TO_DECIDE_LIST' ).
ENDIF.
IF lv_answer = 'A'.
RETURN.
ENDIF.
READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
ASSERT sy-subrc = 0.
lv_name_with_prefix = zcl_abapgit_tag=>add_tag_prefix( <ls_sel>-varoption ).
READ TABLE lt_tags ASSIGNING <ls_tag> WITH KEY name = lv_name_with_prefix.
ASSERT sy-subrc = 0.
rs_tag = <ls_tag>.
ENDMETHOD.
METHOD clean_up.
IF mo_text_control IS BOUND.
mo_text_control->finalize( ).
mo_text_control->free(
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3 ).
ASSERT sy-subrc = 0.
CLEAR: mo_text_control.
ENDIF.
IF mo_docking_container IS BOUND.
mo_docking_container->finalize( ).
mo_docking_container->free(
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3 ).
ASSERT sy-subrc = 0.
CLEAR: mo_docking_container.
ENDIF.
ENDMETHOD.
METHOD show_docking_container_with.
IF mo_docking_container IS NOT BOUND.
CREATE OBJECT mo_docking_container
EXPORTING
side = cl_gui_docking_container=>dock_at_bottom
extension = 120
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
ASSERT sy-subrc = 0.
ENDIF.
IF mo_text_control IS NOT BOUND.
CREATE OBJECT mo_text_control
EXPORTING
parent = mo_docking_container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
OTHERS = 6.
ASSERT sy-subrc = 0.
mo_text_control->set_readonly_mode(
EXCEPTIONS
error_cntl_call_method = 1
invalid_parameter = 2
OTHERS = 3 ).
ASSERT sy-subrc = 0.
ENDIF.
mo_text_control->set_textstream(
EXPORTING
text = iv_text
EXCEPTIONS
error_cntl_call_method = 1
not_supported_by_gui = 2
OTHERS = 3 ).
ASSERT sy-subrc = 0.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_TAG_POPUPS</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>Popups</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSFINAL>X</CLSFINAL>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -1,24 +1,40 @@
CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC FINAL CREATE PUBLIC. CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC FINAL CREATE PRIVATE.
PUBLIC SECTION. PUBLIC SECTION.
CLASS-METHODS: run CLASS-METHODS: run
IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online
RETURNING VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt RETURNING VALUE(ro_branch_overview) TYPE REF TO zcl_abapgit_branch_overview
RAISING zcx_abapgit_exception. RAISING zcx_abapgit_exception.
CLASS-METHODS: compress
IMPORTING it_commits TYPE zif_abapgit_definitions=>ty_commit_tt
RETURNING VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt
RAISING zcx_abapgit_exception.
CLASS-METHODS: get_branches METHODS:
RETURNING VALUE(rt_branches) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt. constructor
IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online
RAISING zcx_abapgit_exception,
get_branches
RETURNING VALUE(rt_branches) TYPE zif_abapgit_definitions=>ty_git_branch_list_tt,
get_tags
RETURNING VALUE(rt_tags) TYPE zif_abapgit_definitions=>ty_git_tag_list_tt,
get_commits
RETURNING
VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt,
compress
IMPORTING it_commits TYPE zif_abapgit_definitions=>ty_commit_tt
RETURNING VALUE(rt_commits) TYPE zif_abapgit_definitions=>ty_commit_tt
RAISING zcx_abapgit_exception.
PRIVATE SECTION. PRIVATE SECTION.
METHODS:
CLASS-METHODS:
parse_commits parse_commits
IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
RAISING zcx_abapgit_exception, RAISING zcx_abapgit_exception,
parse_annotated_tags
IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
RAISING zcx_abapgit_exception,
determine_branch determine_branch
RAISING zcx_abapgit_exception, RAISING zcx_abapgit_exception,
determine_merges determine_merges
@ -32,15 +48,17 @@ CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC FINAL CREATE PUBLIC.
determine_tags determine_tags
RAISING zcx_abapgit_exception. RAISING zcx_abapgit_exception.
CLASS-DATA: DATA:
gt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, mo_repo TYPE REF TO zcl_abapgit_repo_online,
gt_commits TYPE TABLE OF zif_abapgit_definitions=>ty_commit, mt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt,
gt_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt. mt_commits TYPE TABLE OF zif_abapgit_definitions=>ty_commit,
mt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt.
ENDCLASS. ENDCLASS.
CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. CLASS zcl_abapgit_branch_overview IMPLEMENTATION.
METHOD compress. METHOD compress.
@ -64,13 +82,13 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
lv_name TYPE string, lv_name TYPE string,
lt_temp LIKE it_commits. lt_temp LIKE it_commits.
FIELD-SYMBOLS: <ls_branch> LIKE LINE OF gt_branches, FIELD-SYMBOLS: <ls_branch> LIKE LINE OF mt_branches,
<ls_new> LIKE LINE OF rt_commits, <ls_new> LIKE LINE OF rt_commits,
<ls_temp> LIKE LINE OF lt_temp, <ls_temp> LIKE LINE OF lt_temp,
<ls_commit> LIKE LINE OF it_commits. <ls_commit> LIKE LINE OF it_commits.
LOOP AT gt_branches ASSIGNING <ls_branch>. LOOP AT mt_branches ASSIGNING <ls_branch>.
CLEAR lt_temp. CLEAR lt_temp.
lv_name = <ls_branch>-name+11. lv_name = <ls_branch>-name+11.
@ -105,31 +123,56 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD constructor.
DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt.
mo_repo = io_repo.
CLEAR mt_branches.
CLEAR mt_commits.
lt_objects = get_git_objects( io_repo ).
parse_commits( lt_objects ).
parse_annotated_tags( lt_objects ).
CLEAR lt_objects.
determine_branch( ).
determine_merges( ).
determine_tags( ).
fixes( ).
SORT mt_commits BY time ASCENDING.
ENDMETHOD.
METHOD determine_branch. METHOD determine_branch.
CONSTANTS: lc_head TYPE string VALUE 'HEAD'. CONSTANTS: lc_head TYPE string VALUE 'HEAD'.
DATA: lv_name TYPE string. DATA: lv_name TYPE string.
FIELD-SYMBOLS: <ls_branch> LIKE LINE OF gt_branches, FIELD-SYMBOLS: <ls_branch> LIKE LINE OF mt_branches,
<ls_head> LIKE LINE OF gt_branches, <ls_head> LIKE LINE OF mt_branches,
<ls_commit> LIKE LINE OF gt_commits, <ls_commit> LIKE LINE OF mt_commits,
<ls_create> LIKE LINE OF <ls_commit>-create. <ls_create> LIKE LINE OF <ls_commit>-create.
* exchange HEAD, and make sure the branch determination starts with the HEAD branch * exchange HEAD, and make sure the branch determination starts with the HEAD branch
READ TABLE gt_branches ASSIGNING <ls_head> WITH KEY name = lc_head. READ TABLE mt_branches ASSIGNING <ls_head> WITH KEY name = lc_head.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
LOOP AT gt_branches ASSIGNING <ls_branch> LOOP AT mt_branches ASSIGNING <ls_branch>
WHERE sha1 = <ls_head>-sha1 AND name <> lc_head. WHERE sha1 = <ls_head>-sha1 AND name <> lc_head.
<ls_head>-name = <ls_branch>-name. <ls_head>-name = <ls_branch>-name.
DELETE gt_branches INDEX sy-tabix. DELETE mt_branches INDEX sy-tabix.
EXIT. EXIT.
ENDLOOP. ENDLOOP.
LOOP AT gt_branches ASSIGNING <ls_branch>. LOOP AT mt_branches ASSIGNING <ls_branch>.
lv_name = <ls_branch>-name+11. lv_name = <ls_branch>-name+11.
READ TABLE gt_commits ASSIGNING <ls_commit> WITH KEY sha1 = <ls_branch>-sha1. READ TABLE mt_commits ASSIGNING <ls_commit> WITH KEY sha1 = <ls_branch>-sha1.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
DO. DO.
@ -145,7 +188,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
IF <ls_commit>-parent1 IS INITIAL. IF <ls_commit>-parent1 IS INITIAL.
EXIT. EXIT.
ELSE. ELSE.
READ TABLE gt_commits ASSIGNING <ls_commit> READ TABLE mt_commits ASSIGNING <ls_commit>
WITH KEY sha1 = <ls_commit>-parent1. WITH KEY sha1 = <ls_commit>-parent1.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
ENDIF. ENDIF.
@ -158,24 +201,24 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
METHOD determine_merges. METHOD determine_merges.
FIELD-SYMBOLS: <ls_merged> LIKE LINE OF gt_commits, FIELD-SYMBOLS: <ls_merged> LIKE LINE OF mt_commits,
<ls_commit> LIKE LINE OF gt_commits. <ls_commit> LIKE LINE OF mt_commits.
* important: start with the newest first and propagate branches * important: start with the newest first and propagate branches
SORT gt_commits BY time DESCENDING. SORT mt_commits BY time DESCENDING.
LOOP AT gt_commits ASSIGNING <ls_commit> WHERE NOT parent2 IS INITIAL. LOOP AT mt_commits ASSIGNING <ls_commit> WHERE NOT parent2 IS INITIAL.
ASSERT NOT <ls_commit>-branch IS INITIAL. ASSERT NOT <ls_commit>-branch IS INITIAL.
READ TABLE gt_commits ASSIGNING <ls_merged> WITH KEY sha1 = <ls_commit>-parent2. READ TABLE mt_commits ASSIGNING <ls_merged> WITH KEY sha1 = <ls_commit>-parent2.
IF sy-subrc = 0. IF sy-subrc = 0.
<ls_commit>-merge = <ls_merged>-branch. <ls_commit>-merge = <ls_merged>-branch.
* orphaned, branch has been deleted after merge * orphaned, branch has been deleted after merge
WHILE <ls_merged>-branch IS INITIAL. WHILE <ls_merged>-branch IS INITIAL.
<ls_merged>-branch = <ls_commit>-branch. <ls_merged>-branch = <ls_commit>-branch.
READ TABLE gt_commits ASSIGNING <ls_merged> WITH KEY sha1 = <ls_merged>-parent1. READ TABLE mt_commits ASSIGNING <ls_merged> WITH KEY sha1 = <ls_merged>-parent1.
IF sy-subrc <> 0. IF sy-subrc <> 0.
EXIT. EXIT.
ENDIF. ENDIF.
@ -190,13 +233,19 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
DATA: lv_tag TYPE LINE OF zif_abapgit_definitions=>ty_commit-tags. DATA: lv_tag TYPE LINE OF zif_abapgit_definitions=>ty_commit-tags.
FIELD-SYMBOLS: <ls_tag> TYPE zif_abapgit_definitions=>ty_git_branch, FIELD-SYMBOLS: <ls_tag> LIKE LINE OF mt_tags,
<ls_commit> TYPE zif_abapgit_definitions=>ty_commit. <ls_commit> LIKE LINE OF mt_commits.
LOOP AT gt_tags ASSIGNING <ls_tag>. LOOP AT mt_tags ASSIGNING <ls_tag>.
IF <ls_tag>-type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag.
READ TABLE mt_commits WITH KEY sha1 = <ls_tag>-sha1
ASSIGNING <ls_commit>.
ELSEIF <ls_tag>-type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag.
READ TABLE mt_commits WITH KEY sha1 = <ls_tag>-object
ASSIGNING <ls_commit>.
ENDIF.
READ TABLE gt_commits WITH KEY sha1 = <ls_tag>-sha1
ASSIGNING <ls_commit>.
CHECK sy-subrc = 0. CHECK sy-subrc = 0.
lv_tag = zcl_abapgit_tag=>remove_tag_prefix( <ls_tag>-name ). lv_tag = zcl_abapgit_tag=>remove_tag_prefix( <ls_tag>-name ).
@ -209,10 +258,10 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
METHOD fixes. METHOD fixes.
FIELD-SYMBOLS: <ls_commit> LIKE LINE OF gt_commits. FIELD-SYMBOLS: <ls_commit> LIKE LINE OF mt_commits.
LOOP AT gt_commits ASSIGNING <ls_commit> WHERE NOT merge IS INITIAL. LOOP AT mt_commits ASSIGNING <ls_commit> WHERE NOT merge IS INITIAL.
* commits from old branches * commits from old branches
IF <ls_commit>-branch = <ls_commit>-merge. IF <ls_commit>-branch = <ls_commit>-merge.
CLEAR <ls_commit>-merge. CLEAR <ls_commit>-merge.
@ -223,15 +272,24 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
METHOD get_branches. METHOD get_branches.
rt_branches = gt_branches. rt_branches = mt_branches.
ENDMETHOD.
METHOD get_commits.
rt_commits = mt_commits.
ENDMETHOD. ENDMETHOD.
METHOD get_git_objects. METHOD get_git_objects.
DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list, DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list,
lo_progress TYPE REF TO zcl_abapgit_progress. lo_progress TYPE REF TO zcl_abapgit_progress,
lt_branches_and_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt,
lt_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt,
ls_tag LIKE LINE OF mt_tags.
FIELD-SYMBOLS: <ls_branch> TYPE zif_abapgit_definitions=>ty_git_branch.
CREATE OBJECT lo_progress CREATE OBJECT lo_progress
EXPORTING EXPORTING
@ -248,15 +306,23 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
lo_branch_list = zcl_abapgit_git_transport=>branches( io_repo->get_url( ) ). lo_branch_list = zcl_abapgit_git_transport=>branches( io_repo->get_url( ) ).
gt_branches = lo_branch_list->get_branches_only( ). mt_branches = lo_branch_list->get_branches_only( ).
gt_tags = lo_branch_list->get_tags_only( ). INSERT LINES OF mt_branches INTO TABLE lt_branches_and_tags.
lt_tags = lo_branch_list->get_tags_only( ).
INSERT LINES OF lt_tags INTO TABLE lt_branches_and_tags.
LOOP AT lt_tags ASSIGNING <ls_branch>.
MOVE-CORRESPONDING <ls_branch> TO ls_tag.
INSERT ls_tag INTO TABLE mt_tags.
ENDLOOP.
zcl_abapgit_git_transport=>upload_pack( zcl_abapgit_git_transport=>upload_pack(
EXPORTING EXPORTING
iv_url = io_repo->get_url( ) iv_url = io_repo->get_url( )
iv_branch_name = io_repo->get_branch_name( ) iv_branch_name = io_repo->get_branch_name( )
iv_deepen = abap_false iv_deepen = abap_false
it_branches = gt_branches it_branches = lt_branches_and_tags
IMPORTING IMPORTING
et_objects = rt_objects ). et_objects = rt_objects ).
@ -265,9 +331,50 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD get_tags.
rt_tags = mt_tags.
ENDMETHOD.
METHOD parse_annotated_tags.
DATA: ls_raw TYPE zcl_abapgit_git_pack=>ty_tag,
ls_tag LIKE LINE OF mt_tags.
FIELD-SYMBOLS: <ls_object> LIKE LINE OF it_objects,
<ls_tag> LIKE LINE OF mt_tags.
LOOP AT it_objects ASSIGNING <ls_object> WHERE type = zif_abapgit_definitions=>gc_type-tag.
ls_raw = zcl_abapgit_git_pack=>decode_tag( <ls_object>-data ).
CLEAR ls_tag.
ls_tag-sha1 = <ls_object>-sha1.
READ TABLE mt_tags ASSIGNING <ls_tag>
WITH KEY sha1 = <ls_object>-sha1.
ASSERT sy-subrc = 0.
<ls_tag>-name = |refs/tags/{ ls_raw-tag }|.
<ls_tag>-sha1 = <ls_object>-sha1.
<ls_tag>-object = ls_raw-object.
<ls_tag>-type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag.
<ls_tag>-display_name = ls_raw-tag.
<ls_tag>-tagger_name = ls_raw-tagger_name.
<ls_tag>-tagger_email = ls_raw-tagger_email.
<ls_tag>-message = ls_raw-message.
<ls_tag>-body = ls_raw-body.
ENDLOOP.
ENDMETHOD.
METHOD parse_commits. METHOD parse_commits.
DATA: ls_commit LIKE LINE OF gt_commits, DATA: ls_commit LIKE LINE OF mt_commits,
lv_trash TYPE string ##NEEDED, lv_trash TYPE string ##NEEDED,
ls_raw TYPE zcl_abapgit_git_pack=>ty_commit. ls_raw TYPE zcl_abapgit_git_pack=>ty_commit.
@ -291,7 +398,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
ls_commit-email ls_commit-email
ls_commit-time ##NO_TEXT. ls_commit-time ##NO_TEXT.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
APPEND ls_commit TO gt_commits. APPEND ls_commit TO mt_commits.
ENDLOOP. ENDLOOP.
@ -300,24 +407,10 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
METHOD run. METHOD run.
DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. CREATE OBJECT ro_branch_overview
EXPORTING
io_repo = io_repo.
CLEAR gt_branches.
CLEAR gt_commits.
lt_objects = get_git_objects( io_repo ).
parse_commits( lt_objects ).
CLEAR lt_objects.
determine_branch( ).
determine_merges( ).
determine_tags( ).
fixes( ).
SORT gt_commits BY time ASCENDING.
rt_commits = gt_commits.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -7,7 +7,6 @@
<VERSION>1</VERSION> <VERSION>1</VERSION>
<LANGU>E</LANGU> <LANGU>E</LANGU>
<DESCRIPT>Branch Overview</DESCRIPT> <DESCRIPT>Branch Overview</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE> <STATE>1</STATE>
<CLSFINAL>X</CLSFINAL> <CLSFINAL>X</CLSFINAL>
<CLSCCINCL>X</CLSCCINCL> <CLSCCINCL>X</CLSCCINCL>

View File

@ -43,11 +43,28 @@ INTERFACE zif_abapgit_definitions PUBLIC.
TYPES: TYPES:
ty_git_branch_list_tt TYPE STANDARD TABLE OF ty_git_branch WITH DEFAULT KEY . ty_git_branch_list_tt TYPE STANDARD TABLE OF ty_git_branch WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_git_tag,
sha1 TYPE zif_abapgit_definitions=>ty_sha1,
object TYPE zif_abapgit_definitions=>ty_sha1,
name TYPE string,
type TYPE ty_git_branch_type,
display_name TYPE string,
tagger_name TYPE string,
tagger_email TYPE string,
message TYPE string,
body TYPE string,
END OF ty_git_tag .
TYPES:
ty_git_tag_list_tt TYPE STANDARD TABLE OF ty_git_tag WITH DEFAULT KEY .
CONSTANTS: CONSTANTS:
BEGIN OF c_git_branch_type, BEGIN OF c_git_branch_type,
branch TYPE ty_git_branch_type VALUE 'HD', branch TYPE ty_git_branch_type VALUE 'HD',
tag TYPE ty_git_branch_type VALUE 'TG', lightweight_tag TYPE ty_git_branch_type VALUE 'TG',
other TYPE ty_git_branch_type VALUE 'ZZ', annotated_tag TYPE ty_git_branch_type VALUE 'AT',
other TYPE ty_git_branch_type VALUE 'ZZ',
END OF c_git_branch_type . END OF c_git_branch_type .
CONSTANTS c_head_name TYPE string VALUE 'HEAD' ##NO_TEXT. CONSTANTS c_head_name TYPE string VALUE 'HEAD' ##NO_TEXT.