diff --git a/zabapgit.prog.abap b/zabapgit.prog.abap index 9fe9ff865..55ee875c8 100644 --- a/zabapgit.prog.abap +++ b/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.9.13'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.9.14'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -372,23 +372,23 @@ ENDCLASS. "lcl_html_helper IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_html_toolbar DEFINITION FINAL. PUBLIC SECTION. - METHODS add IMPORTING iv_txt TYPE string - io_sub TYPE REF TO lcl_html_toolbar OPTIONAL - iv_cmd TYPE string OPTIONAL - iv_emph TYPE abap_bool OPTIONAL - iv_canc TYPE abap_bool OPTIONAL. + METHODS add IMPORTING iv_txt TYPE string + io_sub TYPE REF TO lcl_html_toolbar OPTIONAL + iv_cmd TYPE string OPTIONAL + iv_emph TYPE abap_bool OPTIONAL + iv_canc TYPE abap_bool OPTIONAL. METHODS render IMPORTING iv_as_droplist_with_label TYPE string OPTIONAL iv_no_separator TYPE abap_bool OPTIONAL RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. PRIVATE SECTION. - TYPES: BEGIN OF ty_item, - txt TYPE string, - cmd TYPE string, - sub TYPE REF TO lcl_html_toolbar, - emphasis TYPE abap_bool, - cancel TYPE abap_bool, - END OF ty_item. + TYPES: BEGIN OF ty_item, + txt TYPE string, + cmd TYPE string, + sub TYPE REF TO lcl_html_toolbar, + emphasis TYPE abap_bool, + cancel TYPE abap_bool, + END OF ty_item. TYPES: tt_items TYPE STANDARD TABLE OF ty_item. DATA mt_items TYPE tt_items. @@ -416,8 +416,8 @@ CLASS lcl_html_toolbar IMPLEMENTATION. METHOD render. DATA: - lv_class TYPE string, - lv_last TYPE abap_bool. + lv_class TYPE string, + lv_last TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF mt_items. @@ -2467,15 +2467,15 @@ CLASS lcl_diff DEFINITION FINAL. update TYPE c LENGTH 1 VALUE 'U', END OF c_diff. - TYPES: BEGIN OF ty_diff, - local_line TYPE c LENGTH 6, - local TYPE string, - result TYPE c LENGTH 1, - remote_line TYPE c LENGTH 6, - remote TYPE string, - short TYPE abap_bool, - beacon TYPE i, - END OF ty_diff. + TYPES: BEGIN OF ty_diff, + local_line TYPE c LENGTH 6, + local TYPE string, + result TYPE c LENGTH 1, + remote_line TYPE c LENGTH 6, + remote TYPE string, + short TYPE abap_bool, + beacon TYPE i, + END OF ty_diff. TYPES: ty_diffs_tt TYPE STANDARD TABLE OF ty_diff WITH DEFAULT KEY. TYPES: BEGIN OF ty_count, @@ -2648,11 +2648,11 @@ CLASS lcl_diff IMPLEMENTATION. METHOD map_beacons. - DATA: lv_beacon TYPE i, - lv_offs TYPE i, - lv_code_line TYPE string, - lo_regex TYPE REF TO cl_abap_regex, - lt_regex_set TYPE TABLE OF REF TO cl_abap_regex. + DATA: lv_beacon TYPE i, + lv_offs TYPE i, + lv_code_line TYPE string, + lo_regex TYPE REF TO cl_abap_regex, + lt_regex_set TYPE TABLE OF REF TO cl_abap_regex. FIELD-SYMBOLS: LIKE LINE OF mt_diff. @@ -2777,12 +2777,14 @@ CLASS lcl_diff IMPLEMENTATION. ENDCLASS. "lcl_diff IMPLEMENTATION +CLASS ltcl_git_pack DEFINITION DEFERRED. + *----------------------------------------------------------------------* * CLASS lcl_pack DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_git_pack DEFINITION FINAL. +CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack. PUBLIC SECTION. TYPES: BEGIN OF ty_node, @@ -2859,6 +2861,10 @@ CLASS lcl_git_pack DEFINITION FINAL. 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 ty_type @@ -14385,6 +14391,38 @@ ENDCLASS. "lcl_hash IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_git_pack IMPLEMENTATION. + METHOD sort_tree. + + TYPES: BEGIN OF ty_sort, + sort TYPE string, + node TYPE ty_node, + END OF ty_sort. + + DATA: lt_sort TYPE STANDARD TABLE OF ty_sort WITH DEFAULT KEY. + + FIELD-SYMBOLS: LIKE LINE OF lt_sort, + LIKE LINE OF it_nodes. + + + LOOP AT it_nodes ASSIGNING . + APPEND INITIAL LINE TO lt_sort ASSIGNING . + IF -chmod = gc_chmod-dir. + CONCATENATE -name '/' INTO -sort. + ELSE. + -sort = -name. + ENDIF. + -node = . + ENDLOOP. + +* following has to be done, or unpack will fail on server side + SORT lt_sort BY sort ASCENDING. + + LOOP AT lt_sort ASSIGNING . + APPEND -node TO rt_nodes. + ENDLOOP. + + ENDMETHOD. + METHOD type_and_length. DATA: lv_bits TYPE string, @@ -14485,9 +14523,7 @@ CLASS lcl_git_pack IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF it_nodes. - lt_nodes[] = it_nodes[]. -* following has to be done, or unpack will fail on server side - SORT lt_nodes BY name ASCENDING. + lt_nodes = sort_tree( it_nodes ). LOOP AT lt_nodes ASSIGNING . ASSERT NOT -chmod IS INITIAL. @@ -18438,9 +18474,9 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. RAISING lcx_exception. METHODS extract_repo_content - IMPORTING io_repo TYPE REF TO lcl_repo - EXPORTING et_repo_items TYPE tt_repo_items - eo_log TYPE REF TO lcl_log + IMPORTING io_repo TYPE REF TO lcl_repo + EXPORTING et_repo_items TYPE tt_repo_items + eo_log TYPE REF TO lcl_log RAISING lcx_exception. METHODS render_repo_item @@ -18670,7 +18706,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. " Content ro_html->add( '
' ). "#EC NOTEXT - ro_html->add( '' )."#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT @@ -20080,14 +20116,14 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD extract_repo_content. - DATA: lo_repo_online TYPE REF TO lcl_repo_online, - lt_tadir TYPE lcl_tadir=>ty_tadir_tt, - ls_repo_item TYPE ty_repo_item, - ls_file TYPE ty_repo_file, - lt_results TYPE lcl_file_status=>ty_results_tt. + DATA: lo_repo_online TYPE REF TO lcl_repo_online, + lt_tadir TYPE lcl_tadir=>ty_tadir_tt, + ls_repo_item TYPE ty_repo_item, + ls_file TYPE ty_repo_file, + lt_results TYPE lcl_file_status=>ty_results_tt. - FIELD-SYMBOLS: LIKE LINE OF lt_results, - LIKE LINE OF lt_tadir. + FIELD-SYMBOLS: LIKE LINE OF lt_results, + LIKE LINE OF lt_tadir. IF io_repo->is_offline( ) = abap_true. lt_tadir = lcl_tadir=>read( io_repo->get_package( ) ). @@ -20448,9 +20484,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD lif_gui_page~render. - DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, - lx_error TYPE REF TO lcx_exception, - lo_repo LIKE LINE OF lt_repos. + DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, + lx_error TYPE REF TO lcx_exception, + lo_repo LIKE LINE OF lt_repos. CREATE OBJECT ro_html. @@ -20951,7 +20987,9 @@ CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FI pack_long FOR TESTING RAISING lcx_exception, pack_multiple FOR TESTING - RAISING lcx_exception. + RAISING lcx_exception, + sort_tree1 FOR TESTING, + sort_tree2 FOR TESTING. METHODS: object_blob @@ -21218,6 +21256,62 @@ ENDCLASS. "ltcl_url IMPLEMENTATION *----------------------------------------------------------------------* CLASS ltcl_git_pack IMPLEMENTATION. + METHOD sort_tree1. + + DATA: lt_tree TYPE lcl_git_pack=>ty_nodes_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_tree. + + + APPEND INITIAL LINE TO lt_tree ASSIGNING . + -chmod = gc_chmod-file. + -name = 'b.txt'. + -sha1 = '0123'. + + APPEND INITIAL LINE TO lt_tree ASSIGNING . + -chmod = gc_chmod-file. + -name = 'a.txt'. + -sha1 = '0123'. + + lt_tree = lcl_git_pack=>sort_tree( lt_tree ). + + READ TABLE lt_tree INDEX 1 ASSIGNING . + cl_abap_unit_assert=>assert_subrc( ). + + cl_abap_unit_assert=>assert_equals( + act = -name + exp = 'a.txt' ). + + ENDMETHOD. + + METHOD sort_tree2. + + DATA: lt_tree TYPE lcl_git_pack=>ty_nodes_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_tree. + + + APPEND INITIAL LINE TO lt_tree ASSIGNING . + -chmod = gc_chmod-file. + -name = 'foo.txt'. + -sha1 = '0123'. + + APPEND INITIAL LINE TO lt_tree ASSIGNING . + -chmod = gc_chmod-dir. + -name = 'foo'. + -sha1 = '0123'. + + lt_tree = lcl_git_pack=>sort_tree( lt_tree ). + + READ TABLE lt_tree INDEX 1 ASSIGNING . + cl_abap_unit_assert=>assert_subrc( ). + + cl_abap_unit_assert=>assert_equals( + act = -name + exp = 'foo.txt' ). + + ENDMETHOD. + METHOD pack_multiple. CONSTANTS: lc_data TYPE x LENGTH 15 VALUE '123456789ABCDEF545794254754554',
@LOCAL