diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index cc2f11615..7288c6d21 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -137,24 +137,27 @@ CONSTANTS: gc_root_dir TYPE string VALUE '/', gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT. CONSTANTS: BEGIN OF gc_action, - repo_clone TYPE string VALUE 'repo_clone', - repo_refresh TYPE string VALUE 'repo_refresh', - repo_remove TYPE string VALUE 'repo_remove', - repo_purge TYPE string VALUE 'repo_purge', - repo_newoffline TYPE string VALUE 'repo_newoffline', - abapgit_home TYPE string VALUE 'abapgit_home', - abapgit_install TYPE string VALUE 'abapgit_install', - zip_import TYPE string VALUE 'zip_import', - zip_export TYPE string VALUE 'zip_export', - zip_package TYPE string VALUE 'zip_package', - zip_transport TYPE string VALUE 'zip_transport', - git_pull TYPE string VALUE 'git_pull', - git_reset TYPE string VALUE 'git_reset', - git_branch_create TYPE string VALUE 'git_branch_create', - git_branch_switch TYPE string VALUE 'git_branch_switch', - git_branch_delete TYPE string VALUE 'git_branch_delete', - db_delete TYPE string VALUE 'db_delete', - db_update TYPE string VALUE 'db_update', - db_display TYPE string VALUE 'db_display', - db_edit TYPE string VALUE 'db_edit', + repo_clone TYPE string VALUE 'repo_clone', + repo_refresh TYPE string VALUE 'repo_refresh', + repo_remove TYPE string VALUE 'repo_remove', + repo_purge TYPE string VALUE 'repo_purge', + repo_newoffline TYPE string VALUE 'repo_newoffline', + repo_remote_attach TYPE string VALUE 'repo_remote_attach', + repo_remote_detach TYPE string VALUE 'repo_remote_detach', + repo_remote_change TYPE string VALUE 'repo_remote_change', + abapgit_home TYPE string VALUE 'abapgit_home', + abapgit_install TYPE string VALUE 'abapgit_install', + zip_import TYPE string VALUE 'zip_import', + zip_export TYPE string VALUE 'zip_export', + zip_package TYPE string VALUE 'zip_package', + zip_transport TYPE string VALUE 'zip_transport', + git_pull TYPE string VALUE 'git_pull', + git_reset TYPE string VALUE 'git_reset', + git_branch_create TYPE string VALUE 'git_branch_create', + git_branch_switch TYPE string VALUE 'git_branch_switch', + git_branch_delete TYPE string VALUE 'git_branch_delete', + db_delete TYPE string VALUE 'db_delete', + db_update TYPE string VALUE 'db_update', + db_display TYPE string VALUE 'db_display', + db_edit TYPE string VALUE 'db_edit', END OF gc_action. \ No newline at end of file diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap index 664c58bcb..4c8c7e0e6 100644 --- a/src/zabapgit_gui_router.prog.abap +++ b/src/zabapgit_gui_router.prog.abap @@ -147,6 +147,17 @@ CLASS lcl_gui_router IMPLEMENTATION. lcl_transport=>zip( ). ev_state = gc_event_state-no_more_act. + " Remote origin manipulations + WHEN gc_action-repo_remote_attach. + lcl_services_repo=>remote_attach( lv_key ). + ev_state = gc_event_state-re_render. + WHEN gc_action-repo_remote_detach. + lcl_services_repo=>remote_detach( lv_key ). + ev_state = gc_event_state-re_render. + WHEN gc_action-repo_remote_change. + lcl_services_repo=>remote_change( lv_key ). + ev_state = gc_event_state-re_render. + " Git actions WHEN gc_action-git_pull. lcl_services_git=>pull( lv_key ). @@ -219,7 +230,7 @@ CLASS lcl_gui_router IMPLEMENTATION. ri_page = lo_page. - ENDMETHOD. + ENDMETHOD. "get_page_branch_overview METHOD get_page_diff. @@ -262,7 +273,7 @@ CLASS lcl_gui_router IMPLEMENTATION. ri_page = lo_page. - ENDMETHOD. + ENDMETHOD. "get_page_diff METHOD get_page_stage. @@ -281,7 +292,7 @@ CLASS lcl_gui_router IMPLEMENTATION. ri_page = lo_stage_page. - ENDMETHOD. + ENDMETHOD. "get_page_stage METHOD get_page_background. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 7a29bc6fa..01d13da4c 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -207,7 +207,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lv_pull_opt LIKE gc_html_opt-crossout, lo_repo_online TYPE REF TO lcl_repo_online. - CREATE OBJECT ro_html. CREATE OBJECT lo_toolbar. CREATE OBJECT lo_tb_branch. @@ -245,6 +244,13 @@ CLASS lcl_gui_page_main IMPLEMENTATION. iv_opt = lv_wp_opt ). lo_tb_advanced->add( iv_txt = 'Background mode' iv_act = |background?{ lv_key }| ). + lo_tb_advanced->add( iv_txt = 'Change remote' + iv_act = |{ gc_action-repo_remote_change }?{ lv_key }| ). + lo_tb_advanced->add( iv_txt = 'Make off-line' + iv_act = |{ gc_action-repo_remote_detach }?{ lv_key }| ). + ELSE. + lo_tb_advanced->add( iv_txt = 'Make on-line' + iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ). ENDIF. lo_tb_advanced->add( iv_txt = 'Remove' iv_act = |{ gc_action-repo_remove }?{ lv_key }| ). diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index 1a4fbaa20..85dda76d7 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -146,6 +146,11 @@ CLASS lcl_persistence_repo DEFINITION FINAL. iv_head_branch TYPE ty_repo_xml-head_branch RAISING lcx_exception. + METHODS update_offline + IMPORTING iv_key TYPE ty_repo-key + iv_offline TYPE ty_repo_xml-offline + RAISING lcx_exception. + METHODS add IMPORTING iv_url TYPE string iv_branch_name TYPE string @@ -815,10 +820,6 @@ CLASS lcl_persistence_repo IMPLEMENTATION. ls_repo TYPE ty_repo. - IF iv_branch_name IS INITIAL. - lcx_exception=>raise( 'update, branch name empty' ). - ENDIF. - ASSERT NOT iv_key IS INITIAL. TRY. @@ -843,10 +844,6 @@ CLASS lcl_persistence_repo IMPLEMENTATION. ls_repo TYPE ty_repo. - IF iv_head_branch IS INITIAL. - lcx_exception=>raise( 'update, head branch empty' ). - ENDIF. - ASSERT NOT iv_key IS INITIAL. TRY. @@ -864,6 +861,29 @@ CLASS lcl_persistence_repo IMPLEMENTATION. ENDMETHOD. "update_head_branch + METHOD update_offline. + + DATA: lt_content TYPE lcl_persistence_db=>tt_content, + ls_content LIKE LINE OF lt_content, + ls_repo TYPE ty_repo. + + ASSERT NOT iv_key IS INITIAL. + + TRY. + ls_repo = read( iv_key ). + CATCH lcx_not_found. + lcx_exception=>raise( 'key not found' ). + ENDTRY. + + ls_repo-offline = iv_offline. + ls_content-data_str = to_xml( ls_repo ). + + mo_db->update( iv_type = c_type_repo + iv_value = iv_key + iv_data = ls_content-data_str ). + + ENDMETHOD. "update_offline + METHOD update_sha1. DATA: lt_content TYPE lcl_persistence_db=>tt_content, @@ -871,10 +891,6 @@ CLASS lcl_persistence_repo IMPLEMENTATION. ls_repo TYPE ty_repo. - IF iv_branch_sha1 IS INITIAL. - lcx_exception=>raise( 'update, sha empty' ). - ENDIF. - ASSERT NOT iv_key IS INITIAL. TRY. diff --git a/src/zabapgit_popups.prog.abap b/src/zabapgit_popups.prog.abap index 9957d1aa8..df16c6a11 100644 --- a/src/zabapgit_popups.prog.abap +++ b/src/zabapgit_popups.prog.abap @@ -33,9 +33,12 @@ CLASS lcl_popups DEFINITION. RETURNING VALUE(rs_branch) TYPE lcl_git_branch_list=>ty_git_branch RAISING lcx_exception, repo_popup - IMPORTING iv_url TYPE string - iv_package TYPE devclass OPTIONAL - iv_branch TYPE string DEFAULT 'refs/heads/master' + IMPORTING iv_url TYPE string + iv_package TYPE devclass OPTIONAL + iv_branch TYPE string DEFAULT 'refs/heads/master' + iv_freeze_package TYPE abap_bool OPTIONAL + iv_freeze_url TYPE abap_bool OPTIONAL + iv_title TYPE clike DEFAULT 'Clone repository ...' RETURNING VALUE(rs_popup) TYPE ty_popup RAISING lcx_exception ##NO_TEXT, popup_to_confirm @@ -253,34 +256,37 @@ CLASS lcl_popups IMPLEMENTATION. lv_icon_ok TYPE icon-name, lv_icon_br TYPE icon-name, lt_fields TYPE TABLE OF sval, + lv_uattr TYPE spo_fattr, lv_pattr TYPE spo_fattr, - lv_battr TYPE spo_fattr, lv_button2 TYPE svalbutton-buttontext, lv_icon2 TYPE icon-name. FIELD-SYMBOLS: LIKE LINE OF lt_fields. + IF iv_freeze_url = abap_true. + lv_uattr = '05'. + ENDIF. - IF NOT iv_package IS INITIAL. + IF iv_freeze_package = abap_true. lv_pattr = '05'. - lv_battr = '03'. - ELSE. - lv_battr = '05'. + ENDIF. + + IF iv_package IS INITIAL. " Empty package -> can be created lv_button2 = 'Create package' ##NO_TEXT. lv_icon2 = icon_msg. ENDIF. * TAB FLD LABEL DEF ATTR - _add_dialog_fld 'ABAPTXT255' 'LINE' 'Git Clone Url' iv_url lv_pattr. - _add_dialog_fld 'TDEVC' 'DEVCLASS' 'Target Package' iv_package lv_pattr. - _add_dialog_fld 'TEXTL' 'LINE' 'Branch' iv_branch lv_battr. + _add_dialog_fld 'ABAPTXT255' 'LINE' 'Git clone URL' iv_url lv_uattr. + _add_dialog_fld 'TDEVC' 'DEVCLASS' 'Target package' iv_package lv_pattr. + _add_dialog_fld 'TEXTL' 'LINE' 'Branch' iv_branch '05'. lv_icon_ok = icon_okay. lv_icon_br = icon_workflow_fork. CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' EXPORTING - popup_title = 'Repository' + popup_title = iv_title programname = sy-repid formname = 'BRANCH_POPUP' ok_pushbuttontext = 'OK' diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index d0c316c88..43288f1da 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -5,7 +5,7 @@ *----------------------------------------------------------------------* * CLASS lcl_repo DEFINITION *----------------------------------------------------------------------* -CLASS lcl_repo DEFINITION ABSTRACT. +CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv. PUBLIC SECTION. METHODS: @@ -62,6 +62,7 @@ CLASS lcl_repo DEFINITION ABSTRACT. iv_url TYPE lcl_persistence_repo=>ty_repo-url OPTIONAL iv_branch_name TYPE lcl_persistence_repo=>ty_repo-branch_name OPTIONAL iv_head_branch TYPE lcl_persistence_repo=>ty_repo-head_branch OPTIONAL + iv_offline TYPE lcl_persistence_repo=>ty_repo-offline OPTIONAL RAISING lcx_exception. ENDCLASS. "lcl_repo DEFINITION @@ -92,6 +93,10 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. set_branch_name IMPORTING iv_branch_name TYPE lcl_persistence_repo=>ty_repo-branch_name RAISING lcx_exception, + set_new_remote + IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url + iv_branch_name TYPE lcl_persistence_repo=>ty_repo-branch_name + RAISING lcx_exception, get_sha1_local RETURNING VALUE(rv_sha1) TYPE lcl_persistence_repo=>ty_repo-sha1, get_sha1_remote @@ -186,6 +191,11 @@ CLASS lcl_repo_srv DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RETURNING VALUE(rv_installed) TYPE abap_bool RAISING lcx_exception. + METHODS switch_repo_type + IMPORTING iv_key TYPE lcl_persistence_db=>ty_value + iv_offline TYPE abap_bool + RAISING lcx_exception. + PRIVATE SECTION. METHODS constructor. diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 0b73f017a..b2b0a983b 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -135,6 +135,10 @@ CLASS lcl_repo_online IMPLEMENTATION. METHOD set_url. + IF ms_data-write_protect = abap_true. + lcx_exception=>raise( 'Cannot change URL. Local code is write-protected by repo config' ). + ENDIF. + mv_initialized = abap_false. set( iv_url = iv_url ). @@ -151,6 +155,20 @@ CLASS lcl_repo_online IMPLEMENTATION. ENDMETHOD. + METHOD set_new_remote. + + IF ms_data-write_protect = abap_true. + lcx_exception=>raise( 'Cannot change remote. Local code is write-protected by repo config' ). + ENDIF. + + mv_initialized = abap_false. + set( iv_url = iv_url + iv_branch_name = iv_branch_name + iv_head_branch = '' + iv_sha1 = '' ). + + ENDMETHOD. "set_new_remote + METHOD get_sha1_local. rv_sha1 = ms_data-sha1. ENDMETHOD. "get_sha1_local @@ -252,7 +270,8 @@ CLASS lcl_repo IMPLEMENTATION. OR it_checksums IS SUPPLIED OR iv_url IS SUPPLIED OR iv_branch_name IS SUPPLIED - OR iv_head_branch IS SUPPLIED. + OR iv_head_branch IS SUPPLIED + OR iv_offline IS SUPPLIED. CREATE OBJECT lo_persistence. @@ -291,6 +310,13 @@ CLASS lcl_repo IMPLEMENTATION. ms_data-head_branch = iv_head_branch. ENDIF. + IF iv_offline IS SUPPLIED. + lo_persistence->update_offline( + iv_key = ms_data-key + iv_offline = iv_offline ). + ms_data-offline = iv_offline. + ENDIF. + ENDMETHOD. "set_sha1 METHOD build_local_checksums. @@ -529,7 +555,8 @@ CLASS lcl_repo_srv IMPLEMENTATION. lv_key = mo_persistence->add( iv_url = iv_url iv_branch_name = iv_branch_name - iv_package = iv_package ). + iv_package = iv_package + iv_offline = abap_false ). TRY. ls_repo = mo_persistence->read( lv_key ). @@ -663,4 +690,34 @@ CLASS lcl_repo_srv IMPLEMENTATION. ENDMETHOD. "is_repo_installed + METHOD switch_repo_type. + + DATA lo_repo TYPE REF TO lcl_repo. + + FIELD-SYMBOLS LIKE LINE OF mt_list. + + lo_repo = get( iv_key ). + READ TABLE mt_list ASSIGNING FROM lo_repo. + ASSERT sy-subrc IS INITIAL. + ASSERT iv_offline <> lo_repo->ms_data-offline. + + IF iv_offline = abap_true. " On-line -> OFFline + lo_repo->set( + iv_url = lcl_url=>name( lo_repo->ms_data-url ) + iv_branch_name = '' + iv_sha1 = '' + iv_head_branch = '' + iv_offline = abap_true ). + CREATE OBJECT TYPE lcl_repo_offline + EXPORTING + is_data = lo_repo->ms_data. + ELSE. " OFFline -> On-line + lo_repo->set( iv_offline = abap_false ). + CREATE OBJECT TYPE lcl_repo_online + EXPORTING + is_data = lo_repo->ms_data. + ENDIF. + + ENDMETHOD. "switch_repo_type + ENDCLASS. "lcl_repo_srv IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_services_repo.prog.abap b/src/zabapgit_services_repo.prog.abap index 509368af9..f175fcccf 100644 --- a/src/zabapgit_services_repo.prog.abap +++ b/src/zabapgit_services_repo.prog.abap @@ -23,6 +23,18 @@ CLASS lcl_services_repo DEFINITION FINAL. CLASS-METHODS new_offline RAISING lcx_exception lcx_cancel. + CLASS-METHODS remote_attach + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + RAISING lcx_exception lcx_cancel. + + CLASS-METHODS remote_detach + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + RAISING lcx_exception lcx_cancel. + + CLASS-METHODS remote_change + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + RAISING lcx_exception lcx_cancel. + ENDCLASS. "lcl_services_repo CLASS lcl_services_repo IMPLEMENTATION. @@ -159,4 +171,78 @@ CLASS lcl_services_repo IMPLEMENTATION. ENDMETHOD. "new_offline + METHOD remote_detach. + + DATA: lv_answer TYPE c LENGTH 1. + + lv_answer = lcl_popups=>popup_to_confirm( + titlebar = 'Make repository OFF-line' + text_question = 'This will detach the repo from remote and make it OFF-line' + text_button_1 = 'Make OFF-line' + icon_button_1 = 'ICON_WF_UNLINK' + text_button_2 = 'Cancel' + icon_button_2 = 'ICON_CANCEL' + default_button = '2' + display_cancel_button = abap_false + ). "#EC NOTEXT + + IF lv_answer = '2'. + RAISE EXCEPTION TYPE lcx_cancel. + ENDIF. + + lcl_app=>repo_srv( )->switch_repo_type( iv_key = iv_key iv_offline = abap_true ). + + COMMIT WORK. + + ENDMETHOD. "remote_detach + + + METHOD remote_attach. + + DATA: ls_popup TYPE lcl_popups=>ty_popup, + lo_repo TYPE REF TO lcl_repo_online. + + ls_popup = lcl_popups=>repo_popup( + iv_title = 'Attach repo to remote ...' + iv_url = '' + iv_package = lcl_app=>repo_srv( )->get( iv_key )->get_package( ) + iv_freeze_package = abap_true ). + IF ls_popup-cancel = abap_true. + RAISE EXCEPTION TYPE lcx_cancel. + ENDIF. + + lcl_app=>repo_srv( )->switch_repo_type( iv_key = iv_key iv_offline = abap_false ). + + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + lo_repo->set_url( ls_popup-url ). + lo_repo->set_branch_name( ls_popup-branch_name ). + + COMMIT WORK. + + ENDMETHOD. "remote_attach + + METHOD remote_change. + + DATA: ls_popup TYPE lcl_popups=>ty_popup, + lo_repo TYPE REF TO lcl_repo_online. + + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + + ls_popup = lcl_popups=>repo_popup( + iv_title = 'Change repo remote ...' + iv_url = lo_repo->get_url( ) + iv_package = lo_repo->get_package( ) + iv_freeze_package = abap_true ). + IF ls_popup-cancel = abap_true. + RAISE EXCEPTION TYPE lcx_cancel. + ENDIF. + + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + lo_repo->set_new_remote( iv_url = ls_popup-url + iv_branch_name = ls_popup-branch_name ). + + COMMIT WORK. + + ENDMETHOD. "remote_change + ENDCLASS. "lcl_services_repo \ No newline at end of file