From d36467dd93a3b3dbc516246c119c496a4a5ee679 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sun, 6 Nov 2016 18:42:18 +0200 Subject: [PATCH] file state refactoring --- src/zabapgit_definitions.prog.abap | 20 ++++++---- src/zabapgit_file_status.prog.abap | 56 +++++++++++++++------------ src/zabapgit_unit_test.prog.abap | 61 ++++++++++++++++++++---------- src/zabapgit_view_repo.prog.abap | 40 +++++--------------- 4 files changed, 96 insertions(+), 81 deletions(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 914c242e9..d63f0e06a 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -59,7 +59,8 @@ TYPES: BEGIN OF ty_repo_file, path TYPE string, filename TYPE string, is_changed TYPE abap_bool, - new TYPE char1, + rstate TYPE char1, + lstate TYPE char1, END OF ty_repo_file. TYPES tt_repo_files TYPE STANDARD TABLE OF ty_repo_file WITH DEFAULT KEY. @@ -97,20 +98,23 @@ TYPES: ty_tadir_tt TYPE STANDARD TABLE OF ty_tadir WITH DEFAULT KEY. TYPES: BEGIN OF ty_result, obj_type TYPE tadir-object, obj_name TYPE tadir-obj_name, - match TYPE sap_bool, + path TYPE string, filename TYPE string, package TYPE devclass, - path TYPE string, - new TYPE char1, + match TYPE sap_bool, + rstate TYPE char1, + lstate TYPE char1, END OF ty_result. TYPES: ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY. TYPES: ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY. -CONSTANTS: BEGIN OF gc_new, - local TYPE char1 VALUE 'L', - remote TYPE char1 VALUE 'R', - END OF gc_new. +CONSTANTS: BEGIN OF gc_state, " https://git-scm.com/docs/git-status + unchanged TYPE char1 VALUE '', + added TYPE char1 VALUE 'A', + modified TYPE char1 VALUE 'M', + deleted TYPE char1 VALUE 'D', "For future use + END OF gc_state. CONSTANTS: BEGIN OF gc_chmod, file TYPE ty_chmod VALUE '100644', diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap index 0dd5340dd..9a51f9333 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zabapgit_file_status.prog.abap @@ -22,16 +22,23 @@ CLASS lcl_file_status DEFINITION FINAL CLASS-METHODS compare_files IMPORTING it_repo TYPE ty_files_tt - is_gen TYPE ty_file + is_file TYPE ty_file RETURNING VALUE(rv_match) TYPE sap_bool. - CLASS-METHODS calculate_status + CLASS-METHODS calculate_status_old IMPORTING it_local TYPE ty_files_item_tt it_remote TYPE ty_files_tt it_tadir TYPE ty_tadir_tt iv_starting_folder TYPE string RETURNING VALUE(rt_results) TYPE ty_results_tt. + CLASS-METHODS calculate_status_new + IMPORTING it_local TYPE ty_files_item_tt + it_remote TYPE ty_files_tt + it_cur_state TYPE ty_file_signatures_tt + iv_starting_folder TYPE string + RETURNING VALUE(rt_results) TYPE ty_results_tt. + ENDCLASS. "lcl_file_status DEFINITION *----------------------------------------------------------------------* @@ -42,9 +49,9 @@ CLASS lcl_file_status IMPLEMENTATION. METHOD compare_files. READ TABLE it_repo WITH KEY - path = is_gen-path - filename = is_gen-filename - sha1 = is_gen-sha1 + path = is_file-path + filename = is_file-filename + sha1 = is_file-sha1 TRANSPORTING NO FIELDS. rv_match = boolc( sy-subrc = 0 ). @@ -66,7 +73,7 @@ CLASS lcl_file_status IMPLEMENTATION. lo_dot_abapgit = io_repo->get_dot_abapgit( ). lt_tadir = lcl_tadir=>read( io_repo->get_package( ) ). - rt_results = calculate_status( + rt_results = calculate_status_old( it_local = lt_local it_remote = lt_remote it_tadir = lt_tadir @@ -81,7 +88,7 @@ CLASS lcl_file_status IMPLEMENTATION. " of it will be implemented IF -path = gc_root_dir AND -filename = gc_dot_abapgit. -match = abap_true. - -new = space. + CLEAR: -lstate, -rstate. CONTINUE. ENDIF. @@ -100,7 +107,10 @@ CLASS lcl_file_status IMPLEMENTATION. ENDMETHOD. "status - METHOD calculate_status. + METHOD calculate_status_new. + ENDMETHOD. "calculate_status_new. + + METHOD calculate_status_old. DATA: lv_pre TYPE tadir-obj_name, lt_files TYPE ty_files_tt, @@ -114,15 +124,12 @@ CLASS lcl_file_status IMPLEMENTATION. LIKE LINE OF it_tadir, LIKE LINE OF rt_results, LIKE LINE OF it_local, - LIKE LINE OF lt_files. + LIKE LINE OF lt_files. LOOP AT it_remote ASSIGNING . - lcl_progress=>show( iv_key = 'Status' - iv_current = sy-tabix - iv_total = lines( it_remote ) - iv_text = -filename ) ##NO_TEXT. + " Guess object type and name SPLIT -filename AT '.' INTO lv_pre lv_type lv_ext. TRANSLATE lv_pre TO UPPER CASE. TRANSLATE lv_type TO UPPER CASE. @@ -131,7 +138,7 @@ CLASS lcl_file_status IMPLEMENTATION. CONTINUE. " current loop ENDIF. -* handle namespaces + " handle namespaces REPLACE ALL OCCURRENCES OF '#' IN lv_pre WITH '/'. CLEAR ls_result. @@ -142,24 +149,25 @@ CLASS lcl_file_status IMPLEMENTATION. ls_item-obj_type = lv_type. ls_item-obj_name = lv_pre. + " Add corresponding local files CLEAR lt_files. LOOP AT it_local ASSIGNING WHERE item-obj_type = ls_item-obj_type AND item-obj_name = ls_item-obj_name. APPEND -file TO lt_files. ENDLOOP. + " item does not exist locally IF lt_files[] IS INITIAL. -* item does not exist locally ls_result-filename = -filename. - ls_result-new = gc_new-remote. + ls_result-rstate = gc_state-added. APPEND ls_result TO rt_results. CONTINUE. " current loop ENDIF. - LOOP AT lt_files ASSIGNING . - ls_result-filename = -filename. + LOOP AT lt_files ASSIGNING . + ls_result-filename = -filename. ls_result-match = compare_files( it_repo = it_remote - is_gen = ). + is_file = ). APPEND ls_result TO rt_results. ENDLOOP. ENDLOOP. @@ -171,7 +179,7 @@ CLASS lcl_file_status IMPLEMENTATION. IF sy-subrc <> 0. CLEAR ls_result. ls_result-match = abap_false. - ls_result-new = gc_new-remote. + ls_result-rstate = gc_state-added. ls_result-filename = -filename. APPEND ls_result TO rt_results. ENDIF. @@ -202,7 +210,7 @@ CLASS lcl_file_status IMPLEMENTATION. ls_result-match = abap_false. ls_result-obj_type = -object. ls_result-obj_name = -obj_name. - ls_result-new = gc_new-local. + ls_result-lstate = gc_state-added. APPEND ls_result TO rt_results. ENDIF. @@ -211,8 +219,8 @@ CLASS lcl_file_status IMPLEMENTATION. AND obj_name = -obj_name AND path IS INITIAL. * new file added locally to existing object - -path = iv_starting_folder && -path. - -new = gc_new-local. + -path = iv_starting_folder && -path. + -lstate = gc_state-added. ENDLOOP. ENDLOOP. @@ -237,6 +245,6 @@ CLASS lcl_file_status IMPLEMENTATION. DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name filename. - ENDMETHOD. "calculate_status + ENDMETHOD. "calculate_status_old ENDCLASS. "lcl_file_status IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 3b64c78bf..fb09a4fcd 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1776,6 +1776,13 @@ CLASS ltcl_file_status IMPLEMENTATION. -sha1 = &2. END-OF-DEFINITION. + DEFINE _append_state. + APPEND INITIAL LINE TO lt_state ASSIGNING . + -path = '/'. + -filename = &1. + -sha1 = &2. + END-OF-DEFINITION. + DEFINE _append_tadir. APPEND INITIAL LINE TO lt_tadir ASSIGNING . -object = &1. @@ -1788,9 +1795,10 @@ CLASS ltcl_file_status IMPLEMENTATION. -obj_type = &1. -obj_name = &2. -match = &3. - -new = &4. - -package = &5. - -filename = &6. + -lstate = &4. + -rstate = &5. + -package = &6. + -filename = &7. -path = '/'. END-OF-DEFINITION. @@ -1798,6 +1806,7 @@ CLASS ltcl_file_status IMPLEMENTATION. DATA: lt_local TYPE ty_files_item_tt, lt_remote TYPE ty_files_tt, + lt_state TYPE ty_file_signatures_tt, lt_tadir TYPE ty_tadir_tt, lt_results TYPE ty_results_tt, lt_results_exp TYPE ty_results_tt. @@ -1805,44 +1814,58 @@ CLASS ltcl_file_status IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_local, LIKE LINE OF lt_remote, LIKE LINE OF lt_results, + LIKE LINE OF lt_state, LIKE LINE OF lt_tadir. - " TYPE NAME FILE SHA1 + "STATE FILE SHA1 + _append_state 'zdoma1.doma.xml' 'D1'. + _append_state 'zdoma2.doma.xml' 'D2'. + _append_state 'zdoma3.doma.xml' 'D3'. + _append_state 'zclass1.clas.xml' 'C1_F1'. + _append_state 'zclass1.clas.testclasses.abap' 'C1_F3'. + _append_state 'zdoma5.doma.xml' 'D5'. + _append_state 'zdoma6.doma.xml' 'D6'. + + "LOCAL TYPE NAME FILE SHA1 _append_local 'DOMA' 'ZDOMA1' 'zdoma1.doma.xml' 'D1'. - _append_local 'DOMA' 'ZDOMA2' 'zdoma2.doma.xml' 'D2_CHANGED'. + _append_local 'DOMA' 'ZDOMA2' 'zdoma2.doma.xml' 'D2_CHANGED_L'. _append_local 'DOMA' 'ZDOMA3' 'zdoma3.doma.xml' 'D3'. _append_local 'CLAS' 'ZCLASS1' 'zclass1.clas.xml' 'C1_F1'. _append_local 'CLAS' 'ZCLASS1' 'zclass1.clas.testclasses.abap' 'C1_F3'. _append_local 'DOMA' 'ZDOMA5' 'zdoma5.doma.xml' 'D5'. + _append_local 'DOMA' 'ZDOMA6' 'zdoma6.doma.xml' 'D6_CHANGED_L'. - " FILE SHA1 + "REMOTE FILE SHA1 _append_remote 'zdoma1.doma.xml' 'D1'. _append_remote 'zdoma2.doma.xml' 'D2'. - _append_remote 'zdoma3.doma.xml' 'D3_CHANGED'. + _append_remote 'zdoma3.doma.xml' 'D3_CHANGED_R'. _append_remote 'zclass1.clas.xml' 'C1_F1'. _append_remote 'zclass1.clas.abap' 'C1_F2'. _append_remote 'zdoma4.doma.xml' 'D4'. + _append_remote 'zdoma6.doma.xml' 'D6_CHANGED_R'. _append_remote 'textfile.txt' 'T1'. - " TYPE NAME + "TADIR TYPE NAME _append_tadir 'DOMA' 'ZDOMA1'. _append_tadir 'DOMA' 'ZDOMA2'. _append_tadir 'DOMA' 'ZDOMA3'. _append_tadir 'CLAS' 'ZCLASS1'. _append_tadir 'DOMA' 'ZDOMA5'. + _append_tadir 'DOMA' 'ZDOMA6'. - " TYPE NAME MATCH NEW PKG FILE - _append_result '' '' '' 'R' '' 'textfile.txt'. - _append_result 'CLAS' 'ZCLASS1' '' 'R' '$Z$' 'zclass1.clas.abap'. - _append_result 'CLAS' 'ZCLASS1' '' 'L' '$Z$' 'zclass1.clas.testclasses.abap'. - _append_result 'CLAS' 'ZCLASS1' 'X' '' '$Z$' 'zclass1.clas.xml'. - _append_result 'DOMA' 'ZDOMA1' 'X' '' '$Z$' 'zdoma1.doma.xml'. - _append_result 'DOMA' 'ZDOMA2' '' '' '$Z$' 'zdoma2.doma.xml'. - _append_result 'DOMA' 'ZDOMA3' '' '' '$Z$' 'zdoma3.doma.xml'. - _append_result 'DOMA' 'ZDOMA4' '' 'R' '$Z$' 'zdoma4.doma.xml'. - _append_result 'DOMA' 'ZDOMA5' '' 'L' '$Z$' 'zdoma5.doma.xml'. + "EXP RESULT TYPE NAME MATCH LST RST PKG FILE + _append_result '' '' '' '' 'A' '' 'textfile.txt'. + _append_result 'CLAS' 'ZCLASS1' '' 'R' 'L' '$Z$' 'zclass1.clas.abap'. + _append_result 'CLAS' 'ZCLASS1' '' 'L' 'R' '$Z$' 'zclass1.clas.testclasses.abap'. + _append_result 'CLAS' 'ZCLASS1' 'X' '' '' '$Z$' 'zclass1.clas.xml'. + _append_result 'DOMA' 'ZDOMA1' 'X' '' '' '$Z$' 'zdoma1.doma.xml'. + _append_result 'DOMA' 'ZDOMA2' '' 'M' '' '$Z$' 'zdoma2.doma.xml'. + _append_result 'DOMA' 'ZDOMA3' '' '' 'M' '$Z$' 'zdoma3.doma.xml'. + _append_result 'DOMA' 'ZDOMA4' '' '' 'A' '$Z$' 'zdoma4.doma.xml'. + _append_result 'DOMA' 'ZDOMA5' '' 'A' '' '$Z$' 'zdoma5.doma.xml'. + _append_result 'DOMA' 'ZDOMA6' '' 'M' 'M' '$Z$' 'zdoma6.doma.xml'. - lt_results = lcl_file_status=>calculate_status( + lt_results = lcl_file_status=>calculate_status_old( it_local = lt_local it_remote = lt_remote it_tadir = lt_tadir diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index b74a0d6db..a567e771e 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -195,11 +195,12 @@ CLASS lcl_repo_content_browser IMPLEMENTATION. IF -filename IS NOT INITIAL. ls_file-path = -path. ls_file-filename = -filename. - ls_file-is_changed = boolc( -match = abap_false OR -new <> space ). - ls_file-new = -new. + ls_file-is_changed = boolc( -match = abap_false ). " TODO refactor + ls_file-rstate = -rstate. + ls_file-lstate = -lstate. APPEND ls_file TO -files. - IF ls_file-is_changed = abap_true OR ls_file-new IS NOT INITIAL. + IF ls_file-is_changed = abap_true. -sortkey = c_sortkey-changed. " Changed files -changes = -changes + 1. ENDIF. @@ -270,7 +271,8 @@ CLASS lcl_gui_view_repo_content DEFINITION FINAL INHERITING FROM lcl_gui_page_su IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item RETURNING VALUE(rv_html) TYPE string, render_state - IMPORTING iv_state TYPE char2 + IMPORTING iv_l TYPE char1 + iv_r TYPE char1 RETURNING VALUE(rv_html) TYPE string, render_empty_package RETURNING VALUE(rv_html) TYPE string, @@ -574,7 +576,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. rv_html = ''. - CASE iv_state(1). " Local + CASE iv_l. " Local WHEN 'C'. "Changed rv_html = rv_html && ''. WHEN 'U'. "Unchanged @@ -583,7 +585,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. rv_html = rv_html && ''. ENDCASE. - CASE iv_state+1(1). " Remote + CASE iv_r. " Remote WHEN 'C'. "Changed rv_html = rv_html && ''. WHEN 'U'. "Unchanged @@ -677,7 +679,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add_anchor( iv_txt = |diff| iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). - ro_html->add( render_state( 'C_' ) ). + ro_html->add( render_state( iv_l = 'C' iv_r = '_' ) ). ro_html->add( '' ). ELSEIF is_item-changes > 0. @@ -709,34 +711,12 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. iv_txt = |diff| iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). - CASE ls_file-new. - WHEN gc_new-remote. - ro_html->add( render_state( '_C' ) ). - WHEN gc_new-local. - ro_html->add( render_state( 'C_' ) ). - WHEN OTHERS. - ro_html->add( render_state( 'CC' ) ). - ENDCASE. - + ro_html->add( render_state( iv_l = ls_file-lstate iv_r = ls_file-rstate ) ). ro_html->add( '' ). ELSE. ro_html->add( |
 
| ). ENDIF. - -* IF ls_file-new = gc_new-remote. -* ro_html->add( '
new @remote
' ). -* ELSEIF ls_file-new = gc_new-local. -* ro_html->add( '
new @local
' ). -* ELSEIF ls_file-is_changed = abap_true. -* ro_html->add( '
' ). -* ro_html->add_anchor( -* iv_txt = 'diff' -* iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). -* ro_html->add( '
' ). -* ELSE. -* ro_html->add( |
 
| ). -* ENDIF. ENDLOOP. ENDIF.