Branch OV - Sort by parents instead of time + PP #577 (#1890)

* Branch OV - Sort by parents instead of time #577

* Branch OV - Sort by parents PP #577
This commit is contained in:
Domi Bigl 2018-09-08 08:30:42 +02:00 committed by Lars Hvam
parent b2f43a04b6
commit 93c518a142
2 changed files with 109 additions and 20 deletions

View File

@ -287,6 +287,11 @@ CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_gui_page_hotkey~get_hotkey_actions.
ENDMETHOD.
METHOD zif_abapgit_gui_page~on_event. METHOD zif_abapgit_gui_page~on_event.
DATA: ls_merge TYPE ty_merge, DATA: ls_merge TYPE ty_merge,
@ -317,9 +322,4 @@ CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION.
ENDCASE. ENDCASE.
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_gui_page_hotkey~get_hotkey_actions.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -8,19 +8,20 @@ CLASS zcl_abapgit_branch_overview DEFINITION
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES zif_abapgit_branch_overview . INTERFACES zif_abapgit_branch_overview .
TYPES: ty_commits TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_commit WITH DEFAULT KEY .
METHODS constructor METHODS constructor
IMPORTING IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo_online io_repo TYPE REF TO zcl_abapgit_repo_online
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
PRIVATE SECTION. PRIVATE SECTION.
TYPES: TYPES: tyt_commit_sha1_range TYPE RANGE OF zif_abapgit_definitions=>ty_sha1.
ty_commits TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_commit WITH DEFAULT KEY .
DATA mt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt . DATA mt_branches TYPE zif_abapgit_definitions=>ty_git_branch_list_tt .
DATA mt_commits TYPE ty_commits . DATA mt_commits TYPE ty_commits .
DATA mt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt . DATA mt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt .
CLASS-METHODS parse_commits CLASS-METHODS parse_commits
@ -54,12 +55,18 @@ CLASS zcl_abapgit_branch_overview DEFINITION
METHODS determine_tags METHODS determine_tags
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS _sort_commits CHANGING ct_commits TYPE ty_commits.
METHODS _get_1st_child_commit
IMPORTING itr_commit_sha1s TYPE tyt_commit_sha1_range
EXPORTING etr_commit_sha1s TYPE tyt_commit_sha1_range
CHANGING ct_commits TYPE ty_commits
RETURNING VALUE(e_1st_commit) TYPE zif_abapgit_definitions=>ty_commit.
ENDCLASS. ENDCLASS.
CLASS zcl_abapgit_branch_overview IMPLEMENTATION.
CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
METHOD constructor. METHOD constructor.
@ -77,8 +84,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
determine_merges( ). determine_merges( ).
determine_tags( ). determine_tags( ).
fixes( ). fixes( ).
_sort_commits( CHANGING ct_commits = mt_commits ).
SORT mt_commits BY time ASCENDING.
ENDMETHOD. ENDMETHOD.
@ -343,7 +349,11 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
IF lines( lt_temp ) >= 10. IF lines( lt_temp ) >= 10.
READ TABLE lt_temp ASSIGNING <ls_temp> INDEX 1. READ TABLE lt_temp ASSIGNING <ls_temp> INDEX 1.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
READ TABLE lt_temp ASSIGNING <ls_temp_end> INDEX lines( lt_temp ).
ASSERT sy-subrc = 0.
APPEND INITIAL LINE TO rt_commits ASSIGNING <ls_new>. APPEND INITIAL LINE TO rt_commits ASSIGNING <ls_new>.
<ls_new>-sha1 = <ls_temp_end>-sha1.
<ls_new>-parent1 = <ls_temp>-parent1.
<ls_new>-time = <ls_temp>-time. <ls_new>-time = <ls_temp>-time.
<ls_new>-message = |Compressed, { lines( lt_temp ) } commits|. <ls_new>-message = |Compressed, { lines( lt_temp ) } commits|.
<ls_new>-branch = lv_name. <ls_new>-branch = lv_name.
@ -351,6 +361,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
ELSE. ELSE.
APPEND LINES OF lt_temp TO rt_commits. APPEND LINES OF lt_temp TO rt_commits.
ENDIF. ENDIF.
CLEAR lt_temp.
END-OF-DEFINITION. END-OF-DEFINITION.
DATA: lv_previous TYPE i, DATA: lv_previous TYPE i,
@ -358,10 +369,11 @@ 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 mt_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_temp_end> LIKE LINE OF lt_temp,
<ls_commit> LIKE LINE OF it_commits.
LOOP AT mt_branches ASSIGNING <ls_branch>. LOOP AT mt_branches ASSIGNING <ls_branch>.
@ -381,7 +393,6 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
IF lv_previous + 1 <> sy-tabix. IF lv_previous + 1 <> sy-tabix.
_compress. _compress.
CLEAR lt_temp.
ENDIF. ENDIF.
lv_previous = lv_index. lv_previous = lv_index.
@ -394,7 +405,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
ENDLOOP. ENDLOOP.
SORT rt_commits BY time ASCENDING. _sort_commits( CHANGING ct_commits = rt_commits ).
ENDMETHOD. ENDMETHOD.
@ -414,4 +425,82 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION.
rt_tags = mt_tags. rt_tags = mt_tags.
ENDMETHOD. ENDMETHOD.
METHOD _get_1st_child_commit.
DATA: lt_1stchild_commits TYPE ty_commits.
DATA: lsr_parent LIKE LINE OF itr_commit_sha1s.
DATA: ltr_commit_sha1s LIKE itr_commit_sha1s.
FIELD-SYMBOLS: <lsr_commit_sha1> LIKE LINE OF itr_commit_sha1s.
FIELD-SYMBOLS: <ls_child_commit> TYPE zif_abapgit_definitions=>ty_commit.
* get all reachable next commits
ltr_commit_sha1s = itr_commit_sha1s.
LOOP AT ct_commits ASSIGNING <ls_child_commit> WHERE parent1 IN ltr_commit_sha1s
OR parent2 IN ltr_commit_sha1s.
INSERT <ls_child_commit> INTO TABLE lt_1stchild_commits.
ENDLOOP.
* return oldest one
SORT lt_1stchild_commits BY time ASCENDING.
READ TABLE lt_1stchild_commits INTO e_1st_commit INDEX 1.
* remove from available commits
DELETE ct_commits WHERE sha1 = e_1st_commit-sha1.
* set relevant parent commit sha1s
IF lines( lt_1stchild_commits ) = 1.
CLEAR etr_commit_sha1s.
ELSE.
etr_commit_sha1s = itr_commit_sha1s.
ENDIF.
lsr_parent-sign = 'I'.
lsr_parent-option = 'EQ'.
lsr_parent-low = e_1st_commit-sha1.
INSERT lsr_parent INTO TABLE etr_commit_sha1s.
ENDMETHOD.
METHOD _sort_commits.
DATA: lt_sorted_commits TYPE ty_commits.
DATA: lv_next_commit TYPE zif_abapgit_definitions=>ty_commit.
DATA: ltr_parents TYPE tyt_commit_sha1_range.
DATA: lsr_parent LIKE LINE OF ltr_parents.
FIELD-SYMBOLS: <ls_initial_commit> TYPE zif_abapgit_definitions=>ty_commit.
* find initial commit
READ TABLE ct_commits ASSIGNING <ls_initial_commit> WITH KEY parent1 = space.
IF sy-subrc = 0.
lsr_parent-sign = 'I'.
lsr_parent-option = 'EQ'.
lsr_parent-low = <ls_initial_commit>-sha1.
INSERT lsr_parent INTO TABLE ltr_parents.
* first commit
INSERT <ls_initial_commit> INTO TABLE lt_sorted_commits.
* remove from available commits
DELETE ct_commits WHERE sha1 = <ls_initial_commit>-sha1.
DO.
_get_1st_child_commit( EXPORTING itr_commit_sha1s = ltr_parents
IMPORTING etr_commit_sha1s = ltr_parents
CHANGING ct_commits = ct_commits
RECEIVING e_1st_commit = lv_next_commit ).
IF lv_next_commit IS INITIAL.
EXIT. "DO
ENDIF.
INSERT lv_next_commit INTO TABLE lt_sorted_commits.
ENDDO.
ENDIF.
ct_commits = lt_sorted_commits.
ENDMETHOD.
ENDCLASS. ENDCLASS.