diff --git a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap index 31fee6869..847e811e0 100644 --- a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap @@ -60,12 +60,11 @@ CLASS zcl_abapgit_gui_page_boverview DEFINITION ENDCLASS. - CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION. - METHOD body. - DATA: lv_tag TYPE string. + DATA: lv_tag TYPE string. + DATA: lv_branch_display_name TYPE string. FIELD-SYMBOLS: LIKE LINE OF mt_commits, LIKE LINE OF -create. @@ -145,9 +144,15 @@ CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION. ENDIF. LOOP AT -create ASSIGNING . + IF -name CS zcl_abapgit_branch_overview=>c_deleted_branch_name_prefix. + lv_branch_display_name = ''. + ELSE. + lv_branch_display_name = -name. + ENDIF. + ro_html->add( |var { escape_branch( -name ) } = { - escape_branch( -parent ) }.branch("{ - -name }");| ). + escape_branch( -parent ) }.branch("{ + lv_branch_display_name }");| ). ENDLOOP. ENDLOOP. diff --git a/src/zcl_abapgit_branch_overview.clas.abap b/src/zcl_abapgit_branch_overview.clas.abap index 40c8f104b..ccad8350f 100644 --- a/src/zcl_abapgit_branch_overview.clas.abap +++ b/src/zcl_abapgit_branch_overview.clas.abap @@ -9,6 +9,7 @@ CLASS zcl_abapgit_branch_overview DEFINITION INTERFACES zif_abapgit_branch_overview . TYPES: ty_commits TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_commit WITH DEFAULT KEY . + CONSTANTS c_deleted_branch_name_prefix TYPE string VALUE '__DELETED_BRANCH_' ##NO_TEXT. METHODS constructor IMPORTING @@ -61,6 +62,8 @@ CLASS zcl_abapgit_branch_overview DEFINITION EXPORTING etr_commit_sha1s TYPE tyt_commit_sha1_range e_1st_commit TYPE zif_abapgit_definitions=>ty_commit CHANGING ct_commits TYPE ty_commits. + METHODS _reverse_sort_order + CHANGING ct_commits TYPE ty_commits. ENDCLASS. @@ -75,6 +78,8 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. lt_objects = get_git_objects( io_repo ). mt_commits = parse_commits( lt_objects ). + _sort_commits( CHANGING ct_commits = mt_commits ). + parse_annotated_tags( lt_objects ). CLEAR lt_objects. @@ -83,7 +88,7 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. determine_merges( ). determine_tags( ). fixes( ). - _sort_commits( CHANGING ct_commits = mt_commits ). + ENDMETHOD. @@ -141,31 +146,76 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. METHOD determine_merges. - FIELD-SYMBOLS: LIKE LINE OF mt_commits, - LIKE LINE OF mt_commits. + DATA: BEGIN OF deleted_branch_info, + created TYPE flag, + index TYPE string, + name TYPE string, + END OF deleted_branch_info. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_commit, + TYPE zif_abapgit_definitions=>ty_commit, + TYPE zif_abapgit_definitions=>ty_commit, + TYPE zif_abapgit_definitions=>ty_create. -* important: start with the newest first and propagate branches - SORT mt_commits BY time DESCENDING. +* we need latest first here: latest -> initial + _reverse_sort_order( CHANGING ct_commits = mt_commits ). LOOP AT mt_commits ASSIGNING WHERE NOT parent2 IS INITIAL. ASSERT NOT -branch IS INITIAL. - READ TABLE mt_commits ASSIGNING WITH KEY sha1 = -parent2. + READ TABLE mt_commits ASSIGNING WITH KEY sha1 = -parent2. IF sy-subrc = 0. - -merge = -branch. + -merge = -branch. * orphaned, branch has been deleted after merge - WHILE -branch IS INITIAL. - -branch = -branch. - READ TABLE mt_commits ASSIGNING WITH KEY sha1 = -parent1. + deleted_branch_info-created = abap_false. + + WHILE -branch IS INITIAL. + IF deleted_branch_info-created = abap_false. + + deleted_branch_info-created = abap_true. + deleted_branch_info-index = deleted_branch_info-index + 1. + deleted_branch_info-name = c_deleted_branch_name_prefix && deleted_branch_info-index && '__'. + CONDENSE deleted_branch_info-name NO-GAPS. + + -merge = deleted_branch_info-name. + + ENDIF. + -branch = deleted_branch_info-name. + + READ TABLE mt_commits ASSIGNING + WITH KEY sha1 = -parent1. IF sy-subrc <> 0. EXIT. + ELSE. + ASSIGN TO . ENDIF. ENDWHILE. + + IF IS ASSIGNED. + APPEND INITIAL LINE TO -create ASSIGNING . + -name = deleted_branch_info-name. + -parent = -branch. + ENDIF. + ENDIF. ENDLOOP. + " switch back to initial -> latest + _reverse_sort_order( CHANGING ct_commits = mt_commits ). + + ENDMETHOD. + + METHOD _reverse_sort_order. + DATA: lt_commits TYPE ty_commits. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_commit. + + LOOP AT ct_commits ASSIGNING . + INSERT INTO lt_commits INDEX 1. + ENDLOOP. + ct_commits = lt_commits. + FREE lt_commits. + ENDMETHOD. @@ -503,5 +553,4 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. ct_commits = lt_sorted_commits. ENDMETHOD. - ENDCLASS.