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.