Refactor repo class, part1 (#2096)

* repo refactoring

* repo refactoring - part 2

* review fixes

* more review fixes
This commit is contained in:
sbcgua 2018-11-17 07:12:20 +02:00 committed by Lars Hvam
parent af2ac36253
commit af86d5b969
6 changed files with 158 additions and 139 deletions

View File

@ -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: <ls_status> 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( ).

View File

@ -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( ).

View File

@ -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: <ls_checksum> LIKE LINE OF lt_checksums,
FIELD-SYMBOLS:
<ls_checksum> LIKE LINE OF lt_checksums,
<ls_file_sig> LIKE LINE OF <ls_checksum>-files,
<ls_local> 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 <ls_local>.
@ -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,

View File

@ -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.
<ls_repo_item> 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 <ls_status>.
AT NEW obj_name. "obj_type + obj_name

View File

@ -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.

View File

@ -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: <ls_checksum> LIKE LINE OF lt_checksums,
FIELD-SYMBOLS:
<ls_checksum> LIKE LINE OF lt_checksums,
<ls_file_sig> LIKE LINE OF <ls_checksum>-files,
<ls_remote> LIKE LINE OF lt_remote,
<ls_local> 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 <ls_local>.
@ -269,7 +266,7 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION.
READ TABLE lt_remote ASSIGNING <ls_remote>
WITH KEY path = <ls_local>-file-path filename = <ls_local>-file-filename
BINARY SEARCH.
CHECK sy-subrc = 0. " Ignore new ones
CHECK sy-subrc = 0. " Ignore new local ones
APPEND INITIAL LINE TO <ls_checksum>-files ASSIGNING <ls_file_sig>.
MOVE-CORRESPONDING <ls_local>-file TO <ls_file_sig>.
@ -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.