diff --git a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap index 03e45c5f5..31fee6869 100644 --- a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap @@ -287,6 +287,11 @@ CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_gui_page_hotkey~get_hotkey_actions. + + ENDMETHOD. + + METHOD zif_abapgit_gui_page~on_event. DATA: ls_merge TYPE ty_merge, @@ -317,9 +322,4 @@ CLASS zcl_abapgit_gui_page_boverview IMPLEMENTATION. ENDCASE. ENDMETHOD. - - METHOD zif_abapgit_gui_page_hotkey~get_hotkey_actions. - - ENDMETHOD. - ENDCLASS. diff --git a/src/zcl_abapgit_branch_overview.clas.abap b/src/zcl_abapgit_branch_overview.clas.abap index 10683ea16..3009004b4 100644 --- a/src/zcl_abapgit_branch_overview.clas.abap +++ b/src/zcl_abapgit_branch_overview.clas.abap @@ -8,19 +8,20 @@ CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC SECTION. INTERFACES zif_abapgit_branch_overview . + TYPES: ty_commits TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_commit WITH DEFAULT KEY . METHODS constructor IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo_online + io_repo TYPE REF TO zcl_abapgit_repo_online RAISING zcx_abapgit_exception . + PRIVATE SECTION. - TYPES: - ty_commits TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_commit WITH DEFAULT KEY . + TYPES: tyt_commit_sha1_range TYPE RANGE OF zif_abapgit_definitions=>ty_sha1. 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 . CLASS-METHODS parse_commits @@ -54,12 +55,18 @@ CLASS zcl_abapgit_branch_overview DEFINITION METHODS determine_tags RAISING 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. - -CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. - +CLASS zcl_abapgit_branch_overview IMPLEMENTATION. METHOD constructor. @@ -77,8 +84,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. determine_merges( ). determine_tags( ). fixes( ). - - SORT mt_commits BY time ASCENDING. + _sort_commits( CHANGING ct_commits = mt_commits ). ENDMETHOD. @@ -343,7 +349,11 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. IF lines( lt_temp ) >= 10. READ TABLE lt_temp ASSIGNING INDEX 1. ASSERT sy-subrc = 0. + READ TABLE lt_temp ASSIGNING INDEX lines( lt_temp ). + ASSERT sy-subrc = 0. APPEND INITIAL LINE TO rt_commits ASSIGNING . + -sha1 = -sha1. + -parent1 = -parent1. -time = -time. -message = |Compressed, { lines( lt_temp ) } commits|. -branch = lv_name. @@ -351,6 +361,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. ELSE. APPEND LINES OF lt_temp TO rt_commits. ENDIF. + CLEAR lt_temp. END-OF-DEFINITION. DATA: lv_previous TYPE i, @@ -358,10 +369,11 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. lv_name TYPE string, lt_temp LIKE it_commits. - FIELD-SYMBOLS: LIKE LINE OF mt_branches, - LIKE LINE OF rt_commits, - LIKE LINE OF lt_temp, - LIKE LINE OF it_commits. + FIELD-SYMBOLS: LIKE LINE OF mt_branches, + LIKE LINE OF rt_commits, + LIKE LINE OF lt_temp, + LIKE LINE OF lt_temp, + LIKE LINE OF it_commits. LOOP AT mt_branches ASSIGNING . @@ -381,7 +393,6 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. IF lv_previous + 1 <> sy-tabix. _compress. - CLEAR lt_temp. ENDIF. lv_previous = lv_index. @@ -394,7 +405,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. ENDLOOP. - SORT rt_commits BY time ASCENDING. + _sort_commits( CHANGING ct_commits = rt_commits ). ENDMETHOD. @@ -414,4 +425,82 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. rt_tags = mt_tags. 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: LIKE LINE OF itr_commit_sha1s. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_commit. + +* get all reachable next commits + ltr_commit_sha1s = itr_commit_sha1s. + LOOP AT ct_commits ASSIGNING WHERE parent1 IN ltr_commit_sha1s + OR parent2 IN ltr_commit_sha1s. + INSERT 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: TYPE zif_abapgit_definitions=>ty_commit. + +* find initial commit + READ TABLE ct_commits ASSIGNING WITH KEY parent1 = space. + IF sy-subrc = 0. + + lsr_parent-sign = 'I'. + lsr_parent-option = 'EQ'. + lsr_parent-low = -sha1. + INSERT lsr_parent INTO TABLE ltr_parents. + +* first commit + INSERT INTO TABLE lt_sorted_commits. + +* remove from available commits + DELETE ct_commits WHERE sha1 = -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.