diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap index ca8746482..5a8669634 100644 --- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap @@ -422,7 +422,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. DATA: lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, lt_status TYPE zif_abapgit_definitions=>ty_results_tt, - lo_repo TYPE REF TO zcl_abapgit_repo_online, + lo_repo TYPE REF TO zcl_abapgit_repo, lv_ts TYPE timestamp. FIELD-SYMBOLS: LIKE LINE OF lt_status. @@ -444,7 +444,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed - lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lt_remote = lo_repo->get_files_remote( ). lt_local = lo_repo->get_files_local( ). lt_status = lo_repo->status( ). diff --git a/src/ui/zcl_abapgit_services_git.clas.abap b/src/ui/zcl_abapgit_services_git.clas.abap index a3e74fc19..c416b9f59 100644 --- a/src/ui/zcl_abapgit_services_git.clas.abap +++ b/src/ui/zcl_abapgit_services_git.clas.abap @@ -201,9 +201,9 @@ CLASS ZCL_ABAPGIT_SERVICES_GIT IMPLEMENTATION. METHOD pull. - DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo. - lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lo_repo->refresh( ). diff --git a/src/zcl_abapgit_repo.clas.abap b/src/zcl_abapgit_repo.clas.abap index 5aa4a7735..dd99e25a4 100644 --- a/src/zcl_abapgit_repo.clas.abap +++ b/src/zcl_abapgit_repo.clas.abap @@ -24,14 +24,15 @@ CLASS zcl_abapgit_repo DEFINITION RETURNING VALUE(rv_key) TYPE zif_abapgit_persistence=>ty_value . METHODS get_name + ABSTRACT RETURNING VALUE(rv_name) TYPE string RAISING zcx_abapgit_exception . METHODS get_files_local IMPORTING - !io_log TYPE REF TO zcl_abapgit_log OPTIONAL - !it_filter TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL + !io_log TYPE REF TO zcl_abapgit_log OPTIONAL + !it_filter TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL RETURNING VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_item_tt RAISING @@ -91,9 +92,7 @@ CLASS zcl_abapgit_repo DEFINITION zcx_abapgit_exception . METHODS set_files_remote IMPORTING - !it_files TYPE zif_abapgit_definitions=>ty_files_tt - RAISING - zcx_abapgit_exception . + !it_files TYPE zif_abapgit_definitions=>ty_files_tt . METHODS get_local_settings RETURNING VALUE(rs_settings) TYPE zif_abapgit_persistence=>ty_repo-local_settings . @@ -107,15 +106,27 @@ CLASS zcl_abapgit_repo DEFINITION VALUE(rt_list) TYPE scit_alvlist RAISING zcx_abapgit_exception . - + METHODS has_remote_source + ABSTRACT + RETURNING + VALUE(rv_yes) TYPE abap_bool . + METHODS status + IMPORTING + !io_log TYPE REF TO zcl_abapgit_log OPTIONAL + RETURNING + VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt + RAISING + zcx_abapgit_exception . PROTECTED SECTION. DATA mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt . DATA mt_remote TYPE zif_abapgit_definitions=>ty_files_tt . - DATA mv_do_local_refresh TYPE abap_bool . + DATA mv_request_local_refresh TYPE abap_bool . DATA mv_last_serialization TYPE timestamp . DATA ms_data TYPE zif_abapgit_persistence=>ty_repo . DATA mv_code_inspector_successful TYPE abap_bool . + DATA mv_request_remote_refresh TYPE abap_bool . + DATA mt_status TYPE zif_abapgit_definitions=>ty_results_tt . METHODS set IMPORTING it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt OPTIONAL @@ -127,17 +138,20 @@ CLASS zcl_abapgit_repo DEFINITION is_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings OPTIONAL iv_deserialized_at TYPE zif_abapgit_persistence=>ty_repo-deserialized_at OPTIONAL iv_deserialized_by TYPE zif_abapgit_persistence=>ty_repo-deserialized_by OPTIONAL - RAISING zcx_abapgit_exception . - + RAISING + zcx_abapgit_exception . + METHODS reset_status . + METHODS reset_remote . PRIVATE SECTION. - METHODS: update_last_deserialize RAISING zcx_abapgit_exception. - + METHODS update_last_deserialize + RAISING + zcx_abapgit_exception . ENDCLASS. -CLASS zcl_abapgit_repo IMPLEMENTATION. +CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION. METHOD constructor. @@ -198,6 +212,9 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. update_local_checksums( lt_updated_files ). update_last_deserialize( ). + reset_status( ). + + COMMIT WORK AND WAIT. ENDMETHOD. @@ -266,7 +283,7 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. " Serialization happened before and no refresh request - IF mv_last_serialization IS NOT INITIAL AND mv_do_local_refresh = abap_false. + IF mv_last_serialization IS NOT INITIAL AND mv_request_local_refresh = abap_false. rt_files = mt_local. RETURN. ENDIF. @@ -342,8 +359,8 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. ENDLOOP. GET TIME STAMP FIELD mv_last_serialization. - mt_local = rt_files. - mv_do_local_refresh = abap_false. " Fulfill refresh + mt_local = rt_files. + mv_request_local_refresh = abap_false. " Fulfill refresh ENDMETHOD. @@ -381,18 +398,6 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. ENDMETHOD. - METHOD get_name. - - IF ms_data-offline = abap_true. - rv_name = ms_data-url. - ELSE. - rv_name = zcl_abapgit_url=>name( ms_data-url ). - rv_name = cl_http_utility=>if_http_utility~unescape_url( rv_name ). - ENDIF. - - ENDMETHOD. - - METHOD get_package. rv_package = ms_data-package. ENDMETHOD. @@ -403,24 +408,24 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. ENDMETHOD. - METHOD rebuild_local_checksums. "LOCAL (BASE) + METHOD rebuild_local_checksums. - DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + DATA: + lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, ls_last_item TYPE zif_abapgit_definitions=>ty_item, lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt. - FIELD-SYMBOLS: LIKE LINE OF lt_checksums, + FIELD-SYMBOLS: + LIKE LINE OF lt_checksums, LIKE LINE OF -files, LIKE LINE OF lt_local. - lt_local = get_files_local( ). DELETE lt_local " Remove non-code related files except .abapgit WHERE item IS INITIAL AND NOT ( file-path = zif_abapgit_definitions=>c_root_dir AND file-filename = zif_abapgit_definitions=>c_dot_abapgit ). - SORT lt_local BY item. LOOP AT lt_local ASSIGNING . @@ -436,13 +441,15 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. ENDLOOP. set( it_checksums = lt_checksums ). + reset_status( ). ENDMETHOD. METHOD refresh. - mv_do_local_refresh = abap_true. + mv_request_local_refresh = abap_true. + reset_remote( ). IF iv_drop_cache = abap_true. CLEAR: mv_last_serialization, mt_local. @@ -451,6 +458,18 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. ENDMETHOD. + METHOD reset_remote. + CLEAR mt_remote. + mv_request_remote_refresh = abap_true. + reset_status( ). + ENDMETHOD. + + + METHOD reset_status. + CLEAR mt_status. + ENDMETHOD. + + METHOD run_code_inspector. DATA: li_code_inspector TYPE REF TO zif_abapgit_code_inspector, @@ -565,6 +584,7 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. METHOD set_files_remote. mt_remote = it_files. + mv_request_remote_refresh = abap_false. ENDMETHOD. @@ -576,6 +596,19 @@ CLASS zcl_abapgit_repo IMPLEMENTATION. ENDMETHOD. + METHOD status. + + IF lines( mt_status ) = 0. + mt_status = zcl_abapgit_file_status=>status( + io_repo = me + io_log = io_log ). + ENDIF. + + rt_results = mt_status. + + ENDMETHOD. + + METHOD update_last_deserialize. DATA: lv_deserialized_at TYPE zif_abapgit_persistence=>ty_repo-deserialized_at, diff --git a/src/zcl_abapgit_repo_content_list.clas.abap b/src/zcl_abapgit_repo_content_list.clas.abap index f265c7eda..82b23c39c 100644 --- a/src/zcl_abapgit_repo_content_list.clas.abap +++ b/src/zcl_abapgit_repo_content_list.clas.abap @@ -133,7 +133,7 @@ CLASS ZCL_ABAPGIT_REPO_CONTENT_LIST IMPLEMENTATION. METHOD build_repo_items_online. - DATA: lo_repo_online TYPE REF TO zcl_abapgit_repo_online, + DATA: ls_file TYPE zif_abapgit_definitions=>ty_repo_file, lt_status TYPE zif_abapgit_definitions=>ty_results_tt. @@ -141,8 +141,7 @@ CLASS ZCL_ABAPGIT_REPO_CONTENT_LIST IMPLEMENTATION. LIKE LINE OF rt_repo_items. - lo_repo_online ?= mo_repo. - lt_status = lo_repo_online->status( mo_log ). + lt_status = mo_repo->status( mo_log ). LOOP AT lt_status ASSIGNING . AT NEW obj_name. "obj_type + obj_name diff --git a/src/zcl_abapgit_repo_offline.clas.abap b/src/zcl_abapgit_repo_offline.clas.abap index f4c452f69..d5c42a0a8 100644 --- a/src/zcl_abapgit_repo_offline.clas.abap +++ b/src/zcl_abapgit_repo_offline.clas.abap @@ -5,11 +5,47 @@ CLASS zcl_abapgit_repo_offline DEFINITION CREATE PUBLIC . PUBLIC SECTION. + + METHODS get_name + REDEFINITION . + METHODS has_remote_source + REDEFINITION . PROTECTED SECTION. + + METHODS reset_remote + REDEFINITION . PRIVATE SECTION. ENDCLASS. CLASS ZCL_ABAPGIT_REPO_OFFLINE IMPLEMENTATION. + + + METHOD get_name. + rv_name = ms_data-url. + ENDMETHOD. + + + METHOD has_remote_source. + rv_yes = boolc( lines( mt_remote ) > 0 ). + ENDMETHOD. + + + METHOD reset_remote. + + DATA lt_backup LIKE mt_remote. + + " online repo has online source to renew data from, offline does not + " so offline repo preserves the remote + " in case of partial pull failure the user will immediately see the new difference + " UI will detect "pullable" content based on mt_status + " in the uniform way both for online and offline repos + " for more details see discussion in 2096 and 1953 + + lt_backup = mt_remote. + super->reset_remote( ). + set_files_remote( lt_backup ). + + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap index 711b7836e..c8c55aa80 100644 --- a/src/zcl_abapgit_repo_online.clas.abap +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -13,11 +13,6 @@ CLASS zcl_abapgit_repo_online DEFINITION ALIASES push FOR zif_abapgit_git_operations~push . - METHODS constructor - IMPORTING - !is_data TYPE zif_abapgit_persistence=>ty_repo - RAISING - zcx_abapgit_exception . METHODS get_url RETURNING VALUE(rv_url) TYPE zif_abapgit_persistence=>ty_repo-url . @@ -44,38 +39,26 @@ CLASS zcl_abapgit_repo_online DEFINITION VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt RAISING zcx_abapgit_exception . - METHODS status - IMPORTING - !io_log TYPE REF TO zcl_abapgit_log OPTIONAL - RETURNING - VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt - RAISING - zcx_abapgit_exception . METHODS get_unnecessary_local_objs RETURNING VALUE(rt_unnecessary_local_objects) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . - METHODS deserialize - REDEFINITION . METHODS get_files_remote - REDEFINITION . + REDEFINITION . + METHODS get_name + REDEFINITION . METHODS rebuild_local_checksums - REDEFINITION . - METHODS refresh - REDEFINITION . + REDEFINITION . + METHODS has_remote_source + REDEFINITION . + PROTECTED SECTION. PRIVATE SECTION. DATA mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt . DATA mv_branch TYPE zif_abapgit_definitions=>ty_sha1 . - DATA mv_initialized TYPE abap_bool . - DATA mt_status TYPE zif_abapgit_definitions=>ty_results_tt . - METHODS reset_status . - METHODS initialize - RAISING - zcx_abapgit_exception . METHODS handle_stage_ignore IMPORTING !io_stage TYPE REF TO zcl_abapgit_stage @@ -86,6 +69,9 @@ CLASS zcl_abapgit_repo_online DEFINITION !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt RAISING zcx_abapgit_exception . + METHODS fetch_remote + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -93,24 +79,30 @@ ENDCLASS. CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. - METHOD constructor. + METHOD fetch_remote. - super->constructor( is_data ). + DATA: lo_progress TYPE REF TO zcl_abapgit_progress, + ls_pull TYPE zcl_abapgit_git_porcelain=>ty_pull_result. - mv_initialized = abap_false. + IF mv_request_remote_refresh = abap_false. + RETURN. + ENDIF. - ENDMETHOD. + CREATE OBJECT lo_progress + EXPORTING + iv_total = 1. - METHOD deserialize. + lo_progress->show( iv_current = 1 + iv_text = 'Fetch remote files' ) ##NO_TEXT. - initialize( ). + ls_pull = zcl_abapgit_git_porcelain=>pull( + iv_url = get_url( ) + iv_branch_name = get_branch_name( ) ). - super->deserialize( is_checks ). - - reset_status( ). - - COMMIT WORK AND WAIT. + set_files_remote( ls_pull-files ). + set_objects( ls_pull-objects ). + mv_branch = ls_pull-branch. ENDMETHOD. @@ -121,22 +113,25 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. METHOD get_files_remote. - initialize( ). + fetch_remote( ). + rt_files = super->get_files_remote( ). + ENDMETHOD. - rt_files = mt_remote. + + METHOD get_name. + rv_name = zcl_abapgit_url=>name( ms_data-url ). + rv_name = cl_http_utility=>if_http_utility~unescape_url( rv_name ). ENDMETHOD. METHOD get_objects. - initialize( ). - + fetch_remote( ). rt_objects = mt_objects. ENDMETHOD. METHOD get_sha1_remote. - initialize( ). - + fetch_remote( ). rv_sha1 = mv_branch. ENDMETHOD. @@ -229,34 +224,36 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. ENDMETHOD. - METHOD initialize. - IF mv_initialized = abap_false. - refresh( ). - ENDIF. + METHOD has_remote_source. + rv_yes = abap_true. ENDMETHOD. - METHOD rebuild_local_checksums. "REMOTE + METHOD rebuild_local_checksums. - DATA: lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, + " TODO: method unify to base class ! + + DATA: + lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, ls_last_item TYPE zif_abapgit_definitions=>ty_item, lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt. - FIELD-SYMBOLS: LIKE LINE OF lt_checksums, + FIELD-SYMBOLS: + LIKE LINE OF lt_checksums, LIKE LINE OF -files, LIKE LINE OF lt_remote, LIKE LINE OF lt_local. - lt_remote = get_files_remote( ). lt_local = get_files_local( ). DELETE lt_local " Remove non-code related files except .abapgit WHERE item IS INITIAL AND NOT ( file-path = zif_abapgit_definitions=>c_root_dir AND file-filename = zif_abapgit_definitions=>c_dot_abapgit ). - SORT lt_local BY item. + + lt_remote = get_files_remote( ). SORT lt_remote BY path filename. LOOP AT lt_local ASSIGNING . @@ -269,7 +266,7 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. READ TABLE lt_remote ASSIGNING WITH KEY path = -file-path filename = -file-filename BINARY SEARCH. - CHECK sy-subrc = 0. " Ignore new ones + CHECK sy-subrc = 0. " Ignore new local ones APPEND INITIAL LINE TO -files ASSIGNING . MOVE-CORRESPONDING -file TO . @@ -288,46 +285,13 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. ENDMETHOD. - METHOD refresh. - - DATA: lo_progress TYPE REF TO zcl_abapgit_progress, - ls_pull TYPE zcl_abapgit_git_porcelain=>ty_pull_result. - - super->refresh( iv_drop_cache ). - reset_status( ). - - CREATE OBJECT lo_progress - EXPORTING - iv_total = 1. - - lo_progress->show( iv_current = 1 - iv_text = 'Fetch remote files' ) ##NO_TEXT. - - ls_pull = zcl_abapgit_git_porcelain=>pull( - iv_url = get_url( ) - iv_branch_name = get_branch_name( ) ). - - mt_remote = ls_pull-files. - mt_objects = ls_pull-objects. - mv_branch = ls_pull-branch. - - mv_initialized = abap_true. - - ENDMETHOD. - - - METHOD reset_status. - CLEAR mt_status. - ENDMETHOD. - - METHOD set_branch_name. IF ms_data-local_settings-write_protected = abap_true. zcx_abapgit_exception=>raise( 'Cannot switch branch. Local code is write-protected by repo config' ). ENDIF. - mv_initialized = abap_false. + reset_remote( ). set( iv_branch_name = iv_branch_name ). ENDMETHOD. @@ -344,25 +308,12 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Cannot change URL. Local code is write-protected by repo config' ). ENDIF. - mv_initialized = abap_false. + reset_remote( ). set( iv_url = iv_url ). ENDMETHOD. - METHOD status. - - initialize( ). - - IF lines( mt_status ) = 0. - mt_status = zcl_abapgit_file_status=>status( io_repo = me - io_log = io_log ). - ENDIF. - rt_results = mt_status. - - ENDMETHOD. - - METHOD zif_abapgit_git_operations~create_branch. DATA: lv_sha1 TYPE zif_abapgit_definitions=>ty_sha1.