Diff: Properly show diffs for whitespace (#5643)

This commit is contained in:
Marc Bernard 2022-06-23 14:35:31 +02:00 committed by GitHub
parent ef29fa7411
commit 8baf69ed98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 135 additions and 38 deletions

View File

@ -152,12 +152,12 @@ CLASS zcl_abapgit_gui_page_diff DEFINITION
VALUE(rv_is_refrseh) TYPE abap_bool.
METHODS modify_files_before_diff_calc
IMPORTING
it_diff_files_old TYPE ty_file_diffs
it_diff_files_old TYPE ty_file_diffs
RETURNING
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_stage_tt.
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_stage_tt.
METHODS add_view_sub_menu
IMPORTING
io_menu TYPE REF TO zcl_abapgit_html_toolbar .
io_menu TYPE REF TO zcl_abapgit_html_toolbar .
METHODS render_content
REDEFINITION .
@ -201,6 +201,11 @@ CLASS zcl_abapgit_gui_page_diff DEFINITION
!is_diff TYPE ty_file_diff
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS render_line_no_diffs
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS render_line_split
IMPORTING
!is_diff_line TYPE zif_abapgit_definitions=>ty_diff
@ -256,6 +261,11 @@ CLASS zcl_abapgit_gui_page_diff DEFINITION
is_status TYPE zif_abapgit_definitions=>ty_result
RETURNING
VALUE(rv_is_file_requested) TYPE abap_bool.
METHODS has_diffs
IMPORTING
!it_diffs TYPE zif_abapgit_definitions=>ty_diffs_tt
RETURNING
VALUE(rv_has_diffs) TYPE abap_bool.
ENDCLASS.
@ -641,6 +651,16 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
ENDMETHOD.
METHOD has_diffs.
LOOP AT it_diffs TRANSPORTING NO FIELDS WHERE result IS NOT INITIAL.
rv_has_diffs = abap_true.
EXIT.
ENDLOOP.
ENDMETHOD.
METHOD insert_nav.
ENDMETHOD.
@ -984,6 +1004,11 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
lt_diffs = is_diff-o_diff->get( ).
IF has_diffs( lt_diffs ) = abap_false.
ri_html->add( render_line_no_diffs( ) ).
RETURN.
ENDIF.
lv_insert_nav = insert_nav( ).
LOOP AT lt_diffs ASSIGNING <ls_diff>.
@ -1032,6 +1057,26 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
ENDMETHOD.
METHOD render_line_no_diffs.
DATA ls_diff_line TYPE zif_abapgit_definitions=>ty_diff.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
IF mv_unified = abap_true.
ls_diff_line-old = 'No diffs found'.
ri_html->add( render_line_unified( is_diff_line = ls_diff_line ) ).
ELSE.
ls_diff_line-new = 'No diffs found'.
ri_html->add( render_line_split( is_diff_line = ls_diff_line
iv_filename = ''
iv_fstate = ''
iv_index = 1 ) ).
ENDIF.
ENDMETHOD.
METHOD render_line_split.
DATA: lv_new TYPE string,

View File

@ -241,7 +241,7 @@ CLASS zcl_abapgit_diff IMPLEMENTATION.
APPEND ls_diff TO rt_diff.
ENDLOOP.
ELSEIF sy-subrc = 2.
" Identical input
" Copy input... but it might not be identical
LOOP AT it_old ASSIGNING <ls_old>.
CLEAR ls_diff.
ls_diff-old_num = sy-tabix.
@ -250,6 +250,11 @@ CLASS zcl_abapgit_diff IMPLEMENTATION.
ASSERT sy-subrc = 0.
ls_diff-new_num = sy-tabix.
ls_diff-new = <ls_new>.
" SAP function ignores lines that contain only whitespace so we compare directly
IF ( mv_compare_mode = 1 OR mv_compare_mode = 3 ) AND <ls_old> <> <ls_new> AND
( strlen( condense( <ls_old> ) ) = 0 OR strlen( condense( <ls_new> ) ) = 0 ).
ls_diff-result = zif_abapgit_definitions=>c_diff-update.
ENDIF.
APPEND ls_diff TO rt_diff.
ENDLOOP.
ELSE.

View File

@ -42,7 +42,8 @@ CLASS ltcl_diff DEFINITION FOR TESTING
diff10 FOR TESTING RAISING zcx_abapgit_exception,
diff11 FOR TESTING RAISING zcx_abapgit_exception,
diff12 FOR TESTING RAISING zcx_abapgit_exception,
diff13 FOR TESTING RAISING zcx_abapgit_exception.
diff13 FOR TESTING RAISING zcx_abapgit_exception,
diff14 FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS.
@ -141,7 +142,7 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = 'A'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = 'A' ).
test( ).
@ -189,12 +190,12 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = 'A'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = 'A' ).
add_expected( iv_new_num = ' 2'
iv_new = 'B'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 2'
iv_old = 'B' ).
test( ).
@ -217,12 +218,12 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = 'A'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = 'A' ).
add_expected( iv_new_num = ' 2'
iv_new = 'B'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 2'
iv_old = 'B' ).
add_expected( iv_new_num = ' 3'
@ -232,7 +233,7 @@ CLASS ltcl_diff IMPLEMENTATION.
iv_old = '' ).
add_expected( iv_new_num = ' 4'
iv_new = 'C'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 3'
iv_old = 'C' ).
add_expected( iv_new_num = ' 5'
@ -260,22 +261,22 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = 'A'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = 'A' ).
add_expected( iv_new_num = ' 2'
iv_new = ' B'
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 2'
iv_old = 'B' ).
add_expected( iv_new_num = ' 3'
iv_new = 'C'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 3'
iv_old = 'C' ).
add_expected( iv_new_num = ' 4'
iv_new = ' D'
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 4'
iv_old = 'D' ).
@ -298,22 +299,22 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = 'A'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = 'A' ).
add_expected( iv_new_num = ' 2'
iv_new = '* X'
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 2'
iv_old = '* B' ).
add_expected( iv_new_num = ' 3'
iv_new = 'C'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 3'
iv_old = 'C' ).
add_expected( iv_new_num = ' 4'
iv_new = 'D " new'
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 4'
iv_old = 'D " old' ).
@ -336,22 +337,22 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = 'A'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = 'A' ).
add_expected( iv_new_num = ' 2'
iv_new = 'b'
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 2'
iv_old = 'B' ).
add_expected( iv_new_num = ' 3'
iv_new = 'c'
iv_result = ''
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 3'
iv_old = 'c' ).
add_expected( iv_new_num = ' 4'
iv_new = 'D'
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 4'
iv_old = 'd' ).
@ -368,7 +369,7 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = `WRITE 'TEST'`
iv_result = 'U'
iv_result = zif_abapgit_definitions=>c_diff-update
iv_old_num = ' 1'
iv_old = `WRITE 'test'` ).
@ -387,12 +388,12 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = `write 'test'`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = `WRITE 'test'` ).
add_expected( iv_new_num = ' 2'
iv_new = `DATA FOO TYPE I.`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 2'
iv_old = `DATA foo TYPE i.` ).
@ -416,37 +417,37 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_new_num = ' 1'
iv_new = `REPORT zprog_diff.`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = `REPORT zprog_diff.`
iv_beacon = 1 ).
add_expected( iv_new_num = ' 2'
iv_new = `*`
iv_result = 'I'
iv_result = zif_abapgit_definitions=>c_diff-insert
iv_old_num = ' '
iv_old = ``
iv_beacon = 1 ).
add_expected( iv_new_num = ' 3'
iv_new = `FORM t_1.`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 2'
iv_old = `FORM t_1.`
iv_beacon = 2 ).
add_expected( iv_new_num = ' 4'
iv_new = `ENDFORM.`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 3'
iv_old = `ENDFORM.`
iv_beacon = 2 ).
add_expected( iv_new_num = ' 5'
iv_new = `FORM t_2.`
iv_result = 'I'
iv_result = zif_abapgit_definitions=>c_diff-insert
iv_old_num = ' '
iv_old = ``
iv_beacon = 3 ).
add_expected( iv_new_num = ' 6'
iv_new = `ENDFORM.`
iv_result = 'I'
iv_result = zif_abapgit_definitions=>c_diff-insert
iv_old_num = ' '
iv_old = ``
iv_beacon = 3 ).
@ -471,37 +472,37 @@ CLASS ltcl_diff IMPLEMENTATION.
add_expected( iv_old_num = ' 1'
iv_old = `REPORT zprog_diff.`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_new_num = ' 1'
iv_new = `REPORT zprog_diff.`
iv_beacon = 1 ).
add_expected( iv_old_num = ' 2'
iv_old = `*`
iv_result = 'D'
iv_result = zif_abapgit_definitions=>c_diff-delete
iv_new_num = ' '
iv_new = ``
iv_beacon = 1 ).
add_expected( iv_old_num = ' 3'
iv_old = `FORM t_1.`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_new_num = ' 2'
iv_new = `FORM t_1.`
iv_beacon = 2 ).
add_expected( iv_old_num = ' 4'
iv_old = `ENDFORM.`
iv_result = '' " no diff!
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_new_num = ' 3'
iv_new = `ENDFORM.`
iv_beacon = 2 ).
add_expected( iv_old_num = ' 5'
iv_old = `FORM t_2.`
iv_result = 'D'
iv_result = zif_abapgit_definitions=>c_diff-delete
iv_new_num = ' '
iv_new = ``
iv_beacon = 2 ).
add_expected( iv_old_num = ' 6'
iv_old = `ENDFORM.`
iv_result = 'D'
iv_result = zif_abapgit_definitions=>c_diff-delete
iv_new_num = ' '
iv_new = ``
iv_beacon = 2 ).
@ -510,4 +511,49 @@ CLASS ltcl_diff IMPLEMENTATION.
ENDMETHOD.
METHOD diff14.
" lines with different whitespace
add_new( iv_new = 'A' ).
add_new( iv_new = `` ). " empty line
add_new( iv_new = ` ` ). " one space
add_new( iv_new = ` ` ). " some spaces
add_new( iv_new = 'E' ).
add_old( iv_old = 'A' ).
add_old( iv_old = ` ` ). " some spaces
add_old( iv_old = ` ` ). " two spaces
add_old( iv_old = `` ). " empty line
add_old( iv_old = 'E' ).
add_expected( iv_new_num = ' 1'
iv_new = 'A'
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 1'
iv_old = 'A' ).
add_expected( iv_new_num = ' 2'
iv_new = ''
iv_result = zif_abapgit_definitions=>c_diff-update
iv_old_num = ' 2'
iv_old = ` ` ).
add_expected( iv_new_num = ' 3'
iv_new = ` `
iv_result = zif_abapgit_definitions=>c_diff-update
iv_old_num = ' 3'
iv_old = ` ` ).
add_expected( iv_new_num = ' 4'
iv_new = ` `
iv_result = zif_abapgit_definitions=>c_diff-update
iv_old_num = ' 4'
iv_old = '' ).
add_expected( iv_new_num = ' 5'
iv_new = 'E'
iv_result = zif_abapgit_definitions=>c_diff-unchanged
iv_old_num = ' 5'
iv_old = 'E' ).
test( ).
ENDMETHOD.
ENDCLASS.

View File

@ -277,6 +277,7 @@
{"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff11", "note": "fm RS_CMP_COMPUTE_DELTA + Void type: RSWSOURCET"},
{"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff12", "note": "fm RS_CMP_COMPUTE_DELTA + Void type: RSWSOURCET"},
{"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff13", "note": "fm RS_CMP_COMPUTE_DELTA + Void type: RSWSOURCET"},
{"object": "ZCL_ABAPGIT_DIFF", "class": "ltcl_diff", "method": "diff14", "note": "fm RS_CMP_COMPUTE_DELTA + Void type: RSWSOURCET"},
{"object": "ZCL_ABAPGIT_USER_RECORD", "class": "ltcl_user_record", "method": "test_invalid_user", "note": "Void type: BAPIADDR3"},
{"object": "ZCL_ABAPGIT_SERVICES_BASIS", "class": "ltcl_create_package", "method": "raise_error_if_package_exists", "note": "Void type: SCOMPKDTLN"},
{"object": "ZCL_ABAPGIT_SERVICES_BASIS", "class": "ltcl_create_package", "method": "package_given_in_popup", "note": "Void type: SCOMPKDTLN"},