mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 11:46:38 +08:00
851 lines
24 KiB
ABAP
851 lines
24 KiB
ABAP
CLASS zcl_abapgit_repo DEFINITION
|
|
PUBLIC
|
|
ABSTRACT
|
|
CREATE PUBLIC .
|
|
|
|
PUBLIC SECTION.
|
|
|
|
INTERFACES zif_abapgit_repo .
|
|
|
|
METHODS constructor
|
|
IMPORTING
|
|
!is_data TYPE zif_abapgit_persistence=>ty_repo .
|
|
|
|
PROTECTED SECTION.
|
|
|
|
DATA mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt .
|
|
DATA mt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt .
|
|
DATA mv_request_local_refresh TYPE abap_bool .
|
|
DATA mv_request_remote_refresh TYPE abap_bool .
|
|
DATA mi_log TYPE REF TO zif_abapgit_log .
|
|
DATA mi_listener TYPE REF TO zif_abapgit_repo_listener .
|
|
DATA mo_apack_reader TYPE REF TO zcl_abapgit_apack_reader .
|
|
DATA mi_data_config TYPE REF TO zif_abapgit_data_config .
|
|
DATA mi_repo TYPE REF TO zif_abapgit_repo .
|
|
|
|
METHODS find_remote_dot_apack
|
|
RETURNING
|
|
VALUE(ro_dot) TYPE REF TO zcl_abapgit_apack_reader
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS reset_remote .
|
|
METHODS set
|
|
IMPORTING
|
|
!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
|
|
!iv_head_branch TYPE zif_abapgit_persistence=>ty_repo-head_branch OPTIONAL
|
|
!iv_offline TYPE zif_abapgit_persistence=>ty_repo-offline OPTIONAL
|
|
!is_dot_abapgit TYPE zif_abapgit_persistence=>ty_repo-dot_abapgit OPTIONAL
|
|
!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
|
|
!iv_switched_origin TYPE zif_abapgit_persistence=>ty_repo-switched_origin OPTIONAL
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS set_dot_apack
|
|
IMPORTING
|
|
!io_dot_apack TYPE REF TO zcl_abapgit_apack_reader
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
PRIVATE SECTION.
|
|
METHODS check_language
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS check_write_protect
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS deserialize_data
|
|
IMPORTING
|
|
!is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
|
|
CHANGING
|
|
!ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS deserialize_dot_abapgit
|
|
CHANGING
|
|
!ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS deserialize_objects
|
|
IMPORTING
|
|
!is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
|
|
!ii_log TYPE REF TO zif_abapgit_log
|
|
CHANGING
|
|
!ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS normalize_local_settings
|
|
CHANGING
|
|
!cs_local_settings TYPE zif_abapgit_persistence=>ty_local_settings .
|
|
METHODS notify_listener
|
|
IMPORTING
|
|
!is_change_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS update_last_deserialize
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS check_abap_language_version
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
METHODS remove_locally_excluded_files
|
|
CHANGING
|
|
!ct_rem_files TYPE zif_abapgit_git_definitions=>ty_files_tt OPTIONAL
|
|
!ct_loc_files TYPE zif_abapgit_definitions=>ty_files_item_tt OPTIONAL
|
|
RAISING
|
|
zcx_abapgit_exception .
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
|
|
CLASS zcl_abapgit_repo IMPLEMENTATION.
|
|
|
|
|
|
METHOD zif_abapgit_repo~bind_listener.
|
|
mi_listener = ii_listener.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD check_abap_language_version.
|
|
|
|
DATA lo_abapgit_abap_language_vers TYPE REF TO zcl_abapgit_abap_language_vers.
|
|
DATA lv_text TYPE string.
|
|
|
|
CREATE OBJECT lo_abapgit_abap_language_vers
|
|
EXPORTING
|
|
io_dot_abapgit = mi_repo->get_dot_abapgit( ).
|
|
|
|
IF lo_abapgit_abap_language_vers->is_import_allowed( zif_abapgit_repo~ms_data-package ) = abap_false.
|
|
lv_text = |Repository cannot be imported. | &&
|
|
|ABAP Language Version of linked package is not compatible with repository settings.|.
|
|
zcx_abapgit_exception=>raise( lv_text ).
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD check_language.
|
|
|
|
DATA:
|
|
lv_main_language TYPE spras,
|
|
lv_error_message TYPE string,
|
|
lv_error_longtext TYPE string.
|
|
|
|
" for deserialize, assumes find_remote_dot_abapgit has been called before (or language won't be defined)
|
|
lv_main_language = mi_repo->get_dot_abapgit( )->get_main_language( ).
|
|
|
|
IF lv_main_language <> sy-langu.
|
|
|
|
lv_error_message = |Current login language |
|
|
&& |'{ zcl_abapgit_convert=>conversion_exit_isola_output( sy-langu ) }'|
|
|
&& | does not match main language |
|
|
&& |'{ zcl_abapgit_convert=>conversion_exit_isola_output( lv_main_language ) }'.|.
|
|
|
|
" Feature open in main language only exists if abapGit tcode is present
|
|
IF zcl_abapgit_services_abapgit=>get_abapgit_tcode( ) IS INITIAL.
|
|
lv_error_message = lv_error_message && | Please logon in main language and retry.|.
|
|
lv_error_longtext = |For the Advanced menu option 'Open in Main Language' to be available a transaction code| &&
|
|
| must be assigned to report { sy-cprog }.|.
|
|
ELSE.
|
|
lv_error_message = lv_error_message && | Select 'Advanced' > 'Open in Main Language'|.
|
|
ENDIF.
|
|
|
|
zcx_abapgit_exception=>raise( iv_text = lv_error_message
|
|
iv_longtext = lv_error_longtext ).
|
|
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD check_write_protect.
|
|
|
|
IF mi_repo->get_local_settings( )-write_protected = abap_true.
|
|
zcx_abapgit_exception=>raise( 'Cannot deserialize. Local code is write-protected by repo config' ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD constructor.
|
|
|
|
ASSERT NOT is_data-key IS INITIAL.
|
|
|
|
mi_repo = me.
|
|
|
|
zif_abapgit_repo~ms_data = is_data.
|
|
mv_request_remote_refresh = abap_true.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~create_new_log.
|
|
|
|
CREATE OBJECT mi_log TYPE zcl_abapgit_log.
|
|
mi_log->set_title( iv_title ).
|
|
|
|
ri_log = mi_log.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~delete_checks.
|
|
|
|
DATA: li_package TYPE REF TO zif_abapgit_sap_package.
|
|
|
|
check_write_protect( ).
|
|
check_language( ).
|
|
|
|
li_package = zcl_abapgit_factory=>get_sap_package( mi_repo->get_package( ) ).
|
|
rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD deserialize_data.
|
|
|
|
DATA:
|
|
lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
|
|
lt_result TYPE zif_abapgit_data_deserializer=>ty_results.
|
|
|
|
"Deserialize data
|
|
lt_result = zcl_abapgit_data_factory=>get_deserializer( )->deserialize(
|
|
ii_config = mi_repo->get_data_config( )
|
|
it_files = mi_repo->get_files_remote( ) ).
|
|
|
|
"Save deserialized data to DB and add entries to transport requests
|
|
lt_updated_files = zcl_abapgit_data_factory=>get_deserializer( )->actualize(
|
|
it_result = lt_result
|
|
is_checks = is_checks ).
|
|
|
|
INSERT LINES OF lt_updated_files INTO TABLE ct_files.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD deserialize_dot_abapgit.
|
|
INSERT mi_repo->get_dot_abapgit( )->get_signature( ) INTO TABLE ct_files.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD deserialize_objects.
|
|
|
|
DATA:
|
|
lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
|
|
lx_error TYPE REF TO zcx_abapgit_exception.
|
|
|
|
TRY.
|
|
lt_updated_files = zcl_abapgit_objects=>deserialize(
|
|
ii_repo = me
|
|
is_checks = is_checks
|
|
ii_log = ii_log ).
|
|
CATCH zcx_abapgit_exception INTO lx_error.
|
|
" Ensure to reset default transport request task
|
|
zcl_abapgit_factory=>get_default_transport( )->reset( ).
|
|
zif_abapgit_repo~refresh( iv_drop_log = abap_false ).
|
|
RAISE EXCEPTION lx_error.
|
|
ENDTRY.
|
|
|
|
INSERT LINES OF lt_updated_files INTO TABLE ct_files.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD find_remote_dot_apack.
|
|
|
|
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
|
|
|
|
zif_abapgit_repo~get_files_remote( ).
|
|
|
|
READ TABLE mt_remote ASSIGNING <ls_remote>
|
|
WITH KEY file_path
|
|
COMPONENTS path = zif_abapgit_definitions=>c_root_dir
|
|
filename = zif_abapgit_apack_definitions=>c_dot_apack_manifest.
|
|
IF sy-subrc = 0.
|
|
ro_dot = zcl_abapgit_apack_reader=>deserialize( iv_package_name = mi_repo->ms_data-package
|
|
iv_xstr = <ls_remote>-data ).
|
|
set_dot_apack( ro_dot ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_data_config.
|
|
|
|
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
|
|
|
|
IF mi_data_config IS BOUND.
|
|
ri_config = mi_data_config.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
CREATE OBJECT ri_config TYPE zcl_abapgit_data_config.
|
|
mi_data_config = ri_config.
|
|
|
|
" Assume remote data has been loaded already
|
|
READ TABLE mt_remote ASSIGNING <ls_remote>
|
|
WITH KEY file_path
|
|
COMPONENTS path = zif_abapgit_data_config=>c_default_path.
|
|
IF sy-subrc = 0.
|
|
ri_config->from_json( mt_remote ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_dot_apack.
|
|
IF mo_apack_reader IS NOT BOUND.
|
|
mo_apack_reader = zcl_abapgit_apack_reader=>create_instance( zif_abapgit_repo~ms_data-package ).
|
|
ENDIF.
|
|
|
|
ro_dot_apack = mo_apack_reader.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_log.
|
|
ri_log = mi_log.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_unsupported_objects_local.
|
|
|
|
DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
|
|
lt_supported_types TYPE zif_abapgit_objects=>ty_types_tt.
|
|
|
|
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF lt_tadir,
|
|
<ls_object> LIKE LINE OF rt_objects.
|
|
|
|
lt_tadir = zif_abapgit_repo~get_tadir_objects( ).
|
|
|
|
lt_supported_types = zcl_abapgit_objects=>supported_list( ).
|
|
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
|
|
READ TABLE lt_supported_types WITH KEY table_line = <ls_tadir>-object TRANSPORTING NO FIELDS.
|
|
IF sy-subrc <> 0.
|
|
APPEND INITIAL LINE TO rt_objects ASSIGNING <ls_object>.
|
|
MOVE-CORRESPONDING <ls_tadir> TO <ls_object>.
|
|
<ls_object>-obj_type = <ls_tadir>-object.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD normalize_local_settings.
|
|
|
|
cs_local_settings-labels = zcl_abapgit_repo_labels=>normalize( cs_local_settings-labels ).
|
|
|
|
" TODO: more validation and normalization ?
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD notify_listener.
|
|
|
|
DATA ls_meta_slug TYPE zif_abapgit_persistence=>ty_repo_xml.
|
|
|
|
IF mi_listener IS BOUND.
|
|
MOVE-CORRESPONDING zif_abapgit_repo~ms_data TO ls_meta_slug.
|
|
mi_listener->on_meta_change(
|
|
iv_key = zif_abapgit_repo~ms_data-key
|
|
is_meta = ls_meta_slug
|
|
is_change_mask = is_change_mask ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~refresh_local_object.
|
|
|
|
DATA:
|
|
ls_tadir TYPE zif_abapgit_definitions=>ty_tadir,
|
|
lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
|
|
lt_new_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt,
|
|
lo_serialize TYPE REF TO zcl_abapgit_serialize.
|
|
|
|
lt_tadir = zif_abapgit_repo~get_tadir_objects( ).
|
|
|
|
DELETE mt_local WHERE item-obj_type = iv_obj_type
|
|
AND item-obj_name = iv_obj_name.
|
|
|
|
READ TABLE lt_tadir INTO ls_tadir
|
|
WITH KEY object = iv_obj_type
|
|
obj_name = iv_obj_name.
|
|
IF sy-subrc <> 0 OR ls_tadir-delflag = abap_true.
|
|
" object doesn't exist anymore, nothing todo here
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
CLEAR lt_tadir.
|
|
INSERT ls_tadir INTO TABLE lt_tadir.
|
|
|
|
CREATE OBJECT lo_serialize.
|
|
lt_new_local_files = lo_serialize->serialize(
|
|
iv_package = zif_abapgit_repo~ms_data-package
|
|
it_tadir = lt_tadir ).
|
|
|
|
INSERT LINES OF lt_new_local_files INTO TABLE mt_local.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~refresh_local_objects.
|
|
|
|
mv_request_local_refresh = abap_true.
|
|
zif_abapgit_repo~get_files_local( ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~remove_ignored_files.
|
|
|
|
DATA lo_dot TYPE REF TO zcl_abapgit_dot_abapgit.
|
|
DATA lv_index TYPE sy-index.
|
|
|
|
FIELD-SYMBOLS <ls_files> LIKE LINE OF ct_files.
|
|
|
|
lo_dot = zif_abapgit_repo~get_dot_abapgit( ).
|
|
|
|
" Skip ignored files
|
|
LOOP AT ct_files ASSIGNING <ls_files>.
|
|
lv_index = sy-tabix.
|
|
IF lo_dot->is_ignored( iv_path = <ls_files>-path
|
|
iv_filename = <ls_files>-filename ) = abap_true.
|
|
DELETE ct_files INDEX lv_index.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD remove_locally_excluded_files.
|
|
|
|
DATA ls_ls TYPE zif_abapgit_persistence=>ty_repo-local_settings.
|
|
DATA lv_excl TYPE string.
|
|
DATA lv_full_path TYPE string.
|
|
|
|
FIELD-SYMBOLS <ls_rfile> LIKE LINE OF ct_rem_files.
|
|
FIELD-SYMBOLS <ls_lfile> LIKE LINE OF ct_loc_files.
|
|
|
|
ls_ls = mi_repo->get_local_settings( ).
|
|
|
|
LOOP AT ls_ls-exclude_remote_paths INTO lv_excl.
|
|
CHECK lv_excl IS NOT INITIAL.
|
|
|
|
IF ct_rem_files IS SUPPLIED.
|
|
LOOP AT ct_rem_files ASSIGNING <ls_rfile>.
|
|
lv_full_path = <ls_rfile>-path && <ls_rfile>-filename.
|
|
IF lv_full_path CP lv_excl.
|
|
DELETE ct_rem_files INDEX sy-tabix.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
ELSEIF ct_loc_files IS SUPPLIED.
|
|
LOOP AT ct_loc_files ASSIGNING <ls_lfile>.
|
|
lv_full_path = <ls_lfile>-file-path && <ls_lfile>-file-filename.
|
|
IF lv_full_path CP lv_excl.
|
|
DELETE ct_loc_files INDEX sy-tabix.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD reset_remote.
|
|
CLEAR mt_remote.
|
|
mv_request_remote_refresh = abap_true.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD set.
|
|
|
|
* TODO: refactor, maybe use zcl_abapgit_string_map ?
|
|
|
|
DATA: ls_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask.
|
|
|
|
|
|
ASSERT iv_url IS SUPPLIED
|
|
OR iv_branch_name IS SUPPLIED
|
|
OR iv_selected_commit IS SUPPLIED
|
|
OR iv_head_branch IS SUPPLIED
|
|
OR iv_offline IS SUPPLIED
|
|
OR is_dot_abapgit IS SUPPLIED
|
|
OR is_local_settings IS SUPPLIED
|
|
OR iv_deserialized_by IS SUPPLIED
|
|
OR iv_deserialized_at IS SUPPLIED
|
|
OR iv_switched_origin IS SUPPLIED.
|
|
|
|
|
|
IF iv_url IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-url = iv_url.
|
|
ls_mask-url = abap_true.
|
|
ENDIF.
|
|
|
|
IF iv_branch_name IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-branch_name = iv_branch_name.
|
|
ls_mask-branch_name = abap_true.
|
|
ENDIF.
|
|
|
|
IF iv_selected_commit IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-selected_commit = iv_selected_commit.
|
|
ls_mask-selected_commit = abap_true.
|
|
ENDIF.
|
|
|
|
IF iv_head_branch IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-head_branch = iv_head_branch.
|
|
ls_mask-head_branch = abap_true.
|
|
ENDIF.
|
|
|
|
IF iv_offline IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-offline = iv_offline.
|
|
ls_mask-offline = abap_true.
|
|
ENDIF.
|
|
|
|
IF is_dot_abapgit IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-dot_abapgit = is_dot_abapgit.
|
|
ls_mask-dot_abapgit = abap_true.
|
|
ENDIF.
|
|
|
|
IF is_local_settings IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-local_settings = is_local_settings.
|
|
ls_mask-local_settings = abap_true.
|
|
normalize_local_settings( CHANGING cs_local_settings = zif_abapgit_repo~ms_data-local_settings ).
|
|
ENDIF.
|
|
|
|
IF iv_deserialized_at IS SUPPLIED OR iv_deserialized_by IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-deserialized_at = iv_deserialized_at.
|
|
zif_abapgit_repo~ms_data-deserialized_by = iv_deserialized_by.
|
|
ls_mask-deserialized_at = abap_true.
|
|
ls_mask-deserialized_by = abap_true.
|
|
ENDIF.
|
|
|
|
IF iv_switched_origin IS SUPPLIED.
|
|
zif_abapgit_repo~ms_data-switched_origin = iv_switched_origin.
|
|
ls_mask-switched_origin = abap_true.
|
|
ENDIF.
|
|
|
|
notify_listener( ls_mask ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD set_dot_apack.
|
|
mi_repo->get_dot_apack( ).
|
|
mo_apack_reader->set_manifest_descriptor( io_dot_apack->get_manifest_descriptor( ) ).
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~set_files_remote.
|
|
|
|
mt_remote = it_files.
|
|
mv_request_remote_refresh = abap_false.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~set_local_settings.
|
|
|
|
set( is_local_settings = is_settings ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~switch_repo_type.
|
|
|
|
IF iv_offline = mi_repo->ms_data-offline.
|
|
zcx_abapgit_exception=>raise( |Cannot switch_repo_type, offline already = "{ mi_repo->ms_data-offline }"| ).
|
|
ENDIF.
|
|
|
|
IF iv_offline = abap_true. " On-line -> OFFline
|
|
set( iv_url = zcl_abapgit_url=>name( mi_repo->ms_data-url )
|
|
iv_branch_name = ''
|
|
iv_selected_commit = ''
|
|
iv_head_branch = ''
|
|
iv_offline = abap_true ).
|
|
ELSE. " OFFline -> On-line
|
|
set( iv_offline = abap_false ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD update_last_deserialize.
|
|
|
|
DATA: lv_deserialized_at TYPE zif_abapgit_persistence=>ty_repo-deserialized_at,
|
|
lv_deserialized_by TYPE zif_abapgit_persistence=>ty_repo-deserialized_by.
|
|
|
|
GET TIME STAMP FIELD lv_deserialized_at.
|
|
lv_deserialized_by = sy-uname.
|
|
|
|
set( iv_deserialized_at = lv_deserialized_at
|
|
iv_deserialized_by = lv_deserialized_by ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~checksums.
|
|
|
|
CREATE OBJECT ri_checksums TYPE zcl_abapgit_repo_checksums
|
|
EXPORTING
|
|
iv_repo_key = mi_repo->ms_data-key.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~deserialize.
|
|
|
|
DATA lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt.
|
|
|
|
mi_repo->find_remote_dot_abapgit( ).
|
|
find_remote_dot_apack( ).
|
|
|
|
check_write_protect( ).
|
|
check_language( ).
|
|
|
|
IF is_checks-requirements-met = zif_abapgit_definitions=>c_no AND is_checks-requirements-decision IS INITIAL.
|
|
zcx_abapgit_exception=>raise( 'Requirements not met and undecided' ).
|
|
ENDIF.
|
|
|
|
IF is_checks-dependencies-met = zif_abapgit_definitions=>c_no AND is_checks-dependencies-decision IS INITIAL.
|
|
zcx_abapgit_exception=>raise( 'APACK dependencies not met and undecided' ).
|
|
ENDIF.
|
|
|
|
IF is_checks-transport-required = abap_true AND is_checks-transport-transport IS INITIAL.
|
|
zcx_abapgit_exception=>raise( |No transport request was supplied| ).
|
|
ENDIF.
|
|
|
|
deserialize_dot_abapgit( CHANGING ct_files = lt_updated_files ).
|
|
|
|
deserialize_objects(
|
|
EXPORTING
|
|
is_checks = is_checks
|
|
ii_log = ii_log
|
|
CHANGING
|
|
ct_files = lt_updated_files ).
|
|
|
|
deserialize_data(
|
|
EXPORTING
|
|
is_checks = is_checks
|
|
CHANGING
|
|
ct_files = lt_updated_files ).
|
|
|
|
CLEAR mt_local. " Should be before CS update which uses NEW local
|
|
|
|
mi_repo->checksums( )->update( lt_updated_files ).
|
|
|
|
update_last_deserialize( ).
|
|
|
|
COMMIT WORK AND WAIT.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~deserialize_checks.
|
|
|
|
DATA: lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
|
|
lt_dependencies TYPE zif_abapgit_apack_definitions=>ty_dependencies.
|
|
|
|
mi_repo->find_remote_dot_abapgit( ).
|
|
find_remote_dot_apack( ).
|
|
|
|
check_write_protect( ).
|
|
check_language( ).
|
|
check_abap_language_version( ).
|
|
|
|
rs_checks = zcl_abapgit_objects=>deserialize_checks( me ).
|
|
|
|
lt_requirements = mi_repo->get_dot_abapgit( )->get_data( )-requirements.
|
|
rs_checks-requirements-met = zcl_abapgit_repo_requirements=>is_requirements_met( lt_requirements ).
|
|
|
|
lt_dependencies = mi_repo->get_dot_apack( )->get_manifest_descriptor( )-dependencies.
|
|
rs_checks-dependencies-met = zcl_abapgit_apack_helper=>are_dependencies_met( lt_dependencies ).
|
|
|
|
rs_checks-customizing = zcl_abapgit_data_factory=>get_deserializer( )->deserialize_check(
|
|
ii_repo = me
|
|
ii_config = mi_repo->get_data_config( ) ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~find_remote_dot_abapgit.
|
|
|
|
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
|
|
|
|
mi_repo->get_files_remote( ).
|
|
|
|
READ TABLE mt_remote ASSIGNING <ls_remote>
|
|
WITH KEY file_path
|
|
COMPONENTS path = zif_abapgit_definitions=>c_root_dir
|
|
filename = zif_abapgit_definitions=>c_dot_abapgit.
|
|
IF sy-subrc = 0.
|
|
ro_dot = zcl_abapgit_dot_abapgit=>deserialize( <ls_remote>-data ).
|
|
mi_repo->set_dot_abapgit( ro_dot ).
|
|
COMMIT WORK AND WAIT. " to release lock
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_dot_abapgit.
|
|
CREATE OBJECT ro_dot_abapgit
|
|
EXPORTING
|
|
is_data = mi_repo->ms_data-dot_abapgit.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_files_local.
|
|
|
|
DATA lo_serialize TYPE REF TO zcl_abapgit_serialize.
|
|
|
|
" Serialization happened before and no refresh request
|
|
IF lines( mt_local ) > 0 AND mv_request_local_refresh = abap_false.
|
|
rt_files = mt_local.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
CREATE OBJECT lo_serialize
|
|
EXPORTING
|
|
io_dot_abapgit = mi_repo->get_dot_abapgit( )
|
|
is_local_settings = mi_repo->get_local_settings( ).
|
|
|
|
rt_files = lo_serialize->files_local(
|
|
iv_package = mi_repo->get_package( )
|
|
ii_data_config = mi_repo->get_data_config( )
|
|
ii_log = ii_log ).
|
|
|
|
remove_locally_excluded_files( CHANGING ct_loc_files = rt_files ).
|
|
|
|
mt_local = rt_files.
|
|
mv_request_local_refresh = abap_false. " Fulfill refresh
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_files_local_filtered.
|
|
|
|
DATA lo_serialize TYPE REF TO zcl_abapgit_serialize.
|
|
DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt.
|
|
|
|
|
|
CREATE OBJECT lo_serialize
|
|
EXPORTING
|
|
io_dot_abapgit = mi_repo->get_dot_abapgit( )
|
|
is_local_settings = mi_repo->get_local_settings( ).
|
|
|
|
lt_filter = ii_obj_filter->get_filter( ).
|
|
|
|
rt_files = lo_serialize->files_local(
|
|
iv_package = mi_repo->get_package( )
|
|
ii_data_config = mi_repo->get_data_config( )
|
|
ii_log = ii_log
|
|
it_filter = lt_filter ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_files_remote.
|
|
DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt.
|
|
DATA lr_filter TYPE REF TO zcl_abapgit_repo_filter.
|
|
|
|
rt_files = mt_remote.
|
|
|
|
"Filter Ignored Files prior to Applying a Filter
|
|
IF iv_ignore_files = abap_true.
|
|
mi_repo->remove_ignored_files( CHANGING ct_files = rt_files ).
|
|
ENDIF.
|
|
|
|
remove_locally_excluded_files( CHANGING ct_rem_files = rt_files ).
|
|
|
|
IF ii_obj_filter IS NOT INITIAL.
|
|
lt_filter = ii_obj_filter->get_filter( ).
|
|
|
|
CREATE OBJECT lr_filter.
|
|
lr_filter->apply_object_filter(
|
|
EXPORTING
|
|
it_filter = lt_filter
|
|
io_dot = mi_repo->get_dot_abapgit( )
|
|
iv_devclass = mi_repo->get_package( )
|
|
CHANGING
|
|
ct_files = rt_files ).
|
|
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_key.
|
|
rv_key = mi_repo->ms_data-key.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_local_settings.
|
|
|
|
rs_settings = mi_repo->ms_data-local_settings.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_name.
|
|
|
|
" Local display name has priority over official name
|
|
rv_name = mi_repo->ms_data-local_settings-display_name.
|
|
IF rv_name IS INITIAL.
|
|
rv_name = mi_repo->ms_data-dot_abapgit-name.
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_package.
|
|
rv_package = mi_repo->ms_data-package.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~get_tadir_objects.
|
|
|
|
rt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
|
|
iv_package = mi_repo->get_package( )
|
|
iv_ignore_subpackages = mi_repo->get_local_settings( )-ignore_subpackages
|
|
iv_only_local_objects = mi_repo->get_local_settings( )-only_local_objects
|
|
io_dot = mi_repo->get_dot_abapgit( ) ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~has_remote_source.
|
|
rv_yes = boolc( lines( mt_remote ) > 0 ).
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~is_offline.
|
|
rv_offline = mi_repo->ms_data-offline.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~refresh.
|
|
|
|
mv_request_local_refresh = abap_true.
|
|
reset_remote( ).
|
|
|
|
IF iv_drop_log = abap_true.
|
|
CLEAR mi_log.
|
|
ENDIF.
|
|
|
|
IF iv_drop_cache = abap_true.
|
|
CLEAR mt_local.
|
|
ENDIF.
|
|
|
|
mi_repo->get_dot_apack( )->refresh( ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_repo~set_dot_abapgit.
|
|
set( is_dot_abapgit = io_dot_abapgit->get_data( ) ).
|
|
ENDMETHOD.
|
|
ENDCLASS.
|