moving to includes

whoa this is a lot of work
This commit is contained in:
larshp 2016-07-02 11:26:42 +00:00
parent d6b5dbaf27
commit 5c2cac3211
18 changed files with 5537 additions and 5161 deletions

File diff suppressed because it is too large Load Diff

View File

@ -61,7 +61,7 @@
<ID>R</ID>
<KEY/>
<ENTRY>abapGit</ENTRY>
<LENGTH>54</LENGTH>
<LENGTH>7</LENGTH>
<SPLIT/>
</item>
</TPOOL>

View File

@ -0,0 +1,208 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_DOT_ABAPGIT
*&---------------------------------------------------------------------*
CLASS ltcl_dot_abapgit DEFINITION DEFERRED.
CLASS lcl_dot_abapgit DEFINITION CREATE PRIVATE FINAL FRIENDS ltcl_dot_abapgit.
PUBLIC SECTION.
CLASS-METHODS:
build_default
IMPORTING iv_master_language TYPE spras
RETURNING VALUE(ro_dot_abapgit) TYPE REF TO lcl_dot_abapgit,
deserialize
IMPORTING iv_xstr TYPE xstring
RETURNING VALUE(ro_dot_abapgit) TYPE REF TO lcl_dot_abapgit
RAISING lcx_exception.
METHODS:
serialize
RETURNING VALUE(rv_xstr) TYPE xstring,
add_ignore
IMPORTING iv_path TYPE string
iv_filename TYPE string,
is_ignored
IMPORTING iv_path TYPE string
iv_filename TYPE string
RETURNING VALUE(rv_ignored) TYPE abap_bool,
remove_ignore
IMPORTING iv_path TYPE string
iv_filename TYPE string,
get_starting_folder
RETURNING VALUE(rv_path) TYPE string,
* set_starting_folder
* IMPORTING iv_path TYPE string,
get_master_language
RETURNING VALUE(rv_language) TYPE spras.
* set_master_language
* IMPORTING iv_language TYPE spras.
PRIVATE SECTION.
TYPES: BEGIN OF ty_dot_abapgit,
master_language TYPE spras,
starting_folder TYPE string,
ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
END OF ty_dot_abapgit.
DATA: ms_data TYPE ty_dot_abapgit.
METHODS:
constructor
IMPORTING is_data TYPE ty_dot_abapgit.
CLASS-METHODS:
to_xml
IMPORTING is_data TYPE ty_dot_abapgit
RETURNING VALUE(rv_xml) TYPE string,
from_xml
IMPORTING iv_xml TYPE string
RETURNING VALUE(rs_data) TYPE ty_dot_abapgit.
ENDCLASS.
CLASS lcl_dot_abapgit IMPLEMENTATION.
METHOD constructor.
ms_data = is_data.
ENDMETHOD.
METHOD deserialize.
DATA: lv_xml TYPE string,
ls_data TYPE ty_dot_abapgit.
lv_xml = lcl_convert=>xstring_to_string_utf8( iv_xstr ).
ls_data = from_xml( lv_xml ).
CREATE OBJECT ro_dot_abapgit
EXPORTING
is_data = ls_data.
ENDMETHOD.
METHOD serialize.
DATA: lv_xml TYPE string.
lv_xml = to_xml( ms_data ).
rv_xstr = lcl_convert=>string_to_xstring_utf8( lv_xml ).
ENDMETHOD.
METHOD build_default.
DATA: ls_data TYPE ty_dot_abapgit.
ls_data-master_language = iv_master_language.
ls_data-starting_folder = '/'.
APPEND '/.gitignore' TO ls_data-ignore.
APPEND '/LICENSE' TO ls_data-ignore.
APPEND '/README.md' TO ls_data-ignore.
APPEND '/package.json' TO ls_data-ignore.
APPEND '/.travis.yml' TO ls_data-ignore.
CREATE OBJECT ro_dot_abapgit
EXPORTING
is_data = ls_data.
ENDMETHOD.
METHOD to_xml.
CALL TRANSFORMATION id
SOURCE data = is_data
RESULT XML rv_xml.
rv_xml = lcl_xml_pretty=>print( rv_xml ).
REPLACE FIRST OCCURRENCE
OF '<?xml version="1.0" encoding="utf-16"?>'
IN rv_xml
WITH '<?xml version="1.0" encoding="utf-8"?>'.
ASSERT sy-subrc = 0.
ENDMETHOD.
METHOD from_xml.
DATA: lv_xml TYPE string.
lv_xml = iv_xml.
* fix downward compatibility
REPLACE ALL OCCURRENCES OF '<_--28C_DATA_--29>' IN lv_xml WITH '<DATA>'.
REPLACE ALL OCCURRENCES OF '</_--28C_DATA_--29>' IN lv_xml WITH '</DATA>'.
CALL TRANSFORMATION id
OPTIONS value_handling = 'accept_data_loss'
SOURCE XML lv_xml
RESULT data = rs_data ##NO_TEXT.
ENDMETHOD.
METHOD add_ignore.
DATA: lv_name TYPE string.
FIELD-SYMBOLS: <lv_ignore> LIKE LINE OF ms_data-ignore.
lv_name = iv_path && iv_filename.
READ TABLE ms_data-ignore FROM lv_name TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
RETURN.
ENDIF.
APPEND INITIAL LINE TO ms_data-ignore ASSIGNING <lv_ignore>.
<lv_ignore> = lv_name.
ENDMETHOD.
METHOD is_ignored.
DATA: lv_name TYPE string,
lv_ignore TYPE string.
lv_name = iv_path && iv_filename.
LOOP AT ms_data-ignore INTO lv_ignore.
IF lv_name CP lv_ignore.
rv_ignored = abap_true.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD remove_ignore.
DATA: lv_name TYPE string.
lv_name = iv_path && iv_filename.
DELETE TABLE ms_data-ignore FROM lv_name.
ENDMETHOD.
METHOD get_starting_folder.
rv_path = ms_data-starting_folder.
ENDMETHOD.
* METHOD set_starting_folder.
* ms_data-starting_folder = iv_path.
* ENDMETHOD.
METHOD get_master_language.
rv_language = ms_data-master_language.
ENDMETHOD.
* METHOD set_master_language.
* ms_data-master_language = iv_language.
* ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_DOT_ABAPGIT</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_DOT_ABAPGIT</ENTRY>
<LENGTH>28</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,190 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_FILE_STATUS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_file_status DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_file_status DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS status
IMPORTING io_repo TYPE REF TO lcl_repo
io_log TYPE REF TO lcl_log OPTIONAL
RETURNING VALUE(rt_results) TYPE ty_results_tt
RAISING lcx_exception.
PRIVATE SECTION.
CLASS-METHODS compare_files
IMPORTING it_repo TYPE ty_files_tt
is_gen TYPE ty_file
RETURNING VALUE(rv_match) TYPE sap_bool
RAISING lcx_exception.
ENDCLASS. "lcl_file_status DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_file_status IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_file_status IMPLEMENTATION.
METHOD compare_files.
READ TABLE it_repo WITH KEY
path = is_gen-path
filename = is_gen-filename
data = is_gen-data
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
rv_match = abap_false.
ELSE.
rv_match = abap_true.
ENDIF.
ENDMETHOD. "compare_files
METHOD status.
DATA: lv_pre TYPE tadir-obj_name,
lt_files TYPE ty_files_tt,
ls_result LIKE LINE OF rt_results,
lv_type TYPE string,
ls_item TYPE ty_item,
lt_tadir TYPE lcl_tadir=>ty_tadir_tt,
lt_local TYPE ty_files_item_tt,
ls_tadir TYPE tadir,
lt_remote TYPE ty_files_tt,
lv_ext TYPE string.
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF lt_remote,
<ls_tadir> LIKE LINE OF lt_tadir,
<ls_result> LIKE LINE OF rt_results,
<ls_local> LIKE LINE OF lt_local,
<ls_gen> LIKE LINE OF lt_files.
lt_remote = io_repo->get_files_remote( ).
lt_local = io_repo->get_files_local( io_log ).
LOOP AT lt_remote ASSIGNING <ls_remote>.
lcl_progress=>show( iv_key = 'Status'
iv_current = sy-tabix
iv_total = lines( lt_remote )
iv_text = <ls_remote>-filename ) ##NO_TEXT.
SPLIT <ls_remote>-filename AT '.' INTO lv_pre lv_type lv_ext.
TRANSLATE lv_pre TO UPPER CASE.
TRANSLATE lv_type TO UPPER CASE.
IF lv_ext <> 'xml' OR strlen( lv_type ) <> 4.
CONTINUE. " current loop
ENDIF.
* handle namespaces
REPLACE ALL OCCURRENCES OF '#' IN lv_pre WITH '/'.
CLEAR ls_result.
ls_result-obj_type = lv_type.
ls_result-obj_name = lv_pre.
CLEAR ls_item.
ls_item-obj_type = lv_type.
ls_item-obj_name = lv_pre.
CLEAR lt_files.
LOOP AT lt_local ASSIGNING <ls_local> WHERE item = ls_item.
APPEND <ls_local>-file TO lt_files.
ENDLOOP.
IF lt_files[] IS INITIAL.
* item does not exist locally
ls_result-filename = <ls_remote>-filename.
APPEND ls_result TO rt_results.
CONTINUE. " current loop
ENDIF.
LOOP AT lt_files ASSIGNING <ls_gen>.
ls_result-filename = <ls_gen>-filename.
ls_result-match = compare_files( it_repo = lt_remote
is_gen = <ls_gen> ).
APPEND ls_result TO rt_results.
ENDLOOP.
ENDLOOP.
* find files only existing remotely, including non abapGit related
LOOP AT lt_remote ASSIGNING <ls_remote>.
READ TABLE rt_results WITH KEY filename = <ls_remote>-filename
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
IF io_repo->get_dot_abapgit( )->is_ignored(
iv_path = <ls_remote>-path
iv_filename = <ls_remote>-filename ) = abap_true.
CONTINUE.
ENDIF.
CLEAR ls_result.
ls_result-match = abap_true.
ls_result-filename = <ls_remote>-filename.
APPEND ls_result TO rt_results.
ENDIF.
ENDLOOP.
* find objects only existing locally
lt_tadir = lcl_tadir=>read( io_repo->get_package( ) ).
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
READ TABLE rt_results
WITH KEY obj_type = <ls_tadir>-object
obj_name = <ls_tadir>-obj_name
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
ls_item-obj_type = <ls_tadir>-object.
ls_item-obj_name = <ls_tadir>-obj_name.
IF lcl_objects=>is_supported( ls_item ) = abap_false.
CONTINUE.
ENDIF.
CLEAR ls_result.
ls_result-match = abap_true.
ls_result-obj_type = <ls_tadir>-object.
ls_result-obj_name = <ls_tadir>-obj_name.
APPEND ls_result TO rt_results.
ENDIF.
ENDLOOP.
* add path information for files
LOOP AT lt_remote ASSIGNING <ls_remote>.
READ TABLE rt_results ASSIGNING <ls_result> WITH KEY filename = <ls_remote>-filename.
IF sy-subrc = 0.
<ls_result>-path = <ls_remote>-path.
ENDIF.
ENDLOOP.
* add package information
LOOP AT rt_results ASSIGNING <ls_result> WHERE NOT obj_type IS INITIAL.
ls_tadir = lcl_tadir=>read_single( iv_object = <ls_result>-obj_type
iv_obj_name = <ls_result>-obj_name ).
<ls_result>-package = ls_tadir-devclass.
ENDLOOP.
SORT rt_results BY
obj_type ASCENDING
obj_name ASCENDING
filename ASCENDING.
DELETE ADJACENT DUPLICATES FROM rt_results
COMPARING obj_type obj_name filename.
lcl_sap_package=>check(
io_log = io_log
it_results = rt_results
iv_start = io_repo->get_dot_abapgit( )->get_starting_folder( )
iv_top = io_repo->get_package( ) ).
ENDMETHOD. "status
ENDCLASS. "lcl_file_status IMPLEMENTATION

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_FILE_STATUS</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_FILE_STATUS</ENTRY>
<LENGTH>28</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

1773
src/zabapgit_git.prog.abap Normal file

File diff suppressed because it is too large Load Diff

48
src/zabapgit_git.prog.xml Normal file
View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_GIT</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GIT</ENTRY>
<LENGTH>20</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

543
src/zabapgit_html.prog.abap Normal file
View File

@ -0,0 +1,543 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_HTML
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_html_action_utils DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_html_action_utils DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_commit_fields, "TODO refactor ! Move to normal place
repo_key TYPE lcl_persistence_repo=>ty_repo-key,
username TYPE string,
email TYPE string,
comment TYPE string,
body TYPE string,
END OF ty_commit_fields.
CLASS-METHODS jump_encode
IMPORTING iv_obj_type TYPE tadir-object
iv_obj_name TYPE tadir-obj_name
RETURNING VALUE(rv_string) TYPE string.
CLASS-METHODS jump_decode
IMPORTING iv_string TYPE clike
EXPORTING ev_obj_type TYPE tadir-object
ev_obj_name TYPE tadir-obj_name
RAISING lcx_exception.
CLASS-METHODS file_encode
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
ig_file TYPE any "ty_repo_file
RETURNING VALUE(rv_string) TYPE string.
CLASS-METHODS file_decode
IMPORTING iv_string TYPE clike
EXPORTING ev_key TYPE lcl_persistence_repo=>ty_repo-key
eg_file TYPE any "ty_repo_file
RAISING lcx_exception.
CLASS-METHODS dbkey_encode
IMPORTING is_key TYPE lcl_persistence_db=>ty_content
RETURNING VALUE(rv_string) TYPE string.
CLASS-METHODS dbkey_decode
IMPORTING iv_string TYPE clike
RETURNING VALUE(rs_key) TYPE lcl_persistence_db=>ty_content.
CLASS-METHODS parse_commit_request
IMPORTING it_postdata TYPE cnht_post_data_tab
RETURNING VALUE(rs_fields) TYPE ty_commit_fields.
CLASS-METHODS repo_key_encode
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RETURNING VALUE(rv_string) TYPE string.
CLASS-METHODS repo_key_decode
IMPORTING iv_string TYPE clike
RETURNING VALUE(rv_key) TYPE lcl_persistence_repo=>ty_repo-key.
ENDCLASS. "lcl_html_action_utils DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_html_action_utils IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_html_action_utils IMPLEMENTATION.
METHOD jump_encode.
DATA: lt_fields TYPE tihttpnvp,
ls_field LIKE LINE OF lt_fields.
ls_field-name = 'TYPE'.
ls_field-value = iv_obj_type.
APPEND ls_field TO lt_fields.
ls_field-name = 'NAME'.
ls_field-value = iv_obj_name.
APPEND ls_field TO lt_fields.
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD. "jump_encode
METHOD jump_decode.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
lv_string = iv_string. " type conversion
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'TYPE'.
IF sy-subrc = 0.
ev_obj_type = <ls_field>-value.
ELSE.
CLEAR ev_obj_type.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'NAME'.
IF sy-subrc = 0.
ev_obj_name = <ls_field>-value.
ELSE.
CLEAR ev_obj_name.
ENDIF.
ENDMETHOD. "jump_decode
METHOD file_encode.
DATA: lt_fields TYPE tihttpnvp,
ls_field LIKE LINE OF lt_fields.
FIELD-SYMBOLS <lv_field> TYPE string.
ls_field-name = 'KEY'.
ls_field-value = iv_key.
APPEND ls_field TO lt_fields.
ls_field-name = 'PATH'.
ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
ls_field-value = <lv_field>.
APPEND ls_field TO lt_fields.
ls_field-name = 'FILENAME'.
ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
ls_field-value = <lv_field>.
APPEND ls_field TO lt_fields.
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD. "file_encode
METHOD file_decode.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields,
<lv_field> TYPE string.
CLEAR: ev_key, eg_file.
lv_string = iv_string. " type conversion
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'KEY'.
IF sy-subrc = 0.
ev_key = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'PATH'.
IF sy-subrc = 0.
ASSIGN COMPONENT 'PATH' OF STRUCTURE eg_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
<lv_field> = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'FILENAME'.
IF sy-subrc = 0.
ASSIGN COMPONENT 'FILENAME' OF STRUCTURE eg_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
<lv_field> = <ls_field>-value.
ENDIF.
ENDMETHOD. "file_decode
METHOD dbkey_encode.
DATA: lt_fields TYPE tihttpnvp,
ls_field LIKE LINE OF lt_fields.
ls_field-name = 'TYPE'.
ls_field-value = is_key-type.
APPEND ls_field TO lt_fields.
ls_field-name = 'VALUE'.
ls_field-value = is_key-value.
APPEND ls_field TO lt_fields.
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD. "dbkey_encode
METHOD dbkey_decode.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
lv_string = iv_string. " type conversion
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'TYPE'.
IF sy-subrc = 0.
rs_key-type = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'VALUE'.
IF sy-subrc = 0.
rs_key-value = <ls_field>-value.
ENDIF.
ENDMETHOD. "dbkey_decode
METHOD parse_commit_request.
CONSTANTS: lc_replace TYPE string VALUE '<<new>>'.
DATA: lv_string TYPE string,
lt_fields TYPE tihttpnvp.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
CONCATENATE LINES OF it_postdata INTO lv_string.
REPLACE ALL OCCURRENCES OF gc_newline IN lv_string WITH lc_replace.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'key' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-repo_key = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'username' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-username = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'email' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-email = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'comment' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-comment = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'body' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-body = <ls_field>-value.
REPLACE ALL OCCURRENCES OF lc_replace IN rs_fields-body WITH gc_newline.
ENDMETHOD. "parse_commit_request
METHOD repo_key_encode.
DATA: lt_fields TYPE tihttpnvp,
ls_field LIKE LINE OF lt_fields.
ls_field-name = 'KEY'.
ls_field-value = iv_key.
APPEND ls_field TO lt_fields.
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD. "repo_key_encode
METHOD repo_key_decode.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
lv_string = iv_string. " type conversion
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'KEY'.
IF sy-subrc = 0.
rv_key = <ls_field>-value.
ENDIF.
ENDMETHOD. "repo_key_decode
ENDCLASS. "lcl_html_action_utils IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_html_helper DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_html_helper DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: c_indent_size TYPE i VALUE 2.
DATA mv_html TYPE string READ-ONLY.
DATA mv_indent TYPE i READ-ONLY.
METHODS add IMPORTING iv_chunk TYPE any.
METHODS reset.
METHODS add_anchor IMPORTING iv_txt TYPE string
iv_act TYPE string
iv_opt TYPE char1 OPTIONAL
iv_typ TYPE char1 DEFAULT gc_action_type-sapevent
iv_class TYPE string OPTIONAL.
PRIVATE SECTION.
METHODS _add_str IMPORTING iv_str TYPE csequence.
METHODS _add_htm IMPORTING io_html TYPE REF TO lcl_html_helper.
ENDCLASS. "lcl_html_helper DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_html_helper IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_html_helper IMPLEMENTATION.
METHOD add.
DATA lo_type TYPE REF TO cl_abap_typedescr.
DATA lo_html TYPE REF TO lcl_html_helper.
lo_type = cl_abap_typedescr=>describe_by_data( iv_chunk ).
CASE lo_type->type_kind.
WHEN cl_abap_typedescr=>typekind_char
OR cl_abap_typedescr=>typekind_string.
IF strlen( iv_chunk ) = 0.
RETURN.
ENDIF.
_add_str( iv_chunk ).
WHEN cl_abap_typedescr=>typekind_oref.
ASSERT iv_chunk IS BOUND. " Dev mistake
TRY.
lo_html ?= iv_chunk.
CATCH cx_sy_move_cast_error.
ASSERT 1 = 0. " Dev mistake
ENDTRY.
_add_htm( lo_html ).
WHEN OTHERS.
ASSERT 1 = 0. " Dev mistake
ENDCASE.
ENDMETHOD. " add
METHOD reset.
CLEAR: me->mv_html, me->mv_indent.
ENDMETHOD. "reset
METHOD _add_str.
CONSTANTS lc_single_tags_re TYPE string " HTML5 singleton tags
VALUE '<(area|base|br|col|command|embed|hr|img|input|link|meta|param|source|!)'.
DATA lv_tags TYPE i.
DATA lv_tags_open TYPE i.
DATA lv_tags_close TYPE i.
DATA lv_tags_single TYPE i.
DATA lv_close_offs TYPE i.
DATA lv_shift_back TYPE i.
FIND FIRST OCCURRENCE OF '</' IN iv_str MATCH OFFSET lv_close_offs.
IF sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0. " Found close tag @beginning
lv_shift_back = 1.
ENDIF.
mv_html = mv_html
&& repeat( val = ` ` occ = ( mv_indent - lv_shift_back ) * c_indent_size )
&& iv_str
&& gc_newline.
FIND ALL OCCURRENCES OF '<' IN iv_str MATCH COUNT lv_tags.
FIND ALL OCCURRENCES OF '</' IN iv_str MATCH COUNT lv_tags_close.
FIND ALL OCCURRENCES OF REGEX lc_single_tags_re IN iv_str MATCH COUNT lv_tags_single.
lv_tags_open = lv_tags - lv_tags_close - lv_tags_single.
" More-less logic chosen due to possible double tags in a line '<a><b>'
IF lv_tags_open > lv_tags_close.
mv_indent = mv_indent + 1.
ELSEIF lv_tags_open < lv_tags_close AND mv_indent > 0.
mv_indent = mv_indent - 1.
ENDIF.
ENDMETHOD. "_add_str
METHOD _add_htm.
DATA lt_strtab TYPE TABLE OF string.
DATA lv_str TYPE string.
SPLIT io_html->mv_html AT gc_newline INTO TABLE lt_strtab.
LOOP AT lt_strtab INTO lv_str.
SHIFT lv_str LEFT DELETING LEADING space.
_add_str( lv_str ).
ENDLOOP.
ENDMETHOD. "_add_htm
METHOD add_anchor.
DATA: lv_class TYPE string,
lv_href TYPE string.
lv_class = iv_class.
IF iv_opt = gc_html_opt-emphas.
lv_class = lv_class && ' emphasis' ##NO_TEXT.
ENDIF.
IF iv_opt = gc_html_opt-cancel.
lv_class = lv_class && ' attention' ##NO_TEXT.
ENDIF.
IF lv_class IS NOT INITIAL.
SHIFT lv_class LEFT DELETING LEADING space.
lv_class = | class="{ lv_class }"|.
ENDIF.
IF iv_act IS NOT INITIAL.
CASE iv_typ.
WHEN gc_action_type-url.
lv_href = | href="{ iv_act }"|.
WHEN gc_action_type-sapevent.
lv_href = | href="sapevent:{ iv_act }"|.
WHEN gc_action_type-onclick.
lv_href = | onclick="{ iv_act }"|.
WHEN OTHERS.
ENDCASE.
ENDIF.
_add_str( |<a{ lv_class }{ lv_href }>{ iv_txt }</a>| ).
ENDMETHOD. "add_action
ENDCLASS. "lcl_html_helper IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_html_toolbar DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_html_toolbar DEFINITION FINAL.
PUBLIC SECTION.
METHODS add IMPORTING iv_txt TYPE string
io_sub TYPE REF TO lcl_html_toolbar OPTIONAL
iv_act TYPE string OPTIONAL
iv_opt TYPE c OPTIONAL
iv_typ TYPE c DEFAULT gc_action_type-sapevent.
METHODS render IMPORTING iv_as_droplist_with_label TYPE string OPTIONAL
iv_no_separator TYPE abap_bool OPTIONAL
iv_vertical TYPE abap_bool OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS reset.
PRIVATE SECTION.
TYPES: BEGIN OF ty_item,
txt TYPE string,
act TYPE string,
sub TYPE REF TO lcl_html_toolbar,
opt TYPE char1,
typ TYPE char1,
END OF ty_item.
TYPES: tt_items TYPE STANDARD TABLE OF ty_item.
DATA mt_items TYPE tt_items.
ENDCLASS. "lcl_html_toolbar DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_html_toolbar IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_html_toolbar IMPLEMENTATION.
METHOD reset.
CLEAR mt_items.
ENDMETHOD. "reset
METHOD add.
DATA ls_item TYPE ty_item.
ASSERT iv_act IS INITIAL AND io_sub IS NOT INITIAL
OR iv_act IS NOT INITIAL AND io_sub IS INITIAL. " Only one supplied
ls_item-txt = iv_txt.
ls_item-act = iv_act.
ls_item-sub = io_sub.
ls_item-opt = iv_opt.
ls_item-typ = iv_typ.
APPEND ls_item TO mt_items.
ENDMETHOD. "add
METHOD render.
DATA:
lv_class TYPE string,
lv_last TYPE abap_bool.
FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items.
CREATE OBJECT ro_html.
IF iv_as_droplist_with_label IS INITIAL.
IF iv_vertical = abap_true.
lv_class = 'menu_vertical' ##NO_TEXT.
ELSE.
lv_class = 'menu' ##NO_TEXT.
ENDIF.
ELSE.
lv_class = 'dropdown' ##NO_TEXT.
ENDIF.
ro_html->add( |<div class="{ lv_class }">| ).
IF iv_as_droplist_with_label IS NOT INITIAL.
lv_class = 'dropbtn'.
IF iv_no_separator = abap_true.
lv_class = lv_class && ' menu_end' ##NO_TEXT.
ENDIF.
ro_html->add( |<a class="{ lv_class }">{ iv_as_droplist_with_label }</a>| ).
ro_html->add( '<div class="dropdown_content">' ).
ENDIF.
LOOP AT mt_items ASSIGNING <ls_item>.
lv_last = boolc( sy-tabix = lines( mt_items ) ).
IF <ls_item>-sub IS INITIAL.
CLEAR lv_class.
IF iv_no_separator = abap_true
OR lv_last = abap_true
AND iv_as_droplist_with_label IS INITIAL.
lv_class = 'menu_end'.
ENDIF.
ro_html->add_anchor( iv_txt = <ls_item>-txt
iv_act = <ls_item>-act
iv_opt = <ls_item>-opt
iv_typ = <ls_item>-typ
iv_class = lv_class ).
ELSE.
ro_html->add( <ls_item>-sub->render(
iv_as_droplist_with_label = <ls_item>-txt
iv_no_separator = lv_last ) ).
ENDIF.
ENDLOOP.
IF iv_as_droplist_with_label IS NOT INITIAL.
ro_html->add( '</div>' ).
ENDIF.
ro_html->add( '</div>' ).
ENDMETHOD. "render
ENDCLASS. "lcl_html_toolbar IMPLEMENTATION

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_HTML</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_HTML</ENTRY>
<LENGTH>21</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_PERSISTENCE</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_PERSISTENCE</ENTRY>
<LENGTH>28</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

213
src/zabapgit_repo.prog.abap Normal file
View File

@ -0,0 +1,213 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_REPO
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_repo DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_repo DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING is_data TYPE lcl_persistence_repo=>ty_repo,
get_key
RETURNING VALUE(rv_key) TYPE lcl_persistence_db=>ty_value,
get_name
RETURNING VALUE(rv_name) TYPE string
RAISING lcx_exception,
get_files_local
IMPORTING io_log TYPE REF TO lcl_log OPTIONAL
RETURNING VALUE(rt_files) TYPE ty_files_item_tt
RAISING lcx_exception,
get_local_checksums
RETURNING VALUE(rt_checksums) TYPE lcl_persistence_repo=>ty_local_checksum_tt,
get_files_remote
RETURNING VALUE(rt_files) TYPE ty_files_tt
RAISING lcx_exception,
get_package
RETURNING VALUE(rv_package) TYPE lcl_persistence_repo=>ty_repo-package,
get_master_language
RETURNING VALUE(rv_language) TYPE spras,
delete
RAISING lcx_exception,
get_dot_abapgit
RETURNING VALUE(ro_dot_abapgit) TYPE REF TO lcl_dot_abapgit,
deserialize
RAISING lcx_exception,
refresh
RAISING lcx_exception,
build_local_checksums
RETURNING VALUE(rt_checksums) TYPE lcl_persistence_repo=>ty_local_checksum_tt
RAISING lcx_exception,
is_offline
RETURNING VALUE(rv_offline) TYPE abap_bool
RAISING lcx_exception.
PROTECTED SECTION.
DATA: mt_local TYPE ty_files_item_tt,
mt_remote TYPE ty_files_tt,
mo_dot_abapgit TYPE REF TO lcl_dot_abapgit,
ms_data TYPE lcl_persistence_repo=>ty_repo.
METHODS:
find_dot_abapgit
RAISING lcx_exception,
set
IMPORTING iv_sha1 TYPE ty_sha1 OPTIONAL
it_checksums TYPE lcl_persistence_repo=>ty_local_checksum_tt OPTIONAL
iv_url TYPE lcl_persistence_repo=>ty_repo-url OPTIONAL
iv_branch_name TYPE lcl_persistence_repo=>ty_repo-branch_name OPTIONAL
RAISING lcx_exception.
ENDCLASS. "lcl_repo DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_repo_online DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL.
PUBLIC SECTION.
METHODS:
refresh REDEFINITION,
constructor
IMPORTING is_data TYPE lcl_persistence_repo=>ty_repo
RAISING lcx_exception,
get_url
RETURNING VALUE(rv_url) TYPE lcl_persistence_repo=>ty_repo-url,
get_branch_name
RETURNING VALUE(rv_name) TYPE lcl_persistence_repo=>ty_repo-branch_name,
set_url
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
RAISING lcx_exception,
set_branch_name
IMPORTING iv_branch_name TYPE lcl_persistence_repo=>ty_repo-branch_name
RAISING lcx_exception,
get_sha1_local
RETURNING VALUE(rv_sha1) TYPE lcl_persistence_repo=>ty_repo-sha1,
get_sha1_remote
RETURNING VALUE(rv_sha1) TYPE lcl_persistence_repo=>ty_repo-sha1
RAISING lcx_exception,
get_files_remote REDEFINITION,
get_objects
RETURNING VALUE(rt_objects) TYPE ty_objects_tt
RAISING lcx_exception,
deserialize REDEFINITION,
status
IMPORTING io_log TYPE REF TO lcl_log OPTIONAL
RETURNING VALUE(rt_results) TYPE ty_results_tt
RAISING lcx_exception,
push
IMPORTING is_comment TYPE ty_comment
io_stage TYPE REF TO lcl_stage
RAISING lcx_exception.
PRIVATE SECTION.
DATA:
mt_objects TYPE ty_objects_tt,
mv_branch TYPE ty_sha1,
mv_initialized TYPE abap_bool.
METHODS:
handle_stage_ignore
IMPORTING io_stage TYPE REF TO lcl_stage
RAISING lcx_exception,
initialize
RAISING lcx_exception.
ENDCLASS. "lcl_repo_online DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_repo_offline DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_repo_offline DEFINITION INHERITING FROM lcl_repo FINAL.
PUBLIC SECTION.
METHODS:
set_files_remote
IMPORTING it_files TYPE ty_files_tt
RAISING lcx_exception.
ENDCLASS. "lcl_repo_offline DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_repo_srv DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_repo_srv DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
PUBLIC SECTION.
TYPES: ty_repo_tt TYPE STANDARD TABLE OF REF TO lcl_repo WITH DEFAULT KEY.
METHODS list
RETURNING VALUE(rt_list) TYPE ty_repo_tt
RAISING lcx_exception.
METHODS refresh
RAISING lcx_exception.
METHODS new_online
IMPORTING iv_url TYPE string
iv_branch_name TYPE string
iv_package TYPE devclass
RETURNING VALUE(ro_repo) TYPE REF TO lcl_repo_online
RAISING lcx_exception.
METHODS new_offline
IMPORTING iv_url TYPE string
iv_package TYPE devclass
RETURNING VALUE(ro_repo) TYPE REF TO lcl_repo_offline
RAISING lcx_exception.
METHODS delete
IMPORTING io_repo TYPE REF TO lcl_repo
RAISING lcx_exception.
METHODS get
IMPORTING iv_key TYPE lcl_persistence_db=>ty_value
RETURNING VALUE(ro_repo) TYPE REF TO lcl_repo
RAISING lcx_exception.
METHODS is_repo_installed
IMPORTING iv_url TYPE string
iv_target_package TYPE devclass OPTIONAL
RETURNING VALUE(rv_installed) TYPE abap_bool
RAISING lcx_exception.
METHODS get_stage
IMPORTING iv_repo_key TYPE lcl_persistence_db=>ty_value
iv_new TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(ro_stage) TYPE REF TO lcl_stage
RAISING lcx_exception.
METHODS free_stage
IMPORTING iv_repo_key TYPE lcl_persistence_db=>ty_value.
PRIVATE SECTION.
TYPES: BEGIN OF ty_stage_list,
repo_key TYPE lcl_persistence_db=>ty_value,
stage TYPE REF TO lcl_stage,
END OF ty_stage_list.
METHODS constructor.
DATA: mv_init TYPE abap_bool VALUE abap_false,
mo_persistence TYPE REF TO lcl_persistence_repo,
mt_stages TYPE TABLE OF ty_stage_list,
mt_list TYPE ty_repo_tt.
METHODS add
IMPORTING io_repo TYPE REF TO lcl_repo
RAISING lcx_exception.
METHODS validate_package
IMPORTING iv_package TYPE devclass
RAISING lcx_exception.
ENDCLASS. "lcl_repo_srv DEFINITION

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_REPO</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_REPO</ENTRY>
<LENGTH>21</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,96 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_STAGE
*&---------------------------------------------------------------------*
CLASS lcl_stage_logic DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_stage_files,
local TYPE ty_files_item_tt,
remote TYPE ty_files_tt,
END OF ty_stage_files.
CLASS-METHODS:
get
IMPORTING io_repo TYPE REF TO lcl_repo_online
RETURNING VALUE(rs_files) TYPE ty_stage_files
RAISING lcx_exception,
count
IMPORTING io_repo TYPE REF TO lcl_repo_online
RETURNING VALUE(rv_count) TYPE i
RAISING lcx_exception.
PRIVATE SECTION.
CLASS-METHODS:
remove_ignored
IMPORTING io_repo TYPE REF TO lcl_repo_online
CHANGING cs_files TYPE ty_stage_files,
remove_identical
CHANGING cs_files TYPE ty_stage_files.
ENDCLASS.
CLASS lcl_stage_logic IMPLEMENTATION.
METHOD get.
rs_files-local = io_repo->get_files_local( ).
rs_files-remote = io_repo->get_files_remote( ).
remove_identical( CHANGING cs_files = rs_files ).
remove_ignored( EXPORTING io_repo = io_repo
CHANGING cs_files = rs_files ).
ENDMETHOD.
METHOD count.
DATA: ls_files TYPE ty_stage_files.
ls_files = get( io_repo ).
rv_count = lines( ls_files-remote ) + lines( ls_files-local ).
ENDMETHOD.
METHOD remove_ignored.
DATA: lv_index TYPE i.
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF cs_files-remote.
LOOP AT cs_files-remote ASSIGNING <ls_remote>.
lv_index = sy-tabix.
IF io_repo->get_dot_abapgit( )->is_ignored(
iv_path = <ls_remote>-path
iv_filename = <ls_remote>-filename ) = abap_true.
DELETE cs_files-remote INDEX lv_index.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD remove_identical.
DATA: lv_index TYPE i,
ls_remote LIKE LINE OF cs_files-remote.
FIELD-SYMBOLS: <ls_local> LIKE LINE OF cs_files-local.
LOOP AT cs_files-local ASSIGNING <ls_local>.
lv_index = sy-tabix.
READ TABLE cs_files-remote INTO ls_remote
WITH KEY path = <ls_local>-file-path
filename = <ls_local>-file-filename.
IF sy-subrc = 0.
DELETE cs_files-remote INDEX sy-tabix.
IF ls_remote-data = <ls_local>-file-data.
DELETE cs_files-local INDEX lv_index.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_STAGE</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_STAGE</ENTRY>
<LENGTH>22</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -118,7 +118,7 @@ CLASS ltcl_dangerous IMPLEMENTATION.
DATA: lo_repo TYPE REF TO lcl_repo_online,
lt_tadir TYPE lcl_tadir=>ty_tadir_tt,
lv_msg TYPE string,
lt_results TYPE lcl_file_status=>ty_results_tt,
lt_results TYPE ty_results_tt,
lt_types TYPE lcl_objects=>ty_types_tt.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF lt_results,
@ -788,7 +788,7 @@ CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FI
METHODS:
object_blob
IMPORTING iv_data TYPE xstring
RETURNING VALUE(rs_object) TYPE lcl_git_pack=>ty_object
RETURNING VALUE(rs_object) TYPE ty_object
RAISING lcx_exception.
ENDCLASS. "test DEFINITION
@ -861,12 +861,12 @@ CLASS ltcl_git_pack IMPLEMENTATION.
CONSTANTS: lc_data TYPE x LENGTH 15 VALUE '123456789ABCDEF545794254754554',
lc_sha TYPE ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
DATA: lt_objects TYPE lcl_git_pack=>ty_objects_tt,
DATA: lt_objects TYPE ty_objects_tt,
ls_object LIKE LINE OF lt_objects,
lt_nodes TYPE lcl_git_pack=>ty_nodes_tt,
ls_node LIKE LINE OF lt_nodes,
ls_commit TYPE lcl_git_pack=>ty_commit,
lt_result TYPE lcl_git_pack=>ty_objects_tt,
lt_result TYPE ty_objects_tt,
lv_data TYPE xstring.
@ -929,9 +929,9 @@ CLASS ltcl_git_pack IMPLEMENTATION.
CONSTANTS: lc_data TYPE x LENGTH 8 VALUE '0123456789ABCDEF'.
DATA: lt_objects TYPE lcl_git_pack=>ty_objects_tt,
DATA: lt_objects TYPE ty_objects_tt,
ls_object LIKE LINE OF lt_objects,
lt_result TYPE lcl_git_pack=>ty_objects_tt,
lt_result TYPE ty_objects_tt,
lv_data TYPE xstring.
@ -954,10 +954,10 @@ CLASS ltcl_git_pack IMPLEMENTATION.
CONSTANTS: lc_data TYPE x LENGTH 8 VALUE '0123456789ABCDEF'.
DATA: lt_objects TYPE lcl_git_pack=>ty_objects_tt,
DATA: lt_objects TYPE ty_objects_tt,
ls_object LIKE LINE OF lt_objects,
lv_xstring TYPE xstring,
lt_result TYPE lcl_git_pack=>ty_objects_tt,
lt_result TYPE ty_objects_tt,
lv_data TYPE xstring.

View File

@ -851,4 +851,111 @@ CLASS lcl_login_manager IMPLEMENTATION.
ENDMETHOD.
ENDCLASS.
CLASS lcl_progress DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS:
show
IMPORTING
iv_key TYPE string
VALUE(iv_current) TYPE i
iv_total TYPE i
iv_text TYPE csequence.
PRIVATE SECTION.
TYPES: BEGIN OF ty_stack,
key TYPE string,
current TYPE i,
total TYPE i,
text TYPE string,
END OF ty_stack.
CLASS-DATA:
gt_stack TYPE STANDARD TABLE OF ty_stack WITH DEFAULT KEY.
CLASS-METHODS:
calc_pct
RETURNING VALUE(rv_pct) TYPE i,
build_text
RETURNING VALUE(rv_text) TYPE string.
ENDCLASS.
CLASS lcl_progress IMPLEMENTATION.
METHOD show.
DATA: lv_pct TYPE i,
lv_text TYPE string.
FIELD-SYMBOLS: <ls_stack> LIKE LINE OF gt_stack.
* assumption:
* all callers must end with calling this method with iv_current = iv_total
* to clear the progress of that sub element
ASSERT lines( gt_stack ) < 10.
READ TABLE gt_stack INDEX lines( gt_stack ) ASSIGNING <ls_stack>.
IF sy-subrc <> 0 OR <ls_stack>-key <> iv_key.
APPEND INITIAL LINE TO gt_stack ASSIGNING <ls_stack>.
ENDIF.
<ls_stack>-key = iv_key.
<ls_stack>-current = iv_current.
<ls_stack>-total = iv_total.
<ls_stack>-text = iv_text.
lv_pct = calc_pct( ).
lv_text = build_text( ).
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = lv_pct
text = lv_text.
IF iv_current = iv_total.
DELETE gt_stack INDEX lines( gt_stack ).
ENDIF.
ENDMETHOD.
METHOD build_text.
FIELD-SYMBOLS: <ls_stack> LIKE LINE OF gt_stack.
LOOP AT gt_stack ASSIGNING <ls_stack>.
IF sy-tabix = 1.
rv_text = |{ <ls_stack>-key } { <ls_stack>-text }|.
ELSE.
rv_text = |{ rv_text } - { <ls_stack>-key } { <ls_stack>-text }|.
IF <ls_stack>-current <> 1 AND <ls_stack>-total <> 1.
rv_text = |{ rv_text } ({ <ls_stack>-current }/{ <ls_stack>-total })|.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD calc_pct.
DATA: lv_f TYPE f.
FIELD-SYMBOLS: <ls_stack> LIKE LINE OF gt_stack.
READ TABLE gt_stack ASSIGNING <ls_stack> INDEX 1.
ASSERT sy-subrc = 0.
lv_f = ( <ls_stack>-current / <ls_stack>-total ) * 100.
rv_pct = lv_f.
IF rv_pct = 100.
rv_pct = 99.
ENDIF.
ENDMETHOD.
ENDCLASS.