Merge pull request #441 from sbcgua/t420_diff_fixes

diff page fixes and refactorings
This commit is contained in:
Lars Hvam 2016-11-19 11:59:25 +01:00 committed by GitHub
commit 5075a37d06
4 changed files with 246 additions and 177 deletions

View File

@ -11,6 +11,7 @@ Legend
2016-11-?? 2016-11-??
------------------ ------------------
+ supported object list @debugpage + supported object list @debugpage
* Fixed bug in diff page: change counters values
2016-11-12 2016-11-12
------------------ ------------------

View File

@ -6,10 +6,18 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS:
BEGIN OF c_mod,
local TYPE char1 VALUE 'L',
remote TYPE char1 VALUE 'R',
both TYPE char1 VALUE 'B',
END OF c_mod.
TYPES: BEGIN OF ty_file_diff, TYPES: BEGIN OF ty_file_diff,
filename TYPE string, filename TYPE string,
lstate TYPE char1, lstate TYPE char1,
rstate TYPE char1, rstate TYPE char1,
mod TYPE char1, " Abstraction for shorter ifs
o_diff TYPE REF TO lcl_diff, o_diff TYPE REF TO lcl_diff,
END OF ty_file_diff, END OF ty_file_diff,
tt_file_diff TYPE STANDARD TABLE OF ty_file_diff. tt_file_diff TYPE STANDARD TABLE OF ty_file_diff.
@ -29,15 +37,20 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
METHODS render_diff METHODS render_diff
IMPORTING is_diff TYPE ty_file_diff IMPORTING is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_head METHODS render_diff_head
IMPORTING is_diff TYPE ty_file_diff IMPORTING is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_table_head
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_lines METHODS render_lines
IMPORTING is_diff TYPE ty_file_diff IMPORTING is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_beacon
IMPORTING is_diff_line TYPE lcl_diff=>ty_diff
is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS get_line_hl METHODS get_line_hl
IMPORTING iv_lstate TYPE char1 IMPORTING iv_mod TYPE char1
iv_rstate TYPE char1
iv_result TYPE lcl_diff=>ty_diff-result iv_result TYPE lcl_diff=>ty_diff-result
EXPORTING ev_lattr TYPE string EXPORTING ev_lattr TYPE string
ev_rattr TYPE string. ev_rattr TYPE string.
@ -69,7 +82,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lt_local = lo_repo->get_files_local( ). lt_local = lo_repo->get_files_local( ).
lt_status = lo_repo->status( ). lt_status = lo_repo->status( ).
IF is_file IS NOT INITIAL. IF is_file IS NOT INITIAL. " Diff for one file
READ TABLE lt_status ASSIGNING <ls_status> READ TABLE lt_status ASSIGNING <ls_status>
WITH KEY path = is_file-path filename = is_file-filename. WITH KEY path = is_file-path filename = is_file-filename.
@ -78,7 +91,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
it_local = lt_local it_local = lt_local
is_status = <ls_status> ). is_status = <ls_status> ).
ELSEIF is_object IS NOT INITIAL. ELSEIF is_object IS NOT INITIAL. " Diff for whole object
LOOP AT lt_status ASSIGNING <ls_status> LOOP AT lt_status ASSIGNING <ls_status>
WHERE obj_type = is_object-obj_type WHERE obj_type = is_object-obj_type
@ -88,18 +101,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
append_diff( it_remote = lt_remote append_diff( it_remote = lt_remote
it_local = lt_local it_local = lt_local
is_status = <ls_status> ). is_status = <ls_status> ).
ENDLOOP. ENDLOOP.
ELSE. " For the whole repo ELSE. " Diff for the whole repo
LOOP AT lt_status ASSIGNING <ls_status>
WHERE match IS INITIAL.
LOOP AT lt_status ASSIGNING <ls_status> WHERE match IS INITIAL.
append_diff( it_remote = lt_remote append_diff( it_remote = lt_remote
it_local = lt_local it_local = lt_local
is_status = <ls_status> ). is_status = <ls_status> ).
ENDLOOP. ENDLOOP.
ENDIF. ENDIF.
@ -114,11 +123,12 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
DATA: DATA:
ls_r_dummy LIKE LINE OF it_remote ##NEEDED, ls_r_dummy LIKE LINE OF it_remote ##NEEDED,
ls_l_dummy LIKE LINE OF it_local ##NEEDED, ls_l_dummy LIKE LINE OF it_local ##NEEDED.
ls_diff_file LIKE LINE OF mt_diff_files.
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF it_remote, FIELD-SYMBOLS: <ls_remote> LIKE LINE OF it_remote,
<ls_local> LIKE LINE OF it_local. <ls_local> LIKE LINE OF it_local,
<ls_diff> LIKE LINE OF mt_diff_files.
READ TABLE it_remote ASSIGNING <ls_remote> READ TABLE it_remote ASSIGNING <ls_remote>
WITH KEY filename = is_status-filename WITH KEY filename = is_status-filename
@ -138,15 +148,30 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lcx_exception=>raise( |DIFF: file not found { is_status-filename }| ). lcx_exception=>raise( |DIFF: file not found { is_status-filename }| ).
ENDIF. ENDIF.
CREATE OBJECT ls_diff_file-o_diff APPEND INITIAL LINE TO mt_diff_files ASSIGNING <ls_diff>.
EXPORTING <ls_diff>-filename = is_status-filename.
iv_local = <ls_local>-file-data <ls_diff>-lstate = is_status-lstate.
iv_remote = <ls_remote>-data. <ls_diff>-rstate = is_status-rstate.
ls_diff_file-filename = is_status-filename. IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL.
ls_diff_file-lstate = is_status-lstate. <ls_diff>-mod = c_mod-both.
ls_diff_file-rstate = is_status-rstate. ELSEIF <ls_diff>-lstate IS NOT INITIAL.
APPEND ls_diff_file TO mt_diff_files. <ls_diff>-mod = c_mod-local.
ELSE. "rstate IS NOT INITIAL, lstate = empty.
<ls_diff>-mod = c_mod-remote.
ENDIF.
IF <ls_diff>-mod = c_mod-remote. " Remote file leading changes
CREATE OBJECT <ls_diff>-o_diff
EXPORTING
iv_new = <ls_remote>-data
iv_old = <ls_local>-file-data.
ELSE. " Local leading changes or both were modified
CREATE OBJECT <ls_diff>-o_diff
EXPORTING
iv_new = <ls_local>-file-data
iv_old = <ls_remote>-data.
ENDIF.
ENDMETHOD. "append_diff ENDMETHOD. "append_diff
@ -277,7 +302,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD render_head. METHOD render_diff_head.
DATA: lo_html TYPE REF TO lcl_html_helper, DATA: lo_html TYPE REF TO lcl_html_helper,
ls_stats TYPE lcl_diff=>ty_count. ls_stats TYPE lcl_diff=>ty_count.
@ -285,35 +310,48 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ls_stats = is_diff-o_diff->stats( ). ls_stats = is_diff-o_diff->stats( ).
IF is_diff-mod = c_mod-both. " Merge stats into 'update' if both were changed
ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete.
CLEAR: ls_stats-insert, ls_stats-delete.
ENDIF.
lo_html->add( '<div class="diff_head">' ). "#EC NOTEXT lo_html->add( '<div class="diff_head">' ). "#EC NOTEXT
lo_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ). lo_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
lo_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ). lo_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
lo_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ). lo_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
lo_html->add( '<span class="diff_name">' ). "#EC NOTEXT lo_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ). "#EC NOTEXT
lo_html->add( |{ is_diff-filename }| ).
lo_html->add( '</span>' ). "#EC NOTEXT
lo_html->add( render_item_state( iv1 = is_diff-lstate iv2 = is_diff-rstate ) ). lo_html->add( render_item_state( iv1 = is_diff-lstate iv2 = is_diff-rstate ) ).
lo_html->add( '</div>' ). "#EC NOTEXT lo_html->add( '</div>' ). "#EC NOTEXT
ro_html = lo_html. ro_html = lo_html.
ENDMETHOD. ENDMETHOD.
METHOD render_table_head.
CREATE OBJECT ro_html.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>LOCAL</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ENDMETHOD. " render_table_head.
METHOD render_diff. METHOD render_diff.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( '<div class="diff">' ). "#EC NOTEXT ro_html->add( '<div class="diff">' ). "#EC NOTEXT
ro_html->add( render_head( is_diff ) ). ro_html->add( render_diff_head( is_diff ) ).
" Content " Content
ro_html->add( '<div class="diff_content">' ). "#EC NOTEXT ro_html->add( '<div class="diff_content">' ). "#EC NOTEXT
ro_html->add( '<table width="100%" class="diff_tab">' ). "#EC NOTEXT ro_html->add( '<table width="100%" class="diff_tab">' ). "#EC NOTEXT
ro_html->add( '<thead class="header"><tr>' ). "#EC NOTEXT ro_html->add( render_table_head( ) ).
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>LOCAL</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr></thead>' ). "#EC NOTEXT
ro_html->add( render_lines( is_diff ) ). ro_html->add( render_lines( is_diff ) ).
ro_html->add( '</table>' ). "#EC NOTEXT ro_html->add( '</table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT ro_html->add( '</div>' ). "#EC NOTEXT
@ -322,6 +360,27 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD render_beacon.
DATA: lv_beacon TYPE string.
CREATE OBJECT ro_html.
IF is_diff_line-beacon > 0.
READ TABLE is_diff-o_diff->mt_beacons INTO lv_beacon INDEX is_diff_line-beacon.
ELSE.
lv_beacon = '---'.
ENDIF.
ro_html->add( '<thead class="nav_line">' ).
ro_html->add( '<tr>' ).
ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th colspan="3">@@ { is_diff_line-new_line } @@ { lv_beacon }</th>| ).
ro_html->add( '</tr>' ).
ro_html->add( '</thead>' ).
ENDMETHOD. " render_beacon.
METHOD render_lines. METHOD render_lines.
DATA: lt_diffs TYPE lcl_diff=>ty_diffs_tt, DATA: lt_diffs TYPE lcl_diff=>ty_diffs_tt,
@ -329,7 +388,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lv_remote TYPE string, lv_remote TYPE string,
lv_lattr TYPE string, lv_lattr TYPE string,
lv_rattr TYPE string, lv_rattr TYPE string,
lv_beacon TYPE string,
lv_insert_nav TYPE abap_bool. lv_insert_nav TYPE abap_bool.
FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs. FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
@ -345,32 +403,27 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDIF. ENDIF.
IF lv_insert_nav = abap_true. " Insert separator line with navigation IF lv_insert_nav = abap_true. " Insert separator line with navigation
IF <ls_diff>-beacon > 0. ro_html->add( render_beacon( is_diff_line = <ls_diff> is_diff = is_diff ) ).
READ TABLE is_diff-o_diff->mt_beacons INTO lv_beacon INDEX <ls_diff>-beacon.
ELSE.
lv_beacon = '---'.
ENDIF.
ro_html->add( '<thead class="nav_line"><tr>').
ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th colspan="3">@@ { <ls_diff>-local_line } @@ { lv_beacon }</th>| ).
ro_html->add( '</tr></thead>' ).
lv_insert_nav = abap_false. lv_insert_nav = abap_false.
ENDIF. ENDIF.
lv_local = escape( val = <ls_diff>-local format = cl_abap_format=>e_html_attr ). IF is_diff-mod = c_mod-remote. " Remote file leading changes
lv_remote = escape( val = <ls_diff>-remote format = cl_abap_format=>e_html_attr ). lv_local = escape( val = <ls_diff>-old format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = <ls_diff>-new format = cl_abap_format=>e_html_attr ).
ELSE. " Local leading changes or both were modified
lv_local = escape( val = <ls_diff>-new format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = <ls_diff>-old format = cl_abap_format=>e_html_attr ).
ENDIF.
get_line_hl( EXPORTING iv_lstate = is_diff-lstate get_line_hl( EXPORTING iv_mod = is_diff-mod
iv_rstate = is_diff-rstate
iv_result = <ls_diff>-result iv_result = <ls_diff>-result
IMPORTING ev_lattr = lv_lattr IMPORTING ev_lattr = lv_lattr
ev_rattr = lv_rattr ). ev_rattr = lv_rattr ).
ro_html->add( '<tr>' ). "#EC NOTEXT ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-local_line }</td>| ). "#EC NOTEXT ro_html->add( |<td class="num">{ <ls_diff>-new_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_lattr }><code>{ lv_local }</code></td>| ). "#EC NOTEXT ro_html->add( |<td{ lv_lattr }><code>{ lv_local }</code></td>| ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-remote_line }</td>| ). "#EC NOTEXT ro_html->add( |<td class="num">{ <ls_diff>-old_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_rattr }><code>{ lv_remote }</code></td>| ). "#EC NOTEXT ro_html->add( |<td{ lv_rattr }><code>{ lv_remote }</code></td>| ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT ro_html->add( '</tr>' ). "#EC NOTEXT
@ -382,24 +435,27 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
CLEAR: ev_lattr, ev_rattr. " Class for changed lines CLEAR: ev_lattr, ev_rattr. " Class for changed lines
IF iv_lstate IS NOT INITIAL AND iv_rstate IS NOT INITIAL AND iv_result IS NOT INITIAL IF iv_result IS INITIAL.
OR iv_result = lcl_diff=>c_diff-update. RETURN.
ENDIF.
" Both file changed ? Or line updated ? - All yellow " Both file changed ? Or line updated ? - All yellow
IF iv_mod = c_mod-both OR iv_result = lcl_diff=>c_diff-update.
ev_lattr = ' class="diff_upd"'. "#EC NOTEXT ev_lattr = ' class="diff_upd"'. "#EC NOTEXT
ev_rattr = ' class="diff_upd"'. "#EC NOTEXT ev_rattr = ' class="diff_upd"'. "#EC NOTEXT
ELSEIF iv_lstate IS NOT INITIAL. " Changed locally ELSEIF iv_mod = c_mod-local. " Changed locally
CASE iv_result. CASE iv_result.
WHEN lcl_diff=>c_diff-insert. WHEN lcl_diff=>c_diff-insert.
ev_lattr = ' class="diff_ins"'. "#EC NOTEXT ev_lattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete. WHEN lcl_diff=>c_diff-delete.
ev_rattr = ' class="diff_del"'. "#EC NOTEXT ev_rattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE. ENDCASE.
ELSEIF iv_rstate IS NOT INITIAL. " Changed remotely ELSEIF iv_mod = c_mod-remote. " Changed remotely - invert sides
CASE iv_result. CASE iv_result.
WHEN lcl_diff=>c_diff-insert. WHEN lcl_diff=>c_diff-insert.
ev_lattr = ' class="diff_del"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_rattr = ' class="diff_ins"'. "#EC NOTEXT ev_rattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_lattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE. ENDCASE.
ENDIF. ENDIF.

View File

@ -204,8 +204,8 @@ ENDCLASS. "ltcl_dangerous IMPLEMENTATION
CLASS ltcl_diff DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. CLASS ltcl_diff DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
PRIVATE SECTION. PRIVATE SECTION.
DATA: mt_local TYPE TABLE OF string, DATA: mt_new TYPE TABLE OF string,
mt_remote TYPE TABLE OF string, mt_old TYPE TABLE OF string,
mt_expected TYPE lcl_diff=>ty_diffs_tt, mt_expected TYPE lcl_diff=>ty_diffs_tt,
ms_expected LIKE LINE OF mt_expected. ms_expected LIKE LINE OF mt_expected.
@ -229,56 +229,56 @@ ENDCLASS. "ltcl_diff DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS ltcl_diff IMPLEMENTATION. CLASS ltcl_diff IMPLEMENTATION.
DEFINE _local. DEFINE _new.
APPEND &1 TO mt_local. APPEND &1 TO mt_new.
END-OF-DEFINITION. END-OF-DEFINITION.
DEFINE _remote. DEFINE _old.
APPEND &1 TO mt_remote. APPEND &1 TO mt_old.
END-OF-DEFINITION. END-OF-DEFINITION.
DEFINE _expected. DEFINE _expected.
CLEAR ms_expected. CLEAR ms_expected.
ms_expected-local = &1. ms_expected-new_line = &1.
ms_expected-result = &2. ms_expected-new = &2.
ms_expected-remote = &3. ms_expected-result = &3.
ms_expected-old_line = &4.
ms_expected-old = &5.
APPEND ms_expected TO mt_expected. APPEND ms_expected TO mt_expected.
END-OF-DEFINITION. END-OF-DEFINITION.
METHOD setup. METHOD setup.
CLEAR mt_local. CLEAR mt_new.
CLEAR mt_remote. CLEAR mt_old.
CLEAR mt_expected. CLEAR mt_expected.
ENDMETHOD. "setup ENDMETHOD. "setup
METHOD test. METHOD test.
DATA: lv_local TYPE string, DATA: lv_new TYPE string,
lv_xlocal TYPE xstring, lv_xnew TYPE xstring,
lv_remote TYPE string, lv_old TYPE string,
lv_xremote TYPE xstring, lv_xold TYPE xstring,
lo_diff TYPE REF TO lcl_diff, lo_diff TYPE REF TO lcl_diff,
lt_diff TYPE lcl_diff=>ty_diffs_tt. lt_diff TYPE lcl_diff=>ty_diffs_tt.
FIELD-SYMBOLS: <ls_diff> LIKE LINE OF lt_diff. FIELD-SYMBOLS: <ls_diff> LIKE LINE OF lt_diff.
CONCATENATE LINES OF mt_local INTO lv_local SEPARATED BY gc_newline. CONCATENATE LINES OF mt_new INTO lv_new SEPARATED BY gc_newline.
CONCATENATE LINES OF mt_remote INTO lv_remote SEPARATED BY gc_newline. CONCATENATE LINES OF mt_old INTO lv_old SEPARATED BY gc_newline.
lv_xlocal = lcl_convert=>string_to_xstring_utf8( lv_local ). lv_xnew = lcl_convert=>string_to_xstring_utf8( lv_new ).
lv_xremote = lcl_convert=>string_to_xstring_utf8( lv_remote ). lv_xold = lcl_convert=>string_to_xstring_utf8( lv_old ).
CREATE OBJECT lo_diff CREATE OBJECT lo_diff
EXPORTING EXPORTING
iv_local = lv_xlocal iv_new = lv_xnew
iv_remote = lv_xremote. iv_old = lv_xold.
lt_diff = lo_diff->get( ). lt_diff = lo_diff->get( ).
LOOP AT lt_diff ASSIGNING <ls_diff>. LOOP AT lt_diff ASSIGNING <ls_diff>.
CLEAR <ls_diff>-local_line.
CLEAR <ls_diff>-remote_line.
CLEAR <ls_diff>-short. CLEAR <ls_diff>-short.
ENDLOOP. ENDLOOP.
@ -291,8 +291,10 @@ CLASS ltcl_diff IMPLEMENTATION.
METHOD diff01. METHOD diff01.
* insert * insert
_local '1'. _new 'A'.
_expected '1' lcl_diff=>c_diff-insert ''.
" " NEW " STATUS " OLD
_expected 1 'A' lcl_diff=>c_diff-insert '' ''.
test( ). test( ).
ENDMETHOD. "diff01 ENDMETHOD. "diff01
@ -300,9 +302,11 @@ CLASS ltcl_diff IMPLEMENTATION.
METHOD diff02. METHOD diff02.
* identical * identical
_local '1'. _new 'A'.
_remote '1'. _old 'A'.
_expected '1' '' '1'.
" " NEW " STATUS " OLD
_expected 1 'A' '' 1 'A'.
test( ). test( ).
ENDMETHOD. "diff02 ENDMETHOD. "diff02
@ -310,8 +314,10 @@ CLASS ltcl_diff IMPLEMENTATION.
METHOD diff03. METHOD diff03.
* delete * delete
_remote '1'. _old 'A'.
_expected '' lcl_diff=>c_diff-delete '1'.
" " NEW " STATUS " OLD
_expected '' '' lcl_diff=>c_diff-delete 1 'A'.
test( ). test( ).
ENDMETHOD. "diff03 ENDMETHOD. "diff03
@ -319,9 +325,11 @@ CLASS ltcl_diff IMPLEMENTATION.
METHOD diff04. METHOD diff04.
* update * update
_local '1+'. _new 'A+'.
_remote '1'. _old 'A'.
_expected '1+' lcl_diff=>c_diff-update '1'.
" " NEW " STATUS " OLD
_expected 1 'A+' lcl_diff=>c_diff-update 1 'A'.
test( ). test( ).
ENDMETHOD. "diff04 ENDMETHOD. "diff04
@ -329,34 +337,37 @@ CLASS ltcl_diff IMPLEMENTATION.
METHOD diff05. METHOD diff05.
* identical * identical
_local '1'. _new 'A'.
_local '2'. _new 'B'.
_remote '1'. _old 'A'.
_remote '2'. _old 'B'.
_expected '1' '' '1'.
_expected '2' '' '2'. " " NEW " STATUS " OLD
_expected 1 'A' '' 1 'A'.
_expected 2 'B' '' 2 'B'.
test( ). test( ).
ENDMETHOD. "diff05 ENDMETHOD. "diff05
METHOD diff06. METHOD diff06.
_local '1'. _new 'A'.
_local '2'. _new 'B'.
_local 'inserted'. _new 'inserted'.
_local '3'. _new 'C'.
_local '4 update'. _new 'D update'.
_remote '1'. _old 'A'.
_remote '2'. _old 'B'.
_remote '3'. _old 'C'.
_remote '4'. _old 'D'.
_expected '1' '' '1'. " " NEW " STATUS " OLD
_expected '2' '' '2'. _expected 1 'A' '' 1 'A'.
_expected 'inserted' lcl_diff=>c_diff-insert ''. _expected 2 'B' '' 2 'B'.
_expected '3' '' '3'. _expected 3 'inserted' lcl_diff=>c_diff-insert '' ''.
_expected '4 update' lcl_diff=>c_diff-update '4'. _expected 4 'C' '' 3 'C'.
_expected 5 'D update' lcl_diff=>c_diff-update 4 'D'.
test( ). test( ).

View File

@ -522,11 +522,11 @@ CLASS lcl_diff DEFINITION FINAL.
END OF c_diff. END OF c_diff.
TYPES: BEGIN OF ty_diff, TYPES: BEGIN OF ty_diff,
local_line TYPE c LENGTH 6, new_line TYPE c LENGTH 6,
local TYPE string, new TYPE string,
result TYPE c LENGTH 1, result TYPE c LENGTH 1,
remote_line TYPE c LENGTH 6, old_line TYPE c LENGTH 6,
remote TYPE string, old TYPE string,
short TYPE abap_bool, short TYPE abap_bool,
beacon TYPE i, beacon TYPE i,
END OF ty_diff. END OF ty_diff.
@ -543,8 +543,8 @@ CLASS lcl_diff DEFINITION FINAL.
* assumes data is UTF8 based with newlines * assumes data is UTF8 based with newlines
* only works with lines up to 255 characters * only works with lines up to 255 characters
METHODS constructor METHODS constructor
IMPORTING iv_local TYPE xstring IMPORTING iv_new TYPE xstring
iv_remote TYPE xstring. iv_old TYPE xstring.
METHODS get METHODS get
RETURNING VALUE(rt_diff) TYPE ty_diffs_tt. RETURNING VALUE(rt_diff) TYPE ty_diffs_tt.
@ -558,18 +558,18 @@ CLASS lcl_diff DEFINITION FINAL.
CLASS-METHODS: CLASS-METHODS:
unpack unpack
IMPORTING iv_local TYPE xstring IMPORTING iv_new TYPE xstring
iv_remote TYPE xstring iv_old TYPE xstring
EXPORTING et_local TYPE abaptxt255_tab EXPORTING et_new TYPE abaptxt255_tab
et_remote TYPE abaptxt255_tab, et_old TYPE abaptxt255_tab,
render render
IMPORTING it_local TYPE abaptxt255_tab IMPORTING it_new TYPE abaptxt255_tab
it_remote TYPE abaptxt255_tab it_old TYPE abaptxt255_tab
it_delta TYPE vxabapt255_tab it_delta TYPE vxabapt255_tab
RETURNING VALUE(rt_diff) TYPE ty_diffs_tt, RETURNING VALUE(rt_diff) TYPE ty_diffs_tt,
compute compute
IMPORTING it_local TYPE abaptxt255_tab IMPORTING it_new TYPE abaptxt255_tab
it_remote TYPE abaptxt255_tab it_old TYPE abaptxt255_tab
RETURNING VALUE(rt_delta) TYPE vxabapt255_tab. RETURNING VALUE(rt_delta) TYPE vxabapt255_tab.
METHODS: METHODS:
@ -596,15 +596,15 @@ CLASS lcl_diff IMPLEMENTATION.
METHOD unpack. METHOD unpack.
DATA: lv_local TYPE string, DATA: lv_new TYPE string,
lv_remote TYPE string. lv_old TYPE string.
lv_local = lcl_convert=>xstring_to_string_utf8( iv_local ). lv_new = lcl_convert=>xstring_to_string_utf8( iv_new ).
lv_remote = lcl_convert=>xstring_to_string_utf8( iv_remote ). lv_old = lcl_convert=>xstring_to_string_utf8( iv_old ).
SPLIT lv_local AT gc_newline INTO TABLE et_local. SPLIT lv_new AT gc_newline INTO TABLE et_new.
SPLIT lv_remote AT gc_newline INTO TABLE et_remote. SPLIT lv_old AT gc_newline INTO TABLE et_old.
ENDMETHOD. "unpack ENDMETHOD. "unpack
@ -617,8 +617,8 @@ CLASS lcl_diff IMPLEMENTATION.
CALL FUNCTION 'SVRS_COMPUTE_DELTA_REPS' CALL FUNCTION 'SVRS_COMPUTE_DELTA_REPS'
TABLES TABLES
texttab_old = it_remote texttab_old = it_old
texttab_new = it_local texttab_new = it_new
trdirtab_old = lt_trdirtab_old trdirtab_old = lt_trdirtab_old
trdirtab_new = lt_trdirtab_new trdirtab_new = lt_trdirtab_new
trdir_delta = lt_trdir_delta trdir_delta = lt_trdir_delta
@ -665,26 +665,26 @@ CLASS lcl_diff IMPLEMENTATION.
METHOD calculate_line_num_and_stats. METHOD calculate_line_num_and_stats.
DATA: lv_local TYPE i VALUE 1, DATA: lv_new TYPE i VALUE 1,
lv_remote TYPE i VALUE 1. lv_old TYPE i VALUE 1.
FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff. FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
LOOP AT mt_diff ASSIGNING <ls_diff>. LOOP AT mt_diff ASSIGNING <ls_diff>.
<ls_diff>-local_line = lv_local. <ls_diff>-new_line = lv_new.
<ls_diff>-remote_line = lv_remote. <ls_diff>-old_line = lv_old.
CASE <ls_diff>-result. " Line nums CASE <ls_diff>-result. " Line nums
WHEN c_diff-delete. WHEN c_diff-delete.
lv_remote = lv_remote + 1. lv_old = lv_old + 1.
CLEAR <ls_diff>-local_line. CLEAR <ls_diff>-new_line.
WHEN c_diff-insert. WHEN c_diff-insert.
lv_local = lv_local + 1. lv_new = lv_new + 1.
CLEAR <ls_diff>-remote_line. CLEAR <ls_diff>-old_line.
WHEN OTHERS. WHEN OTHERS.
lv_local = lv_local + 1. lv_new = lv_new + 1.
lv_remote = lv_remote + 1. lv_old = lv_old + 1.
ENDCASE. ENDCASE.
CASE <ls_diff>-result. " Stats CASE <ls_diff>-result. " Stats
@ -725,9 +725,9 @@ CLASS lcl_diff IMPLEMENTATION.
LOOP AT mt_diff ASSIGNING <ls_diff>. LOOP AT mt_diff ASSIGNING <ls_diff>.
<ls_diff>-beacon = lv_beacon. <ls_diff>-beacon = lv_beacon.
LOOP AT lt_regex_set INTO lo_regex. LOOP AT lt_regex_set INTO lo_regex.
FIND FIRST OCCURRENCE OF REGEX lo_regex IN <ls_diff>-local. FIND FIRST OCCURRENCE OF REGEX lo_regex IN <ls_diff>-new.
IF sy-subrc = 0. " Match IF sy-subrc = 0. " Match
lv_code_line = <ls_diff>-local. lv_code_line = <ls_diff>-new.
" Get rid of comments " Get rid of comments
FIND FIRST OCCURRENCE OF '.' IN lv_code_line MATCH OFFSET lv_offs. FIND FIRST OCCURRENCE OF '.' IN lv_code_line MATCH OFFSET lv_offs.
@ -748,20 +748,20 @@ CLASS lcl_diff IMPLEMENTATION.
METHOD constructor. METHOD constructor.
DATA: lt_delta TYPE vxabapt255_tab, DATA: lt_delta TYPE vxabapt255_tab,
lt_local TYPE abaptxt255_tab, lt_new TYPE abaptxt255_tab,
lt_remote TYPE abaptxt255_tab. lt_old TYPE abaptxt255_tab.
unpack( EXPORTING iv_local = iv_local unpack( EXPORTING iv_new = iv_new
iv_remote = iv_remote iv_old = iv_old
IMPORTING et_local = lt_local IMPORTING et_new = lt_new
et_remote = lt_remote ). et_old = lt_old ).
lt_delta = compute( it_local = lt_local lt_delta = compute( it_new = lt_new
it_remote = lt_remote ). it_old = lt_old ).
mt_diff = render( it_local = lt_local mt_diff = render( it_new = lt_new
it_remote = lt_remote it_old = lt_old
it_delta = lt_delta ). it_delta = lt_delta ).
calculate_line_num_and_stats( ). calculate_line_num_and_stats( ).
@ -774,16 +774,16 @@ CLASS lcl_diff IMPLEMENTATION.
DEFINE _append. DEFINE _append.
CLEAR ls_diff. CLEAR ls_diff.
ls_diff-local = &1. ls_diff-new = &1.
ls_diff-result = &2. ls_diff-result = &2.
ls_diff-remote = &3. ls_diff-old = &3.
APPEND ls_diff TO rt_diff. APPEND ls_diff TO rt_diff.
END-OF-DEFINITION. END-OF-DEFINITION.
DATA: lv_rindex TYPE i VALUE 1, DATA: lv_oindex TYPE i VALUE 1,
lv_lindex TYPE i VALUE 1, lv_nindex TYPE i VALUE 1,
ls_local LIKE LINE OF it_local, ls_new LIKE LINE OF it_new,
ls_remote LIKE LINE OF it_remote, ls_old LIKE LINE OF it_old,
ls_diff LIKE LINE OF rt_diff, ls_diff LIKE LINE OF rt_diff,
lt_delta LIKE it_delta, lt_delta LIKE it_delta,
ls_delta LIKE LINE OF it_delta. ls_delta LIKE LINE OF it_delta.
@ -792,42 +792,43 @@ CLASS lcl_diff IMPLEMENTATION.
lt_delta = it_delta. lt_delta = it_delta.
DO. DO.
READ TABLE lt_delta INTO ls_delta WITH KEY number = lv_rindex. READ TABLE lt_delta INTO ls_delta WITH KEY number = lv_oindex.
IF sy-subrc = 0. IF sy-subrc = 0.
DELETE lt_delta INDEX sy-tabix. DELETE lt_delta INDEX sy-tabix.
CASE ls_delta-vrsflag. CASE ls_delta-vrsflag.
WHEN c_diff-delete. WHEN c_diff-delete.
_append '' c_diff-delete ls_delta-line. _append '' c_diff-delete ls_delta-line.
lv_rindex = lv_rindex + 1. lv_oindex = lv_oindex + 1.
WHEN c_diff-insert. WHEN c_diff-insert.
_append ls_delta-line c_diff-insert ''. _append ls_delta-line c_diff-insert ''.
lv_lindex = lv_lindex + 1. lv_nindex = lv_nindex + 1.
WHEN c_diff-update. WHEN c_diff-update.
CLEAR ls_local. CLEAR ls_new.
READ TABLE it_local INTO ls_local INDEX lv_lindex. READ TABLE it_new INTO ls_new INDEX lv_nindex.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
_append ls_local c_diff-update ls_delta-line. _append ls_new c_diff-update ls_delta-line.
lv_lindex = lv_lindex + 1. lv_nindex = lv_nindex + 1.
lv_rindex = lv_rindex + 1. lv_oindex = lv_oindex + 1.
WHEN OTHERS. WHEN OTHERS.
ASSERT 0 = 1. ASSERT 0 = 1.
ENDCASE. ENDCASE.
ELSE. ELSE.
CLEAR ls_local. CLEAR ls_new.
READ TABLE it_local INTO ls_local INDEX lv_lindex. "#EC CI_SUBRC READ TABLE it_new INTO ls_new INDEX lv_nindex. "#EC CI_SUBRC
lv_lindex = lv_lindex + 1. lv_nindex = lv_nindex + 1.
CLEAR ls_remote. CLEAR ls_old.
READ TABLE it_remote INTO ls_remote INDEX lv_rindex. "#EC CI_SUBRC READ TABLE it_old INTO ls_old INDEX lv_oindex. "#EC CI_SUBRC
lv_rindex = lv_rindex + 1. lv_oindex = lv_oindex + 1.
_append ls_local '' ls_remote. _append ls_new '' ls_old.
ENDIF. ENDIF.
IF lv_lindex > lines( it_local ) AND lv_rindex > lines( it_remote ). IF lv_nindex > lines( it_new ) AND lv_oindex > lines( it_old ).
EXIT. " current loop EXIT. " current loop
ENDIF. ENDIF.
ENDDO. ENDDO.
ENDMETHOD. " render ENDMETHOD. " render
ENDCLASS. "lcl_diff IMPLEMENTATION ENDCLASS. "lcl_diff IMPLEMENTATION