Rework checksums (#5328)

This commit is contained in:
Alexander Tsybulsky 2022-04-13 12:29:23 +03:00 committed by GitHub
parent 985dbf1116
commit 2cc3f53fc5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 1482 additions and 235 deletions

View File

@ -142,7 +142,7 @@ ENDCLASS.
CLASS zcl_abapgit_file_status IMPLEMENTATION.
CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION.
METHOD build_existing.
@ -789,7 +789,7 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION.
io_dot = io_repo->get_dot_abapgit( )
it_local = lt_local
it_remote = lt_remote
it_cur_state = io_repo->get_local_checksums_per_file( ) ).
it_cur_state = io_repo->zif_abapgit_repo~checksums( )->get_checksums_per_file( ) ).
run_checks(
ii_log = ii_log

View File

@ -8,6 +8,9 @@ CLASS zcl_abapgit_persist_factory DEFINITION
CLASS-METHODS get_repo
RETURNING
VALUE(ri_repo) TYPE REF TO zif_abapgit_persist_repo .
CLASS-METHODS get_repo_cs
RETURNING
VALUE(ri_repo_cs) TYPE REF TO zif_abapgit_persist_repo_cs .
CLASS-METHODS get_settings
RETURNING
VALUE(ri_settings) TYPE REF TO zif_abapgit_persist_settings .
@ -15,6 +18,7 @@ CLASS zcl_abapgit_persist_factory DEFINITION
PRIVATE SECTION.
CLASS-DATA gi_repo TYPE REF TO zif_abapgit_persist_repo .
CLASS-DATA gi_repo_cs TYPE REF TO zif_abapgit_persist_repo_cs .
CLASS-DATA gi_settings TYPE REF TO zif_abapgit_persist_settings .
ENDCLASS.
@ -33,6 +37,15 @@ CLASS ZCL_ABAPGIT_PERSIST_FACTORY IMPLEMENTATION.
ENDMETHOD.
METHOD get_repo_cs.
IF gi_repo_cs IS INITIAL.
CREATE OBJECT gi_repo_cs TYPE zcl_abapgit_persistence_repo.
ENDIF.
ri_repo_cs = gi_repo_cs.
ENDMETHOD.
METHOD get_settings.

View File

@ -9,6 +9,10 @@ CLASS zcl_abapgit_persist_injector DEFINITION
IMPORTING
!ii_repo TYPE REF TO zif_abapgit_persist_repo .
CLASS-METHODS set_repo_cs
IMPORTING
!ii_repo_cs TYPE REF TO zif_abapgit_persist_repo_cs .
CLASS-METHODS set_settings
IMPORTING
!ii_settings TYPE REF TO zif_abapgit_persist_settings .
@ -30,6 +34,11 @@ CLASS ZCL_ABAPGIT_PERSIST_INJECTOR IMPLEMENTATION.
ENDMETHOD.
METHOD set_repo_cs.
zcl_abapgit_persist_factory=>gi_repo_cs = ii_repo_cs.
ENDMETHOD.
METHOD set_settings.

View File

@ -9,6 +9,7 @@ CLASS zcl_abapgit_persistence_db DEFINITION
CONSTANTS:
c_type_settings TYPE zif_abapgit_persistence=>ty_type VALUE 'SETTINGS' ##NO_TEXT,
c_type_repo TYPE zif_abapgit_persistence=>ty_type VALUE 'REPO' ##NO_TEXT,
c_type_repo_csum TYPE zif_abapgit_persistence=>ty_type VALUE 'REPO_CS' ##NO_TEXT,
c_type_background TYPE zif_abapgit_persistence=>ty_type VALUE 'BACKGROUND' ##NO_TEXT,
c_type_packages TYPE zif_abapgit_persistence=>ty_type VALUE 'PACKAGES' ##NO_TEXT,
c_type_user TYPE zif_abapgit_persistence=>ty_type VALUE 'USER' ##NO_TEXT.
@ -90,7 +91,7 @@ ENDCLASS.
CLASS zcl_abapgit_persistence_db IMPLEMENTATION.
CLASS ZCL_ABAPGIT_PERSISTENCE_DB IMPLEMENTATION.
METHOD add.
@ -156,14 +157,6 @@ CLASS zcl_abapgit_persistence_db IMPLEMENTATION.
ENDMETHOD.
METHOD list_by_type.
SELECT * FROM (c_tabname)
INTO TABLE rt_content
WHERE type = iv_type
ORDER BY PRIMARY KEY. "#EC CI_SUBRC
ENDMETHOD.
METHOD list_by_keys.
FIELD-SYMBOLS: <ls_key> LIKE LINE OF it_keys.
LOOP AT it_keys ASSIGNING <ls_key>.
@ -175,6 +168,14 @@ CLASS zcl_abapgit_persistence_db IMPLEMENTATION.
ENDMETHOD.
METHOD list_by_type.
SELECT * FROM (c_tabname)
INTO TABLE rt_content
WHERE type = iv_type
ORDER BY PRIMARY KEY. "#EC CI_SUBRC
ENDMETHOD.
METHOD lock.
DATA: lv_dummy_update_function TYPE funcname.
@ -258,6 +259,4 @@ CLASS zcl_abapgit_persistence_db IMPLEMENTATION.
iv_ignore_errors = abap_false ).
ENDMETHOD.
ENDCLASS.

View File

@ -6,8 +6,15 @@ CLASS zcl_abapgit_persistence_repo DEFINITION
PUBLIC SECTION.
INTERFACES zif_abapgit_persist_repo .
INTERFACES zif_abapgit_persist_repo_cs .
METHODS constructor .
METHODS rewrite_repo_meta
IMPORTING
!iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
RAISING
zcx_abapgit_exception
zcx_abapgit_not_found.
PROTECTED SECTION.
PRIVATE SECTION.
@ -141,6 +148,27 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_REPO IMPLEMENTATION.
ENDMETHOD.
METHOD rewrite_repo_meta.
DATA lv_old_blob TYPE string.
DATA lv_new_blob TYPE string.
DATA ls_repo_meta TYPE zif_abapgit_persistence=>ty_repo.
lv_old_blob = mo_db->read(
iv_type = zcl_abapgit_persistence_db=>c_type_repo
iv_value = iv_repo_key ).
MOVE-CORRESPONDING from_xml( lv_old_blob ) TO ls_repo_meta.
lv_new_blob = to_xml( ls_repo_meta ).
mo_db->update(
iv_type = zcl_abapgit_persistence_db=>c_type_repo
iv_value = iv_repo_key
iv_data = lv_new_blob ).
ENDMETHOD.
METHOD to_xml.
DATA: ls_xml TYPE zif_abapgit_persistence=>ty_repo_xml.
@ -154,6 +182,34 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_REPO IMPLEMENTATION.
ENDMETHOD.
METHOD zif_abapgit_persist_repo_cs~delete.
mo_db->delete(
iv_type = zcl_abapgit_persistence_db=>c_type_repo_csum
iv_value = iv_key ).
ENDMETHOD.
METHOD zif_abapgit_persist_repo_cs~read.
rv_cs_blob = mo_db->read(
iv_type = zcl_abapgit_persistence_db=>c_type_repo_csum
iv_value = iv_key ).
ENDMETHOD.
METHOD zif_abapgit_persist_repo_cs~update.
mo_db->modify(
iv_type = zcl_abapgit_persistence_db=>c_type_repo_csum
iv_value = iv_key
iv_data = iv_cs_blob ).
ENDMETHOD.
METHOD zif_abapgit_persist_repo~add.
DATA: ls_repo TYPE zif_abapgit_persistence=>ty_repo,

View File

@ -0,0 +1,23 @@
INTERFACE zif_abapgit_persist_repo_cs
PUBLIC .
METHODS update
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
!iv_cs_blob TYPE zif_abapgit_persistence=>ty_content-data_str
RAISING
zcx_abapgit_exception .
METHODS delete
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
RAISING
zcx_abapgit_exception .
METHODS read
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
RETURNING
VALUE(rv_cs_blob) TYPE zif_abapgit_persistence=>ty_content-data_str
RAISING
zcx_abapgit_exception
zcx_abapgit_not_found .
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_PERSIST_REPO_CS</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Repo checksum persistence</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -14,7 +14,7 @@ INTERFACE zif_abapgit_persistence PUBLIC.
ty_contents TYPE SORTED TABLE OF ty_content WITH UNIQUE KEY type value .
TYPES: BEGIN OF ty_local_checksum,
item TYPE zif_abapgit_definitions=>ty_item,
item TYPE zif_abapgit_definitions=>ty_item_signature,
files TYPE zif_abapgit_definitions=>ty_file_signatures_tt,
END OF ty_local_checksum.
@ -30,6 +30,8 @@ INTERFACE zif_abapgit_persistence PUBLIC.
END OF ty_local_settings.
TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY.
TYPES: ty_local_checksum_by_item_tt TYPE SORTED TABLE OF ty_local_checksum
WITH NON-UNIQUE KEY item-obj_type item-obj_name.
TYPES: BEGIN OF ty_repo_xml,
url TYPE string,
@ -42,7 +44,6 @@ INTERFACE zif_abapgit_persistence PUBLIC.
deserialized_at TYPE timestampl,
offline TYPE abap_bool,
switched_origin TYPE string,
local_checksums TYPE ty_local_checksum_tt,
dot_abapgit TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
head_branch TYPE string, " HEAD symref of the repo, master branch
local_settings TYPE ty_local_settings,
@ -60,7 +61,6 @@ INTERFACE zif_abapgit_persistence PUBLIC.
deserialized_at TYPE abap_bool,
offline TYPE abap_bool,
switched_origin TYPE abap_bool,
local_checksums TYPE abap_bool,
dot_abapgit TYPE abap_bool,
head_branch TYPE abap_bool,
local_settings TYPE abap_bool,

View File

@ -34,9 +34,6 @@ CLASS zcl_abapgit_repo DEFINITION
VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_delete_checks
RAISING
zcx_abapgit_exception .
METHODS get_local_checksums_per_file
RETURNING
VALUE(rt_checksums) TYPE zif_abapgit_definitions=>ty_file_signatures_tt .
METHODS get_dot_apack
RETURNING
VALUE(ro_dot_apack) TYPE REF TO zcl_abapgit_apack_reader .
@ -45,14 +42,6 @@ CLASS zcl_abapgit_repo DEFINITION
VALUE(ri_config) TYPE REF TO zif_abapgit_data_config
RAISING
zcx_abapgit_exception .
METHODS update_local_checksums
IMPORTING
!it_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt
RAISING
zcx_abapgit_exception .
METHODS rebuild_local_checksums
RAISING
zcx_abapgit_exception .
METHODS find_remote_dot_abapgit
RETURNING
VALUE(ro_dot) TYPE REF TO zcl_abapgit_dot_abapgit
@ -129,7 +118,6 @@ CLASS zcl_abapgit_repo DEFINITION
zcx_abapgit_exception .
METHODS set
IMPORTING
!it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt OPTIONAL
!iv_url TYPE zif_abapgit_persistence=>ty_repo-url OPTIONAL
!iv_branch_name TYPE zif_abapgit_persistence=>ty_repo-branch_name OPTIONAL
!iv_selected_commit TYPE zif_abapgit_persistence=>ty_repo-selected_commit OPTIONAL
@ -145,9 +133,6 @@ CLASS zcl_abapgit_repo DEFINITION
METHODS reset_remote .
PRIVATE SECTION.
METHODS get_local_checksums
RETURNING
VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt .
METHODS notify_listener
IMPORTING
!is_change_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask
@ -163,20 +148,11 @@ CLASS zcl_abapgit_repo DEFINITION
METHODS check_language
RAISING
zcx_abapgit_exception .
METHODS remove_non_code_related_files
CHANGING
!ct_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt .
METHODS compare_with_remote_checksum
IMPORTING
!it_remote_files TYPE zif_abapgit_definitions=>ty_files_tt
!is_local_file TYPE zif_abapgit_definitions=>ty_file_item-file
CHANGING
!cs_checksum TYPE zif_abapgit_persistence=>ty_local_checksum .
ENDCLASS.
CLASS zcl_abapgit_repo IMPLEMENTATION.
CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION.
METHOD bind_listener.
@ -234,29 +210,6 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
ENDMETHOD.
METHOD compare_with_remote_checksum.
FIELD-SYMBOLS: <ls_remote_file> LIKE LINE OF it_remote_files,
<ls_file_sig> LIKE LINE OF cs_checksum-files.
READ TABLE it_remote_files ASSIGNING <ls_remote_file>
WITH KEY path = is_local_file-path filename = is_local_file-filename
BINARY SEARCH.
IF sy-subrc <> 0. " Ignore new local ones
RETURN.
ENDIF.
APPEND INITIAL LINE TO cs_checksum-files ASSIGNING <ls_file_sig>.
MOVE-CORRESPONDING is_local_file TO <ls_file_sig>.
" If hashes are equal -> local sha1 is OK
" Else if R-branch is ahead -> assume changes were remote, state - local sha1
" Else (branches equal) -> assume changes were local, state - remote sha1
IF is_local_file-sha1 <> <ls_remote_file>-sha1.
<ls_file_sig>-sha1 = <ls_remote_file>-sha1.
ENDIF.
ENDMETHOD.
METHOD constructor.
ASSERT NOT is_data-key IS INITIAL.
@ -326,7 +279,7 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
APPEND get_dot_abapgit( )->get_signature( ) TO lt_updated_files.
update_local_checksums( lt_updated_files ).
zif_abapgit_repo~checksums( )->update( lt_updated_files ).
" Deserialize data (no save to database, just test for now)
lt_result = zcl_abapgit_data_factory=>get_deserializer( )->deserialize(
@ -502,22 +455,6 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
ENDMETHOD.
METHOD get_local_checksums.
rt_checksums = ms_data-local_checksums.
ENDMETHOD.
METHOD get_local_checksums_per_file.
FIELD-SYMBOLS <ls_object> LIKE LINE OF ms_data-local_checksums.
LOOP AT ms_data-local_checksums ASSIGNING <ls_object>.
APPEND LINES OF <ls_object>-files TO rt_checksums.
ENDLOOP.
ENDMETHOD.
METHOD get_local_settings.
rs_settings = ms_data-local_settings.
@ -589,43 +526,6 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
ENDMETHOD.
METHOD rebuild_local_checksums.
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,
<ls_local> LIKE LINE OF lt_local.
lt_local = get_files_local( ).
remove_non_code_related_files( CHANGING ct_local_files = lt_local ).
lt_remote = get_files_remote( ).
SORT lt_remote BY path filename.
LOOP AT lt_local ASSIGNING <ls_local>.
IF ls_last_item <> <ls_local>-item OR sy-tabix = 1. " First or New item reached ?
APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_checksum>.
<ls_checksum>-item = <ls_local>-item.
ls_last_item = <ls_local>-item.
ENDIF.
compare_with_remote_checksum( EXPORTING it_remote_files = lt_remote
is_local_file = <ls_local>-file
CHANGING cs_checksum = <ls_checksum> ).
ENDLOOP.
set( it_checksums = lt_checksums ).
reset_status( ).
ENDMETHOD.
METHOD refresh.
mv_request_local_refresh = abap_true.
@ -686,17 +586,6 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
ENDMETHOD.
METHOD remove_non_code_related_files.
DELETE ct_local_files
WHERE item IS INITIAL
AND NOT ( file-path = zif_abapgit_definitions=>c_root_dir
AND file-filename = zif_abapgit_definitions=>c_dot_abapgit ).
SORT ct_local_files BY item.
ENDMETHOD.
METHOD reset_remote.
CLEAR mt_remote.
mv_request_remote_refresh = abap_true.
@ -716,8 +605,7 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
DATA: ls_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask.
ASSERT it_checksums IS SUPPLIED
OR iv_url IS SUPPLIED
ASSERT iv_url IS SUPPLIED
OR iv_branch_name IS SUPPLIED
OR iv_selected_commit IS SUPPLIED
OR iv_head_branch IS SUPPLIED
@ -729,11 +617,6 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
OR iv_switched_origin IS SUPPLIED.
IF it_checksums IS SUPPLIED.
ms_data-local_checksums = it_checksums.
ls_mask-local_checksums = abap_true.
ENDIF.
IF iv_url IS SUPPLIED.
ms_data-url = iv_url.
ls_mask-url = abap_true.
@ -858,81 +741,11 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
ENDMETHOD.
METHOD update_local_checksums.
METHOD zif_abapgit_repo~checksums.
" ASSUMTION: SHA1 in param is actual and correct.
" Push fills it from local files before pushing, deserialize from remote
" If this is not true that there is an error somewhere but not here
DATA: lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt,
lt_files_idx TYPE zif_abapgit_definitions=>ty_file_signatures_tt,
lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt,
lv_chks_row TYPE i,
lv_file_row TYPE i.
FIELD-SYMBOLS: <ls_checksum> LIKE LINE OF lt_checksums,
<ls_file> LIKE LINE OF <ls_checksum>-files,
<ls_local> LIKE LINE OF lt_local,
<ls_new_state> LIKE LINE OF it_files.
lt_checksums = get_local_checksums( ).
lt_files_idx = it_files.
SORT lt_files_idx BY path filename. " Sort for binary search
" Loop through current chacksum state, update sha1 for common files
LOOP AT lt_checksums ASSIGNING <ls_checksum>.
lv_chks_row = sy-tabix.
LOOP AT <ls_checksum>-files ASSIGNING <ls_file>.
lv_file_row = sy-tabix.
READ TABLE lt_files_idx ASSIGNING <ls_new_state>
WITH KEY path = <ls_file>-path filename = <ls_file>-filename
BINARY SEARCH.
CHECK sy-subrc = 0. " Missing in param table, skip
IF <ls_new_state>-sha1 IS INITIAL. " Empty input sha1 is a deletion marker
DELETE <ls_checksum>-files INDEX lv_file_row.
ELSE.
<ls_file>-sha1 = <ls_new_state>-sha1. " Update sha1
CLEAR <ls_new_state>-sha1. " Mark as processed
ENDIF.
ENDLOOP.
IF lines( <ls_checksum>-files ) = 0. " Remove empty objects
DELETE lt_checksums INDEX lv_chks_row.
ENDIF.
ENDLOOP.
DELETE lt_files_idx WHERE sha1 IS INITIAL. " Remove processed
IF lines( lt_files_idx ) > 0.
lt_local = get_files_local( ).
SORT lt_local BY file-path file-filename. " Sort for binary search
ENDIF.
" Add new files - not deleted and not marked as processed above
LOOP AT lt_files_idx ASSIGNING <ls_new_state>.
READ TABLE lt_local ASSIGNING <ls_local>
WITH KEY file-path = <ls_new_state>-path file-filename = <ls_new_state>-filename
BINARY SEARCH.
IF sy-subrc <> 0.
* if the deserialization fails, the local file might not be there
CONTINUE.
ENDIF.
READ TABLE lt_checksums ASSIGNING <ls_checksum> " TODO Optimize
WITH KEY item = <ls_local>-item.
IF sy-subrc > 0.
APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_checksum>.
<ls_checksum>-item = <ls_local>-item.
ENDIF.
APPEND <ls_new_state> TO <ls_checksum>-files.
ENDLOOP.
SORT lt_checksums BY item.
set( it_checksums = lt_checksums ).
CREATE OBJECT ri_checksums TYPE zcl_abapgit_repo_checksums
EXPORTING
iv_repo_key = ms_data-key.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,247 @@
CLASS zcl_abapgit_repo_checksums DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_repo_checksums.
METHODS constructor
IMPORTING
!iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
RAISING
zcx_abapgit_exception.
METHODS force_write
IMPORTING
it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
ty_local_files_by_item_tt TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_file_item WITH NON-UNIQUE KEY item.
DATA mv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key.
DATA mi_repo TYPE REF TO zif_abapgit_repo.
METHODS remove_non_code_related_files
CHANGING
!ct_local_files TYPE ty_local_files_by_item_tt.
METHODS build_checksums_from_files
IMPORTING
it_remote TYPE zif_abapgit_definitions=>ty_files_tt
it_local TYPE ty_local_files_by_item_tt
iv_branches_equal TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
METHODS save_checksums
IMPORTING
it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
RAISING
zcx_abapgit_exception.
METHODS add_meta
CHANGING
cv_cs_blob TYPE string
RAISING
zcx_abapgit_exception.
METHODS extract_meta
CHANGING
* co_string_map - return string map with meta when it is needed
cv_cs_blob TYPE string.
ENDCLASS.
CLASS ZCL_ABAPGIT_REPO_CHECKSUMS IMPLEMENTATION.
METHOD add_meta.
DATA lv_meta_str TYPE string.
lv_meta_str = |#repo_name#{ mi_repo->get_name( ) }|.
cv_cs_blob = lv_meta_str && |\n| && cv_cs_blob.
ENDMETHOD.
METHOD build_checksums_from_files.
DATA ls_last_item TYPE zif_abapgit_definitions=>ty_item.
FIELD-SYMBOLS:
<ls_checksum> LIKE LINE OF rt_checksums,
<ls_local> LIKE LINE OF it_local.
FIELD-SYMBOLS:
<ls_remote_file> LIKE LINE OF it_remote,
<ls_cs_file_sig> LIKE LINE OF <ls_checksum>-files.
LOOP AT it_local ASSIGNING <ls_local>.
IF ls_last_item <> <ls_local>-item OR sy-tabix = 1. " First or New item reached ?
APPEND INITIAL LINE TO rt_checksums ASSIGNING <ls_checksum>.
MOVE-CORRESPONDING <ls_local>-item TO <ls_checksum>-item.
ls_last_item = <ls_local>-item.
ENDIF.
READ TABLE it_remote ASSIGNING <ls_remote_file>
WITH TABLE KEY file_path
COMPONENTS
path = <ls_local>-file-path
filename = <ls_local>-file-filename.
IF sy-subrc <> 0. " Ignore new local ones
CONTINUE.
ENDIF.
APPEND INITIAL LINE TO <ls_checksum>-files ASSIGNING <ls_cs_file_sig>.
MOVE-CORRESPONDING <ls_local>-file TO <ls_cs_file_sig>.
" If hashes are equal -> local sha1 is OK already (no change)
" Else
" if branches equal -> assume changes were local, state - remote sha1
" if remote branch is ahead (not equal) -> assume changes were remote, state - local sha1 (no change)
IF <ls_local>-file-sha1 <> <ls_remote_file>-sha1 AND iv_branches_equal = abap_true.
<ls_cs_file_sig>-sha1 = <ls_remote_file>-sha1.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD constructor.
ASSERT iv_repo_key IS NOT INITIAL.
mv_repo_key = iv_repo_key.
mi_repo = zcl_abapgit_repo_srv=>get_instance( )->get( mv_repo_key ).
" Should be safe as repo_srv is supposed to be single source of repo instances
ENDMETHOD.
METHOD extract_meta.
DATA lv_meta_str TYPE string.
IF cv_cs_blob+0(1) <> '#'.
RETURN. " No meta ? just ignore it
ENDIF.
SPLIT cv_cs_blob AT |\n| INTO lv_meta_str cv_cs_blob.
" Just remove the header meta string - this is OK for now.
" There is just repo name for the moment - needed to for DB util and potential debug
ENDMETHOD.
METHOD force_write.
" for migration only for the moment
save_checksums( it_checksums ).
ENDMETHOD.
METHOD remove_non_code_related_files.
DELETE ct_local_files
WHERE item IS INITIAL
AND NOT ( file-path = zif_abapgit_definitions=>c_root_dir
AND file-filename = zif_abapgit_definitions=>c_dot_abapgit ).
ENDMETHOD.
METHOD save_checksums.
DATA lv_cs_blob TYPE string.
lv_cs_blob = lcl_checksum_serializer=>serialize( it_checksums ).
add_meta( CHANGING cv_cs_blob = lv_cs_blob ).
zcl_abapgit_persist_factory=>get_repo_cs( )->update(
iv_key = mv_repo_key
iv_cs_blob = lv_cs_blob ).
ENDMETHOD.
METHOD zif_abapgit_repo_checksums~get.
DATA lv_cs_blob TYPE string.
TRY.
lv_cs_blob = zcl_abapgit_persist_factory=>get_repo_cs( )->read( iv_key = mv_repo_key ).
CATCH zcx_abapgit_exception zcx_abapgit_not_found.
" Ignore currently, it's not critical for execution, just return empty
RETURN.
ENDTRY.
IF lv_cs_blob IS NOT INITIAL.
extract_meta( CHANGING cv_cs_blob = lv_cs_blob ).
rt_checksums = lcl_checksum_serializer=>deserialize( lv_cs_blob ).
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_repo_checksums~get_checksums_per_file.
DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
FIELD-SYMBOLS <ls_object> LIKE LINE OF lt_checksums.
lt_checksums = zif_abapgit_repo_checksums~get( ).
LOOP AT lt_checksums ASSIGNING <ls_object>.
APPEND LINES OF <ls_object>-files TO rt_checksums.
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_repo_checksums~rebuild.
DATA lt_remote TYPE zif_abapgit_definitions=>ty_files_tt.
DATA lt_local TYPE ty_local_files_by_item_tt.
DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
lt_local = mi_repo->get_files_local( ).
lt_remote = mi_repo->get_files_remote( ).
remove_non_code_related_files( CHANGING ct_local_files = lt_local ).
lt_checksums = build_checksums_from_files(
it_remote = lt_remote
it_local = lt_local
iv_branches_equal = iv_branches_equal ).
save_checksums( lt_checksums ).
ENDMETHOD.
METHOD zif_abapgit_repo_checksums~update.
DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lt_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt.
lt_checksums = zif_abapgit_repo_checksums~get( ).
lt_local_files = mi_repo->get_files_local( ).
lt_checksums = lcl_update_calculator=>calculate_updated(
it_current_checksums = lt_checksums
it_local_files = lt_local_files
it_updated_files = it_updated_files ).
save_checksums( lt_checksums ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,260 @@
CLASS lcl_checksum_serializer DEFINITION
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CONSTANTS c_splitter TYPE string VALUE `|`.
CONSTANTS c_root TYPE string VALUE `@`.
CLASS-METHODS serialize
IMPORTING
it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
RETURNING
VALUE(rv_string) TYPE string.
CLASS-METHODS deserialize
IMPORTING
iv_string TYPE string
RETURNING
VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_checksum_serializer IMPLEMENTATION.
METHOD deserialize.
DATA lt_buf_tab TYPE string_table.
DATA lv_buf TYPE string.
DATA lt_checksums LIKE rt_checksums.
FIELD-SYMBOLS <ls_cs> LIKE LINE OF lt_checksums.
FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
SPLIT iv_string AT |\n| INTO TABLE lt_buf_tab.
LOOP AT lt_buf_tab INTO lv_buf.
CHECK lv_buf IS NOT INITIAL. " In fact this is a bug ... it cannot be empty, maybe raise
IF lv_buf+0(1) = '/'.
IF <ls_cs> IS NOT ASSIGNED.
" Incorrect checksums structure, maybe raise, though it is not critical for execution
RETURN.
ENDIF.
APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
SPLIT lv_buf AT c_splitter INTO <ls_file>-path <ls_file>-filename <ls_file>-sha1.
IF <ls_file>-path IS INITIAL OR <ls_file>-filename IS INITIAL OR <ls_file>-sha1 IS INITIAL.
" Incorrect checksums struture, maybe raise, though it is not critical for execution
RETURN.
ENDIF.
ELSEIF lv_buf = c_root. " Root
APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_cs>. " Empty item
ELSE.
APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_cs>.
SPLIT lv_buf AT c_splitter INTO <ls_cs>-item-obj_type <ls_cs>-item-obj_name <ls_cs>-item-devclass.
IF <ls_cs>-item-obj_type IS INITIAL OR <ls_cs>-item-obj_name IS INITIAL OR <ls_cs>-item-devclass IS INITIAL.
" Incorrect checksums structure, maybe raise, though it is not critical for execution
RETURN.
ENDIF.
ENDIF.
ENDLOOP.
rt_checksums = lt_checksums.
ENDMETHOD.
METHOD serialize.
DATA lt_buf_tab TYPE string_table.
DATA lv_buf TYPE string.
DATA lt_checksums_sorted TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
FIELD-SYMBOLS <ls_cs> LIKE LINE OF it_checksums.
FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
lt_checksums_sorted = it_checksums.
LOOP AT lt_checksums_sorted ASSIGNING <ls_cs>.
IF lines( <ls_cs>-files ) = 0.
CONTINUE.
ENDIF.
IF <ls_cs>-item-obj_type IS NOT INITIAL.
CONCATENATE <ls_cs>-item-obj_type <ls_cs>-item-obj_name <ls_cs>-item-devclass
INTO lv_buf
SEPARATED BY c_splitter.
ELSE.
lv_buf = c_root.
ENDIF.
APPEND lv_buf TO lt_buf_tab.
LOOP AT <ls_cs>-files ASSIGNING <ls_file>.
CONCATENATE <ls_file>-path <ls_file>-filename <ls_file>-sha1
INTO lv_buf
SEPARATED BY c_splitter.
APPEND lv_buf TO lt_buf_tab.
ENDLOOP.
ENDLOOP.
rv_string = concat_lines_of(
table = lt_buf_tab
sep = |\n| ).
ENDMETHOD.
ENDCLASS.
**********************************************************************
* UPDATE CALCULATOR
**********************************************************************
CLASS lcl_update_calculator DEFINITION
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS calculate_updated
IMPORTING
it_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt
it_current_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
it_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt
RETURNING
VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
PRIVATE SECTION.
CLASS-METHODS process_updated_files
CHANGING
ct_update_index TYPE zif_abapgit_definitions=>ty_file_signatures_ts
ct_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
CLASS-METHODS add_new_files
IMPORTING
it_local TYPE zif_abapgit_definitions=>ty_files_item_tt
it_update_index TYPE zif_abapgit_definitions=>ty_file_signatures_ts
CHANGING
ct_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
ENDCLASS.
CLASS lcl_update_calculator IMPLEMENTATION.
METHOD calculate_updated.
DATA lt_update_index TYPE zif_abapgit_definitions=>ty_file_signatures_ts.
DATA lt_checksums_sorted TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
lt_checksums_sorted = it_current_checksums.
lt_update_index = it_updated_files.
process_updated_files(
CHANGING
ct_update_index = lt_update_index
ct_checksums = lt_checksums_sorted ).
add_new_files(
EXPORTING
it_update_index = lt_update_index
it_local = it_local_files
CHANGING
ct_checksums = lt_checksums_sorted ).
rt_checksums = lt_checksums_sorted.
ENDMETHOD.
METHOD process_updated_files.
DATA lv_cs_row TYPE i.
DATA lv_file_row TYPE i.
FIELD-SYMBOLS <ls_checksum> LIKE LINE OF ct_checksums.
FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_checksum>-files.
FIELD-SYMBOLS <ls_new_state> LIKE LINE OF ct_update_index.
" Loop through current checksum state, update sha1 for common files
LOOP AT ct_checksums ASSIGNING <ls_checksum>.
lv_cs_row = sy-tabix.
LOOP AT <ls_checksum>-files ASSIGNING <ls_file>.
lv_file_row = sy-tabix.
READ TABLE ct_update_index ASSIGNING <ls_new_state>
WITH KEY
path = <ls_file>-path
filename = <ls_file>-filename.
IF sy-subrc <> 0.
CONTINUE. " Missing in updated files -> nothing to update, skip
ENDIF.
IF <ls_new_state>-sha1 IS INITIAL. " Empty input sha1 is a deletion marker
DELETE <ls_checksum>-files INDEX lv_file_row.
ELSE.
<ls_file>-sha1 = <ls_new_state>-sha1. " Update sha1
CLEAR <ls_new_state>-sha1. " Mark as processed
ENDIF.
ENDLOOP.
IF lines( <ls_checksum>-files ) = 0. " Remove empty objects
DELETE ct_checksums INDEX lv_cs_row.
ENDIF.
ENDLOOP.
DELETE ct_update_index WHERE sha1 IS INITIAL. " Remove processed
ENDMETHOD.
METHOD add_new_files.
DATA lt_local_sorted TYPE zif_abapgit_definitions=>ty_files_item_by_file_tt.
DATA ls_checksum LIKE LINE OF ct_checksums.
FIELD-SYMBOLS <ls_checksum> LIKE LINE OF ct_checksums.
FIELD-SYMBOLS <ls_new_file> LIKE LINE OF it_update_index.
FIELD-SYMBOLS <ls_local> LIKE LINE OF lt_local_sorted.
lt_local_sorted = it_local.
" Add new files - not deleted and not marked as processed
LOOP AT it_update_index ASSIGNING <ls_new_file>.
READ TABLE lt_local_sorted ASSIGNING <ls_local>
WITH KEY
file-path = <ls_new_file>-path
file-filename = <ls_new_file>-filename.
IF sy-subrc <> 0.
" The file should be in locals, however:
" if the deserialization fails, the local file might not be there
" in this case now new CS added, and the file will appear to be remote+new
CONTINUE.
ENDIF.
READ TABLE ct_checksums ASSIGNING <ls_checksum>
WITH KEY
item-obj_type = <ls_local>-item-obj_type
item-obj_name = <ls_local>-item-obj_name.
IF sy-subrc <> 0.
MOVE-CORRESPONDING <ls_local>-item TO ls_checksum-item.
INSERT ls_checksum INTO TABLE ct_checksums ASSIGNING <ls_checksum>.
ENDIF.
APPEND <ls_new_file> TO <ls_checksum>-files.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,580 @@
**********************************************************************
* SERIALIZER
**********************************************************************
CLASS ltcl_test_checksum_serializer DEFINITION FINAL
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PUBLIC SECTION.
METHODS serialize FOR TESTING.
METHODS serialize_w_zero_item FOR TESTING.
METHODS deserialize FOR TESTING.
METHODS deserialize_w_root_file FOR TESTING.
CLASS-METHODS get_mock
EXPORTING
et_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
ev_str TYPE string.
CLASS-METHODS space_to_separator
IMPORTING
iv_str TYPE string
RETURNING
VALUE(rv_str) TYPE string.
ENDCLASS.
CLASS ltcl_test_checksum_serializer IMPLEMENTATION.
METHOD get_mock.
FIELD-SYMBOLS <ls_cs> LIKE LINE OF et_checksums.
FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
CLEAR et_checksums.
APPEND INITIAL LINE TO et_checksums ASSIGNING <ls_cs>.
<ls_cs>-item-devclass = '$PKG'.
<ls_cs>-item-obj_type = 'DEVC'.
<ls_cs>-item-obj_name = '$PKG'.
APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
<ls_file>-path = '/'.
<ls_file>-filename = '$pkg.devc.xml'.
<ls_file>-sha1 = 'hash3'.
APPEND INITIAL LINE TO et_checksums ASSIGNING <ls_cs>.
<ls_cs>-item-devclass = '$PKG'.
<ls_cs>-item-obj_type = 'PROG'.
<ls_cs>-item-obj_name = 'ZHELLO'.
APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
<ls_file>-path = '/'.
<ls_file>-filename = 'zhello.prog.abap'.
<ls_file>-sha1 = 'hash1'.
APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
<ls_file>-path = '/'.
<ls_file>-filename = 'zhello.prog.xml'.
<ls_file>-sha1 = 'hash2'.
ev_str = space_to_separator(
|DEVC $PKG $PKG\n| &&
|/ $pkg.devc.xml hash3\n| &&
|PROG ZHELLO $PKG\n| &&
|/ zhello.prog.abap hash1\n| &&
|/ zhello.prog.xml hash2| ).
ENDMETHOD.
METHOD space_to_separator.
rv_str = replace(
val = iv_str
sub = ` `
with = `|`
occ = 0 ).
" This way it's easier to read and adjust :)
ENDMETHOD.
METHOD serialize.
DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lv_act TYPE string.
DATA lv_exp TYPE string.
get_mock(
IMPORTING
et_checksums = lt_checksums
ev_str = lv_exp ).
lv_act = lcl_checksum_serializer=>serialize( lt_checksums ).
cl_abap_unit_assert=>assert_equals(
act = lv_act
exp = lv_exp ).
ENDMETHOD.
METHOD deserialize.
DATA lt_checksums_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lt_checksums_act TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lv_str TYPE string.
get_mock(
IMPORTING
et_checksums = lt_checksums_exp
ev_str = lv_str ).
lt_checksums_act = lcl_checksum_serializer=>deserialize( lv_str ).
cl_abap_unit_assert=>assert_equals(
act = lt_checksums_act
exp = lt_checksums_exp ).
ENDMETHOD.
METHOD serialize_w_zero_item.
DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lv_act TYPE string.
DATA lv_exp TYPE string.
FIELD-SYMBOLS <ls_cs> LIKE LINE OF lt_checksums.
FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_cs>. " empty item !
lv_act = lcl_checksum_serializer=>serialize( lt_checksums ).
cl_abap_unit_assert=>assert_equals(
act = lv_act
exp = '' ).
APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
<ls_file>-path = '/'.
<ls_file>-filename = '.gitignore'.
<ls_file>-sha1 = 'whatever'.
APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
<ls_file>-path = '/'.
<ls_file>-filename = '.abapgit.xml'.
<ls_file>-sha1 = 'hashZ'.
lv_act = lcl_checksum_serializer=>serialize( lt_checksums ).
cl_abap_unit_assert=>assert_equals(
act = lv_act
exp = space_to_separator(
|@\n| &&
|/ .gitignore whatever\n| && " it's OK, helper doesn't filter irrelevant files
|/ .abapgit.xml hashZ| ) ).
ENDMETHOD.
METHOD deserialize_w_root_file.
DATA lt_checksums_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lt_checksums_act TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lv_str TYPE string.
FIELD-SYMBOLS <ls_cs> LIKE LINE OF lt_checksums_exp.
FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
APPEND INITIAL LINE TO lt_checksums_exp ASSIGNING <ls_cs>. " empty item !
APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
<ls_file>-path = '/'.
<ls_file>-filename = '.abapgit.xml'.
<ls_file>-sha1 = 'hashZ'.
lt_checksums_act = lcl_checksum_serializer=>deserialize( space_to_separator(
|@\n| &&
|/ .abapgit.xml hashZ| ) ).
cl_abap_unit_assert=>assert_equals(
act = lt_checksums_act
exp = lt_checksums_exp ).
ENDMETHOD.
ENDCLASS.
**********************************************************************
* CHECKSUMS
**********************************************************************
CLASS ltcl_test_checksums DEFINITION FINAL
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PUBLIC SECTION.
INTERFACES zif_abapgit_persist_repo_cs.
DATA mv_last_update_key TYPE zif_abapgit_persistence=>ty_repo-key.
DATA mv_last_update_cs_blob TYPE zif_abapgit_persistence=>ty_content-data_str.
METHODS get FOR TESTING RAISING zcx_abapgit_exception.
METHODS rebuild_simple FOR TESTING RAISING zcx_abapgit_exception.
METHODS rebuild_w_dot_abapgit FOR TESTING RAISING zcx_abapgit_exception.
METHODS update_simple FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS.
**********************************************************************
* HELPERS
**********************************************************************
CLASS lcl_repo_mock DEFINITION FINAL.
PUBLIC SECTION.
INTERFACES zif_abapgit_repo.
INTERFACES zif_abapgit_repo_srv.
DATA mt_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt.
DATA mt_remote_files TYPE zif_abapgit_definitions=>ty_files_tt.
ENDCLASS.
CLASS lcl_repo_mock IMPLEMENTATION.
METHOD zif_abapgit_repo_srv~get.
IF iv_key = '1'.
ri_repo = me.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_repo~get_files_local.
rt_files = mt_local_files.
ENDMETHOD.
METHOD zif_abapgit_repo~get_files_remote.
rt_files = mt_remote_files.
ENDMETHOD.
METHOD zif_abapgit_repo~get_key.
rv_key = '1'.
ENDMETHOD.
METHOD zif_abapgit_repo~get_name.
rv_name = 'test'.
ENDMETHOD.
METHOD zif_abapgit_repo~checksums.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~delete.
ENDMETHOD.
METHOD zif_abapgit_repo~get_local_settings.
ENDMETHOD.
METHOD zif_abapgit_repo~get_package.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~get_repo_from_package.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~get_repo_from_url.
ENDMETHOD.
METHOD zif_abapgit_repo~is_offline.
ENDMETHOD.
METHOD zif_abapgit_repo~deserialize.
ENDMETHOD.
METHOD zif_abapgit_repo~deserialize_checks.
ENDMETHOD.
METHOD zif_abapgit_repo~set_dot_abapgit.
ENDMETHOD.
METHOD zif_abapgit_repo~get_dot_abapgit.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~is_repo_installed.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~list.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~list_favorites.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~new_offline.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~new_online.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~purge.
ENDMETHOD.
METHOD zif_abapgit_repo~refresh.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~validate_package.
ENDMETHOD.
METHOD zif_abapgit_repo_srv~validate_url.
ENDMETHOD.
ENDCLASS.
CLASS lcl_local_file_builder DEFINITION FINAL.
PUBLIC SECTION.
DATA mt_tab TYPE zif_abapgit_definitions=>ty_files_item_tt.
METHODS add IMPORTING iv_str TYPE string.
ENDCLASS.
CLASS lcl_local_file_builder IMPLEMENTATION.
METHOD add.
DATA ls_item LIKE LINE OF mt_tab.
DATA lv_tmp TYPE string.
lv_tmp = iv_str.
CONDENSE lv_tmp.
SPLIT lv_tmp AT space INTO
ls_item-item-devclass
ls_item-item-obj_type
ls_item-item-obj_name
ls_item-file-path
ls_item-file-filename
ls_item-file-sha1.
IF ls_item-item-devclass = '@'. " Root items
CLEAR: ls_item-item-devclass, ls_item-item-obj_type, ls_item-item-obj_name.
ENDIF.
APPEND ls_item TO mt_tab.
ENDMETHOD.
ENDCLASS.
CLASS lcl_remote_file_builder DEFINITION FINAL.
PUBLIC SECTION.
DATA mt_tab TYPE zif_abapgit_definitions=>ty_files_tt.
METHODS add IMPORTING iv_str TYPE string.
ENDCLASS.
CLASS lcl_remote_file_builder IMPLEMENTATION.
METHOD add.
DATA ls_item LIKE LINE OF mt_tab.
DATA lv_tmp TYPE string.
lv_tmp = iv_str.
CONDENSE lv_tmp.
SPLIT lv_tmp AT space INTO
ls_item-path
ls_item-filename
ls_item-sha1.
APPEND ls_item TO mt_tab.
ENDMETHOD.
ENDCLASS.
CLASS lcl_file_sig_builder DEFINITION FINAL.
PUBLIC SECTION.
DATA mt_tab TYPE zif_abapgit_definitions=>ty_file_signatures_tt.
METHODS add IMPORTING iv_str TYPE string.
ENDCLASS.
CLASS lcl_file_sig_builder IMPLEMENTATION.
METHOD add.
DATA ls_item LIKE LINE OF mt_tab.
DATA lv_tmp TYPE string.
lv_tmp = iv_str.
CONDENSE lv_tmp.
SPLIT lv_tmp AT space INTO
ls_item-path
ls_item-filename
ls_item-sha1.
APPEND ls_item TO mt_tab.
ENDMETHOD.
ENDCLASS.
**********************************************************************
* CHECKSUMS UT
**********************************************************************
CLASS ltcl_test_checksums IMPLEMENTATION.
METHOD get.
DATA lo_mock TYPE REF TO lcl_repo_mock.
DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
DATA lt_checksums_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
CREATE OBJECT lo_mock.
zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
zcl_abapgit_persist_injector=>set_repo_cs( me ).
ltcl_test_checksum_serializer=>get_mock( IMPORTING et_checksums = lt_checksums_exp ).
CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
EXPORTING
iv_repo_key = '1'.
cl_abap_unit_assert=>assert_equals(
act = li_cut->get( )
exp = lt_checksums_exp ).
ENDMETHOD.
METHOD rebuild_simple.
DATA lo_mock TYPE REF TO lcl_repo_mock.
DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
DATA lv_cs_exp TYPE string.
DATA lo_l_builder TYPE REF TO lcl_local_file_builder.
DATA lo_r_builder TYPE REF TO lcl_remote_file_builder.
CREATE OBJECT lo_mock.
zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
zcl_abapgit_persist_injector=>set_repo_cs( me ).
" Local
CREATE OBJECT lo_l_builder.
lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.abap hash1' ).
lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.xml hash2' ).
lo_l_builder->add( '$PKG DEVC $PKG / $pkg.devc.xml hash3' ).
lo_mock->mt_local_files = lo_l_builder->mt_tab.
" Remote
CREATE OBJECT lo_r_builder.
lo_r_builder->add( '/ zhello.prog.abap hash1' ).
lo_r_builder->add( '/ zhello.prog.xml hash2' ).
lo_r_builder->add( '/ $pkg.devc.xml hash3' ).
lo_mock->mt_remote_files = lo_r_builder->mt_tab.
CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
EXPORTING
iv_repo_key = '1'.
li_cut->rebuild( ).
lv_cs_exp = ltcl_test_checksum_serializer=>space_to_separator(
|#repo_name#test\n| &&
|DEVC $PKG $PKG\n| &&
|/ $pkg.devc.xml hash3\n| &&
|PROG ZHELLO $PKG\n| &&
|/ zhello.prog.abap hash1\n| &&
|/ zhello.prog.xml hash2| ).
cl_abap_unit_assert=>assert_equals(
act = mv_last_update_key
exp = '1' ).
cl_abap_unit_assert=>assert_equals(
act = mv_last_update_cs_blob
exp = lv_cs_exp ).
ENDMETHOD.
METHOD update_simple.
DATA lo_mock TYPE REF TO lcl_repo_mock.
DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
DATA lv_cs_exp TYPE string.
DATA lo_f_builder TYPE REF TO lcl_file_sig_builder.
CREATE OBJECT lo_mock.
zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
zcl_abapgit_persist_injector=>set_repo_cs( me ).
CREATE OBJECT lo_f_builder.
lo_f_builder->add( '/ zhello.prog.abap hash1' ).
lo_f_builder->add( '/ zhello.prog.xml hashNEW' ).
CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
EXPORTING
iv_repo_key = '1'.
li_cut->update( lo_f_builder->mt_tab ).
lv_cs_exp = ltcl_test_checksum_serializer=>space_to_separator(
|#repo_name#test\n| &&
|DEVC $PKG $PKG\n| &&
|/ $pkg.devc.xml hash3\n| &&
|PROG ZHELLO $PKG\n| &&
|/ zhello.prog.abap hash1\n| &&
|/ zhello.prog.xml hashNEW| ).
cl_abap_unit_assert=>assert_equals(
act = mv_last_update_key
exp = '1' ).
cl_abap_unit_assert=>assert_equals(
act = mv_last_update_cs_blob
exp = lv_cs_exp ).
ENDMETHOD.
METHOD zif_abapgit_persist_repo_cs~delete.
ENDMETHOD.
METHOD zif_abapgit_persist_repo_cs~read.
IF iv_key = '1'.
ltcl_test_checksum_serializer=>get_mock( IMPORTING ev_str = rv_cs_blob ).
rv_cs_blob = |#repo_name#test\n{ rv_cs_blob }|.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_persist_repo_cs~update.
mv_last_update_key = iv_key.
mv_last_update_cs_blob = iv_cs_blob.
ENDMETHOD.
METHOD rebuild_w_dot_abapgit.
DATA lo_mock TYPE REF TO lcl_repo_mock.
DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
DATA lv_cs_exp TYPE string.
DATA lo_l_builder TYPE REF TO lcl_local_file_builder.
DATA lo_r_builder TYPE REF TO lcl_remote_file_builder.
CREATE OBJECT lo_mock.
zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
zcl_abapgit_persist_injector=>set_repo_cs( me ).
" Local
CREATE OBJECT lo_l_builder.
lo_l_builder->add( '@ @ @ / .abapgit.xml hashZ' ).
lo_l_builder->add( '@ @ @ / .gitignore whatever' ).
lo_l_builder->add( '$PKG DEVC $PKG / $pkg.devc.xml hash3' ).
lo_mock->mt_local_files = lo_l_builder->mt_tab.
" Remote
CREATE OBJECT lo_r_builder.
lo_r_builder->add( '/ .abapgit.xml hashZ' ).
lo_r_builder->add( '/ .gitignore whatever' ).
lo_r_builder->add( '/ $pkg.devc.xml hash3' ).
lo_mock->mt_remote_files = lo_r_builder->mt_tab.
CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
EXPORTING
iv_repo_key = '1'.
li_cut->rebuild( ).
lv_cs_exp = ltcl_test_checksum_serializer=>space_to_separator(
|#repo_name#test\n| &&
|@\n| &&
|/ .abapgit.xml hashZ\n| &&
|DEVC $PKG $PKG\n| &&
|/ $pkg.devc.xml hash3| ).
cl_abap_unit_assert=>assert_equals(
act = mv_last_update_cs_blob
exp = lv_cs_exp ).
ENDMETHOD.
ENDCLASS.
**********************************************************************
* UPDATE CALCULATOR
**********************************************************************
CLASS ltcl_update_calculator_test DEFINITION FINAL
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS simple_test FOR TESTING.
ENDCLASS.
CLASS ltcl_update_calculator_test IMPLEMENTATION.
METHOD simple_test.
DATA lt_cs_current TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lt_cs_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lt_cs_act TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
DATA lo_l_builder TYPE REF TO lcl_local_file_builder.
DATA lo_f_builder TYPE REF TO lcl_file_sig_builder.
CREATE OBJECT lo_f_builder.
lo_f_builder->add( '/ zhello.prog.abap hash1' ).
lo_f_builder->add( '/ zhello.prog.xml hashNEW' ).
CREATE OBJECT lo_l_builder.
lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.abap hash1' ).
lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.xml hash2' ).
lo_l_builder->add( '$PKG DEVC $PKG / $pkg.devc.xml hash3' ).
lt_cs_current = lcl_checksum_serializer=>deserialize( ltcl_test_checksum_serializer=>space_to_separator(
|DEVC $PKG $PKG\n| &&
|/ $pkg.devc.xml hash3\n| &&
|PROG ZHELLO $PKG\n| &&
|/ zhello.prog.abap hash1\n| &&
|/ zhello.prog.xml hash2| ) ).
lt_cs_exp = lcl_checksum_serializer=>deserialize( ltcl_test_checksum_serializer=>space_to_separator(
|DEVC $PKG $PKG\n| &&
|/ $pkg.devc.xml hash3\n| &&
|PROG ZHELLO $PKG\n| &&
|/ zhello.prog.abap hash1\n| &&
|/ zhello.prog.xml hashNEW| ) ).
lt_cs_act = lcl_update_calculator=>calculate_updated(
it_current_checksums = lt_cs_current
it_updated_files = lo_f_builder->mt_tab
it_local_files = lo_l_builder->mt_tab ).
cl_abap_unit_assert=>assert_equals(
act = lt_cs_act
exp = lt_cs_exp ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_REPO_CHECKSUMS</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit repo files checksum utility</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,117 @@
CLASS zcl_abapgit_repo_cs_migration DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS run
RAISING
zcx_abapgit_exception
zcx_abapgit_not_found.
PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
ty_repo_ids TYPE SORTED TABLE OF zif_abapgit_persistence=>ty_repo-key WITH UNIQUE KEY table_line.
CLASS-METHODS get_unconverted_repo_ids
RETURNING
VALUE(rt_repo_ids) TYPE ty_repo_ids.
CLASS-METHODS clear_repo_metadata
IMPORTING
iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
RAISING
zcx_abapgit_exception
zcx_abapgit_not_found.
CLASS-METHODS convert_checksums
IMPORTING
iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
RAISING
zcx_abapgit_exception
zcx_abapgit_not_found.
ENDCLASS.
CLASS ZCL_ABAPGIT_REPO_CS_MIGRATION IMPLEMENTATION.
METHOD clear_repo_metadata.
DATA lo_repo_persistence TYPE REF TO zcl_abapgit_persistence_repo.
lo_repo_persistence ?= zcl_abapgit_persist_factory=>get_repo( ).
lo_repo_persistence->rewrite_repo_meta( iv_repo_key ).
ENDMETHOD.
METHOD convert_checksums.
DATA lo_cs TYPE REF TO zcl_abapgit_repo_checksums.
DATA lv_xml TYPE zif_abapgit_persistence=>ty_content-data_str.
DATA:
BEGIN OF ls_repo_extract,
local_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt,
END OF ls_repo_extract.
lv_xml = zcl_abapgit_persistence_db=>get_instance( )->read(
iv_type = zcl_abapgit_persistence_db=>c_type_repo
iv_value = iv_repo_key ).
REPLACE ALL OCCURRENCES OF '<_--28C_TYPE_REPO_--29>' IN lv_xml WITH '<REPO>'.
REPLACE ALL OCCURRENCES OF '</_--28C_TYPE_REPO_--29>' IN lv_xml WITH '</REPO>'.
CALL TRANSFORMATION id
OPTIONS value_handling = 'accept_data_loss'
SOURCE XML lv_xml
RESULT repo = ls_repo_extract.
IF lines( ls_repo_extract-local_checksums ) = 0.
RETURN.
ENDIF.
CREATE OBJECT lo_cs EXPORTING iv_repo_key = iv_repo_key.
lo_cs->force_write( ls_repo_extract-local_checksums ).
ENDMETHOD.
METHOD get_unconverted_repo_ids.
DATA lt_cs_ids TYPE ty_repo_ids.
DATA lv_repo_id LIKE LINE OF rt_repo_ids.
DATA lv_index TYPE i.
SELECT value FROM (zcl_abapgit_persistence_db=>c_tabname)
INTO TABLE rt_repo_ids
WHERE type = zcl_abapgit_persistence_db=>c_type_repo.
SELECT value FROM (zcl_abapgit_persistence_db=>c_tabname)
INTO TABLE lt_cs_ids
WHERE type = zcl_abapgit_persistence_db=>c_type_repo_csum.
LOOP AT rt_repo_ids INTO lv_repo_id.
lv_index = sy-tabix.
READ TABLE lt_cs_ids TRANSPORTING NO FIELDS WITH KEY table_line = lv_repo_id.
IF sy-subrc = 0. " Already converted
DELETE rt_repo_ids INDEX lv_index.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD run.
DATA lt_repo_ids TYPE ty_repo_ids.
DATA lv_repo_id LIKE LINE OF lt_repo_ids.
lt_repo_ids = get_unconverted_repo_ids( ).
LOOP AT lt_repo_ids INTO lv_repo_id.
convert_checksums( lv_repo_id ).
clear_repo_metadata( lv_repo_id ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_REPO_CS_MIGRATION</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit repo checksums migration</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -75,7 +75,7 @@ ENDCLASS.
CLASS zcl_abapgit_repo_online IMPLEMENTATION.
CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION.
METHOD check_and_create_package.
@ -313,7 +313,7 @@ CLASS zcl_abapgit_repo_online IMPLEMENTATION.
mv_current_commit = ls_push-branch.
update_local_checksums( ls_push-updated_files ).
zif_abapgit_repo~checksums( )->update( ls_push-updated_files ).
reset_status( ).

View File

@ -11,6 +11,10 @@ CLASS zcl_abapgit_repo_srv DEFINITION
CLASS-METHODS get_instance
RETURNING
VALUE(ri_srv) TYPE REF TO zif_abapgit_repo_srv .
CLASS-METHODS inject_instance
IMPORTING
ii_srv TYPE REF TO zif_abapgit_repo_srv.
PROTECTED SECTION.
PRIVATE SECTION.
@ -130,6 +134,9 @@ CLASS zcl_abapgit_repo_srv IMPLEMENTATION.
ri_srv = gi_ref.
ENDMETHOD.
METHOD inject_instance.
gi_ref = ii_srv.
ENDMETHOD.
METHOD instantiate_and_add.
@ -298,6 +305,7 @@ CLASS zcl_abapgit_repo_srv IMPLEMENTATION.
METHOD zif_abapgit_repo_srv~delete.
zcl_abapgit_persist_factory=>get_repo( )->delete( ii_repo->get_key( ) ).
zcl_abapgit_persist_factory=>get_repo_cs( )->delete( ii_repo->get_key( ) ).
" If favorite, remove it
IF zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( ii_repo->get_key( ) ) = abap_true.

View File

@ -63,4 +63,10 @@ INTERFACE zif_abapgit_repo
RAISING
zcx_abapgit_exception .
METHODS checksums
RETURNING
VALUE(ri_checksums) TYPE REF TO zif_abapgit_repo_checksums
RAISING
zcx_abapgit_exception .
ENDINTERFACE.

View File

@ -0,0 +1,24 @@
INTERFACE zif_abapgit_repo_checksums
PUBLIC.
METHODS get
RETURNING
VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
METHODS get_checksums_per_file
RETURNING
VALUE(rt_checksums) TYPE zif_abapgit_definitions=>ty_file_signatures_tt .
METHODS rebuild
IMPORTING
iv_branches_equal TYPE abap_bool DEFAULT abap_false
RAISING
zcx_abapgit_exception.
METHODS update
IMPORTING
!it_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt
RAISING
zcx_abapgit_exception.
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_REPO_CHECKSUMS</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit repo checksums interface</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -150,6 +150,7 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
ls_match TYPE submatch_result,
lv_cnt TYPE i.
DATA lt_lines TYPE string_table.
CASE is_data-type.
WHEN zcl_abapgit_persistence_db=>c_type_repo.
@ -186,6 +187,20 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
rv_text = 'Global Settings'.
WHEN zcl_abapgit_persistence_db=>c_type_packages.
rv_text = 'Local Package Details'.
WHEN zcl_abapgit_persistence_db=>c_type_repo_csum.
IF strlen( is_data-data_str ) > 0.
SPLIT is_data-data_str AT cl_abap_char_utilities=>newline INTO TABLE lt_lines.
READ TABLE lt_lines INDEX 1 INTO rv_text.
rv_text = |{ rv_text } ({ lines( lt_lines ) } lines)|.
IF strlen( rv_text ) >= 250.
rv_text = rv_text(250).
ENDIF.
rv_text = escape(
val = rv_text
format = cl_abap_format=>e_html_attr ).
ENDIF.
WHEN OTHERS.
IF strlen( is_data-data_str ) >= 250.
rv_text = is_data-data_str(250).

View File

@ -95,7 +95,6 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION
CLASS-METHODS render_repo_palette
IMPORTING
iv_action TYPE string
iv_only_favorites TYPE abap_bool
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
@ -199,7 +198,7 @@ ENDCLASS.
CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION.
CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
METHOD advanced_submenu.
@ -803,11 +802,7 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION.
<ls_repo> LIKE LINE OF lt_repo_list,
<lr_repo_obj> LIKE LINE OF lt_repo_obj_list.
IF iv_only_favorites = abap_true.
lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list_favorites( ).
ELSE.
lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
ENDIF.
lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
LOOP AT lt_repo_obj_list ASSIGNING <lr_repo_obj>.
ls_repo_data = <lr_repo_obj>->ms_data.

View File

@ -37,7 +37,7 @@ ENDCLASS.
CLASS zcl_abapgit_gui_page_main IMPLEMENTATION.
CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION.
METHOD build_main_menu.
@ -85,9 +85,7 @@ CLASS zcl_abapgit_gui_page_main IMPLEMENTATION.
ri_html->add( mo_repo_overview->zif_abapgit_gui_renderable~render( ) ).
register_deferred_script( zcl_abapgit_gui_chunk_lib=>render_repo_palette(
iv_action = c_actions-select
iv_only_favorites = mv_only_favorites ) ).
register_deferred_script( zcl_abapgit_gui_chunk_lib=>render_repo_palette( c_actions-select ) ).
ENDMETHOD.

View File

@ -189,7 +189,7 @@ ENDCLASS.
CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION.
CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_VIEW IMPLEMENTATION.
METHOD apply_order_by.
@ -1256,8 +1256,7 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION.
ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_palette(
iv_action = zif_abapgit_definitions=>c_action-go_repo
iv_only_favorites = abap_true ) ).
iv_action = zif_abapgit_definitions=>c_action-go_repo ) ).
ENDMETHOD.

View File

@ -216,7 +216,8 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION.
iv_main_lang_only = is_repo_params-main_lang_only ).
" Make sure there're no leftovers from previous repos
ro_repo->rebuild_local_checksums( ).
ro_repo->zif_abapgit_repo~checksums( )->rebuild( ).
ro_repo->reset_status( ). " TODO refactor later
toggle_favorite( ro_repo->get_key( ) ).
@ -243,7 +244,8 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION.
iv_main_lang_only = is_repo_params-main_lang_only ).
" Make sure there're no leftovers from previous repos
ro_repo->rebuild_local_checksums( ).
ro_repo->zif_abapgit_repo~checksums( )->rebuild( ).
ro_repo->reset_status( ). " TODO refactor later
toggle_favorite( ro_repo->get_key( ) ).
@ -528,7 +530,8 @@ CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION.
RAISE EXCEPTION TYPE zcx_abapgit_cancel.
ENDIF.
lo_repo->rebuild_local_checksums( ).
lo_repo->zif_abapgit_repo~checksums( )->rebuild( ).
lo_repo->reset_status( ). " TODO refactor later
COMMIT WORK AND WAIT.

View File

@ -4,13 +4,16 @@
FORM run.
DATA: lx_exception TYPE REF TO zcx_abapgit_exception.
DATA lx_exception TYPE REF TO zcx_abapgit_exception.
DATA lx_not_found TYPE REF TO zcx_abapgit_not_found.
TRY.
zcl_abapgit_migrations=>run( ).
PERFORM open_gui.
CATCH zcx_abapgit_exception INTO lx_exception.
MESSAGE lx_exception TYPE 'E'.
CATCH zcx_abapgit_not_found INTO lx_not_found.
MESSAGE lx_not_found TYPE 'E'.
ENDTRY.
ENDFORM. "run

View File

@ -4,7 +4,9 @@ CLASS zcl_abapgit_migrations DEFINITION
PUBLIC SECTION.
CLASS-METHODS run
RAISING zcx_abapgit_exception.
RAISING
zcx_abapgit_exception
zcx_abapgit_not_found.
PROTECTED SECTION.
PRIVATE SECTION.
@ -12,7 +14,7 @@ ENDCLASS.
CLASS zcl_abapgit_migrations IMPLEMENTATION.
CLASS ZCL_ABAPGIT_MIGRATIONS IMPLEMENTATION.
METHOD run.
@ -23,6 +25,8 @@ CLASS zcl_abapgit_migrations IMPLEMENTATION.
" Create ZIF_APACK_MANIFEST interface
zcl_abapgit_apack_migration=>run( ).
ENDMETHOD.
" Migrate checksums from repo metadata to separate DB object
zcl_abapgit_repo_cs_migration=>run( ).
ENDMETHOD.
ENDCLASS.

View File

@ -74,10 +74,15 @@ INTERFACE zif_abapgit_definitions
comment TYPE string,
END OF ty_comment .
TYPES:
BEGIN OF ty_item,
BEGIN OF ty_item_signature,
obj_type TYPE tadir-object,
obj_name TYPE tadir-obj_name,
devclass TYPE devclass,
END OF ty_item_signature .
TYPES:
BEGIN OF ty_item.
INCLUDE TYPE ty_item_signature.
TYPES:
inactive TYPE abap_bool,
END OF ty_item .
TYPES:
@ -91,6 +96,8 @@ INTERFACE zif_abapgit_definitions
END OF ty_file_item .
TYPES:
ty_files_item_tt TYPE STANDARD TABLE OF ty_file_item WITH DEFAULT KEY .
TYPES:
ty_files_item_by_file_tt TYPE SORTED TABLE OF ty_file_item WITH UNIQUE KEY file-path file-filename.
TYPES:
ty_yes_no TYPE c LENGTH 1,
ty_yes_no_partial TYPE c LENGTH 1.

View File

@ -255,7 +255,12 @@
{"object": "ZCL_ABAPGIT_SERVICES_BASIS", "class": "ltcl_create_package", "method": "raise_error_if_package_exists", "note": "Void type: SCOMPKDTLN"},
{"object": "ZCL_ABAPGIT_SERVICES_BASIS", "class": "ltcl_create_package", "method": "package_given_in_popup", "note": "Void type: SCOMPKDTLN"},
{"object": "ZCL_ABAPGIT_SERVICES_BASIS", "class": "ltcl_create_package", "method": "package_not_created_when_canc", "note": "Void type: SCOMPKDTLN"},
{"object": "ZCL_ABAPGIT_SERVICES_BASIS", "class": "ltcl_create_package", "method": "package_created_when_confirm", "note": "Void type: SCOMPKDTLN"}
{"object": "ZCL_ABAPGIT_SERVICES_BASIS", "class": "ltcl_create_package", "method": "package_created_when_confirm", "note": "Void type: SCOMPKDTLN"},
{"object": "ZCL_ABAPGIT_REPO_CHECKSUMS", "class": "ltcl_test_checksum_serializer"},
{"object": "ZCL_ABAPGIT_REPO_CHECKSUMS", "class": "ltcl_test_checksums", "method": "rebuild_simple"},
{"object": "ZCL_ABAPGIT_REPO_CHECKSUMS", "class": "ltcl_test_checksums", "method": "rebuild_w_dot_abapgit"},
{"object": "ZCL_ABAPGIT_REPO_CHECKSUMS", "class": "ltcl_update_calculator_test"}
]
}
}