abapGit/src/zabapgit_persistence.prog.abap
2017-10-25 21:49:13 +00:00

1908 lines
50 KiB
ABAP

*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PERSISTENCE
*&---------------------------------------------------------------------*
CLASS lcl_settings DEFINITION DEFERRED.
CLASS lcl_persist_migrate DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS: run RAISING zcx_abapgit_exception.
PRIVATE SECTION.
CONSTANTS:
c_text TYPE string VALUE 'Generated by abapGit' ##NO_TEXT.
CLASS-METHODS:
migrate_settings
RAISING zcx_abapgit_exception,
table_create
RAISING zcx_abapgit_exception,
table_exists
RETURNING VALUE(rv_exists) TYPE abap_bool,
lock_create
RAISING zcx_abapgit_exception,
lock_exists
RETURNING VALUE(rv_exists) TYPE abap_bool,
settings_exists
RETURNING VALUE(rv_exists) TYPE abap_bool.
ENDCLASS.
CLASS lcl_persistence_db DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
PUBLIC SECTION.
CONSTANTS:
c_tabname TYPE tabname VALUE 'ZABAPGIT',
c_lock TYPE viewname VALUE 'EZABAPGIT'.
TYPES: ty_type TYPE c LENGTH 12.
TYPES: ty_value TYPE c LENGTH 12.
TYPES: BEGIN OF ty_content,
type TYPE ty_type,
value TYPE ty_value,
data_str TYPE string,
END OF ty_content,
tt_content TYPE SORTED TABLE OF ty_content WITH UNIQUE KEY type value.
METHODS:
list_by_type
IMPORTING iv_type TYPE ty_type
RETURNING VALUE(rt_content) TYPE tt_content,
list
RETURNING VALUE(rt_content) TYPE tt_content,
add
IMPORTING iv_type TYPE ty_type
iv_value TYPE ty_content-value
iv_data TYPE ty_content-data_str
RAISING zcx_abapgit_exception,
delete
IMPORTING iv_type TYPE ty_type
iv_value TYPE ty_content-value
RAISING zcx_abapgit_exception,
update
IMPORTING iv_type TYPE ty_type
iv_value TYPE ty_content-value
iv_data TYPE ty_content-data_str
RAISING zcx_abapgit_exception,
modify
IMPORTING iv_type TYPE ty_type
iv_value TYPE ty_content-value
iv_data TYPE ty_content-data_str
RAISING zcx_abapgit_exception,
read
IMPORTING iv_type TYPE ty_type
iv_value TYPE ty_content-value
RETURNING VALUE(rv_data) TYPE ty_content-data_str
RAISING zcx_abapgit_not_found,
lock
IMPORTING iv_mode TYPE enqmode DEFAULT 'E'
iv_type TYPE ty_type
iv_value TYPE ty_content-value
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
METHODS: validate_and_unprettify_xml
IMPORTING iv_xml TYPE string
RETURNING VALUE(rv_xml) TYPE string
RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS lcl_persistence_repo DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_local_checksum,
item TYPE zif_abapgit_definitions=>ty_item,
files TYPE zif_abapgit_definitions=>ty_file_signatures_tt,
END OF ty_local_checksum.
TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY.
TYPES: BEGIN OF ty_repo_xml,
url TYPE string,
branch_name TYPE string,
sha1 TYPE zif_abapgit_definitions=>ty_sha1,
package TYPE devclass,
offline TYPE sap_bool,
local_checksums TYPE ty_local_checksum_tt,
dot_abapgit TYPE lcl_dot_abapgit=>ty_dot_abapgit,
head_branch TYPE string, " HEAD symref of the repo, master branch
write_protect TYPE sap_bool, " Deny destructive ops: pull, switch branch ...
ignore_subpackages TYPE sap_bool,
END OF ty_repo_xml.
TYPES: BEGIN OF ty_repo,
key TYPE lcl_persistence_db=>ty_value.
INCLUDE TYPE ty_repo_xml.
TYPES: END OF ty_repo.
TYPES: tt_repo TYPE STANDARD TABLE OF ty_repo WITH DEFAULT KEY.
TYPES: tt_repo_keys TYPE STANDARD TABLE OF ty_repo-key WITH DEFAULT KEY.
METHODS constructor.
METHODS list
RETURNING VALUE(rt_repos) TYPE tt_repo
RAISING zcx_abapgit_exception.
METHODS update_sha1
IMPORTING iv_key TYPE ty_repo-key
iv_branch_sha1 TYPE ty_repo_xml-sha1
RAISING zcx_abapgit_exception.
METHODS update_local_checksums
IMPORTING iv_key TYPE ty_repo-key
it_checksums TYPE ty_repo_xml-local_checksums
RAISING zcx_abapgit_exception.
METHODS update_url
IMPORTING iv_key TYPE ty_repo-key
iv_url TYPE ty_repo_xml-url
RAISING zcx_abapgit_exception.
METHODS update_branch_name
IMPORTING iv_key TYPE ty_repo-key
iv_branch_name TYPE ty_repo_xml-branch_name
RAISING zcx_abapgit_exception.
METHODS update_head_branch
IMPORTING iv_key TYPE ty_repo-key
iv_head_branch TYPE ty_repo_xml-head_branch
RAISING zcx_abapgit_exception.
METHODS update_offline
IMPORTING iv_key TYPE ty_repo-key
iv_offline TYPE ty_repo_xml-offline
RAISING zcx_abapgit_exception.
METHODS update_dot_abapgit
IMPORTING iv_key TYPE ty_repo-key
is_dot_abapgit TYPE lcl_dot_abapgit=>ty_dot_abapgit
RAISING zcx_abapgit_exception.
METHODS add
IMPORTING iv_url TYPE string
iv_branch_name TYPE string
iv_branch TYPE zif_abapgit_definitions=>ty_sha1 OPTIONAL
iv_package TYPE devclass
iv_offline TYPE sap_bool DEFAULT abap_false
is_dot_abapgit TYPE lcl_dot_abapgit=>ty_dot_abapgit
RETURNING VALUE(rv_key) TYPE ty_repo-key
RAISING zcx_abapgit_exception.
METHODS delete
IMPORTING iv_key TYPE ty_repo-key
RAISING zcx_abapgit_exception.
METHODS read
IMPORTING iv_key TYPE ty_repo-key
RETURNING VALUE(rs_repo) TYPE ty_repo
RAISING zcx_abapgit_exception
zcx_abapgit_not_found.
METHODS lock
IMPORTING iv_mode TYPE enqmode
iv_key TYPE ty_repo-key
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
CONSTANTS c_type_repo TYPE lcl_persistence_db=>ty_type VALUE 'REPO'.
DATA: mo_db TYPE REF TO lcl_persistence_db.
METHODS from_xml
IMPORTING iv_repo_xml_string TYPE string
RETURNING VALUE(rs_repo) TYPE ty_repo_xml
RAISING zcx_abapgit_exception.
METHODS to_xml
IMPORTING is_repo TYPE ty_repo
RETURNING VALUE(rv_repo_xml_string) TYPE string.
METHODS get_next_id
RETURNING VALUE(rv_next_repo_id) TYPE lcl_persistence_db=>ty_content-value
RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS lcl_persist_background DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: BEGIN OF c_method,
nothing TYPE string VALUE 'nothing' ##NO_TEXT,
pull TYPE string VALUE 'pull' ##NO_TEXT,
push TYPE string VALUE 'push' ##NO_TEXT,
END OF c_method.
CONSTANTS: BEGIN OF c_amethod,
fixed TYPE string VALUE 'fixed' ##NO_TEXT,
auto TYPE string VALUE 'auto' ##NO_TEXT,
END OF c_amethod.
TYPES: BEGIN OF ty_xml,
method TYPE string,
username TYPE string,
password TYPE string,
amethod TYPE string,
aname TYPE string,
amail TYPE string,
END OF ty_xml.
TYPES: BEGIN OF ty_background,
key TYPE lcl_persistence_db=>ty_value.
INCLUDE TYPE ty_xml.
TYPES: END OF ty_background.
TYPES: tt_background TYPE STANDARD TABLE OF ty_background WITH DEFAULT KEY.
METHODS constructor.
METHODS list
RETURNING VALUE(rt_list) TYPE tt_background
RAISING zcx_abapgit_exception.
METHODS modify
IMPORTING is_data TYPE ty_background
RAISING zcx_abapgit_exception.
METHODS delete
IMPORTING iv_key TYPE ty_background-key
RAISING zcx_abapgit_exception.
METHODS exists
IMPORTING iv_key TYPE ty_background-key
RETURNING VALUE(rv_yes) TYPE abap_bool
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
CONSTANTS c_type TYPE lcl_persistence_db=>ty_type VALUE 'BACKGROUND'.
DATA: mo_db TYPE REF TO lcl_persistence_db,
mt_jobs TYPE tt_background.
METHODS from_xml
IMPORTING iv_string TYPE string
RETURNING VALUE(rs_xml) TYPE ty_xml
RAISING zcx_abapgit_exception.
METHODS to_xml
IMPORTING is_background TYPE ty_background
RETURNING VALUE(rv_string) TYPE string.
ENDCLASS. "lcl_persistence_background DEFINITION
CLASS lcl_settings DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: c_commitmsg_comment_length_dft TYPE i VALUE 50.
CONSTANTS: c_commitmsg_body_size_dft TYPE i VALUE 72.
CONSTANTS: c_dbtype_settings TYPE lcl_persistence_db=>ty_type VALUE 'SETTINGS' ##NO_TEXT.
METHODS: set_proxy_url
IMPORTING
iv_url TYPE string,
set_proxy_port
IMPORTING
iv_port TYPE string,
set_proxy_authentication
IMPORTING
iv_auth TYPE abap_bool,
get_proxy_url
RETURNING
VALUE(rv_proxy_url) TYPE string,
get_proxy_port
RETURNING
VALUE(rv_port) TYPE string,
get_proxy_authentication
RETURNING
VALUE(rv_auth) TYPE abap_bool,
set_run_critical_tests
IMPORTING
iv_run TYPE abap_bool,
get_run_critical_tests
RETURNING
VALUE(rv_run) TYPE abap_bool,
set_experimental_features
IMPORTING
iv_run TYPE abap_bool,
get_experimental_features
RETURNING
VALUE(rv_run) TYPE abap_bool,
set_max_lines
IMPORTING iv_lines TYPE i,
get_max_lines
RETURNING
VALUE(rv_lines) TYPE i,
set_adt_jump_enanbled
IMPORTING
iv_adt_jump_enabled TYPE abap_bool,
get_adt_jump_enabled
RETURNING
VALUE(rv_adt_jump_enabled) TYPE abap_bool,
set_commitmsg_comment_length
IMPORTING
iv_length TYPE i,
get_commitmsg_comment_length
RETURNING
VALUE(rv_length) TYPE i,
set_commitmsg_body_size
IMPORTING
iv_length TYPE i,
get_commitmsg_body_size
RETURNING
VALUE(rv_length) TYPE i,
get_settings_xml
RETURNING
VALUE(ev_settings_xml) TYPE string
RAISING
zcx_abapgit_exception,
set_xml_settings
IMPORTING
iv_settings_xml TYPE string
RAISING
zcx_abapgit_exception,
set_defaults.
PRIVATE SECTION.
TYPES: BEGIN OF ty_s_settings,
proxy_url TYPE string,
proxy_port TYPE string,
proxy_auth TYPE string,
run_critical_tests TYPE abap_bool,
experimental_features TYPE abap_bool,
max_lines TYPE i,
adt_jump_enabled TYPE abap_bool,
commitmsg_comment_length TYPE i,
commitmsg_body_size TYPE i,
END OF ty_s_settings.
DATA: ms_settings TYPE ty_s_settings.
ENDCLASS.
CLASS lcl_persist_settings DEFINITION FINAL.
PUBLIC SECTION.
METHODS modify
IMPORTING
io_settings TYPE REF TO lcl_settings
RAISING
zcx_abapgit_exception.
METHODS read
RETURNING
VALUE(ro_settings) TYPE REF TO lcl_settings.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_persist_background IMPLEMENTATION.
METHOD constructor.
mo_db = lcl_app=>db( ).
ENDMETHOD.
METHOD list.
DATA: lt_list TYPE lcl_persistence_db=>tt_content,
ls_xml TYPE ty_xml.
FIELD-SYMBOLS: <ls_list> LIKE LINE OF lt_list,
<ls_output> LIKE LINE OF rt_list.
IF lines( mt_jobs ) > 0.
rt_list = mt_jobs.
RETURN.
ENDIF.
lt_list = mo_db->list_by_type( c_type ).
LOOP AT lt_list ASSIGNING <ls_list>.
ls_xml = from_xml( <ls_list>-data_str ).
APPEND INITIAL LINE TO rt_list ASSIGNING <ls_output>.
MOVE-CORRESPONDING ls_xml TO <ls_output>.
<ls_output>-key = <ls_list>-value.
ENDLOOP.
mt_jobs = rt_list.
ENDMETHOD.
METHOD exists.
list( ). " Ensure mt_jobs is populated
READ TABLE mt_jobs WITH KEY key = iv_key TRANSPORTING NO FIELDS.
rv_yes = boolc( sy-subrc = 0 ).
ENDMETHOD. "exists
METHOD modify.
ASSERT NOT is_data-key IS INITIAL.
mo_db->modify(
iv_type = c_type
iv_value = is_data-key
iv_data = to_xml( is_data ) ).
DELETE mt_jobs WHERE key = is_data-key.
APPEND is_data TO mt_jobs.
ENDMETHOD.
METHOD delete.
TRY.
mo_db->read( iv_type = c_type
iv_value = iv_key ).
CATCH zcx_abapgit_not_found.
RETURN.
ENDTRY.
mo_db->delete( iv_type = c_type
iv_value = iv_key ).
DELETE mt_jobs WHERE key = iv_key.
ENDMETHOD.
METHOD from_xml.
CALL TRANSFORMATION id
OPTIONS value_handling = 'accept_data_loss'
SOURCE XML iv_string
RESULT data = rs_xml ##NO_TEXT.
ENDMETHOD.
METHOD to_xml.
DATA: ls_xml TYPE ty_xml.
MOVE-CORRESPONDING is_background TO ls_xml.
CALL TRANSFORMATION id
SOURCE data = ls_xml
RESULT XML rv_string.
ENDMETHOD.
ENDCLASS. " lcl_persistence_background IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_persistence_user DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
PUBLIC SECTION.
TYPES: tt_favorites TYPE lcl_persistence_repo=>tt_repo_keys.
METHODS set_default_git_user_name
IMPORTING iv_username TYPE string
RAISING zcx_abapgit_exception.
METHODS get_default_git_user_name
RETURNING VALUE(rv_username) TYPE string
RAISING zcx_abapgit_exception.
METHODS set_default_git_user_email
IMPORTING iv_email TYPE string
RAISING zcx_abapgit_exception.
METHODS get_default_git_user_email
RETURNING VALUE(rv_email) TYPE string
RAISING zcx_abapgit_exception.
METHODS set_repo_show
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING zcx_abapgit_exception.
METHODS get_repo_show
RETURNING VALUE(rv_key) TYPE lcl_persistence_repo=>ty_repo-key
RAISING zcx_abapgit_exception.
METHODS set_repo_git_user_name
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
iv_username TYPE string
RAISING zcx_abapgit_exception.
METHODS get_repo_git_user_name
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
RETURNING VALUE(rv_username) TYPE string
RAISING zcx_abapgit_exception.
METHODS set_repo_login
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
iv_login TYPE string
RAISING zcx_abapgit_exception.
METHODS get_repo_login
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
RETURNING VALUE(rv_login) TYPE string
RAISING zcx_abapgit_exception.
METHODS set_repo_git_user_email
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
iv_email TYPE string
RAISING zcx_abapgit_exception.
METHODS get_repo_git_user_email
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
RETURNING VALUE(rv_email) TYPE string
RAISING zcx_abapgit_exception.
METHODS set_repo_last_change_seen
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
iv_version TYPE string
RAISING zcx_abapgit_exception.
METHODS get_repo_last_change_seen
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
RETURNING VALUE(rv_version) TYPE string
RAISING zcx_abapgit_exception.
METHODS toggle_hide_files
RETURNING VALUE(rv_hide) TYPE abap_bool
RAISING zcx_abapgit_exception.
METHODS get_hide_files
RETURNING VALUE(rv_hide) TYPE abap_bool
RAISING zcx_abapgit_exception.
METHODS toggle_changes_only
RETURNING VALUE(rv_changes_only) TYPE abap_bool
RAISING zcx_abapgit_exception.
METHODS get_changes_only
RETURNING VALUE(rv_changes_only) TYPE abap_bool
RAISING zcx_abapgit_exception.
METHODS toggle_diff_unified
RETURNING VALUE(rv_diff_unified) TYPE abap_bool
RAISING zcx_abapgit_exception.
METHODS get_diff_unified
RETURNING VALUE(rv_diff_unified) TYPE abap_bool
RAISING zcx_abapgit_exception.
METHODS get_favorites
RETURNING VALUE(rt_favorites) TYPE tt_favorites
RAISING zcx_abapgit_exception.
METHODS toggle_favorite
IMPORTING iv_repo_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING zcx_abapgit_exception.
METHODS is_favorite_repo
IMPORTING iv_repo_key TYPE lcl_persistence_repo=>ty_repo-key
RETURNING VALUE(rv_yes) TYPE abap_bool
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
CONSTANTS c_type_user TYPE lcl_persistence_db=>ty_type VALUE 'USER'.
DATA: mv_user TYPE xubname.
TYPES:
BEGIN OF ty_repo_config,
url TYPE lcl_persistence_repo=>ty_repo-url,
login TYPE string,
git_user TYPE zif_abapgit_definitions=>ty_git_user,
last_change_seen TYPE string,
END OF ty_repo_config.
TYPES: ty_repo_config_tt TYPE STANDARD TABLE OF ty_repo_config WITH DEFAULT KEY.
TYPES:
BEGIN OF ty_user,
default_git_user TYPE zif_abapgit_definitions=>ty_git_user,
repo_show TYPE lcl_persistence_repo=>ty_repo-key,
hide_files TYPE abap_bool,
changes_only TYPE abap_bool,
diff_unified TYPE abap_bool,
favorites TYPE tt_favorites,
repo_config TYPE ty_repo_config_tt,
END OF ty_user.
METHODS constructor
IMPORTING iv_user TYPE xubname DEFAULT sy-uname.
METHODS from_xml
IMPORTING iv_xml TYPE string
RETURNING VALUE(rs_user) TYPE ty_user
RAISING zcx_abapgit_exception.
METHODS to_xml
IMPORTING is_user TYPE ty_user
RETURNING VALUE(rv_xml) TYPE string.
METHODS read
RETURNING VALUE(rs_user) TYPE ty_user
RAISING zcx_abapgit_exception.
METHODS update
IMPORTING is_user TYPE ty_user
RAISING zcx_abapgit_exception.
METHODS read_repo_config
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
RETURNING VALUE(rs_repo_config) TYPE ty_repo_config
RAISING zcx_abapgit_exception.
METHODS update_repo_config
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
is_repo_config TYPE ty_repo_config
RAISING zcx_abapgit_exception.
ENDCLASS. "lcl_persistence_user DEFINITION
CLASS lcl_persistence_user IMPLEMENTATION.
METHOD constructor.
mv_user = iv_user.
ENDMETHOD.
METHOD from_xml.
DATA: lv_xml TYPE string.
lv_xml = iv_xml.
* fix downward compatibility
REPLACE ALL OCCURRENCES OF '<_--28C_TYPE_USER_--29>' IN lv_xml WITH '<USER>'.
REPLACE ALL OCCURRENCES OF '</_--28C_TYPE_USER_--29>' IN lv_xml WITH '</USER>'.
CALL TRANSFORMATION id
OPTIONS value_handling = 'accept_data_loss'
SOURCE XML lv_xml
RESULT user = rs_user ##NO_TEXT.
ENDMETHOD.
METHOD to_xml.
CALL TRANSFORMATION id
SOURCE user = is_user
RESULT XML rv_xml.
ENDMETHOD.
METHOD read.
DATA: lv_xml TYPE string.
TRY.
lv_xml = lcl_app=>db( )->read(
iv_type = c_type_user
iv_value = mv_user ).
CATCH zcx_abapgit_not_found.
RETURN.
ENDTRY.
rs_user = from_xml( lv_xml ).
ENDMETHOD.
METHOD set_repo_show.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
ls_user-repo_show = iv_key.
update( ls_user ).
COMMIT WORK AND WAIT.
ENDMETHOD.
METHOD get_repo_show.
rv_key = read( )-repo_show.
ENDMETHOD.
METHOD update.
DATA: lv_xml TYPE string.
lv_xml = to_xml( is_user ).
lcl_app=>db( )->modify(
iv_type = c_type_user
iv_value = mv_user
iv_data = lv_xml ).
ENDMETHOD.
METHOD set_default_git_user_name.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
ls_user-default_git_user-name = iv_username.
update( ls_user ).
ENDMETHOD.
METHOD get_default_git_user_name.
rv_username = read( )-default_git_user-name.
ENDMETHOD.
METHOD set_default_git_user_email.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
ls_user-default_git_user-email = iv_email.
update( ls_user ).
ENDMETHOD.
METHOD get_default_git_user_email.
rv_email = read( )-default_git_user-email.
ENDMETHOD.
METHOD read_repo_config.
DATA: lt_repo_config TYPE ty_repo_config_tt,
lv_key TYPE string.
lv_key = to_lower( iv_url ).
lt_repo_config = read( )-repo_config.
READ TABLE lt_repo_config INTO rs_repo_config WITH KEY url = lv_key.
ENDMETHOD. "read_repo_config
METHOD update_repo_config.
DATA: ls_user TYPE ty_user,
lv_key TYPE string.
FIELD-SYMBOLS <repo_config> TYPE ty_repo_config.
ls_user = read( ).
lv_key = to_lower( iv_url ).
READ TABLE ls_user-repo_config ASSIGNING <repo_config> WITH KEY url = lv_key.
IF sy-subrc IS NOT INITIAL.
APPEND INITIAL LINE TO ls_user-repo_config ASSIGNING <repo_config>.
ENDIF.
<repo_config> = is_repo_config.
<repo_config>-url = lv_key.
update( ls_user ).
COMMIT WORK AND WAIT.
ENDMETHOD. "update_repo_config
METHOD set_repo_git_user_name.
DATA: ls_repo_config TYPE ty_repo_config.
ls_repo_config = read_repo_config( iv_url ).
ls_repo_config-git_user-name = iv_username.
update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ).
ENDMETHOD. "set_repo_username
METHOD get_repo_git_user_name.
rv_username = read_repo_config( iv_url )-git_user-name.
ENDMETHOD. "get_repo_username
METHOD set_repo_login.
DATA: ls_repo_config TYPE ty_repo_config.
ls_repo_config = read_repo_config( iv_url ).
ls_repo_config-login = iv_login.
update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ).
ENDMETHOD. "set_repo_login
METHOD get_repo_login.
rv_login = read_repo_config( iv_url )-login.
ENDMETHOD. "get_repo_login
METHOD set_repo_git_user_email.
DATA: ls_repo_config TYPE ty_repo_config.
ls_repo_config = read_repo_config( iv_url ).
ls_repo_config-git_user-email = iv_email.
update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ).
ENDMETHOD. "set_repo_email
METHOD get_repo_git_user_email.
rv_email = read_repo_config( iv_url )-git_user-email.
ENDMETHOD. "get_repo_email
METHOD set_repo_last_change_seen.
DATA: ls_repo_config TYPE ty_repo_config.
ls_repo_config = read_repo_config( iv_url ).
ls_repo_config-last_change_seen = iv_version.
update_repo_config( iv_url = iv_url is_repo_config = ls_repo_config ).
ENDMETHOD. "set_last_change_seen
METHOD get_repo_last_change_seen.
rv_version = read_repo_config( iv_url )-last_change_seen.
ENDMETHOD. "get_last_change_seen
METHOD toggle_hide_files.
DATA ls_user TYPE ty_user.
ls_user = read( ).
ls_user-hide_files = boolc( ls_user-hide_files = abap_false ).
update( ls_user ).
rv_hide = ls_user-hide_files.
ENDMETHOD. "toggle_hide_files
METHOD get_hide_files.
rv_hide = read( )-hide_files.
ENDMETHOD. "get_hide_files
METHOD toggle_changes_only.
DATA ls_user TYPE ty_user.
ls_user = read( ).
ls_user-changes_only = boolc( ls_user-changes_only = abap_false ).
update( ls_user ).
rv_changes_only = ls_user-changes_only.
ENDMETHOD. "toggle_changes_only
METHOD get_changes_only.
rv_changes_only = read( )-changes_only.
ENDMETHOD. "get_changes_only
METHOD toggle_diff_unified.
DATA ls_user TYPE ty_user.
ls_user = read( ).
ls_user-diff_unified = boolc( ls_user-diff_unified = abap_false ).
update( ls_user ).
rv_diff_unified = ls_user-diff_unified.
ENDMETHOD. "toggle_diff_unified
METHOD get_diff_unified.
rv_diff_unified = read( )-diff_unified.
ENDMETHOD. "get_diff_unified
METHOD get_favorites.
rt_favorites = read( )-favorites.
ENDMETHOD. "get_favorites
METHOD toggle_favorite.
DATA: ls_user TYPE ty_user.
ls_user = read( ).
READ TABLE ls_user-favorites TRANSPORTING NO FIELDS
WITH KEY table_line = iv_repo_key.
IF sy-subrc = 0.
DELETE ls_user-favorites INDEX sy-tabix.
ELSE.
APPEND iv_repo_key TO ls_user-favorites.
ENDIF.
update( ls_user ).
ENDMETHOD. " toggle_favorite.
METHOD is_favorite_repo.
DATA: lt_favorites TYPE tt_favorites.
lt_favorites = get_favorites( ).
READ TABLE lt_favorites TRANSPORTING NO FIELDS
WITH KEY table_line = iv_repo_key.
rv_yes = boolc( sy-subrc = 0 ).
ENDMETHOD. " is_favorite_repo.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_persistence_db
*----------------------------------------------------------------------*
CLASS lcl_persistence_db IMPLEMENTATION.
METHOD list_by_type.
SELECT * FROM (c_tabname)
INTO TABLE rt_content
WHERE type = iv_type. "#EC CI_SUBRC
ENDMETHOD.
METHOD list.
SELECT * FROM (c_tabname)
INTO TABLE rt_content. "#EC CI_SUBRC
ENDMETHOD.
METHOD lock.
CALL FUNCTION 'ENQUEUE_EZABAPGIT'
EXPORTING
mode_zabapgit = iv_mode
type = iv_type
value = iv_value
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Could not aquire lock { iv_type } { iv_value }| ).
ENDIF.
* trigger dummy update task to automatically release locks at commit
CALL FUNCTION 'BANK_OBJ_WORKL_RELEASE_LOCKS'
IN UPDATE TASK.
ENDMETHOD.
METHOD add.
DATA ls_table TYPE ty_content.
ls_table-type = iv_type.
ls_table-value = iv_value.
ls_table-data_str = iv_data.
INSERT (c_tabname) FROM ls_table. "#EC CI_SUBRC
ASSERT sy-subrc = 0.
ENDMETHOD.
METHOD delete.
lock( iv_type = iv_type
iv_value = iv_value ).
DELETE FROM (c_tabname)
WHERE type = iv_type
AND value = iv_value.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'DB Delete failed' ).
ENDIF.
ENDMETHOD.
METHOD validate_and_unprettify_xml.
rv_xml = lcl_xml_pretty=>print(
iv_xml = iv_xml
iv_unpretty = abap_true
iv_ignore_errors = abap_false ).
ENDMETHOD. " validate_and_unprettify_xml
METHOD update.
DATA lv_data LIKE iv_data.
lv_data = validate_and_unprettify_xml( iv_data ).
lock( iv_type = iv_type
iv_value = iv_value ).
UPDATE (c_tabname) SET data_str = lv_data
WHERE type = iv_type
AND value = iv_value.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'DB update failed' ).
ENDIF.
ENDMETHOD. "update
METHOD modify.
DATA: ls_content TYPE ty_content.
lock( iv_type = iv_type
iv_value = iv_value ).
ls_content-type = iv_type.
ls_content-value = iv_value.
ls_content-data_str = iv_data.
MODIFY (c_tabname) FROM ls_content.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'DB modify failed' ).
ENDIF.
ENDMETHOD.
METHOD read.
SELECT SINGLE data_str FROM (c_tabname) INTO rv_data
WHERE type = iv_type
AND value = iv_value. "#EC CI_SUBRC
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_abapgit_not_found.
ENDIF.
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_persistence_repo
*----------------------------------------------------------------------*
CLASS lcl_persistence_repo IMPLEMENTATION.
METHOD add.
DATA: ls_repo TYPE ty_repo,
lv_repo_as_xml TYPE string.
ls_repo-url = iv_url.
ls_repo-branch_name = iv_branch_name.
ls_repo-sha1 = iv_branch.
ls_repo-package = iv_package.
ls_repo-offline = iv_offline.
ls_repo-dot_abapgit = is_dot_abapgit.
lv_repo_as_xml = to_xml( ls_repo ).
rv_key = get_next_id( ).
mo_db->add( iv_type = c_type_repo
iv_value = rv_key
iv_data = lv_repo_as_xml ).
ENDMETHOD.
METHOD update_dot_abapgit.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo TYPE ty_repo.
ASSERT NOT iv_key IS INITIAL.
TRY.
ls_repo = read( iv_key ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( 'key not found' ).
ENDTRY.
ls_repo-dot_abapgit = is_dot_abapgit.
ls_content-data_str = to_xml( ls_repo ).
mo_db->update( iv_type = c_type_repo
iv_value = iv_key
iv_data = ls_content-data_str ).
ENDMETHOD.
METHOD delete.
DATA: lo_background TYPE REF TO lcl_persist_background.
CREATE OBJECT lo_background.
lo_background->delete( iv_key ).
mo_db->delete( iv_type = c_type_repo
iv_value = iv_key ).
ENDMETHOD.
METHOD update_local_checksums.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo TYPE ty_repo.
ASSERT NOT iv_key IS INITIAL.
TRY.
ls_repo = read( iv_key ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( 'key not found' ).
ENDTRY.
ls_repo-local_checksums = it_checksums.
ls_content-data_str = to_xml( ls_repo ).
mo_db->update( iv_type = c_type_repo
iv_value = iv_key
iv_data = ls_content-data_str ).
ENDMETHOD.
METHOD update_url.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo TYPE ty_repo.
IF iv_url IS INITIAL.
zcx_abapgit_exception=>raise( 'update, url empty' ).
ENDIF.
ASSERT NOT iv_key IS INITIAL.
TRY.
ls_repo = read( iv_key ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( 'key not found' ).
ENDTRY.
ls_repo-url = iv_url.
ls_content-data_str = to_xml( ls_repo ).
mo_db->update( iv_type = c_type_repo
iv_value = iv_key
iv_data = ls_content-data_str ).
ENDMETHOD.
METHOD update_branch_name.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo TYPE ty_repo.
ASSERT NOT iv_key IS INITIAL.
TRY.
ls_repo = read( iv_key ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( 'key not found' ).
ENDTRY.
ls_repo-branch_name = iv_branch_name.
ls_content-data_str = to_xml( ls_repo ).
mo_db->update( iv_type = c_type_repo
iv_value = iv_key
iv_data = ls_content-data_str ).
ENDMETHOD.
METHOD update_head_branch.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo TYPE ty_repo.
ASSERT NOT iv_key IS INITIAL.
TRY.
ls_repo = read( iv_key ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( 'key not found' ).
ENDTRY.
ls_repo-head_branch = iv_head_branch.
ls_content-data_str = to_xml( ls_repo ).
mo_db->update( iv_type = c_type_repo
iv_value = iv_key
iv_data = ls_content-data_str ).
ENDMETHOD. "update_head_branch
METHOD update_offline.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo TYPE ty_repo.
ASSERT NOT iv_key IS INITIAL.
TRY.
ls_repo = read( iv_key ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( 'key not found' ).
ENDTRY.
ls_repo-offline = iv_offline.
ls_content-data_str = to_xml( ls_repo ).
mo_db->update( iv_type = c_type_repo
iv_value = iv_key
iv_data = ls_content-data_str ).
ENDMETHOD. "update_offline
METHOD update_sha1.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo TYPE ty_repo.
ASSERT NOT iv_key IS INITIAL.
TRY.
ls_repo = read( iv_key ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( 'key not found' ).
ENDTRY.
ls_repo-sha1 = iv_branch_sha1.
ls_content-data_str = to_xml( ls_repo ).
mo_db->update( iv_type = c_type_repo
iv_value = iv_key
iv_data = ls_content-data_str ).
ENDMETHOD.
METHOD read.
DATA lt_repo TYPE tt_repo.
lt_repo = list( ).
READ TABLE lt_repo INTO rs_repo WITH KEY key = iv_key.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_abapgit_not_found.
ENDIF.
ENDMETHOD.
METHOD get_next_id.
* todo: Lock the complete persistence in order to prevent concurrent repo-creation
* however the current approach will most likely work in almost all cases
DATA: lt_content TYPE lcl_persistence_db=>tt_content.
FIELD-SYMBOLS: <ls_content> LIKE LINE OF lt_content.
rv_next_repo_id = 1.
lt_content = mo_db->list_by_type( c_type_repo ).
LOOP AT lt_content ASSIGNING <ls_content>.
IF <ls_content>-value >= rv_next_repo_id.
rv_next_repo_id = <ls_content>-value + 1.
ENDIF.
ENDLOOP.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = rv_next_repo_id
IMPORTING
output = rv_next_repo_id.
ENDMETHOD.
METHOD list.
DATA: lt_content TYPE lcl_persistence_db=>tt_content,
ls_content LIKE LINE OF lt_content,
ls_repo LIKE LINE OF rt_repos.
lt_content = mo_db->list_by_type( c_type_repo ).
LOOP AT lt_content INTO ls_content.
MOVE-CORRESPONDING from_xml( ls_content-data_str ) TO ls_repo.
ls_repo-key = ls_content-value.
INSERT ls_repo INTO TABLE rt_repos.
ENDLOOP.
ENDMETHOD.
METHOD from_xml.
DATA: lv_xml TYPE string.
lv_xml = iv_repo_xml_string.
* fix downward compatibility
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 = rs_repo ##NO_TEXT.
IF rs_repo IS INITIAL.
zcx_abapgit_exception=>raise( 'Inconsistent repo metadata' ).
ENDIF.
ENDMETHOD.
METHOD to_xml.
DATA: ls_xml TYPE ty_repo_xml.
MOVE-CORRESPONDING is_repo TO ls_xml.
CALL TRANSFORMATION id
SOURCE repo = ls_xml
RESULT XML rv_repo_xml_string.
ENDMETHOD.
METHOD constructor.
mo_db = lcl_app=>db( ).
ENDMETHOD.
METHOD lock.
mo_db->lock( iv_mode = iv_mode
iv_type = c_type_repo
iv_value = iv_key ).
ENDMETHOD.
ENDCLASS.
CLASS lcl_persist_migrate IMPLEMENTATION.
METHOD run.
IF table_exists( ) = abap_false.
table_create( ).
ENDIF.
IF lock_exists( ) = abap_false.
lock_create( ).
ENDIF.
IF settings_exists( ) = abap_false.
migrate_settings( ).
ENDIF.
ENDMETHOD.
METHOD settings_exists.
TRY.
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = '' ).
rv_exists = abap_true.
CATCH zcx_abapgit_not_found.
rv_exists = abap_false.
ENDTRY.
ENDMETHOD.
METHOD migrate_settings.
DATA: lr_settings TYPE REF TO lcl_settings.
DATA: lr_persist_settings TYPE REF TO lcl_persist_settings.
DATA: lv_critical_tests_as_string TYPE string.
DATA: lv_critical_tests_as_boolean TYPE abap_bool.
DATA: lv_max_lines_as_string TYPE string.
DATA: lv_flag TYPE abap_bool.
DATA: lv_max_lines_as_integer TYPE i.
DATA: lv_s_param_value TYPE string.
DATA: lv_i_param_value TYPE i.
DATA: lv_adt_jump_enabled_as_string TYPE string.
DATA: lv_adt_jump_enabled_as_boolean TYPE abap_bool.
CREATE OBJECT lr_persist_settings.
CREATE OBJECT lr_settings.
lr_settings->set_defaults( ).
TRY.
lr_settings->set_proxy_url(
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_URL' ) ).
CATCH zcx_abapgit_not_found.
ENDTRY.
TRY.
lr_settings->set_proxy_port(
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_PORT' ) ).
CATCH zcx_abapgit_not_found.
ENDTRY.
TRY.
lv_flag = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_AUTH' ).
lr_settings->set_proxy_authentication( lv_flag ).
CATCH zcx_abapgit_not_found.
ENDTRY.
TRY.
lv_critical_tests_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'CRIT_TESTS' ).
lv_critical_tests_as_boolean = lv_critical_tests_as_string.
lr_settings->set_run_critical_tests( lv_critical_tests_as_boolean ).
CATCH zcx_abapgit_not_found.
ENDTRY.
TRY.
lv_max_lines_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'MAX_LINES' ).
lv_max_lines_as_integer = lv_max_lines_as_string.
lr_settings->set_max_lines( lv_max_lines_as_integer ).
CATCH zcx_abapgit_not_found cx_sy_conversion_no_number.
ENDTRY.
TRY.
lv_adt_jump_enabled_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'ADT_JUMP' ).
lv_adt_jump_enabled_as_boolean = lv_adt_jump_enabled_as_string.
lr_settings->set_adt_jump_enanbled( lv_adt_jump_enabled_as_boolean ).
CATCH zcx_abapgit_not_found.
ENDTRY.
TRY.
lv_s_param_value = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'COMMENT_LEN' ).
lv_i_param_value = lv_s_param_value.
lr_settings->set_commitmsg_comment_length( lv_i_param_value ).
CATCH zcx_abapgit_not_found cx_sy_conversion_no_number.
ENDTRY.
TRY.
lv_s_param_value = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'BODY_SIZE' ).
lv_i_param_value = lv_s_param_value.
lr_settings->set_commitmsg_body_size( lv_i_param_value ).
CATCH zcx_abapgit_not_found cx_sy_conversion_no_number.
ENDTRY.
lr_persist_settings->modify( io_settings = lr_settings ).
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'PROXY_URL' ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'PROXY_PORT' ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'PROXY_AUTH' ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'CRIT_TESTS' ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'MAX_LINES' ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'ADT_JUMP' ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'COMMENT_LEN' ).
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'BODY_SIZE' ).
CATCH zcx_abapgit_exception.
ENDTRY.
ENDMETHOD.
METHOD lock_exists.
DATA: lv_viewname TYPE dd25l-viewname.
SELECT SINGLE viewname FROM dd25l INTO lv_viewname
WHERE viewname = lcl_persistence_db=>c_lock.
rv_exists = boolc( sy-subrc = 0 ).
ENDMETHOD.
METHOD lock_create.
DATA: lv_obj_name TYPE tadir-obj_name,
ls_dd25v TYPE dd25v,
lt_dd26e TYPE STANDARD TABLE OF dd26e WITH DEFAULT KEY,
lt_dd27p TYPE STANDARD TABLE OF dd27p WITH DEFAULT KEY.
FIELD-SYMBOLS: <ls_dd26e> LIKE LINE OF lt_dd26e,
<ls_dd27p> LIKE LINE OF lt_dd27p.
ls_dd25v-viewname = lcl_persistence_db=>c_lock.
ls_dd25v-aggtype = 'E'.
ls_dd25v-roottab = lcl_persistence_db=>c_tabname.
ls_dd25v-ddlanguage = zif_abapgit_definitions=>gc_english.
ls_dd25v-ddtext = c_text.
APPEND INITIAL LINE TO lt_dd26e ASSIGNING <ls_dd26e>.
<ls_dd26e>-viewname = lcl_persistence_db=>c_lock.
<ls_dd26e>-tabname = lcl_persistence_db=>c_tabname.
<ls_dd26e>-tabpos = '0001'.
<ls_dd26e>-fortabname = lcl_persistence_db=>c_tabname.
<ls_dd26e>-enqmode = 'E'.
APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
<ls_dd27p>-viewname = lcl_persistence_db=>c_lock.
<ls_dd27p>-objpos = '0001'.
<ls_dd27p>-viewfield = 'TYPE'.
<ls_dd27p>-tabname = lcl_persistence_db=>c_tabname.
<ls_dd27p>-fieldname = 'TYPE'.
<ls_dd27p>-keyflag = abap_true.
APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
<ls_dd27p>-viewname = lcl_persistence_db=>c_lock.
<ls_dd27p>-objpos = '0002'.
<ls_dd27p>-viewfield = 'VALUE'.
<ls_dd27p>-tabname = lcl_persistence_db=>c_tabname.
<ls_dd27p>-fieldname = 'VALUE'.
<ls_dd27p>-keyflag = abap_true.
CALL FUNCTION 'DDIF_ENQU_PUT'
EXPORTING
name = lcl_persistence_db=>c_lock
dd25v_wa = ls_dd25v
TABLES
dd26e_tab = lt_dd26e
dd27p_tab = lt_dd27p
EXCEPTIONS
enqu_not_found = 1
name_inconsistent = 2
enqu_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'migrate, error from DDIF_ENQU_PUT' ).
ENDIF.
lv_obj_name = lcl_persistence_db=>c_lock.
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = 'ENQU'
wi_tadir_obj_name = lv_obj_name
wi_set_genflag = abap_true
wi_test_modus = abap_false
wi_tadir_devclass = '$TMP'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'migrate, error from TR_TADIR_INTERFACE' ).
ENDIF.
CALL FUNCTION 'DDIF_ENQU_ACTIVATE'
EXPORTING
name = lcl_persistence_db=>c_lock
EXCEPTIONS
not_found = 1
put_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'migrate, error from DDIF_ENQU_ACTIVATE' ).
ENDIF.
ENDMETHOD.
METHOD table_exists.
DATA: lv_tabname TYPE dd02l-tabname.
SELECT SINGLE tabname FROM dd02l INTO lv_tabname
WHERE tabname = lcl_persistence_db=>c_tabname.
rv_exists = boolc( sy-subrc = 0 ).
ENDMETHOD.
METHOD table_create.
DATA: lv_rc LIKE sy-subrc,
lv_obj_name TYPE tadir-obj_name,
ls_dd02v TYPE dd02v,
ls_dd09l TYPE dd09l,
lt_dd03p TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY.
FIELD-SYMBOLS: <ls_dd03p> LIKE LINE OF lt_dd03p.
ls_dd02v-tabname = lcl_persistence_db=>c_tabname.
ls_dd02v-ddlanguage = zif_abapgit_definitions=>gc_english.
ls_dd02v-tabclass = 'TRANSP'.
ls_dd02v-ddtext = c_text.
ls_dd02v-contflag = 'A'.
ls_dd02v-exclass = '1'.
ls_dd09l-tabname = lcl_persistence_db=>c_tabname.
ls_dd09l-as4local = 'A'.
ls_dd09l-tabkat = '1'.
ls_dd09l-tabart = 'APPL1'.
ls_dd09l-bufallow = 'N'.
APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
<ls_dd03p>-tabname = lcl_persistence_db=>c_tabname.
<ls_dd03p>-fieldname = 'TYPE'.
<ls_dd03p>-position = '0001'.
<ls_dd03p>-keyflag = 'X'.
<ls_dd03p>-datatype = 'CHAR'.
<ls_dd03p>-leng = '000012'.
APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
<ls_dd03p>-tabname = lcl_persistence_db=>c_tabname.
<ls_dd03p>-fieldname = 'VALUE'.
<ls_dd03p>-position = '0002'.
<ls_dd03p>-keyflag = 'X'.
<ls_dd03p>-datatype = 'CHAR'.
<ls_dd03p>-leng = '000012'.
APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
<ls_dd03p>-tabname = lcl_persistence_db=>c_tabname.
<ls_dd03p>-fieldname = 'DATA_STR'.
<ls_dd03p>-position = '0003'.
<ls_dd03p>-datatype = 'STRG'.
CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
name = lcl_persistence_db=>c_tabname
dd02v_wa = ls_dd02v
dd09l_wa = ls_dd09l
TABLES
dd03p_tab = lt_dd03p
EXCEPTIONS
tabl_not_found = 1
name_inconsistent = 2
tabl_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'migrate, error from DDIF_TABL_PUT' ).
ENDIF.
lv_obj_name = lcl_persistence_db=>c_tabname.
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = 'TABL'
wi_tadir_obj_name = lv_obj_name
wi_set_genflag = abap_true
wi_test_modus = abap_false
wi_tadir_devclass = '$TMP'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'migrate, error from TR_TADIR_INTERFACE' ).
ENDIF.
CALL FUNCTION 'DDIF_TABL_ACTIVATE'
EXPORTING
name = lcl_persistence_db=>c_tabname
auth_chk = abap_false
IMPORTING
rc = lv_rc
EXCEPTIONS
not_found = 1
put_failure = 2
OTHERS = 3.
IF sy-subrc <> 0 OR lv_rc <> 0.
zcx_abapgit_exception=>raise( 'migrate, error from DDIF_TABL_ACTIVATE' ).
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS lcl_settings IMPLEMENTATION.
METHOD set_proxy_authentication.
ms_settings-proxy_auth = iv_auth.
ENDMETHOD.
METHOD get_proxy_authentication.
rv_auth = ms_settings-proxy_auth.
ENDMETHOD.
METHOD set_proxy_url.
ms_settings-proxy_url = iv_url.
ENDMETHOD.
METHOD get_proxy_url.
rv_proxy_url = ms_settings-proxy_url.
ENDMETHOD.
METHOD set_proxy_port.
ms_settings-proxy_port = iv_port.
ENDMETHOD.
METHOD get_proxy_port.
rv_port = ms_settings-proxy_port.
ENDMETHOD.
METHOD set_run_critical_tests.
ms_settings-run_critical_tests = iv_run.
ENDMETHOD.
METHOD get_run_critical_tests.
rv_run = ms_settings-run_critical_tests.
ENDMETHOD.
METHOD set_experimental_features.
ms_settings-experimental_features = iv_run.
ENDMETHOD.
METHOD get_experimental_features.
rv_run = ms_settings-experimental_features.
ENDMETHOD.
METHOD get_max_lines.
rv_lines = ms_settings-max_lines.
ENDMETHOD.
METHOD set_max_lines.
ms_settings-max_lines = iv_lines.
ENDMETHOD.
METHOD get_adt_jump_enabled.
rv_adt_jump_enabled = ms_settings-adt_jump_enabled.
ENDMETHOD.
METHOD set_adt_jump_enanbled.
ms_settings-adt_jump_enabled = iv_adt_jump_enabled.
ENDMETHOD.
METHOD get_commitmsg_comment_length.
rv_length = ms_settings-commitmsg_comment_length.
ENDMETHOD.
METHOD set_commitmsg_comment_length.
ms_settings-commitmsg_comment_length = iv_length.
ENDMETHOD.
METHOD get_commitmsg_body_size.
rv_length = ms_settings-commitmsg_body_size.
ENDMETHOD.
METHOD set_commitmsg_body_size.
ms_settings-commitmsg_body_size = iv_length.
ENDMETHOD.
METHOD get_settings_xml.
DATA: lr_output TYPE REF TO lcl_xml_output.
CREATE OBJECT lr_output.
lr_output->add( iv_name = lcl_settings=>c_dbtype_settings
ig_data = ms_settings ).
ev_settings_xml = lr_output->render( ).
ENDMETHOD.
METHOD set_xml_settings.
DATA: lr_input TYPE REF TO lcl_xml_input.
CREATE OBJECT lr_input EXPORTING iv_xml = iv_settings_xml.
CLEAR ms_settings.
lr_input->read( EXPORTING iv_name = lcl_settings=>c_dbtype_settings
CHANGING cg_data = ms_settings ).
ENDMETHOD.
METHOD set_defaults.
CLEAR ms_settings.
set_proxy_authentication( abap_false ).
set_run_critical_tests( abap_false ).
set_experimental_features( abap_false ).
set_max_lines( 500 ).
set_adt_jump_enanbled( abap_false ).
set_commitmsg_comment_length( lcl_settings=>c_commitmsg_comment_length_dft ).
set_commitmsg_body_size( lcl_settings=>c_commitmsg_body_size_dft ).
ENDMETHOD.
ENDCLASS.
CLASS lcl_persist_settings IMPLEMENTATION.
METHOD modify.
lcl_app=>db( )->modify(
iv_type = lcl_settings=>c_dbtype_settings
iv_value = ''
iv_data = io_settings->get_settings_xml( ) ).
ENDMETHOD.
METHOD read.
CREATE OBJECT ro_settings.
TRY.
ro_settings->set_xml_settings(
lcl_app=>db( )->read( iv_type = lcl_settings=>c_dbtype_settings
iv_value = '' ) ).
CATCH zcx_abapgit_not_found zcx_abapgit_exception.
ro_settings->set_defaults( ).
ENDTRY.
ENDMETHOD.
ENDCLASS.