diff --git a/zabapgit.prog.abap b/zabapgit.prog.abap index 650c6adc8..047c43bc2 100644 --- a/zabapgit.prog.abap +++ b/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.7.2'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.7.3'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -14685,6 +14685,9 @@ CLASS lcl_repo DEFINITION ABSTRACT. get_name RETURNING VALUE(rv_name) TYPE string RAISING lcx_exception, + get_files_local + RETURNING VALUE(rt_files) TYPE ty_files_tt + RAISING lcx_exception, get_package RETURNING VALUE(rv_package) TYPE lcl_persistence_repo=>ty_repo-package, delete @@ -14700,6 +14703,58 @@ CLASS lcl_repo DEFINITION ABSTRACT. ENDCLASS. "lcl_repo DEFINITION +CLASS lcl_stage DEFINITION FINAL. + + PUBLIC SECTION. + TYPES: ty_method TYPE c LENGTH 1. + + CONSTANTS: BEGIN OF c_method, + add TYPE ty_method VALUE 'A', + reset TYPE ty_method VALUE 'E', + rm TYPE ty_method VALUE 'M', + ignore TYPE ty_method VALUE 'I', + END OF c_method. + + TYPES: BEGIN OF ty_stage, + file TYPE ty_file, + method TYPE ty_method, + END OF ty_stage. + + TYPES: ty_stage_tt TYPE SORTED TABLE OF ty_stage + WITH UNIQUE KEY file-path file-filename. + + METHODS: + add + IMPORTING is_file TYPE ty_file + RAISING lcx_exception, + reset + IMPORTING is_file TYPE ty_file + RAISING lcx_exception, + rm + IMPORTING is_file TYPE ty_file + RAISING lcx_exception, + ignore + IMPORTING is_file TYPE ty_file + RAISING lcx_exception, + count + RETURNING VALUE(rv_count) TYPE i, + lookup + IMPORTING iv_path TYPE ty_file-path + iv_filename TYPE ty_file-filename + RETURNING VALUE(rs_stage) TYPE ty_stage + RAISING lcx_not_found, + get_all + RETURNING VALUE(rt_stage) TYPE ty_stage_tt. + + PRIVATE SECTION. + DATA: mt_stage TYPE ty_stage_tt. + + METHODS: append + IMPORTING is_file TYPE ty_file + iv_method TYPE ty_method. + +ENDCLASS. + *----------------------------------------------------------------------* * CLASS lcl_repo_online DEFINITION *----------------------------------------------------------------------* @@ -14725,9 +14780,6 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. get_files_remote RETURNING VALUE(rt_files) TYPE ty_files_tt RAISING lcx_exception, - get_files_local - RETURNING VALUE(rt_files) TYPE ty_files_tt - RAISING lcx_exception, get_objects RETURNING VALUE(rt_objects) TYPE lcl_git_pack=>ty_objects_tt RAISING lcx_exception, @@ -14738,7 +14790,7 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. RAISING lcx_exception, push IMPORTING is_comment TYPE ty_comment - it_files TYPE ty_files_tt + io_stage TYPE REF TO lcl_stage RAISING lcx_exception. PRIVATE SECTION. @@ -14785,7 +14837,7 @@ CLASS lcl_git_porcelain DEFINITION FINAL. CLASS-METHODS push IMPORTING io_repo TYPE REF TO lcl_repo_online is_comment TYPE ty_comment - it_files TYPE ty_files_tt + io_stage TYPE REF TO lcl_stage RETURNING VALUE(rv_branch) TYPE ty_sha1 RAISING lcx_exception. @@ -15114,32 +15166,6 @@ CLASS lcl_repo_online IMPLEMENTATION. rv_sha1 = mv_branch. ENDMETHOD. "get_sha1_remote - METHOD get_files_local. -* todo, this can be optimized, cache the data -* and rebould on refresh. Also see STATUS method -* it also generates the same files - - DATA: lt_tadir TYPE lcl_tadir=>ty_tadir_tt, - ls_item TYPE ty_item, - lt_files LIKE rt_files. - - FIELD-SYMBOLS: LIKE LINE OF lt_files, - LIKE LINE OF lt_tadir. - - - lt_tadir = lcl_tadir=>read( get_package( ) ). - LOOP AT lt_tadir ASSIGNING . - ls_item-obj_type = -object. - ls_item-obj_name = -obj_name. - lt_files = lcl_objects=>serialize( ls_item ). - LOOP AT lt_files ASSIGNING . - -path = '/' && -path. - ENDLOOP. - APPEND LINES OF lt_files TO rt_files. - ENDLOOP. - - ENDMETHOD. - METHOD get_files_remote. initialize( ). @@ -15171,7 +15197,7 @@ CLASS lcl_repo_online IMPLEMENTATION. lv_branch = lcl_git_porcelain=>push( is_comment = is_comment io_repo = me - it_files = it_files ). + io_stage = io_stage ). set_sha1( lv_branch ). @@ -15210,6 +15236,32 @@ CLASS lcl_repo IMPLEMENTATION. ENDMETHOD. "constructor + METHOD get_files_local. +* todo, this can be optimized, cache the data +* and rebuild on refresh. Also see STATUS method +* it also generates the same files + + DATA: lt_tadir TYPE lcl_tadir=>ty_tadir_tt, + ls_item TYPE ty_item, + lt_files LIKE rt_files. + + FIELD-SYMBOLS: LIKE LINE OF lt_files, + LIKE LINE OF lt_tadir. + + + lt_tadir = lcl_tadir=>read( get_package( ) ). + LOOP AT lt_tadir ASSIGNING . + ls_item-obj_type = -object. + ls_item-obj_name = -obj_name. + lt_files = lcl_objects=>serialize( ls_item ). + LOOP AT lt_files ASSIGNING . + -path = '/' && -path. + ENDLOOP. + APPEND LINES OF lt_files TO rt_files. + ENDLOOP. + + ENDMETHOD. + METHOD delete. DATA: lo_persistence TYPE REF TO lcl_persistence_repo. @@ -16594,18 +16646,24 @@ CLASS lcl_git_porcelain IMPLEMENTATION. DATA: lt_nodes TYPE lcl_git_pack=>ty_nodes_tt, - lt_files LIKE it_files, + lt_files TYPE ty_files_tt, lv_sha1 TYPE ty_sha1, + lt_stage TYPE lcl_stage=>ty_stage_tt, lv_index TYPE i. - FIELD-SYMBOLS: LIKE LINE OF it_files, - LIKE LINE OF lt_nodes. + FIELD-SYMBOLS: LIKE LINE OF lt_files, + LIKE LINE OF lt_stage, + LIKE LINE OF lt_nodes. lt_nodes = root_tree( it_objects = io_repo->get_objects( ) iv_branch = io_repo->get_sha1_remote( ) ). - lt_files[] = it_files[]. +* todo, can only handle add + lt_stage = io_stage->get_all( ). + LOOP AT lt_stage ASSIGNING WHERE method = lcl_stage=>c_method-add. + APPEND -file TO lt_files. + ENDLOOP. LOOP AT lt_files ASSIGNING . lv_index = sy-tabix. @@ -17324,12 +17382,12 @@ CLASS lcl_gui_page_diff DEFINITION FINAL. METHODS: constructor IMPORTING - is_result TYPE lcl_file_status=>ty_result - io_diff TYPE REF TO lcl_diff. + is_local TYPE ty_file + is_remote TYPE ty_file. PRIVATE SECTION. - DATA: ms_result TYPE lcl_file_status=>ty_result, - mo_diff TYPE REF TO lcl_diff. + DATA: mv_filename TYPE string, + mo_diff TYPE REF TO lcl_diff. METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. METHODS render_head RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. @@ -17340,8 +17398,13 @@ ENDCLASS. CLASS lcl_gui_page_diff IMPLEMENTATION. METHOD constructor. - ms_result = is_result. - mo_diff = io_diff. + mv_filename = is_local-filename. + + CREATE OBJECT mo_diff + EXPORTING + iv_local = is_local-data + iv_remote = is_remote-data. + ENDMETHOD. METHOD styles. @@ -17431,9 +17494,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lo_html->add( |- { ls_count-delete }| ). "#EC NOTEXT lo_html->add( |~ { ls_count-update }| ). "#EC NOTEXT lo_html->add( '' ). "#EC NOTEXT - lo_html->add( ms_result-obj_type ). "#EC NOTEXT - lo_html->add( |{ ms_result-obj_name }| ). "#EC NOTEXT - lo_html->add( |({ ms_result-filename })| ). + lo_html->add( |{ mv_filename }| ). lo_html->add( '' ). "#EC NOTEXT lo_html->add( '' ). "#EC NOTEXT @@ -17558,58 +17619,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ENDCLASS. -CLASS lcl_stage DEFINITION FINAL. - - PUBLIC SECTION. - TYPES: ty_method TYPE c LENGTH 1. - - CONSTANTS: BEGIN OF c_method, - add TYPE ty_method VALUE 'A', - reset TYPE ty_method VALUE 'E', - rm TYPE ty_method VALUE 'M', - ignore TYPE ty_method VALUE 'I', - END OF c_method. - - TYPES: BEGIN OF ty_stage, - file TYPE ty_file, - method TYPE ty_method, - END OF ty_stage. - - TYPES: ty_stage_tt TYPE SORTED TABLE OF ty_stage - WITH UNIQUE KEY file-path file-filename. - - METHODS: - add - IMPORTING is_file TYPE ty_file - RAISING lcx_exception, - reset - IMPORTING is_file TYPE ty_file - RAISING lcx_exception, - rm - IMPORTING is_file TYPE ty_file - RAISING lcx_exception, - ignore - IMPORTING is_file TYPE ty_file - RAISING lcx_exception, - count - RETURNING VALUE(rv_count) TYPE i, - lookup - IMPORTING iv_path TYPE ty_file-path - iv_filename TYPE ty_file-filename - RETURNING VALUE(rs_stage) TYPE ty_stage - RAISING lcx_not_found, - get_all - RETURNING VALUE(rt_stage) TYPE ty_stage_tt. - - PRIVATE SECTION. - DATA: mt_stage TYPE ty_stage_tt. - - METHODS: append - IMPORTING is_file TYPE ty_file - iv_method TYPE ty_method. - -ENDCLASS. - CLASS lcl_stage IMPLEMENTATION. METHOD lookup. @@ -18093,8 +18102,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lt_local TYPE ty_files_tt, ls_item TYPE ty_item, lo_page TYPE REF TO lcl_gui_page_diff, - lo_repo TYPE REF TO lcl_repo_online, - lo_diff TYPE REF TO lcl_diff. + lo_repo TYPE REF TO lcl_repo_online. FIELD-SYMBOLS: LIKE LINE OF lt_remote, LIKE LINE OF lt_local. @@ -18120,15 +18128,10 @@ CLASS lcl_gui_page_main IMPLEMENTATION. _raise 'not found locally'. ENDIF. - CREATE OBJECT lo_diff - EXPORTING - iv_local = -data - iv_remote = -data. - CREATE OBJECT lo_page EXPORTING - is_result = is_result - io_diff = lo_diff. + is_local = + is_remote = . lcl_gui=>call_page( lo_page ). @@ -18236,18 +18239,22 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD commit. DATA: lt_results TYPE lcl_file_status=>ty_results_tt, - lt_push TYPE ty_files_tt, +* lt_push TYPE ty_files_tt, ls_item TYPE ty_item, ls_comment TYPE ty_comment, + lo_stage TYPE REF TO lcl_stage, lo_repo TYPE REF TO lcl_repo_online, lt_files TYPE ty_files_tt. - FIELD-SYMBOLS: LIKE LINE OF lt_results. + FIELD-SYMBOLS: LIKE LINE OF lt_files, + LIKE LINE OF lt_results. lo_repo ?= lcl_repo_srv=>get( iv_key ). lt_results = lo_repo->status( ). + CREATE OBJECT lo_stage. + LOOP AT lt_results ASSIGNING WHERE match = abap_false AND filename <> ''. @@ -18256,10 +18263,13 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ls_item-obj_name = -obj_name. lt_files = lcl_objects=>serialize( ls_item ). - APPEND LINES OF lt_files TO lt_push. + LOOP AT lt_files ASSIGNING . + lo_stage->add( ). +* APPEND LINES OF lt_files TO lt_push. + ENDLOOP. ENDLOOP. - IF lt_push[] IS INITIAL. + IF lo_stage->count( ) = 0. _raise 'no changes'. ENDIF. @@ -18269,7 +18279,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDIF. lo_repo->push( is_comment = ls_comment - it_files = lt_push ). + io_stage = lo_stage ). COMMIT WORK. @@ -18497,8 +18507,11 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ls_comment TYPE ty_comment, lo_repo TYPE REF TO lcl_repo_online, lv_package TYPE devclass, + lo_stage TYPE REF TO lcl_stage, lv_obj_name TYPE tadir-obj_name. + FIELD-SYMBOLS: LIKE LINE OF lt_files. + lo_repo ?= lcl_repo_srv=>get( iv_key ). lv_package = lo_repo->get_package( ). @@ -18521,13 +18534,18 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lt_files = lcl_objects=>serialize( is_item ). + CREATE OBJECT lo_stage. + LOOP AT lt_files ASSIGNING . + lo_stage->add( ). + ENDLOOP. + ls_comment = popup_comment( ). IF ls_comment IS INITIAL. RETURN. ENDIF. lo_repo->push( is_comment = ls_comment - it_files = lt_files ). + io_stage = lo_stage ). COMMIT WORK.