diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 88aeb53e2..c25960625 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -114,6 +114,12 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack. IMPORTING is_commit TYPE ty_commit RETURNING VALUE(rv_data) TYPE xstring. + CLASS-METHODS type_and_length + IMPORTING iv_type TYPE lif_defs=>ty_type + iv_length TYPE i + RETURNING VALUE(rv_xstring) TYPE xstring + RAISING lcx_exception. + PRIVATE SECTION. CONSTANTS: c_pack_start TYPE x LENGTH 4 VALUE '5041434B', " PACK c_zlib TYPE x LENGTH 2 VALUE '789C', @@ -124,11 +130,6 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack. CHANGING ct_objects TYPE lif_defs=>ty_objects_tt RAISING lcx_exception. - CLASS-METHODS type_and_length - IMPORTING is_object TYPE lif_defs=>ty_object - RETURNING VALUE(rv_xstring) TYPE xstring - RAISING lcx_exception. - CLASS-METHODS delta IMPORTING is_object TYPE lif_defs=>ty_object CHANGING ct_objects TYPE lif_defs=>ty_objects_tt @@ -430,7 +431,7 @@ CLASS lcl_git_pack IMPLEMENTATION. lv_x TYPE x LENGTH 1. - CASE is_object-type. + CASE iv_type. WHEN lif_defs=>gc_type-commit. lv_type = '001'. WHEN lif_defs=>gc_type-tree. @@ -443,7 +444,7 @@ CLASS lcl_git_pack IMPLEMENTATION. lcx_exception=>raise( 'Unexpected object type while encoding pack' ). ENDCASE. - lv_x4 = xstrlen( is_object-data ). + lv_x4 = iv_length. DO 32 TIMES. GET BIT sy-index OF lv_x4 INTO lv_c. CONCATENATE lv_bits lv_c INTO lv_bits. @@ -1025,22 +1026,20 @@ CLASS lcl_git_pack IMPLEMENTATION. METHOD encode. - DATA: lv_sha1 TYPE x LENGTH 20, - lv_adler32 TYPE lcl_hash=>ty_adler32, - lv_len TYPE i, - lv_compressed TYPE xstring, - lv_xstring TYPE xstring. - DATA: lv_objects_total TYPE i. - DATA: lv_objects_processed TYPE i. + DATA: lv_sha1 TYPE x LENGTH 20, + lv_adler32 TYPE lcl_hash=>ty_adler32, + lv_compressed TYPE xstring, + lv_xstring TYPE xstring, + lv_objects_total TYPE i, + lv_objects_processed TYPE i. + FIELD-SYMBOLS: LIKE LINE OF it_objects. rv_data = c_pack_start. CONCATENATE rv_data c_version INTO rv_data IN BYTE MODE. - lv_len = lines( it_objects ). - lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_len - iv_length = 4 ). + lv_xstring = lcl_convert=>int_to_xstring4( lines( it_objects ) ). CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE. lv_objects_total = lines( it_objects ). @@ -1053,7 +1052,9 @@ CLASS lcl_git_pack IMPLEMENTATION. i_processed = lv_objects_processed i_total = lv_objects_total ). - lv_xstring = type_and_length( ). + lv_xstring = type_and_length( + iv_type = -type + iv_length = xstrlen( -data ) ). CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE. cl_abap_gzip=>compress_binary( diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 62de90170..37b38afe9 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -62,6 +62,7 @@ ENDCLASS. "ltcl_convert DEFINITION CLASS ltcl_convert IMPLEMENTATION. METHOD convert_int. + DATA: lv_xstring TYPE xstring, lv_input TYPE i, lv_result TYPE i. @@ -69,8 +70,7 @@ CLASS ltcl_convert IMPLEMENTATION. DO 1000 TIMES. lv_input = sy-index. - lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_input - iv_length = 4 ). + lv_xstring = lcl_convert=>int_to_xstring4( lv_input ). lv_result = lcl_convert=>xstring_to_int( lv_xstring ). cl_abap_unit_assert=>assert_equals( @@ -1096,7 +1096,11 @@ CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FI pack_multiple FOR TESTING RAISING lcx_exception, sort_tree1 FOR TESTING, - sort_tree2 FOR TESTING. + sort_tree2 FOR TESTING, + type_and_length01 FOR TESTING + RAISING lcx_exception, + type_and_length02 FOR TESTING + RAISING lcx_exception. METHODS: object_blob @@ -1113,6 +1117,34 @@ ENDCLASS. "test DEFINITION *----------------------------------------------------------------------* CLASS ltcl_git_pack IMPLEMENTATION. + METHOD type_and_length01. + + DATA: lv_result TYPE xstring. + + lv_result = lcl_git_pack=>type_and_length( + iv_type = lif_defs=>gc_type-commit + iv_length = 100 ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = '9406' ). + + ENDMETHOD. + + METHOD type_and_length02. + + DATA: lv_result TYPE xstring. + + lv_result = lcl_git_pack=>type_and_length( + iv_type = lif_defs=>gc_type-blob + iv_length = 90000 ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = 'B0F92B' ). + + ENDMETHOD. + METHOD sort_tree1. DATA: lt_tree TYPE lcl_git_pack=>ty_nodes_tt. diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index 06e39421c..cdd0ec32e 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -133,9 +133,8 @@ CLASS lcl_convert DEFINITION FINAL. RETURNING VALUE(rv_i) TYPE i RAISING lcx_exception. - CLASS-METHODS int_to_xstring + CLASS-METHODS int_to_xstring4 IMPORTING iv_i TYPE i - iv_length TYPE i RETURNING VALUE(rv_xstring) TYPE xstring. CLASS-METHODS split_string @@ -151,13 +150,12 @@ ENDCLASS. "lcl_convert DEFINITION *----------------------------------------------------------------------* CLASS lcl_convert IMPLEMENTATION. - METHOD int_to_xstring. + METHOD int_to_xstring4. +* returns xstring of length 4 containing the integer value iv_i DATA: lv_x TYPE x LENGTH 4. - ASSERT iv_length = 4. " other cases not implemented - lv_x = iv_i. rv_xstring = lv_x.