diff --git a/zabapgit.prog.abap b/zabapgit.prog.abap index 047c43bc2..1b0d61f7d 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.3'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.7.4'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -14699,7 +14699,8 @@ CLASS lcl_repo DEFINITION ABSTRACT. RAISING lcx_exception. PROTECTED SECTION. - DATA: ms_data TYPE lcl_persistence_repo=>ty_repo. + DATA: mt_local TYPE ty_files_tt, + ms_data TYPE lcl_persistence_repo=>ty_repo. ENDCLASS. "lcl_repo DEFINITION @@ -15151,6 +15152,8 @@ CLASS lcl_repo_online IMPLEMENTATION. METHOD refresh. + super->refresh( ). + lcl_git_porcelain=>pull( EXPORTING io_repo = me IMPORTING et_files = mt_files_remote et_objects = mt_objects @@ -15237,9 +15240,6 @@ 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, @@ -15249,6 +15249,11 @@ CLASS lcl_repo IMPLEMENTATION. LIKE LINE OF lt_tadir. + IF lines( mt_local ) > 0. + rt_files = mt_local. + RETURN. + ENDIF. + lt_tadir = lcl_tadir=>read( get_package( ) ). LOOP AT lt_tadir ASSIGNING . ls_item-obj_type = -object. @@ -15260,6 +15265,8 @@ CLASS lcl_repo IMPLEMENTATION. APPEND LINES OF lt_files TO rt_files. ENDLOOP. + mt_local = rt_files. + ENDMETHOD. METHOD delete. @@ -15278,10 +15285,7 @@ CLASS lcl_repo IMPLEMENTATION. ENDMETHOD. METHOD refresh. - -* redefined in LCL_REPO_ONLINE - RETURN. - + CLEAR mt_local. ENDMETHOD. "refresh METHOD get_package. @@ -16661,8 +16665,14 @@ CLASS lcl_git_porcelain IMPLEMENTATION. * 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. + LOOP AT lt_stage ASSIGNING . + CASE -method. + WHEN lcl_stage=>c_method-add. + APPEND -file TO lt_files. + WHEN OTHERS. +* todo, work in progress see issue #5 on github + _raise 'stage method not supported, todo'. + ENDCASE. ENDLOOP. LOOP AT lt_files ASSIGNING . @@ -17261,6 +17271,11 @@ CLASS lcl_gui_page_main DEFINITION FINAL. RETURNING VALUE(rv_html) TYPE string RAISING lcx_exception. + CLASS-METHODS render_top + IMPORTING io_repo TYPE REF TO lcl_repo_online + RETURNING VALUE(rv_html) TYPE string + RAISING lcx_exception. + CLASS-METHODS render_repo_offline IMPORTING io_repo TYPE REF TO lcl_repo_offline RETURNING VALUE(rv_html) TYPE string @@ -17306,11 +17321,6 @@ CLASS lcl_gui_page_main DEFINITION FINAL. CLASS-METHODS newoffline RAISING lcx_exception. - CLASS-METHODS add - IMPORTING is_item TYPE ty_item - iv_key TYPE lcl_persistence_repo=>ty_repo-key - RAISING lcx_exception. - CLASS-METHODS uninstall IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key RAISING lcx_exception. @@ -17323,10 +17333,6 @@ CLASS lcl_gui_page_main DEFINITION FINAL. IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key RAISING lcx_exception. - CLASS-METHODS commit - IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key - RAISING lcx_exception. - CLASS-METHODS stage IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key RAISING lcx_exception. @@ -17347,10 +17353,6 @@ CLASS lcl_gui_page_main DEFINITION FINAL. es_file TYPE lcl_file_status=>ty_result RAISING lcx_exception. - CLASS-METHODS popup_comment - RETURNING VALUE(rs_comment) TYPE ty_comment - RAISING lcx_exception. - CLASS-METHODS zipexport RAISING lcx_exception. @@ -17358,8 +17360,7 @@ CLASS lcl_gui_page_main DEFINITION FINAL. RAISING lcx_exception. CLASS-METHODS is_repo_installed - IMPORTING - iv_url TYPE string + IMPORTING iv_url TYPE string iv_target_package TYPE devclass OPTIONAL RETURNING VALUE(rv_installed) TYPE abap_bool RAISING lcx_exception. @@ -17687,18 +17688,113 @@ CLASS lcl_gui_page_commit DEFINITION FINAL. DATA: mo_repo TYPE REF TO lcl_repo_online, mo_stage TYPE REF TO lcl_stage. - METHODS: render_files - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + TYPES: BEGIN OF ty_fields, + username TYPE string, + email TYPE string, + comment TYPE string, + body TYPE string, + END OF ty_fields. + + METHODS: + render_files + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + push + IMPORTING it_postdata TYPE cnht_post_data_tab + RAISING lcx_exception, + update_userdata + IMPORTING is_fields TYPE ty_fields + RAISING lcx_exception, + parse + IMPORTING it_postdata TYPE cnht_post_data_tab + RETURNING VALUE(rs_fields) TYPE ty_fields. ENDCLASS. CLASS lcl_gui_page_commit IMPLEMENTATION. METHOD constructor. - mo_repo = io_repo. + mo_repo = io_repo. mo_stage = io_stage. ENDMETHOD. + METHOD update_userdata. + + DATA: lo_user TYPE REF TO lcl_persistence_user. + + CREATE OBJECT lo_user. + lo_user->set_username( is_fields-username ). + lo_user->set_email( is_fields-email ). + + ENDMETHOD. + + METHOD push. + + DATA: ls_fields TYPE ty_fields, + ls_comment TYPE ty_comment. + + + ls_fields = parse( it_postdata ). + + update_userdata( ls_fields ). + + IF ls_fields-username IS INITIAL. + _raise 'empty username'. + ENDIF. + IF ls_fields-email IS INITIAL. + _raise 'empty email'. + ENDIF. + IF ls_fields-comment IS INITIAL. + _raise 'empty comment'. + ENDIF. + + ls_comment-username = ls_fields-username. + ls_comment-email = ls_fields-email. + ls_comment-comment = ls_fields-comment. + + IF NOT ls_fields-body IS INITIAL. + CONCATENATE ls_comment-comment gc_newline ls_fields-body + INTO ls_comment-comment. + ENDIF. + + mo_repo->push( is_comment = ls_comment + io_stage = mo_stage ). + + COMMIT WORK. + + lcl_gui=>back( ). + + ENDMETHOD. + + METHOD parse. + + DATA: lv_string TYPE string, + lt_fields TYPE tihttpnvp. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + CONCATENATE LINES OF it_postdata INTO lv_string. + + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'username' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-username = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'email' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-email = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'comment' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-comment = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'body' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-body = -value. + + ENDMETHOD. + METHOD render_files. DATA: lt_stage TYPE lcl_stage=>ty_stage_tt. @@ -17729,6 +17825,8 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. METHOD lif_gui_page~on_event. CASE iv_action. + WHEN 'post'. + push( it_postdata ). WHEN 'cancel'. lcl_gui=>back( ). WHEN OTHERS. @@ -17932,9 +18030,6 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. CASE iv_action. WHEN 'back'. lcl_gui=>back( ). - WHEN 'refresh'. - refresh( ). - lcl_gui=>render( ). WHEN 'add'. ls_file = file_decode( iv_getdata ). mo_stage->add( ls_file ). @@ -17976,7 +18071,6 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. '' && gc_newline && '
' && gc_newline && 'Local:
' && gc_newline. @@ -18100,7 +18194,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. DATA: lt_remote TYPE ty_files_tt, 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. @@ -18112,20 +18205,20 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lt_remote = lo_repo->get_files_remote( ). - ls_item-obj_type = is_result-obj_type. - ls_item-obj_name = is_result-obj_name. - - lt_local = lcl_objects=>serialize( ls_item ). + lt_local = lo_repo->get_files_local( ). READ TABLE lt_remote ASSIGNING - WITH KEY filename = is_result-filename. + WITH KEY filename = is_result-filename + path = is_result-path. IF sy-subrc <> 0. - _raise 'not found remotely'. + _raise 'file not found remotely'. ENDIF. + READ TABLE lt_local ASSIGNING - WITH KEY filename = is_result-filename. + WITH KEY filename = is_result-filename + path = is_result-path. IF sy-subrc <> 0. - _raise 'not found locally'. + _raise 'file not found locally'. ENDIF. CREATE OBJECT lo_page @@ -18137,72 +18230,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDMETHOD. "diff - METHOD popup_comment. - - DATA: lv_returncode TYPE c, - lo_user TYPE REF TO lcl_persistence_user, - lt_fields TYPE TABLE OF sval. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - CREATE OBJECT lo_user. - - APPEND INITIAL LINE TO lt_fields ASSIGNING . - -tabname = 'BAPIRTEXT'. - -fieldname = 'TEXT'. - -fieldtext = 'Username'. "#EC NOTEXT - -field_obl = abap_true. - -value = lo_user->get_username( ). - - APPEND INITIAL LINE TO lt_fields ASSIGNING . - -tabname = 'BAPIRTEXT1'. - -fieldname = 'TEXT'. - -fieldtext = 'E-Mail'. "#EC NOTEXT - -field_obl = abap_true. - -value = lo_user->get_email( ). - - APPEND INITIAL LINE TO lt_fields ASSIGNING . - -tabname = 'ABAPTXT255'. - -fieldname = 'LINE'. - -fieldtext = 'Comment'. "#EC NOTEXT - -field_obl = abap_true. - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - no_value_check = abap_true - popup_title = 'Enter Git username and email' "#EC NOTEXT - IMPORTING - returncode = lv_returncode - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. - IF sy-subrc <> 0. - _raise 'Error from POPUP_GET_VALUES'. - ENDIF. - IF lv_returncode = 'A'. - CLEAR rs_comment. - RETURN. - ENDIF. - - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - rs_comment-username = -value. - lo_user->set_username( rs_comment-username ). - - READ TABLE lt_fields INDEX 2 ASSIGNING . - ASSERT sy-subrc = 0. - rs_comment-email = -value. - lo_user->set_email( rs_comment-email ). - - READ TABLE lt_fields INDEX 3 ASSIGNING . - ASSERT sy-subrc = 0. - rs_comment-comment = -value. - - ENDMETHOD. "popup_commit - METHOD pull. DATA: lo_repo TYPE REF TO lcl_repo_online. @@ -18236,57 +18263,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDMETHOD. - METHOD commit. - - DATA: lt_results TYPE lcl_file_status=>ty_results_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_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 <> ''. - CLEAR ls_item. - ls_item-obj_type = -obj_type. - ls_item-obj_name = -obj_name. - - lt_files = lcl_objects=>serialize( ls_item ). - LOOP AT lt_files ASSIGNING . - lo_stage->add( ). -* APPEND LINES OF lt_files TO lt_push. - ENDLOOP. - ENDLOOP. - - IF lo_stage->count( ) = 0. - _raise 'no changes'. - ENDIF. - - ls_comment = popup_comment( ). - IF ls_comment IS INITIAL. - RETURN. - ENDIF. - - lo_repo->push( is_comment = ls_comment - io_stage = lo_stage ). - - COMMIT WORK. - - lcl_gui=>render( ). - - ENDMETHOD. "commit - METHOD jump_decode. DATA: lt_fields TYPE tihttpnvp, @@ -18501,58 +18477,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDMETHOD. "remove - METHOD add. - - DATA: lt_files TYPE ty_files_tt, - 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( ). - - IF is_item-obj_type = 'SICF'. - CONCATENATE is_item-obj_name '%' INTO lv_obj_name. - ELSE. - lv_obj_name = is_item-obj_name. - ENDIF. - - SELECT SINGLE obj_name FROM tadir - INTO lv_obj_name - WHERE pgmid = 'R3TR' - AND object = is_item-obj_type - AND obj_name LIKE lv_obj_name - AND devclass = lv_package. "#EC CI_GENBUFF - IF sy-subrc <> 0. - _raise 'Object not found or in wrong package'. - ENDIF. - - 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 - io_stage = lo_stage ). - - COMMIT WORK. - - lcl_gui=>render( ). - - ENDMETHOD. "add - METHOD newoffline. DATA: lv_returncode TYPE c, @@ -18840,8 +18764,31 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDMETHOD. + METHOD render_top. + + rv_html = '' && gc_newline && + '' && gc_newline && + '' && gc_newline && + '' && gc_newline && + '' && gc_newline && + '
' && gc_newline && + '' && io_repo->get_name( ) && '' && gc_newline && + '' && gc_newline && + '' && io_repo->get_package( ) && '' && gc_newline && + '' && io_repo->get_branch_name( ) && '' && gc_newline && + '' && io_repo->get_url( ) && '' && gc_newline && + '
' && gc_newline. + + ENDMETHOD. + METHOD render_repo_online. + CONSTANTS: BEGIN OF c_status, + commit TYPE c VALUE 'C', + match TYPE c VALUE 'M', + pull TYPE c VALUE 'P', + END OF c_status. + DATA: lv_link TYPE string, lv_status TYPE string, lv_object TYPE string, @@ -18861,31 +18808,20 @@ CLASS lcl_gui_page_main IMPLEMENTATION. rv_html = rv_html && '
' && gc_newline && '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '
' && gc_newline && - '' && io_repo->get_name( ) && '' && gc_newline && - '' && gc_newline && - '' && io_repo->get_package( ) && '' && gc_newline && - '' && io_repo->get_branch_name( ) && '' && gc_newline && - '' && io_repo->get_url( ) && '' && gc_newline && - '
' && gc_newline && + render_top( io_repo ) && render_repo_menu( io_repo ). IF go_user->is_hidden( io_repo->get_key( ) ) = abap_false. TRY. lt_results = io_repo->status( ). IF io_repo->get_sha1_remote( ) <> io_repo->get_sha1_local( ). - lv_status = 'pull'. "#EC NOTEXT + lv_status = c_status-pull. ELSE. READ TABLE lt_results WITH KEY match = abap_false TRANSPORTING NO FIELDS. IF sy-subrc = 0. - lv_status = 'commit'. "#EC NOTEXT + lv_status = c_status-commit. ELSE. - lv_status = 'match'. "#EC NOTEXT + lv_status = c_status-match. ENDIF. ENDIF. @@ -18899,11 +18835,12 @@ CLASS lcl_gui_page_main IMPLEMENTATION. is_file = ). CLEAR lv_link. - IF lv_status = 'match' AND -filename IS INITIAL. + IF lv_status = c_status-match AND -filename IS INITIAL. MOVE-CORRESPONDING TO ls_item. lv_supported = lcl_objects=>is_supported( ls_item ). IF lv_supported = abap_true. - lv_link = 'add'. + lv_link = 'new'. + lv_status = c_status-commit. ELSE. lv_link = |Object type { ls_item-obj_type } not supported|. ENDIF. @@ -18955,24 +18892,18 @@ CLASS lcl_gui_page_main IMPLEMENTATION. gc_newline. CASE lv_status. - WHEN 'commit'. + WHEN c_status-commit. rv_html = rv_html && - 'get_key( ) && - '">commit'. - WHEN 'pull'. + '">stage'. + WHEN c_status-pull. rv_html = rv_html && 'pull'. ENDCASE. -* todo, work in progress, - rv_html = rv_html && - 'stage'. - lv_status = lcl_sap_package=>check( it_results = lt_results iv_top = io_repo->get_package( ) ). @@ -19120,14 +19051,14 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lcl_gui=>show_url( 'http://larshp.github.io/abapGit/explore.html' ). WHEN 'abapgithome'. cl_gui_frontend_services=>execute( document = 'http://www.abapgit.org' ). - WHEN 'add'. - file_decode( EXPORTING iv_string = iv_getdata - IMPORTING ev_key = lv_key - es_file = ls_result ). - CLEAR ls_item. - MOVE-CORRESPONDING ls_result TO ls_item. - add( is_item = ls_item - iv_key = lv_key ). +* WHEN 'add'. +* file_decode( EXPORTING iv_string = iv_getdata +* IMPORTING ev_key = lv_key +* es_file = ls_result ). +* CLEAR ls_item. +* MOVE-CORRESPONDING ls_result TO ls_item. +* add( is_item = ls_item +* iv_key = lv_key ). WHEN 'uninstall'. lv_key = iv_getdata. uninstall( lv_key ). @@ -19149,9 +19080,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lv_key = iv_getdata. go_user->unhide( lv_key ). lcl_gui=>render( ). - WHEN 'commit'. - lv_key = iv_getdata. - commit( lv_key ). +* WHEN 'commit'. +* lv_key = iv_getdata. +* commit( lv_key ). WHEN 'stage'. lv_key = iv_getdata. stage( lv_key ).