diff --git a/src/zcl_abapgit_branch_overview.clas.abap b/src/zcl_abapgit_branch_overview.clas.abap index 7c9f32514..6792c5523 100644 --- a/src/zcl_abapgit_branch_overview.clas.abap +++ b/src/zcl_abapgit_branch_overview.clas.abap @@ -2,125 +2,73 @@ CLASS zcl_abapgit_branch_overview DEFINITION PUBLIC FINAL CREATE PRIVATE - GLOBAL FRIENDS zcl_abapgit_factory . + GLOBAL FRIENDS zcl_abapgit_factory . PUBLIC SECTION. - INTERFACES zif_abapgit_branch_overview. - - METHODS: - constructor - IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online - RAISING zcx_abapgit_exception. + INTERFACES zif_abapgit_branch_overview . + METHODS constructor + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + RAISING + zcx_abapgit_exception . PRIVATE SECTION. - METHODS: - parse_commits - IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING zcx_abapgit_exception, - parse_annotated_tags - IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING zcx_abapgit_exception, - determine_branch - RAISING zcx_abapgit_exception, - determine_merges - RAISING zcx_abapgit_exception, - fixes - RAISING zcx_abapgit_exception, - get_git_objects - IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online - RETURNING VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING zcx_abapgit_exception, - determine_tags - RAISING zcx_abapgit_exception. - DATA: - mo_repo TYPE REF TO zcl_abapgit_repo_online, - mt_branches 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. + TYPES: + 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_commits TYPE ty_commits . + DATA mt_tags TYPE zif_abapgit_definitions=>ty_git_tag_list_tt . + + CLASS-METHODS parse_commits + IMPORTING + !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt + RETURNING + VALUE(rt_commits) TYPE ty_commits + RAISING + zcx_abapgit_exception . + METHODS parse_annotated_tags + IMPORTING + !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING + zcx_abapgit_exception . + METHODS determine_branch + RAISING + zcx_abapgit_exception . + METHODS determine_merges + RAISING + zcx_abapgit_exception . + METHODS fixes + RAISING + zcx_abapgit_exception . + METHODS get_git_objects + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + RETURNING + VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING + zcx_abapgit_exception . + METHODS determine_tags + RAISING + zcx_abapgit_exception . ENDCLASS. -CLASS zcl_abapgit_branch_overview IMPLEMENTATION. - - - METHOD zif_abapgit_branch_overview~compress. - - DEFINE _compress. - IF lines( lt_temp ) >= 10. - READ TABLE lt_temp ASSIGNING INDEX 1. - ASSERT sy-subrc = 0. - APPEND INITIAL LINE TO rt_commits ASSIGNING . - -time = -time. - -message = |Compressed, { lines( lt_temp ) } commits|. - -branch = lv_name. - -compressed = abap_true. - ELSE. - APPEND LINES OF lt_temp TO rt_commits. - ENDIF. - END-OF-DEFINITION. - - DATA: lv_previous TYPE i, - lv_index TYPE i, - 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. - - - LOOP AT mt_branches ASSIGNING . - - CLEAR lt_temp. - lv_name = -name+11. - - LOOP AT it_commits ASSIGNING - WHERE branch = lv_name. - lv_index = sy-tabix. - - IF NOT -merge IS INITIAL - OR NOT -create IS INITIAL. -* always show these vertices - lv_previous = -1. - ENDIF. - - IF lv_previous + 1 <> sy-tabix. - _compress. - CLEAR lt_temp. - ENDIF. - - lv_previous = lv_index. - - APPEND TO lt_temp. - - ENDLOOP. - - _compress. - - ENDLOOP. - - SORT rt_commits BY time ASCENDING. - - ENDMETHOD. +CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. 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 ). + mt_commits = parse_commits( lt_objects ). parse_annotated_tags( lt_objects ). CLEAR lt_objects. @@ -227,7 +175,7 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. IF -type = zif_abapgit_definitions=>c_git_branch_type-lightweight_tag. READ TABLE mt_commits WITH KEY sha1 = -sha1 - ASSIGNING . + ASSIGNING . "#EC CI_SUBRC ELSEIF -type = zif_abapgit_definitions=>c_git_branch_type-annotated_tag. READ TABLE mt_commits WITH KEY sha1 = -object ASSIGNING . @@ -258,16 +206,6 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_branch_overview~get_branches. - rt_branches = mt_branches. - ENDMETHOD. - - - METHOD zif_abapgit_branch_overview~get_commits. - rt_commits = mt_commits. - ENDMETHOD. - - METHOD get_git_objects. DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list, @@ -276,7 +214,8 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. lt_tags TYPE zif_abapgit_definitions=>ty_git_branch_list_tt, ls_tag LIKE LINE OF mt_tags. - FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_git_branch. + FIELD-SYMBOLS: LIKE LINE OF lt_tags. + CREATE OBJECT lo_progress EXPORTING @@ -323,17 +262,9 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_branch_overview~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. + DATA: ls_raw TYPE zcl_abapgit_git_pack=>ty_tag. FIELD-SYMBOLS: LIKE LINE OF it_objects, LIKE LINE OF mt_tags. @@ -342,9 +273,6 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. ls_raw = zcl_abapgit_git_pack=>decode_tag( -data ). - CLEAR ls_tag. - ls_tag-sha1 = -sha1. - READ TABLE mt_tags ASSIGNING WITH KEY sha1 = -sha1. ASSERT sy-subrc = 0. @@ -367,7 +295,7 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. METHOD parse_commits. DATA: ls_commit LIKE LINE OF mt_commits, - lv_trash TYPE string ##NEEDED, + lt_body TYPE STANDARD TABLE OF string WITH DEFAULT KEY, ls_raw TYPE zcl_abapgit_git_pack=>ty_commit. FIELD-SYMBOLS: LIKE LINE OF it_objects. @@ -381,7 +309,15 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. ls_commit-parent1 = ls_raw-parent. ls_commit-parent2 = ls_raw-parent2. - SPLIT ls_raw-body AT zif_abapgit_definitions=>gc_newline INTO ls_commit-message lv_trash. + SPLIT ls_raw-body AT zif_abapgit_definitions=>gc_newline INTO TABLE lt_body. + + READ TABLE lt_body WITH KEY table_line = ' -----END PGP SIGNATURE-----' TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + DELETE lt_body TO sy-tabix. + DELETE lt_body TO 2. + ENDIF. + + READ TABLE lt_body INDEX 1 INTO ls_commit-message. "#EC CI_SUBRC * unix time stamps are in same time zone, so ignore the zone, FIND REGEX zif_abapgit_definitions=>gc_author_regex IN ls_raw-author @@ -390,10 +326,88 @@ CLASS zcl_abapgit_branch_overview IMPLEMENTATION. ls_commit-email ls_commit-time ##NO_TEXT. ASSERT sy-subrc = 0. - APPEND ls_commit TO mt_commits. + APPEND ls_commit TO rt_commits. ENDLOOP. ENDMETHOD. + + METHOD zif_abapgit_branch_overview~compress. + + DEFINE _compress. + IF lines( lt_temp ) >= 10. + READ TABLE lt_temp ASSIGNING INDEX 1. + ASSERT sy-subrc = 0. + APPEND INITIAL LINE TO rt_commits ASSIGNING . + -time = -time. + -message = |Compressed, { lines( lt_temp ) } commits|. + -branch = lv_name. + -compressed = abap_true. + ELSE. + APPEND LINES OF lt_temp TO rt_commits. + ENDIF. + END-OF-DEFINITION. + + DATA: lv_previous TYPE i, + lv_index TYPE i, + 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. + + + LOOP AT mt_branches ASSIGNING . + + CLEAR lt_temp. + lv_name = -name+11. + + LOOP AT it_commits ASSIGNING + WHERE branch = lv_name. + lv_index = sy-tabix. + + IF NOT -merge IS INITIAL + OR NOT -create IS INITIAL. +* always show these vertices + lv_previous = -1. + ENDIF. + + IF lv_previous + 1 <> sy-tabix. + _compress. + CLEAR lt_temp. + ENDIF. + + lv_previous = lv_index. + + APPEND TO lt_temp. + + ENDLOOP. + + _compress. + + ENDLOOP. + + SORT rt_commits BY time ASCENDING. + + ENDMETHOD. + + + METHOD zif_abapgit_branch_overview~get_branches. + rt_branches = mt_branches. + ENDMETHOD. + + + METHOD zif_abapgit_branch_overview~get_commits. + rt_commits = mt_commits. + ENDMETHOD. + + + METHOD zif_abapgit_branch_overview~get_tags. + + rt_tags = mt_tags. + + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_branch_overview.clas.testclasses.abap b/src/zcl_abapgit_branch_overview.clas.testclasses.abap new file mode 100644 index 000000000..4844bfa4f --- /dev/null +++ b/src/zcl_abapgit_branch_overview.clas.testclasses.abap @@ -0,0 +1,57 @@ + +CLASS ltcl_test DEFINITION DEFERRED. +CLASS zcl_abapgit_branch_overview DEFINITION LOCAL FRIENDS ltcl_test. + + +CLASS ltcl_test DEFINITION FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS FINAL. + + PRIVATE SECTION. + + METHODS: + parse_commits FOR TESTING RAISING zcx_abapgit_exception. + +ENDCLASS. + + +CLASS ltcl_test IMPLEMENTATION. + + METHOD parse_commits. + + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lt_commits TYPE zcl_abapgit_branch_overview=>ty_commits, + ls_commit LIKE LINE OF lt_commits, + ls_object LIKE LINE OF lt_objects. + + + ls_object-type = zif_abapgit_definitions=>gc_type-commit. + ls_object-data = '7472656520396335376238613931336465306539' && + '3735333630633261306330643638363037306162' && + '61343965650A706172656E742036393532346462' && + '3139363263383839366566343364323861616131' && + '396536366533373263653364620A617574686F72' && + '206C6172736870203C6C617273687040686F746D' && + '61696C2E636F6D3E203135333236313133353020' && + '2B303030300A636F6D6D6974746572206C617273' && + '6870203C6C617273687040686F746D61696C2E63' && + '6F6D3E2031353332363131333530202B30303030' && + '0A0A56494557'. + APPEND ls_object TO lt_objects. + + lt_commits = zcl_abapgit_branch_overview=>parse_commits( lt_objects ). + + cl_abap_unit_assert=>assert_equals( + act = lines( lt_commits ) + exp = 1 ). + + READ TABLE lt_commits INTO ls_commit INDEX 1. + cl_abap_unit_assert=>assert_subrc( ). + + cl_abap_unit_assert=>assert_equals( + act = ls_commit-message + exp = 'VIEW' ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_branch_overview.clas.xml b/src/zcl_abapgit_branch_overview.clas.xml index bbc259bfc..566ccde8d 100644 --- a/src/zcl_abapgit_branch_overview.clas.xml +++ b/src/zcl_abapgit_branch_overview.clas.xml @@ -12,6 +12,7 @@ X X X + X