From 788d649feba7c1cfbcf90671da169c3b88d8b804 Mon Sep 17 00:00:00 2001 From: Mike Pokraka Date: Mon, 3 May 2021 13:42:34 +0100 Subject: [PATCH] Limit size of branch overview (#4726) * Add support for partial logs (WIP) * Still trying to handle multiple branch origins * Error message for too many commits * Remove PDXX * Lint Co-authored-by: Lars Hvam --- src/git/zcl_abapgit_git_commit.clas.abap | 47 ++++++- ...l_abapgit_git_commit.clas.testclasses.abap | 122 +++++++++++++++++- src/git/zcl_abapgit_git_pack.clas.abap | 2 +- src/git/zcl_abapgit_git_transport.clas.abap | 6 +- src/zcl_abapgit_branch_overview.clas.abap | 25 +++- 5 files changed, 191 insertions(+), 11 deletions(-) diff --git a/src/git/zcl_abapgit_git_commit.clas.abap b/src/git/zcl_abapgit_git_commit.clas.abap index 4227f01da..a659e9cde 100644 --- a/src/git/zcl_abapgit_git_commit.clas.abap +++ b/src/git/zcl_abapgit_git_commit.clas.abap @@ -41,6 +41,7 @@ CLASS zcl_abapgit_git_commit DEFINITION CLASS-METHODS reverse_sort_order CHANGING !ct_commits TYPE zif_abapgit_definitions=>ty_commit_tt . + CLASS-METHODS clear_missing_parents CHANGING ct_commits TYPE zif_abapgit_definitions=>ty_commit_tt . PROTECTED SECTION. PRIVATE SECTION. @@ -55,6 +56,13 @@ CLASS zcl_abapgit_git_commit DEFINITION CHANGING ct_commits TYPE zif_abapgit_definitions=>ty_commit_tt . + CLASS-METHODS is_missing + IMPORTING + it_commits TYPE zif_abapgit_definitions=>ty_commit_tt + iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1 + RETURNING + VALUE(rv_result) TYPE abap_bool. + ENDCLASS. @@ -255,8 +263,45 @@ CLASS zcl_abapgit_git_commit IMPLEMENTATION. INSERT ls_next_commit INTO TABLE lt_sorted_commits. ENDDO. - ct_commits = lt_sorted_commits. + ENDIF. + ct_commits = lt_sorted_commits. + + ENDMETHOD. + + METHOD clear_missing_parents. + + "Part of #4719 to handle cut commit sequences, todo + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_commit. + + LOOP AT ct_commits ASSIGNING . + + IF is_missing( it_commits = ct_commits + iv_sha1 = -parent1 ) = abap_true. + CLEAR -parent1. + ENDIF. + + IF is_missing( it_commits = ct_commits + iv_sha1 = -parent2 ) = abap_true. + CLEAR -parent2. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + + METHOD is_missing. + + IF iv_sha1 IS NOT INITIAL. + + READ TABLE it_commits + TRANSPORTING NO FIELDS + WITH KEY sha1 = iv_sha1. + rv_result = boolc( sy-subrc <> 0 ). + ENDIF. ENDMETHOD. + ENDCLASS. diff --git a/src/git/zcl_abapgit_git_commit.clas.testclasses.abap b/src/git/zcl_abapgit_git_commit.clas.testclasses.abap index 5af60a05d..9e28c1286 100644 --- a/src/git/zcl_abapgit_git_commit.clas.testclasses.abap +++ b/src/git/zcl_abapgit_git_commit.clas.testclasses.abap @@ -57,10 +57,10 @@ CLASS ltcl_test IMPLEMENTATION. METHOD check_author_regex. - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lt_commits TYPE zif_abapgit_definitions=>ty_commit_tt, - ls_object LIKE LINE OF lt_objects, - ls_git_pack_commit TYPE zcl_abapgit_git_pack=>ty_commit. + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lt_commits TYPE zif_abapgit_definitions=>ty_commit_tt, + ls_object LIKE LINE OF lt_objects, + ls_git_pack_commit TYPE zcl_abapgit_git_pack=>ty_commit. ls_object-type = zif_abapgit_definitions=>c_type-commit. @@ -100,3 +100,117 @@ CLASS ltcl_test IMPLEMENTATION. ENDMETHOD. ENDCLASS. + +CLASS ltc_parent_handling DEFINITION DEFERRED. +CLASS zcl_abapgit_git_commit DEFINITION LOCAL FRIENDS ltc_parent_handling. +CLASS ltc_parent_handling DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA mt_commits TYPE zif_abapgit_definitions=>ty_commit_tt. + METHODS blank_not_missing FOR TESTING RAISING cx_static_check. + METHODS parent_is_missing FOR TESTING RAISING cx_static_check. + METHODS parent_is_found FOR TESTING RAISING cx_static_check. + METHODS missing_parent1_cleared FOR TESTING RAISING cx_static_check. + METHODS missing_parent2_cleared FOR TESTING RAISING cx_static_check. + METHODS matched_parent1_remains FOR TESTING RAISING cx_static_check. + METHODS given_commit_sha1 IMPORTING iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1. + METHODS parent_should_be_missing IMPORTING iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1. + METHODS parent_should_not_be_missing IMPORTING iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1. + METHODS given_commit IMPORTING iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1 + iv_parent1 TYPE zif_abapgit_definitions=>ty_sha1 OPTIONAL + iv_parent2 TYPE zif_abapgit_definitions=>ty_sha1 OPTIONAL. +ENDCLASS. + + +CLASS ltc_parent_handling IMPLEMENTATION. + + METHOD blank_not_missing. + given_commit_sha1( 'F00' ). + parent_should_not_be_missing( '' ). + ENDMETHOD. + + METHOD parent_is_missing. + given_commit_sha1( 'F00' ). + parent_should_be_missing( 'BA5' ). + ENDMETHOD. + + METHOD parent_is_found. + given_commit_sha1( 'F00' ). + parent_should_not_be_missing( 'F00' ). + ENDMETHOD. + + METHOD missing_parent1_cleared. + + DATA ls_commit TYPE zif_abapgit_definitions=>ty_commit. + + given_commit( iv_sha1 = 'F00' + iv_parent1 = 'BA5' ). + zcl_abapgit_git_commit=>clear_missing_parents( CHANGING ct_commits = mt_commits ). + + READ TABLE mt_commits INDEX 1 INTO ls_commit. + cl_abap_unit_assert=>assert_equals( act = ls_commit-parent1 + exp = '' ). + ENDMETHOD. + + METHOD missing_parent2_cleared. + + DATA ls_commit TYPE zif_abapgit_definitions=>ty_commit. + + given_commit( iv_sha1 = 'F00' + iv_parent2 = 'BA5' ). + zcl_abapgit_git_commit=>clear_missing_parents( CHANGING ct_commits = mt_commits ). + + READ TABLE mt_commits INDEX 1 INTO ls_commit. + cl_abap_unit_assert=>assert_equals( act = ls_commit-parent2 + exp = '' ). + + ENDMETHOD. + + METHOD matched_parent1_remains. + + DATA ls_commit TYPE zif_abapgit_definitions=>ty_commit. + + given_commit( iv_sha1 = 'F00' ). + given_commit( iv_sha1 = 'BA5' + iv_parent1 = 'F00' ). + + zcl_abapgit_git_commit=>clear_missing_parents( CHANGING ct_commits = mt_commits ). + + READ TABLE mt_commits INDEX 2 INTO ls_commit. + cl_abap_unit_assert=>assert_equals( act = ls_commit-parent1 + exp = 'F00' ). + + ENDMETHOD. + + METHOD given_commit_sha1. + DATA ls_commit TYPE zif_abapgit_definitions=>ty_commit. + + ls_commit-sha1 = iv_sha1. + APPEND ls_commit TO mt_commits. + + ENDMETHOD. + + + METHOD parent_should_be_missing. + cl_abap_unit_assert=>assert_true( + zcl_abapgit_git_commit=>is_missing( it_commits = mt_commits + iv_sha1 = iv_sha1 ) ). + ENDMETHOD. + + METHOD parent_should_not_be_missing. + cl_abap_unit_assert=>assert_false( + zcl_abapgit_git_commit=>is_missing( it_commits = mt_commits + iv_sha1 = iv_sha1 ) ). + ENDMETHOD. + + METHOD given_commit. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_commit. + APPEND INITIAL LINE TO mt_commits ASSIGNING . + -sha1 = iv_sha1. + -parent1 = iv_parent1. + -parent2 = iv_parent2. + ENDMETHOD. + +ENDCLASS. diff --git a/src/git/zcl_abapgit_git_pack.clas.abap b/src/git/zcl_abapgit_git_pack.clas.abap index 3df1f3666..905baee87 100644 --- a/src/git/zcl_abapgit_git_pack.clas.abap +++ b/src/git/zcl_abapgit_git_pack.clas.abap @@ -244,7 +244,7 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. ENDIF. ELSEIF lv_zlib = c_zlib_hmm. -* cl_abap_gzip copmression works for header '789C', but does not work for +* cl_abap_gzip compression works for header '789C', but does not work for * '7801', call custom implementation of DEFLATE algorithm. * The custom implementation could handle both, but most likely the kernel * implementation runs faster than the custom ABAP. diff --git a/src/git/zcl_abapgit_git_transport.clas.abap b/src/git/zcl_abapgit_git_transport.clas.abap index 425c9ed61..22e1e1a93 100644 --- a/src/git/zcl_abapgit_git_transport.clas.abap +++ b/src/git/zcl_abapgit_git_transport.clas.abap @@ -101,7 +101,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION. +CLASS zcl_abapgit_git_transport IMPLEMENTATION. METHOD branches. @@ -326,8 +326,8 @@ CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION. METHOD upload_pack_by_branch. - DATA: lo_client TYPE REF TO zcl_abapgit_http_client, - lt_hashes TYPE zif_abapgit_definitions=>ty_sha1_tt. + DATA: lo_client TYPE REF TO zcl_abapgit_http_client, + lt_hashes TYPE zif_abapgit_definitions=>ty_sha1_tt. FIELD-SYMBOLS: LIKE LINE OF it_branches. diff --git a/src/zcl_abapgit_branch_overview.clas.abap b/src/zcl_abapgit_branch_overview.clas.abap index 215ab0b11..3f96fbc34 100644 --- a/src/zcl_abapgit_branch_overview.clas.abap +++ b/src/zcl_abapgit_branch_overview.clas.abap @@ -50,11 +50,14 @@ CLASS zcl_abapgit_branch_overview DEFINITION METHODS determine_tags RAISING zcx_abapgit_exception . + METHODS get_deepen_level + RETURNING + VALUE(rv_result) TYPE i. ENDCLASS. -CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. +CLASS zcl_abapgit_branch_overview IMPLEMENTATION. METHOD compress_internal. @@ -91,6 +94,9 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. lt_objects = get_git_objects( io_repo ). mt_commits = zcl_abapgit_git_commit=>parse_commits( lt_objects ). + IF lines( mt_commits ) > 2000. + zcx_abapgit_exception=>raise( 'Too many commits to display overview' ). + ENDIF. zcl_abapgit_git_commit=>sort_commits( CHANGING ct_commits = mt_commits ). parse_annotated_tags( lt_objects ). @@ -335,7 +341,7 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. EXPORTING iv_url = io_repo->get_url( ) iv_branch_name = io_repo->get_selected_branch( ) - iv_deepen_level = 0 + iv_deepen_level = get_deepen_level( ) it_branches = lt_branches_and_tags IMPORTING et_objects = rt_objects ). @@ -446,4 +452,19 @@ CLASS ZCL_ABAPGIT_BRANCH_OVERVIEW IMPLEMENTATION. rt_tags = mt_tags. ENDMETHOD. + + METHOD get_deepen_level. + + DATA: lv_deepen_level(10) TYPE c. + + "Experimental: Use STVARV to get a locally configured value + SELECT SINGLE low + INTO lv_deepen_level + FROM tvarvc + WHERE name = 'ABAPGIT_TEST_LOG_LENGTH' ##WARN_OK. + + rv_result = lv_deepen_level. + + ENDMETHOD. + ENDCLASS.