From a9607f90b2a7db71dd44efd75fc3575710c38111 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 21 Jan 2018 07:37:11 +0000 Subject: [PATCH 1/2] git pack: add adler32 table as optional input git pack: add adler32 table as optional input #1165 --- src/git/zcl_abapgit_git_pack.clas.abap | 109 ++++++++++++++++--------- 1 file changed, 71 insertions(+), 38 deletions(-) diff --git a/src/git/zcl_abapgit_git_pack.clas.abap b/src/git/zcl_abapgit_git_pack.clas.abap index 6e566de7f..10b534874 100644 --- a/src/git/zcl_abapgit_git_pack.clas.abap +++ b/src/git/zcl_abapgit_git_pack.clas.abap @@ -21,6 +21,14 @@ CLASS zcl_abapgit_git_pack DEFINITION committer TYPE string, body TYPE string, END OF ty_commit . + TYPES: + BEGIN OF ty_adler32, + sha1 TYPE zif_abapgit_definitions=>ty_sha1, + type TYPE zif_abapgit_definitions=>ty_type, + adler32 TYPE zcl_abapgit_hash=>ty_adler32, + END OF ty_adler32 . + TYPES: + ty_adler32_tt TYPE SORTED TABLE OF ty_adler32 WITH UNIQUE KEY sha1 type . CLASS-METHODS decode IMPORTING @@ -46,6 +54,7 @@ CLASS zcl_abapgit_git_pack DEFINITION CLASS-METHODS encode IMPORTING !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt + !it_adler32 TYPE ty_adler32_tt OPTIONAL RETURNING VALUE(rv_data) TYPE xstring RAISING @@ -60,6 +69,51 @@ CLASS zcl_abapgit_git_pack DEFINITION !is_commit TYPE ty_commit RETURNING VALUE(rv_data) TYPE xstring . + PRIVATE SECTION. + + CONSTANTS: + c_pack_start TYPE x LENGTH 4 VALUE '5041434B' ##NO_TEXT. + CONSTANTS: + c_zlib TYPE x LENGTH 2 VALUE '789C' ##NO_TEXT. + CONSTANTS: + c_zlib_hmm TYPE x LENGTH 2 VALUE '7801' ##NO_TEXT. + CONSTANTS: " PACK + c_version TYPE x LENGTH 4 VALUE '00000002' ##NO_TEXT. + + CLASS-METHODS decode_deltas + CHANGING + !ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING + zcx_abapgit_exception . + CLASS-METHODS delta + IMPORTING + !is_object TYPE zif_abapgit_definitions=>ty_object + CHANGING + !ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING + zcx_abapgit_exception . + CLASS-METHODS delta_header + EXPORTING + !ev_header TYPE i + CHANGING + !cv_delta TYPE xstring . + CLASS-METHODS sort_tree + IMPORTING + !it_nodes TYPE ty_nodes_tt + RETURNING + VALUE(rt_nodes) TYPE ty_nodes_tt . + CLASS-METHODS get_type + IMPORTING + !iv_x TYPE x + RETURNING + VALUE(rv_type) TYPE zif_abapgit_definitions=>ty_type + RAISING + zcx_abapgit_exception . + CLASS-METHODS get_length + EXPORTING + !ev_length TYPE i + CHANGING + !cv_data TYPE xstring . CLASS-METHODS type_and_length IMPORTING !iv_type TYPE zif_abapgit_definitions=>ty_type @@ -68,43 +122,12 @@ CLASS zcl_abapgit_git_pack DEFINITION VALUE(rv_xstring) TYPE xstring RAISING zcx_abapgit_exception . - PRIVATE SECTION. - CONSTANTS: c_pack_start TYPE x LENGTH 4 VALUE '5041434B', " PACK - c_zlib TYPE x LENGTH 2 VALUE '789C', - c_zlib_hmm TYPE x LENGTH 2 VALUE '7801', - c_version TYPE x LENGTH 4 VALUE '00000002'. - - CLASS-METHODS decode_deltas - CHANGING ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING zcx_abapgit_exception. - - CLASS-METHODS delta - IMPORTING is_object TYPE zif_abapgit_definitions=>ty_object - CHANGING ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING zcx_abapgit_exception. - - CLASS-METHODS delta_header - EXPORTING ev_header TYPE i - CHANGING cv_delta TYPE xstring. - - CLASS-METHODS sort_tree - IMPORTING it_nodes TYPE ty_nodes_tt - RETURNING VALUE(rt_nodes) TYPE ty_nodes_tt. - - CLASS-METHODS get_type - IMPORTING iv_x TYPE x - RETURNING VALUE(rv_type) TYPE zif_abapgit_definitions=>ty_type - RAISING zcx_abapgit_exception. - - CLASS-METHODS get_length - EXPORTING ev_length TYPE i - CHANGING cv_data TYPE xstring. - CLASS-METHODS zlib_decompress - CHANGING cv_data TYPE xstring - cv_decompressed TYPE xstring - RAISING zcx_abapgit_exception. - + CHANGING + !cv_data TYPE xstring + !cv_decompressed TYPE xstring + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -524,7 +547,9 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. lo_progress TYPE REF TO zcl_abapgit_progress, lv_objects_total TYPE i. - FIELD-SYMBOLS: LIKE LINE OF it_objects. + FIELD-SYMBOLS: LIKE LINE OF it_objects, + LIKE LINE OF it_adler32. + rv_data = c_pack_start. @@ -558,7 +583,15 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. CONCATENATE rv_data c_zlib lv_compressed INTO rv_data IN BYTE MODE. - lv_adler32 = zcl_abapgit_hash=>adler32( -data ). + READ TABLE it_adler32 + ASSIGNING + WITH KEY type = -type + sha1 = -sha1. + IF sy-subrc = 0 AND NOT -adler32 IS INITIAL. + lv_adler32 = -adler32. + ELSE. + lv_adler32 = zcl_abapgit_hash=>adler32( -data ). + ENDIF. CONCATENATE rv_data lv_adler32 INTO rv_data IN BYTE MODE. ENDLOOP. From ad6b99ec95dd63681699f1ed4506715fdfee3cf6 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 21 Jan 2018 07:52:39 +0000 Subject: [PATCH 2/2] also return at decode --- src/git/zcl_abapgit_git_pack.clas.abap | 25 ++++++------------- ...zcl_abapgit_git_pack.clas.testclasses.abap | 4 +++ src/utils/zcl_abapgit_hash.clas.abap | 4 +-- src/zif_abapgit_definitions.intf.abap | 8 +++--- 4 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/git/zcl_abapgit_git_pack.clas.abap b/src/git/zcl_abapgit_git_pack.clas.abap index 10b534874..98a0b449b 100644 --- a/src/git/zcl_abapgit_git_pack.clas.abap +++ b/src/git/zcl_abapgit_git_pack.clas.abap @@ -25,10 +25,7 @@ CLASS zcl_abapgit_git_pack DEFINITION BEGIN OF ty_adler32, sha1 TYPE zif_abapgit_definitions=>ty_sha1, type TYPE zif_abapgit_definitions=>ty_type, - adler32 TYPE zcl_abapgit_hash=>ty_adler32, END OF ty_adler32 . - TYPES: - ty_adler32_tt TYPE SORTED TABLE OF ty_adler32 WITH UNIQUE KEY sha1 type . CLASS-METHODS decode IMPORTING @@ -54,7 +51,6 @@ CLASS zcl_abapgit_git_pack DEFINITION CLASS-METHODS encode IMPORTING !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt - !it_adler32 TYPE ty_adler32_tt OPTIONAL RETURNING VALUE(rv_data) TYPE xstring RAISING @@ -233,11 +229,10 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. cv_decompressed = lv_decompressed ). ENDIF. + CLEAR ls_object. + ls_object-adler32 = lv_data(4). lv_data = lv_data+4. " skip adler checksum -************************* - - CLEAR ls_object. IF lv_type = zif_abapgit_definitions=>gc_type-ref_d. ls_object-sha1 = lv_ref_delta. TRANSLATE ls_object-sha1 TO LOWER CASE. @@ -541,14 +536,13 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. METHOD encode. DATA: lv_sha1 TYPE x LENGTH 20, - lv_adler32 TYPE zcl_abapgit_hash=>ty_adler32, + lv_adler32 TYPE zif_abapgit_definitions=>ty_adler32, lv_compressed TYPE xstring, lv_xstring TYPE xstring, lo_progress TYPE REF TO zcl_abapgit_progress, lv_objects_total TYPE i. - FIELD-SYMBOLS: LIKE LINE OF it_objects, - LIKE LINE OF it_adler32. + FIELD-SYMBOLS: LIKE LINE OF it_objects. rv_data = c_pack_start. @@ -565,7 +559,6 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. iv_total = lv_objects_total. LOOP AT it_objects ASSIGNING . - lo_progress->show( iv_current = sy-tabix iv_text = |Encoding objects ( { sy-tabix } of { lv_objects_total } )| ). @@ -583,12 +576,8 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. CONCATENATE rv_data c_zlib lv_compressed INTO rv_data IN BYTE MODE. - READ TABLE it_adler32 - ASSIGNING - WITH KEY type = -type - sha1 = -sha1. - IF sy-subrc = 0 AND NOT -adler32 IS INITIAL. - lv_adler32 = -adler32. + IF NOT -adler32 IS INITIAL. + lv_adler32 = -adler32. ELSE. lv_adler32 = zcl_abapgit_hash=>adler32( -data ). ENDIF. @@ -834,7 +823,7 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION. DATA: ls_data TYPE zcl_abapgit_zlib=>ty_decompress, lv_compressed_len TYPE i, - lv_adler32 TYPE zcl_abapgit_hash=>ty_adler32. + lv_adler32 TYPE zif_abapgit_definitions=>ty_adler32. ls_data = zcl_abapgit_zlib=>decompress( cv_data ). diff --git a/src/git/zcl_abapgit_git_pack.clas.testclasses.abap b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap index 66f7ef7e9..bae77c2a9 100644 --- a/src/git/zcl_abapgit_git_pack.clas.testclasses.abap +++ b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap @@ -142,6 +142,7 @@ CLASS ltcl_pack IMPLEMENTATION. ls_object-sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-blob iv_data = lv_data ). ls_object-type = zif_abapgit_definitions=>gc_type-blob. ls_object-data = lv_data. + ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ). APPEND ls_object TO lt_objects. * commit @@ -156,6 +157,7 @@ CLASS ltcl_pack IMPLEMENTATION. ls_object-sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-commit iv_data = lv_data ). ls_object-type = zif_abapgit_definitions=>gc_type-commit. ls_object-data = lv_data. + ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ). APPEND ls_object TO lt_objects. * tree @@ -169,6 +171,7 @@ CLASS ltcl_pack IMPLEMENTATION. ls_object-sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-tree iv_data = lv_data ). ls_object-type = zif_abapgit_definitions=>gc_type-tree. ls_object-data = lv_data. + ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ). APPEND ls_object TO lt_objects. @@ -188,6 +191,7 @@ CLASS ltcl_pack IMPLEMENTATION. iv_data = iv_data ). rs_object-type = zif_abapgit_definitions=>gc_type-blob. rs_object-data = iv_data. + rs_object-adler32 = zcl_abapgit_hash=>adler32( iv_data ). ENDMETHOD. "object_blob diff --git a/src/utils/zcl_abapgit_hash.clas.abap b/src/utils/zcl_abapgit_hash.clas.abap index d0366b663..3142a16e9 100644 --- a/src/utils/zcl_abapgit_hash.clas.abap +++ b/src/utils/zcl_abapgit_hash.clas.abap @@ -3,11 +3,9 @@ CLASS zcl_abapgit_hash DEFINITION CREATE PUBLIC . PUBLIC SECTION. - TYPES: ty_adler32 TYPE x LENGTH 4. - CLASS-METHODS adler32 IMPORTING iv_xstring TYPE xstring - RETURNING VALUE(rv_checksum) TYPE ty_adler32. + RETURNING VALUE(rv_checksum) TYPE zif_abapgit_definitions=>ty_adler32. CLASS-METHODS sha1 IMPORTING iv_type TYPE zif_abapgit_definitions=>ty_type diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 6b3b46b2b..14eb0229f 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -6,6 +6,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. ty_bitbyte TYPE c LENGTH 8 . TYPES: ty_sha1 TYPE c LENGTH 40 . + TYPES: ty_adler32 TYPE x LENGTH 4. TYPES: BEGIN OF ty_file_signature, path TYPE string, @@ -92,9 +93,10 @@ INTERFACE zif_abapgit_definitions PUBLIC. ty_chmod TYPE c LENGTH 6 . TYPES: BEGIN OF ty_object, - sha1 TYPE zif_abapgit_definitions=>ty_sha1, - type TYPE zif_abapgit_definitions=>ty_type, - data TYPE xstring, + sha1 TYPE zif_abapgit_definitions=>ty_sha1, + type TYPE zif_abapgit_definitions=>ty_type, + data TYPE xstring, + adler32 TYPE ty_adler32, END OF ty_object . TYPES: ty_objects_tt TYPE STANDARD TABLE OF ty_object WITH DEFAULT KEY .