Merge pull request #1166 from larshp/issue_1165

git pack: add adler32 table as optional input
This commit is contained in:
Lars Hvam 2018-01-21 12:05:55 +01:00 committed by GitHub
commit ef9dccab71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 76 additions and 50 deletions

View File

@ -21,6 +21,11 @@ CLASS zcl_abapgit_git_pack DEFINITION
committer TYPE string, committer TYPE string,
body TYPE string, body TYPE string,
END OF ty_commit . END OF ty_commit .
TYPES:
BEGIN OF ty_adler32,
sha1 TYPE zif_abapgit_definitions=>ty_sha1,
type TYPE zif_abapgit_definitions=>ty_type,
END OF ty_adler32 .
CLASS-METHODS decode CLASS-METHODS decode
IMPORTING IMPORTING
@ -60,6 +65,51 @@ CLASS zcl_abapgit_git_pack DEFINITION
!is_commit TYPE ty_commit !is_commit TYPE ty_commit
RETURNING RETURNING
VALUE(rv_data) TYPE xstring . 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 CLASS-METHODS type_and_length
IMPORTING IMPORTING
!iv_type TYPE zif_abapgit_definitions=>ty_type !iv_type TYPE zif_abapgit_definitions=>ty_type
@ -68,43 +118,12 @@ CLASS zcl_abapgit_git_pack DEFINITION
VALUE(rv_xstring) TYPE xstring VALUE(rv_xstring) TYPE xstring
RAISING RAISING
zcx_abapgit_exception . 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 CLASS-METHODS zlib_decompress
CHANGING cv_data TYPE xstring CHANGING
cv_decompressed TYPE xstring !cv_data TYPE xstring
RAISING zcx_abapgit_exception. !cv_decompressed TYPE xstring
RAISING
zcx_abapgit_exception .
ENDCLASS. ENDCLASS.
@ -210,11 +229,10 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
cv_decompressed = lv_decompressed ). cv_decompressed = lv_decompressed ).
ENDIF. ENDIF.
CLEAR ls_object.
ls_object-adler32 = lv_data(4).
lv_data = lv_data+4. " skip adler checksum lv_data = lv_data+4. " skip adler checksum
*************************
CLEAR ls_object.
IF lv_type = zif_abapgit_definitions=>gc_type-ref_d. IF lv_type = zif_abapgit_definitions=>gc_type-ref_d.
ls_object-sha1 = lv_ref_delta. ls_object-sha1 = lv_ref_delta.
TRANSLATE ls_object-sha1 TO LOWER CASE. TRANSLATE ls_object-sha1 TO LOWER CASE.
@ -518,13 +536,14 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
METHOD encode. METHOD encode.
DATA: lv_sha1 TYPE x LENGTH 20, 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_compressed TYPE xstring,
lv_xstring TYPE xstring, lv_xstring TYPE xstring,
lo_progress TYPE REF TO zcl_abapgit_progress, lo_progress TYPE REF TO zcl_abapgit_progress,
lv_objects_total TYPE i. lv_objects_total TYPE i.
FIELD-SYMBOLS: <ls_object> LIKE LINE OF it_objects. FIELD-SYMBOLS: <ls_object> LIKE LINE OF it_objects.
rv_data = c_pack_start. rv_data = c_pack_start.
@ -540,7 +559,6 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
iv_total = lv_objects_total. iv_total = lv_objects_total.
LOOP AT it_objects ASSIGNING <ls_object>. LOOP AT it_objects ASSIGNING <ls_object>.
lo_progress->show( lo_progress->show(
iv_current = sy-tabix iv_current = sy-tabix
iv_text = |Encoding objects ( { sy-tabix } of { lv_objects_total } )| ). iv_text = |Encoding objects ( { sy-tabix } of { lv_objects_total } )| ).
@ -558,7 +576,11 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
CONCATENATE rv_data c_zlib lv_compressed INTO rv_data IN BYTE MODE. CONCATENATE rv_data c_zlib lv_compressed INTO rv_data IN BYTE MODE.
lv_adler32 = zcl_abapgit_hash=>adler32( <ls_object>-data ). IF NOT <ls_object>-adler32 IS INITIAL.
lv_adler32 = <ls_object>-adler32.
ELSE.
lv_adler32 = zcl_abapgit_hash=>adler32( <ls_object>-data ).
ENDIF.
CONCATENATE rv_data lv_adler32 INTO rv_data IN BYTE MODE. CONCATENATE rv_data lv_adler32 INTO rv_data IN BYTE MODE.
ENDLOOP. ENDLOOP.
@ -801,7 +823,7 @@ CLASS ZCL_ABAPGIT_GIT_PACK IMPLEMENTATION.
DATA: ls_data TYPE zcl_abapgit_zlib=>ty_decompress, DATA: ls_data TYPE zcl_abapgit_zlib=>ty_decompress,
lv_compressed_len TYPE i, 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 ). ls_data = zcl_abapgit_zlib=>decompress( cv_data ).

View File

@ -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-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-type = zif_abapgit_definitions=>gc_type-blob.
ls_object-data = lv_data. ls_object-data = lv_data.
ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ).
APPEND ls_object TO lt_objects. APPEND ls_object TO lt_objects.
* commit * 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-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-type = zif_abapgit_definitions=>gc_type-commit.
ls_object-data = lv_data. ls_object-data = lv_data.
ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ).
APPEND ls_object TO lt_objects. APPEND ls_object TO lt_objects.
* tree * 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-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-type = zif_abapgit_definitions=>gc_type-tree.
ls_object-data = lv_data. ls_object-data = lv_data.
ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ).
APPEND ls_object TO lt_objects. APPEND ls_object TO lt_objects.
@ -188,6 +191,7 @@ CLASS ltcl_pack IMPLEMENTATION.
iv_data = iv_data ). iv_data = iv_data ).
rs_object-type = zif_abapgit_definitions=>gc_type-blob. rs_object-type = zif_abapgit_definitions=>gc_type-blob.
rs_object-data = iv_data. rs_object-data = iv_data.
rs_object-adler32 = zcl_abapgit_hash=>adler32( iv_data ).
ENDMETHOD. "object_blob ENDMETHOD. "object_blob

View File

@ -3,11 +3,9 @@ CLASS zcl_abapgit_hash DEFINITION
CREATE PUBLIC . CREATE PUBLIC .
PUBLIC SECTION. PUBLIC SECTION.
TYPES: ty_adler32 TYPE x LENGTH 4.
CLASS-METHODS adler32 CLASS-METHODS adler32
IMPORTING iv_xstring TYPE xstring 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 CLASS-METHODS sha1
IMPORTING iv_type TYPE zif_abapgit_definitions=>ty_type IMPORTING iv_type TYPE zif_abapgit_definitions=>ty_type

View File

@ -6,6 +6,7 @@ INTERFACE zif_abapgit_definitions PUBLIC.
ty_bitbyte TYPE c LENGTH 8 . ty_bitbyte TYPE c LENGTH 8 .
TYPES: TYPES:
ty_sha1 TYPE c LENGTH 40 . ty_sha1 TYPE c LENGTH 40 .
TYPES: ty_adler32 TYPE x LENGTH 4.
TYPES: TYPES:
BEGIN OF ty_file_signature, BEGIN OF ty_file_signature,
path TYPE string, path TYPE string,
@ -92,9 +93,10 @@ INTERFACE zif_abapgit_definitions PUBLIC.
ty_chmod TYPE c LENGTH 6 . ty_chmod TYPE c LENGTH 6 .
TYPES: TYPES:
BEGIN OF ty_object, BEGIN OF ty_object,
sha1 TYPE zif_abapgit_definitions=>ty_sha1, sha1 TYPE zif_abapgit_definitions=>ty_sha1,
type TYPE zif_abapgit_definitions=>ty_type, type TYPE zif_abapgit_definitions=>ty_type,
data TYPE xstring, data TYPE xstring,
adler32 TYPE ty_adler32,
END OF ty_object . END OF ty_object .
TYPES: TYPES:
ty_objects_tt TYPE STANDARD TABLE OF ty_object WITH DEFAULT KEY . ty_objects_tt TYPE STANDARD TABLE OF ty_object WITH DEFAULT KEY .