Faulty handling of post data (#3624)

* Fixed faulty translation of post data to parsable string

- Added method TRANSLATE_POSTDATA to ZCL_ABAPGIT_UTILS as a centralized place to translate post data to a string
- Replaced all post data string concatenations with the translation helper method to correctly parse spaces that fall to the end of a table line (this should solve #3073 as well as any other random crash caused by accidental misalignment of the post data)

* Backport ABAP statement to 7.02

* Code cleanup for linter checks

* Code cleanup for linter checks

* Fixed a possible error in parsing

If it_postdata contains an empty last line, the staging fails, because the string may contain a lot of soaces at the end of the previous to last line.

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Michael Käsemann 2020-07-16 15:51:36 +02:00 committed by GitHub
parent 3183f95bb6
commit 72ccc986c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 40 additions and 7 deletions

View File

@ -56,7 +56,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION.
lv_string TYPE string. lv_string TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_string. lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ).
lv_string = cl_http_utility=>unescape_url( lv_string ). lv_string = cl_http_utility=>unescape_url( lv_string ).

View File

@ -233,7 +233,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields. FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
CONCATENATE LINES OF it_postdata INTO lv_string. lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ).
lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ).

View File

@ -345,7 +345,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION.
lv_add TYPE string, lv_add TYPE string,
lv_remove TYPE string. lv_remove TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_string. lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ).
lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ).
zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = c_patch_action-add zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = c_patch_action-add

View File

@ -84,7 +84,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_SETT IMPLEMENTATION.
DATA lv_serialized_post_data TYPE string. DATA lv_serialized_post_data TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. lv_serialized_post_data = zcl_abapgit_utils=>translate_postdata( it_postdata ).
rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ). rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ).
ENDMETHOD. ENDMETHOD.

View File

@ -128,7 +128,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETTINGS IMPLEMENTATION.
DATA lv_serialized_post_data TYPE string. DATA lv_serialized_post_data TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. lv_serialized_post_data = zcl_abapgit_utils=>translate_postdata( it_postdata ).
rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ). rt_post_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_serialized_post_data ).
ENDMETHOD. ENDMETHOD.

View File

@ -581,7 +581,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION.
<ls_status> LIKE LINE OF ms_files-status, <ls_status> LIKE LINE OF ms_files-status,
<ls_item> LIKE LINE OF lt_fields. <ls_item> LIKE LINE OF lt_fields.
CONCATENATE LINES OF it_postdata INTO lv_string. lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ).
lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ). lt_fields = zcl_abapgit_html_action_utils=>parse_fields( lv_string ).
IF lines( lt_fields ) = 0. IF lines( lt_fields ) = 0.

View File

@ -159,7 +159,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION.
CLEAR eg_fields. CLEAR eg_fields.
CONCATENATE LINES OF it_postdata INTO lv_string. lv_string = zcl_abapgit_utils=>translate_postdata( it_postdata ).
REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_string WITH lc_replace. REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_string WITH lc_replace.
REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_newline IN lv_string WITH lc_replace. REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_newline IN lv_string WITH lc_replace.
lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ). lt_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( lv_string ).

View File

@ -19,6 +19,11 @@ CLASS zcl_abapgit_utils DEFINITION
!ev_time TYPE zif_abapgit_definitions=>ty_commit-time !ev_time TYPE zif_abapgit_definitions=>ty_commit-time
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS translate_postdata
IMPORTING
!it_postdata TYPE cnht_post_data_tab
RETURNING
VALUE(rv_string) TYPE string .
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
ENDCLASS. ENDCLASS.
@ -72,4 +77,32 @@ CLASS zcl_abapgit_utils IMPLEMENTATION.
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD translate_postdata.
DATA: lt_post_data TYPE cnht_post_data_tab,
ls_last_line TYPE cnht_post_data_line,
lv_last_line_index TYPE i.
IF it_postdata IS INITIAL.
"Nothing to do
RETURN.
ENDIF.
lt_post_data = it_postdata.
"Save the last line for separate merge, because we don't need its trailing spaces
WHILE ls_last_line IS INITIAL.
lv_last_line_index = lines( lt_post_data ).
READ TABLE lt_post_data INTO ls_last_line INDEX lv_last_line_index.
DELETE lt_post_data INDEX lv_last_line_index.
ENDWHILE.
CONCATENATE LINES OF lt_post_data INTO rv_string
IN CHARACTER MODE RESPECTING BLANKS.
CONCATENATE rv_string ls_last_line INTO rv_string
IN CHARACTER MODE.
ENDMETHOD.
ENDCLASS. ENDCLASS.