From e73fef45349dabfe3924fb76641d516761f7840b Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sat, 19 Nov 2016 11:37:13 +0200 Subject: [PATCH 1/2] lcl_diff naming refactor, improve UTs #420 --- src/zabapgit_page_diff.prog.abap | 14 ++-- src/zabapgit_unit_test.prog.abap | 117 +++++++++++++++------------ src/zabapgit_util.prog.abap | 135 ++++++++++++++++--------------- 3 files changed, 139 insertions(+), 127 deletions(-) diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index 9b78e2e4b..c8c683d26 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -140,8 +140,8 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. CREATE OBJECT ls_diff_file-o_diff EXPORTING - iv_local = -file-data - iv_remote = -data. + iv_new = -file-data + iv_old = -data. ls_diff_file-filename = is_status-filename. ls_diff_file-lstate = is_status-lstate. @@ -353,13 +353,13 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ro_html->add( ''). ro_html->add( '' ). - ro_html->add( |@@ { -local_line } @@ { lv_beacon }| ). + ro_html->add( |@@ { -new_line } @@ { lv_beacon }| ). ro_html->add( '' ). lv_insert_nav = abap_false. ENDIF. - lv_local = escape( val = -local format = cl_abap_format=>e_html_attr ). - lv_remote = escape( val = -remote format = cl_abap_format=>e_html_attr ). + lv_local = escape( val = -new format = cl_abap_format=>e_html_attr ). + lv_remote = escape( val = -old format = cl_abap_format=>e_html_attr ). get_line_hl( EXPORTING iv_lstate = is_diff-lstate iv_rstate = is_diff-rstate @@ -368,9 +368,9 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ev_rattr = lv_rattr ). ro_html->add( '' ). "#EC NOTEXT - ro_html->add( |{ -local_line }| ). "#EC NOTEXT + ro_html->add( |{ -new_line }| ). "#EC NOTEXT ro_html->add( |{ lv_local }| ). "#EC NOTEXT - ro_html->add( |{ -remote_line }| ). "#EC NOTEXT + ro_html->add( |{ -old_line }| ). "#EC NOTEXT ro_html->add( |{ lv_remote }| ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 054dec114..43828e8ce 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -204,8 +204,8 @@ ENDCLASS. "ltcl_dangerous IMPLEMENTATION CLASS ltcl_diff DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. PRIVATE SECTION. - DATA: mt_local TYPE TABLE OF string, - mt_remote TYPE TABLE OF string, + DATA: mt_new TYPE TABLE OF string, + mt_old TYPE TABLE OF string, mt_expected TYPE lcl_diff=>ty_diffs_tt, ms_expected LIKE LINE OF mt_expected. @@ -229,56 +229,56 @@ ENDCLASS. "ltcl_diff DEFINITION *----------------------------------------------------------------------* CLASS ltcl_diff IMPLEMENTATION. - DEFINE _local. - APPEND &1 TO mt_local. + DEFINE _new. + APPEND &1 TO mt_new. END-OF-DEFINITION. - DEFINE _remote. - APPEND &1 TO mt_remote. + DEFINE _old. + APPEND &1 TO mt_old. END-OF-DEFINITION. DEFINE _expected. CLEAR ms_expected. - ms_expected-local = &1. - ms_expected-result = &2. - ms_expected-remote = &3. + ms_expected-new_line = &1. + ms_expected-new = &2. + ms_expected-result = &3. + ms_expected-old_line = &4. + ms_expected-old = &5. APPEND ms_expected TO mt_expected. END-OF-DEFINITION. METHOD setup. - CLEAR mt_local. - CLEAR mt_remote. + CLEAR mt_new. + CLEAR mt_old. CLEAR mt_expected. ENDMETHOD. "setup METHOD test. - DATA: lv_local TYPE string, - lv_xlocal TYPE xstring, - lv_remote TYPE string, - lv_xremote TYPE xstring, + DATA: lv_new TYPE string, + lv_xnew TYPE xstring, + lv_old TYPE string, + lv_xold TYPE xstring, lo_diff TYPE REF TO lcl_diff, lt_diff TYPE lcl_diff=>ty_diffs_tt. FIELD-SYMBOLS: LIKE LINE OF lt_diff. - CONCATENATE LINES OF mt_local INTO lv_local SEPARATED BY gc_newline. - CONCATENATE LINES OF mt_remote INTO lv_remote SEPARATED BY gc_newline. + CONCATENATE LINES OF mt_new INTO lv_new 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_xremote = lcl_convert=>string_to_xstring_utf8( lv_remote ). + lv_xnew = lcl_convert=>string_to_xstring_utf8( lv_new ). + lv_xold = lcl_convert=>string_to_xstring_utf8( lv_old ). CREATE OBJECT lo_diff EXPORTING - iv_local = lv_xlocal - iv_remote = lv_xremote. + iv_new = lv_xnew + iv_old = lv_xold. lt_diff = lo_diff->get( ). LOOP AT lt_diff ASSIGNING . - CLEAR -local_line. - CLEAR -remote_line. CLEAR -short. ENDLOOP. @@ -291,8 +291,10 @@ CLASS ltcl_diff IMPLEMENTATION. METHOD diff01. * insert - _local '1'. - _expected '1' lcl_diff=>c_diff-insert ''. + _new 'A'. + + " " NEW " STATUS " OLD + _expected 1 'A' lcl_diff=>c_diff-insert '' ''. test( ). ENDMETHOD. "diff01 @@ -300,9 +302,11 @@ CLASS ltcl_diff IMPLEMENTATION. METHOD diff02. * identical - _local '1'. - _remote '1'. - _expected '1' '' '1'. + _new 'A'. + _old 'A'. + + " " NEW " STATUS " OLD + _expected 1 'A' '' 1 'A'. test( ). ENDMETHOD. "diff02 @@ -310,8 +314,10 @@ CLASS ltcl_diff IMPLEMENTATION. METHOD diff03. * delete - _remote '1'. - _expected '' lcl_diff=>c_diff-delete '1'. + _old 'A'. + + " " NEW " STATUS " OLD + _expected '' '' lcl_diff=>c_diff-delete 1 'A'. test( ). ENDMETHOD. "diff03 @@ -319,9 +325,11 @@ CLASS ltcl_diff IMPLEMENTATION. METHOD diff04. * update - _local '1+'. - _remote '1'. - _expected '1+' lcl_diff=>c_diff-update '1'. + _new 'A+'. + _old 'A'. + + " " NEW " STATUS " OLD + _expected 1 'A+' lcl_diff=>c_diff-update 1 'A'. test( ). ENDMETHOD. "diff04 @@ -329,34 +337,37 @@ CLASS ltcl_diff IMPLEMENTATION. METHOD diff05. * identical - _local '1'. - _local '2'. - _remote '1'. - _remote '2'. - _expected '1' '' '1'. - _expected '2' '' '2'. + _new 'A'. + _new 'B'. + _old 'A'. + _old 'B'. + + " " NEW " STATUS " OLD + _expected 1 'A' '' 1 'A'. + _expected 2 'B' '' 2 'B'. test( ). ENDMETHOD. "diff05 METHOD diff06. - _local '1'. - _local '2'. - _local 'inserted'. - _local '3'. - _local '4 update'. + _new 'A'. + _new 'B'. + _new 'inserted'. + _new 'C'. + _new 'D update'. - _remote '1'. - _remote '2'. - _remote '3'. - _remote '4'. + _old 'A'. + _old 'B'. + _old 'C'. + _old 'D'. - _expected '1' '' '1'. - _expected '2' '' '2'. - _expected 'inserted' lcl_diff=>c_diff-insert ''. - _expected '3' '' '3'. - _expected '4 update' lcl_diff=>c_diff-update '4'. + " " NEW " STATUS " OLD + _expected 1 'A' '' 1 'A'. + _expected 2 'B' '' 2 'B'. + _expected 3 'inserted' lcl_diff=>c_diff-insert '' ''. + _expected 4 'C' '' 3 'C'. + _expected 5 'D update' lcl_diff=>c_diff-update 4 'D'. test( ). diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index 9d33a058e..98700dbbe 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -522,11 +522,11 @@ CLASS lcl_diff DEFINITION FINAL. END OF c_diff. TYPES: BEGIN OF ty_diff, - local_line TYPE c LENGTH 6, - local TYPE string, + new_line TYPE c LENGTH 6, + new TYPE string, result TYPE c LENGTH 1, - remote_line TYPE c LENGTH 6, - remote TYPE string, + old_line TYPE c LENGTH 6, + old TYPE string, short TYPE abap_bool, beacon TYPE i, END OF ty_diff. @@ -543,8 +543,8 @@ CLASS lcl_diff DEFINITION FINAL. * assumes data is UTF8 based with newlines * only works with lines up to 255 characters METHODS constructor - IMPORTING iv_local TYPE xstring - iv_remote TYPE xstring. + IMPORTING iv_new TYPE xstring + iv_old TYPE xstring. METHODS get RETURNING VALUE(rt_diff) TYPE ty_diffs_tt. @@ -558,18 +558,18 @@ CLASS lcl_diff DEFINITION FINAL. CLASS-METHODS: unpack - IMPORTING iv_local TYPE xstring - iv_remote TYPE xstring - EXPORTING et_local TYPE abaptxt255_tab - et_remote TYPE abaptxt255_tab, + IMPORTING iv_new TYPE xstring + iv_old TYPE xstring + EXPORTING et_new TYPE abaptxt255_tab + et_old TYPE abaptxt255_tab, render - IMPORTING it_local TYPE abaptxt255_tab - it_remote TYPE abaptxt255_tab + IMPORTING it_new TYPE abaptxt255_tab + it_old TYPE abaptxt255_tab it_delta TYPE vxabapt255_tab RETURNING VALUE(rt_diff) TYPE ty_diffs_tt, compute - IMPORTING it_local TYPE abaptxt255_tab - it_remote TYPE abaptxt255_tab + IMPORTING it_new TYPE abaptxt255_tab + it_old TYPE abaptxt255_tab RETURNING VALUE(rt_delta) TYPE vxabapt255_tab. METHODS: @@ -596,15 +596,15 @@ CLASS lcl_diff IMPLEMENTATION. METHOD unpack. - DATA: lv_local TYPE string, - lv_remote TYPE string. + DATA: lv_new TYPE string, + lv_old TYPE string. - lv_local = lcl_convert=>xstring_to_string_utf8( iv_local ). - lv_remote = lcl_convert=>xstring_to_string_utf8( iv_remote ). + lv_new = lcl_convert=>xstring_to_string_utf8( iv_new ). + lv_old = lcl_convert=>xstring_to_string_utf8( iv_old ). - SPLIT lv_local AT gc_newline INTO TABLE et_local. - SPLIT lv_remote AT gc_newline INTO TABLE et_remote. + SPLIT lv_new AT gc_newline INTO TABLE et_new. + SPLIT lv_old AT gc_newline INTO TABLE et_old. ENDMETHOD. "unpack @@ -617,8 +617,8 @@ CLASS lcl_diff IMPLEMENTATION. CALL FUNCTION 'SVRS_COMPUTE_DELTA_REPS' TABLES - texttab_old = it_remote - texttab_new = it_local + texttab_old = it_old + texttab_new = it_new trdirtab_old = lt_trdirtab_old trdirtab_new = lt_trdirtab_new trdir_delta = lt_trdir_delta @@ -665,26 +665,26 @@ CLASS lcl_diff IMPLEMENTATION. METHOD calculate_line_num_and_stats. - DATA: lv_local TYPE i VALUE 1, - lv_remote TYPE i VALUE 1. + DATA: lv_new TYPE i VALUE 1, + lv_old TYPE i VALUE 1. FIELD-SYMBOLS: LIKE LINE OF mt_diff. LOOP AT mt_diff ASSIGNING . - -local_line = lv_local. - -remote_line = lv_remote. + -new_line = lv_new. + -old_line = lv_old. CASE -result. " Line nums WHEN c_diff-delete. - lv_remote = lv_remote + 1. - CLEAR -local_line. + lv_old = lv_old + 1. + CLEAR -new_line. WHEN c_diff-insert. - lv_local = lv_local + 1. - CLEAR -remote_line. + lv_new = lv_new + 1. + CLEAR -old_line. WHEN OTHERS. - lv_local = lv_local + 1. - lv_remote = lv_remote + 1. + lv_new = lv_new + 1. + lv_old = lv_old + 1. ENDCASE. CASE -result. " Stats @@ -725,9 +725,9 @@ CLASS lcl_diff IMPLEMENTATION. LOOP AT mt_diff ASSIGNING . -beacon = lv_beacon. LOOP AT lt_regex_set INTO lo_regex. - FIND FIRST OCCURRENCE OF REGEX lo_regex IN -local. + FIND FIRST OCCURRENCE OF REGEX lo_regex IN -new. IF sy-subrc = 0. " Match - lv_code_line = -local. + lv_code_line = -new. " Get rid of comments FIND FIRST OCCURRENCE OF '.' IN lv_code_line MATCH OFFSET lv_offs. @@ -748,21 +748,21 @@ CLASS lcl_diff IMPLEMENTATION. METHOD constructor. DATA: lt_delta TYPE vxabapt255_tab, - lt_local TYPE abaptxt255_tab, - lt_remote TYPE abaptxt255_tab. + lt_new TYPE abaptxt255_tab, + lt_old TYPE abaptxt255_tab. - unpack( EXPORTING iv_local = iv_local - iv_remote = iv_remote - IMPORTING et_local = lt_local - et_remote = lt_remote ). + unpack( EXPORTING iv_new = iv_new + iv_old = iv_old + IMPORTING et_new = lt_new + et_old = lt_old ). - lt_delta = compute( it_local = lt_local - it_remote = lt_remote ). + lt_delta = compute( it_new = lt_new + it_old = lt_old ). - mt_diff = render( it_local = lt_local - it_remote = lt_remote - it_delta = lt_delta ). + mt_diff = render( it_new = lt_new + it_old = lt_old + it_delta = lt_delta ). calculate_line_num_and_stats( ). map_beacons( ). @@ -774,16 +774,16 @@ CLASS lcl_diff IMPLEMENTATION. DEFINE _append. CLEAR ls_diff. - ls_diff-local = &1. + ls_diff-new = &1. ls_diff-result = &2. - ls_diff-remote = &3. + ls_diff-old = &3. APPEND ls_diff TO rt_diff. END-OF-DEFINITION. - DATA: lv_rindex TYPE i VALUE 1, - lv_lindex TYPE i VALUE 1, - ls_local LIKE LINE OF it_local, - ls_remote LIKE LINE OF it_remote, + DATA: lv_oindex TYPE i VALUE 1, + lv_nindex TYPE i VALUE 1, + ls_new LIKE LINE OF it_new, + ls_old LIKE LINE OF it_old, ls_diff LIKE LINE OF rt_diff, lt_delta LIKE it_delta, ls_delta LIKE LINE OF it_delta. @@ -792,42 +792,43 @@ CLASS lcl_diff IMPLEMENTATION. lt_delta = it_delta. 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. DELETE lt_delta INDEX sy-tabix. CASE ls_delta-vrsflag. WHEN c_diff-delete. _append '' c_diff-delete ls_delta-line. - lv_rindex = lv_rindex + 1. + lv_oindex = lv_oindex + 1. WHEN c_diff-insert. _append ls_delta-line c_diff-insert ''. - lv_lindex = lv_lindex + 1. + lv_nindex = lv_nindex + 1. WHEN c_diff-update. - CLEAR ls_local. - READ TABLE it_local INTO ls_local INDEX lv_lindex. + CLEAR ls_new. + READ TABLE it_new INTO ls_new INDEX lv_nindex. ASSERT sy-subrc = 0. - _append ls_local c_diff-update ls_delta-line. - lv_lindex = lv_lindex + 1. - lv_rindex = lv_rindex + 1. + _append ls_new c_diff-update ls_delta-line. + lv_nindex = lv_nindex + 1. + lv_oindex = lv_oindex + 1. WHEN OTHERS. ASSERT 0 = 1. ENDCASE. ELSE. - CLEAR ls_local. - READ TABLE it_local INTO ls_local INDEX lv_lindex. "#EC CI_SUBRC - lv_lindex = lv_lindex + 1. - CLEAR ls_remote. - READ TABLE it_remote INTO ls_remote INDEX lv_rindex. "#EC CI_SUBRC - lv_rindex = lv_rindex + 1. - _append ls_local '' ls_remote. + CLEAR ls_new. + READ TABLE it_new INTO ls_new INDEX lv_nindex. "#EC CI_SUBRC + lv_nindex = lv_nindex + 1. + CLEAR ls_old. + READ TABLE it_old INTO ls_old INDEX lv_oindex. "#EC CI_SUBRC + lv_oindex = lv_oindex + 1. + _append ls_new '' ls_old. 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 ENDIF. ENDDO. + ENDMETHOD. " render ENDCLASS. "lcl_diff IMPLEMENTATION From 55007cceaa8440df20649e4dbf3814d40134bef1 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sat, 19 Nov 2016 12:33:10 +0200 Subject: [PATCH 2/2] improve diff page remote changes handling #420 --- changelog.txt | 1 + src/zabapgit_page_diff.prog.abap | 166 +++++++++++++++++++++---------- 2 files changed, 112 insertions(+), 55 deletions(-) diff --git a/changelog.txt b/changelog.txt index 37baed540..c08cff490 100644 --- a/changelog.txt +++ b/changelog.txt @@ -11,6 +11,7 @@ Legend 2016-11-?? ------------------ + supported object list @debugpage +* Fixed bug in diff page: change counters values 2016-11-12 ------------------ diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index c8c683d26..9c0a97d04 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -6,10 +6,18 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super. 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, filename TYPE string, lstate TYPE char1, rstate TYPE char1, + mod TYPE char1, " Abstraction for shorter ifs o_diff TYPE REF TO lcl_diff, END 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 IMPORTING is_diff TYPE ty_file_diff RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS render_head + METHODS render_diff_head IMPORTING is_diff TYPE ty_file_diff 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 IMPORTING is_diff TYPE ty_file_diff 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 - IMPORTING iv_lstate TYPE char1 - iv_rstate TYPE char1 + IMPORTING iv_mod TYPE char1 iv_result TYPE lcl_diff=>ty_diff-result EXPORTING ev_lattr TYPE string ev_rattr TYPE string. @@ -69,7 +82,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lt_local = lo_repo->get_files_local( ). 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 WITH KEY path = is_file-path filename = is_file-filename. @@ -78,7 +91,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. it_local = lt_local is_status = ). - ELSEIF is_object IS NOT INITIAL. + ELSEIF is_object IS NOT INITIAL. " Diff for whole object LOOP AT lt_status ASSIGNING WHERE obj_type = is_object-obj_type @@ -88,18 +101,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. append_diff( it_remote = lt_remote it_local = lt_local is_status = ). - ENDLOOP. - ELSE. " For the whole repo - - LOOP AT lt_status ASSIGNING - WHERE match IS INITIAL. + ELSE. " Diff for the whole repo + LOOP AT lt_status ASSIGNING WHERE match IS INITIAL. append_diff( it_remote = lt_remote it_local = lt_local is_status = ). - ENDLOOP. ENDIF. @@ -114,11 +123,12 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. DATA: ls_r_dummy LIKE LINE OF it_remote ##NEEDED, - ls_l_dummy LIKE LINE OF it_local ##NEEDED, - ls_diff_file LIKE LINE OF mt_diff_files. + ls_l_dummy LIKE LINE OF it_local ##NEEDED. + FIELD-SYMBOLS: LIKE LINE OF it_remote, - LIKE LINE OF it_local. + LIKE LINE OF it_local, + LIKE LINE OF mt_diff_files. READ TABLE it_remote ASSIGNING 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 }| ). ENDIF. - CREATE OBJECT ls_diff_file-o_diff - EXPORTING - iv_new = -file-data - iv_old = -data. + APPEND INITIAL LINE TO mt_diff_files ASSIGNING . + -filename = is_status-filename. + -lstate = is_status-lstate. + -rstate = is_status-rstate. - ls_diff_file-filename = is_status-filename. - ls_diff_file-lstate = is_status-lstate. - ls_diff_file-rstate = is_status-rstate. - APPEND ls_diff_file TO mt_diff_files. + IF -lstate IS NOT INITIAL AND -rstate IS NOT INITIAL. + -mod = c_mod-both. + ELSEIF -lstate IS NOT INITIAL. + -mod = c_mod-local. + ELSE. "rstate IS NOT INITIAL, lstate = empty. + -mod = c_mod-remote. + ENDIF. + + IF -mod = c_mod-remote. " Remote file leading changes + CREATE OBJECT -o_diff + EXPORTING + iv_new = -data + iv_old = -file-data. + ELSE. " Local leading changes or both were modified + CREATE OBJECT -o_diff + EXPORTING + iv_new = -file-data + iv_old = -data. + ENDIF. ENDMETHOD. "append_diff @@ -277,7 +302,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ENDMETHOD. - METHOD render_head. + METHOD render_diff_head. DATA: lo_html TYPE REF TO lcl_html_helper, ls_stats TYPE lcl_diff=>ty_count. @@ -285,35 +310,48 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. 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( '
' ). "#EC NOTEXT lo_html->add( |+ { ls_stats-insert }| ). lo_html->add( |- { ls_stats-delete }| ). lo_html->add( |~ { ls_stats-update }| ). - lo_html->add( '' ). "#EC NOTEXT - lo_html->add( |{ is_diff-filename }| ). - lo_html->add( '' ). "#EC NOTEXT + lo_html->add( |{ is_diff-filename }| ). "#EC NOTEXT lo_html->add( render_item_state( iv1 = is_diff-lstate iv2 = is_diff-rstate ) ). lo_html->add( '
' ). "#EC NOTEXT ro_html = lo_html. ENDMETHOD. + METHOD render_table_head. + + CREATE OBJECT ro_html. + + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'LOCAL' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( 'REMOTE' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + + ENDMETHOD. " render_table_head. + METHOD render_diff. CREATE OBJECT ro_html. ro_html->add( '
' ). "#EC NOTEXT - ro_html->add( render_head( is_diff ) ). + ro_html->add( render_diff_head( is_diff ) ). " 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 - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + ro_html->add( render_table_head( ) ). ro_html->add( render_lines( is_diff ) ). ro_html->add( '
LOCALREMOTE
' ). "#EC NOTEXT ro_html->add( '
' ). "#EC NOTEXT @@ -322,6 +360,27 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. 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( '' ). + ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( |@@ { is_diff_line-new_line } @@ { lv_beacon }| ). + ro_html->add( '' ). + ro_html->add( '' ). + + ENDMETHOD. " render_beacon. + METHOD render_lines. DATA: lt_diffs TYPE lcl_diff=>ty_diffs_tt, @@ -329,7 +388,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lv_remote TYPE string, lv_lattr TYPE string, lv_rattr TYPE string, - lv_beacon TYPE string, lv_insert_nav TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF lt_diffs. @@ -345,24 +403,19 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ENDIF. IF lv_insert_nav = abap_true. " Insert separator line with navigation - IF -beacon > 0. - READ TABLE is_diff-o_diff->mt_beacons INTO lv_beacon INDEX -beacon. - ELSE. - lv_beacon = '---'. - ENDIF. - - ro_html->add( ''). - ro_html->add( '' ). - ro_html->add( |@@ { -new_line } @@ { lv_beacon }| ). - ro_html->add( '' ). + ro_html->add( render_beacon( is_diff_line = is_diff = is_diff ) ). lv_insert_nav = abap_false. ENDIF. - lv_local = escape( val = -new format = cl_abap_format=>e_html_attr ). - lv_remote = escape( val = -old format = cl_abap_format=>e_html_attr ). + IF is_diff-mod = c_mod-remote. " Remote file leading changes + lv_local = escape( val = -old format = cl_abap_format=>e_html_attr ). + lv_remote = escape( val = -new format = cl_abap_format=>e_html_attr ). + ELSE. " Local leading changes or both were modified + lv_local = escape( val = -new format = cl_abap_format=>e_html_attr ). + lv_remote = escape( val = -old format = cl_abap_format=>e_html_attr ). + ENDIF. - get_line_hl( EXPORTING iv_lstate = is_diff-lstate - iv_rstate = is_diff-rstate + get_line_hl( EXPORTING iv_mod = is_diff-mod iv_result = -result IMPORTING ev_lattr = lv_lattr ev_rattr = lv_rattr ). @@ -382,24 +435,27 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. 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 - OR iv_result = lcl_diff=>c_diff-update. - " Both file changed ? Or line updated ? - All yellow + IF iv_result IS INITIAL. + RETURN. + ENDIF. + + " 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_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. WHEN lcl_diff=>c_diff-insert. ev_lattr = ' class="diff_ins"'. "#EC NOTEXT WHEN lcl_diff=>c_diff-delete. ev_rattr = ' class="diff_del"'. "#EC NOTEXT ENDCASE. - ELSEIF iv_rstate IS NOT INITIAL. " Changed remotely + ELSEIF iv_mod = c_mod-remote. " Changed remotely - invert sides CASE iv_result. WHEN lcl_diff=>c_diff-insert. - ev_lattr = ' class="diff_del"'. "#EC NOTEXT + ev_rattr = ' class="diff_ins"'. "#EC NOTEXT WHEN lcl_diff=>c_diff-delete. - ev_rattr = ' class="diff_ins"'. "#EC NOTEXT + ev_lattr = ' class="diff_del"'. "#EC NOTEXT ENDCASE. ENDIF.