diff --git a/src/git/zcl_abapgit_git_branch_list.clas.abap b/src/git/zcl_abapgit_git_branch_list.clas.abap index 234e13eb4..f451d6f13 100644 --- a/src/git/zcl_abapgit_git_branch_list.clas.abap +++ b/src/git/zcl_abapgit_git_branch_list.clas.abap @@ -187,6 +187,7 @@ CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. REPLACE FIRST OCCURRENCE OF zif_abapgit_definitions=>c_git_branch-heads_prefix IN rv_display_name WITH ''. ELSEIF rv_display_name CP zif_abapgit_definitions=>c_git_branch-tags. REPLACE FIRST OCCURRENCE OF zif_abapgit_definitions=>c_git_branch-prefix IN rv_display_name WITH ''. + rv_display_name = zcl_abapgit_git_tag=>remove_peel( rv_display_name ). ENDIF. ENDMETHOD. @@ -321,8 +322,8 @@ CLASS zcl_abapgit_git_branch_list IMPLEMENTATION. METHOD skip_first_pkt. - DATA: lv_hex TYPE x LENGTH 1, - lv_length TYPE i. + DATA: lv_hex TYPE x LENGTH 1, + lv_length TYPE i. * channel ASSERT iv_data(2) = '00'. diff --git a/src/git/zcl_abapgit_git_porcelain.clas.abap b/src/git/zcl_abapgit_git_porcelain.clas.abap index bf4508ae6..e8c81e21c 100644 --- a/src/git/zcl_abapgit_git_porcelain.clas.abap +++ b/src/git/zcl_abapgit_git_porcelain.clas.abap @@ -176,6 +176,18 @@ CLASS zcl_abapgit_git_porcelain DEFINITION iv_url TYPE string RAISING zcx_abapgit_exception . + CLASS-METHODS delete_annotated_tag + IMPORTING + !iv_url TYPE string + !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag + RAISING + zcx_abapgit_exception . + CLASS-METHODS delete_lightweight_tag + IMPORTING + !iv_url TYPE string + !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -319,40 +331,70 @@ CLASS zcl_abapgit_git_porcelain IMPLEMENTATION. ENDMETHOD. + METHOD delete_annotated_tag. + + DATA: + lo_branches TYPE REF TO zcl_abapgit_git_branch_list, + lv_tag TYPE string, + ls_tag TYPE zif_abapgit_git_definitions=>ty_git_branch, + lt_tags TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt. + + " For annotated tags, find the correct commit + lo_branches = zcl_abapgit_git_transport=>branches( iv_url ). + lt_tags = lo_branches->get_tags_only( ). + lv_tag = zcl_abapgit_git_tag=>remove_peel( is_tag-name ). + + READ TABLE lt_tags INTO ls_tag WITH KEY name_key COMPONENTS name = lv_tag. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Annotated tag { lv_tag } not found| ). + ENDIF. + + zcl_abapgit_git_transport=>receive_pack( + iv_url = iv_url + iv_old = ls_tag-sha1 + iv_new = c_zero + iv_branch_name = ls_tag-name ). + + ENDMETHOD. + + METHOD delete_branch. - DATA: lv_pack TYPE xstring. - - -* "client MUST send an empty packfile" -* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - zcl_abapgit_git_transport=>receive_pack( iv_url = iv_url iv_old = is_branch-sha1 iv_new = c_zero - iv_branch_name = is_branch-name - iv_pack = lv_pack ). + iv_branch_name = is_branch-name ). + + ENDMETHOD. + + + METHOD delete_lightweight_tag. + + zcl_abapgit_git_transport=>receive_pack( + iv_url = iv_url + iv_old = is_tag-sha1 + iv_new = c_zero + iv_branch_name = is_tag-name ). ENDMETHOD. METHOD delete_tag. - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lv_pack TYPE xstring. + IF is_tag-name CS zif_abapgit_definitions=>c_git_branch-peel. + delete_annotated_tag( + is_tag = is_tag + iv_url = iv_url ). -* "client MUST send an empty packfile" -* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + ELSE. - zcl_abapgit_git_transport=>receive_pack( - iv_url = iv_url - iv_old = is_tag-sha1 - iv_new = c_zero - iv_branch_name = is_tag-name - iv_pack = lv_pack ). + delete_lightweight_tag( + is_tag = is_tag + iv_url = iv_url ). + + ENDIF. ENDMETHOD. diff --git a/src/git/zcl_abapgit_git_tag.clas.abap b/src/git/zcl_abapgit_git_tag.clas.abap index 6b0ee2801..48c27a739 100644 --- a/src/git/zcl_abapgit_git_tag.clas.abap +++ b/src/git/zcl_abapgit_git_tag.clas.abap @@ -1,6 +1,6 @@ CLASS zcl_abapgit_git_tag DEFINITION PUBLIC - CREATE PUBLIC . + CREATE PUBLIC. PUBLIC SECTION. @@ -8,19 +8,40 @@ CLASS zcl_abapgit_git_tag DEFINITION IMPORTING !iv_text TYPE csequence RETURNING - VALUE(rv_text) TYPE string . + VALUE(rv_text) TYPE string. + CLASS-METHODS remove_tag_prefix IMPORTING !iv_text TYPE string RETURNING - VALUE(rv_text) TYPE string . + VALUE(rv_text) TYPE string. + + CLASS-METHODS add_peel + IMPORTING + !iv_text TYPE string + RETURNING + VALUE(rv_text) TYPE string. + + CLASS-METHODS remove_peel + IMPORTING + !iv_text TYPE string + RETURNING + VALUE(rv_text) TYPE string. + PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. -CLASS ZCL_ABAPGIT_GIT_TAG IMPLEMENTATION. +CLASS zcl_abapgit_git_tag IMPLEMENTATION. + + + METHOD add_peel. + + rv_text = iv_text && zif_abapgit_definitions=>c_git_branch-peel. + + ENDMETHOD. METHOD add_tag_prefix. @@ -30,6 +51,15 @@ CLASS ZCL_ABAPGIT_GIT_TAG IMPLEMENTATION. ENDMETHOD. + METHOD remove_peel. + + rv_text = iv_text. + + REPLACE zif_abapgit_definitions=>c_git_branch-peel IN rv_text WITH ''. + + ENDMETHOD. + + METHOD remove_tag_prefix. rv_text = iv_text. diff --git a/src/git/zcl_abapgit_git_transport.clas.abap b/src/git/zcl_abapgit_git_transport.clas.abap index 1600378ca..d3f05d80a 100644 --- a/src/git/zcl_abapgit_git_transport.clas.abap +++ b/src/git/zcl_abapgit_git_transport.clas.abap @@ -34,7 +34,7 @@ CLASS zcl_abapgit_git_transport DEFINITION !iv_old TYPE zif_abapgit_git_definitions=>ty_sha1 !iv_new TYPE zif_abapgit_git_definitions=>ty_sha1 !iv_branch_name TYPE string - !iv_pack TYPE xstring + !iv_pack TYPE xstring OPTIONAL RAISING zcx_abapgit_exception . CLASS-METHODS branches @@ -99,7 +99,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION. +CLASS zcl_abapgit_git_transport IMPLEMENTATION. METHOD branches. diff --git a/src/ui/routing/zcl_abapgit_services_git.clas.abap b/src/ui/routing/zcl_abapgit_services_git.clas.abap index 2953255e7..56ef58dc3 100644 --- a/src/ui/routing/zcl_abapgit_services_git.clas.abap +++ b/src/ui/routing/zcl_abapgit_services_git.clas.abap @@ -176,7 +176,7 @@ CLASS zcl_abapgit_services_git IMPLEMENTATION. iv_url = lo_repo->get_url( ) is_tag = ls_tag ). - lv_text = |Tag { zcl_abapgit_git_tag=>remove_tag_prefix( ls_tag-name ) } deleted|. + lv_text = |Tag { ls_tag-display_name } deleted|. MESSAGE lv_text TYPE 'S'. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 56dde2f43..d66b3c435 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -314,6 +314,7 @@ INTERFACE zif_abapgit_definitions heads TYPE string VALUE 'refs/heads/*', tags_prefix TYPE string VALUE 'refs/tags/', tags TYPE string VALUE 'refs/tags/*', + peel TYPE string VALUE '^{}', END OF c_git_branch. CONSTANTS: BEGIN OF c_diff,