Merge remote-tracking branch 'larshp/master'

This commit is contained in:
Nuno Godinho 2016-12-15 09:53:06 +00:00
commit a14c02538a
142 changed files with 15935 additions and 7133 deletions

View File

@ -10,6 +10,7 @@
<item>/LICENSE</item> <item>/LICENSE</item>
<item>/README.md</item> <item>/README.md</item>
<item>/package.json</item> <item>/package.json</item>
<item>/changelog.txt</item>
</IGNORE> </IGNORE>
</DATA> </DATA>
</asx:values> </asx:values>

View File

@ -5,7 +5,7 @@
Git client for ABAP Git client for ABAP
Works with: [GitHub](https://github.com/), [GitLab](https://gitlab.com/), [Assembla](https://www.assembla.com/git/), [Bitbucket](https://bitbucket.org/), [abapGitServer](https://github.com/larshp/abapGitServer), and more Works with: [GitHub](https://github.com/), [GitLab](https://gitlab.com/), [Assembla](https://www.assembla.com/git/), [Bitbucket](https://bitbucket.org/), [abapGitServer](https://github.com/larshp/abapGitServer), [HCP](http://go.sap.com/denmark/developer/tutorials/hcp-webide-commit-git.html), [TFS](https://www.visualstudio.com/team-services/git/) and more
ABAP Version: 702 or higher ABAP Version: 702 or higher
@ -23,4 +23,4 @@ See [Wiki](https://github.com/larshp/abapGit/wiki/)
## FAQ ## ## FAQ ##
For questions/comments/bugs/feature requests/wishes please create an [issue](https://github.com/larshp/abapGit/issues) For questions/comments/bugs/feature requests/wishes please create an [issue](https://github.com/larshp/abapGit/issues)
![abapgit](https://github.com/larshp/abapGit/wiki/img/abapgit_1_16_1.png) ![abapgit](https://github.com/larshp/abapGit/wiki/img/abapgit_1_17_17.png)

31
changelog.txt Normal file
View File

@ -0,0 +1,31 @@
abapGit changelog
=================
Legend
------
* : fixed
! : changed
+ : added
- : removed
2016-12-01 v1.24.0
------------------
+ abap syntax highlighting
2016-11-22
------------------
+ supported object list @debugpage
+ New favorites bar. All repos are displayed in dropdown burger-button. A repo can be "starred" to appear in favbar.
! W3xx serialization change (v2.0.0). Now data file is stored as a separate file instead of base64 field in XML.
* Fixed bug in diff page: change counters values
2016-11-12
------------------
+ brand new style for file diff display - local and remote statuses are independent and based on local/remote hash and saved state
+ diffs can now be displayed for new local files
* stage header diff (all changes) now display all diff including new local files
! local state in DB is now calculated per file. This will require rebuilding of local checksums - the dislog will popup at the begining. The logic is: if local and remote file differs then: if remote branch is ahead then assume changes are remote, else (branches are equal) assume changes are local. This will lead to incorrect state for files changed on both sides (which should be a rare case though). If this is critical - it is better to sync repo with a previous version of abapGit first.
before 2016-11-12
------------------
long history of abapGit development ;)

View File

@ -8,7 +8,7 @@
"url": "git+https://github.com/larshp/abapGit.git" "url": "git+https://github.com/larshp/abapGit.git"
}, },
"devDependencies": { "devDependencies": {
"abapmerge": "^0.5.4", "abapmerge": "^0.6.2",
"abaplint": ">=0.26.7" "abaplint": ">=0.26.7"
} }
} }

View File

@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100.
* See http://www.abapgit.org * See http://www.abapgit.org
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.17.9'. "#EC NOTEXT gc_abap_version TYPE string VALUE 'v1.24.5'. "#EC NOTEXT
******************************************************************************** ********************************************************************************
* The MIT License (MIT) * The MIT License (MIT)
@ -30,100 +30,57 @@ CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
******************************************************************************** ********************************************************************************
SELECTION-SCREEN BEGIN OF SCREEN 1001. SELECTION-SCREEN BEGIN OF SCREEN 1001.
* dummy for triggering screen * dummy for triggering screen on Java SAP GUI
SELECTION-SCREEN END OF SCREEN 1001. SELECTION-SCREEN END OF SCREEN 1001.
INCLUDE zabapgit_password_dialog. " !!! Contains SELECTION SCREEN INCLUDE zabapgit_password_dialog. " !!! Contains SELECTION SCREEN
INCLUDE zabapgit_definitions. INCLUDE zabapgit_definitions.
INCLUDE zabapgit_macros.
INCLUDE zabapgit_exceptions. INCLUDE zabapgit_exceptions.
INCLUDE zabapgit_zlib. INCLUDE zabapgit_zlib.
INCLUDE zabapgit_html.
INCLUDE zabapgit_util. INCLUDE zabapgit_util.
INCLUDE zabapgit_xml. INCLUDE zabapgit_xml.
CLASS lcl_gui DEFINITION DEFERRED. INCLUDE zabapgit_app. " Some deferred definitions here
CLASS lcl_persistence_user DEFINITION DEFERRED. INCLUDE zabapgit_persistence_old.
CLASS lcl_repo_srv DEFINITION DEFERRED.
CLASS lcl_persistence_db DEFINITION DEFERRED.
INCLUDE zabapgit_app.
INCLUDE zabapgit_persistence. INCLUDE zabapgit_persistence.
INCLUDE zabapgit_html.
INCLUDE zabapgit_dot_abapgit. INCLUDE zabapgit_dot_abapgit.
INCLUDE zabapgit_sap_package. INCLUDE zabapgit_sap_package.
CLASS lcl_repo_online DEFINITION DEFERRED.
INCLUDE zabapgit_stage. INCLUDE zabapgit_stage.
INCLUDE zabapgit_git_helpers. INCLUDE zabapgit_git_helpers.
INCLUDE zabapgit_repo. INCLUDE zabapgit_repo.
INCLUDE zabapgit_git.
INCLUDE zabapgit_stage_logic. INCLUDE zabapgit_stage_logic.
INCLUDE zabapgit_http.
INCLUDE zabapgit_git.
INCLUDE zabapgit_objects. INCLUDE zabapgit_objects.
INCLUDE zabapgit_tadir. INCLUDE zabapgit_tadir.
INCLUDE zabapgit_file_status. INCLUDE zabapgit_file_status.
INCLUDE zabapgit_object. INCLUDE zabapgit_popups.
INCLUDE zabapgit_object_acid. INCLUDE zabapgit_zip.
INCLUDE zabapgit_object_auth. INCLUDE zabapgit_objects_impl.
INCLUDE zabapgit_object_doct.
INCLUDE zabapgit_object_docv. INCLUDE zabapgit_object_serializing. " All serializing classes here
INCLUDE zabapgit_object_doma.
INCLUDE zabapgit_object_dtel.
INCLUDE zabapgit_object_enho.
INCLUDE zabapgit_object_enhs.
INCLUDE zabapgit_object_enqu.
INCLUDE zabapgit_object_ensc.
INCLUDE zabapgit_object_iarp.
INCLUDE zabapgit_object_iasp.
INCLUDE zabapgit_object_iatu.
INCLUDE zabapgit_object_msag.
INCLUDE zabapgit_object_nrob.
INCLUDE zabapgit_object_para.
INCLUDE zabapgit_object_pinf.
INCLUDE zabapgit_object_sfbf.
INCLUDE zabapgit_object_sfbs.
INCLUDE zabapgit_object_sfsw.
INCLUDE zabapgit_object_shi3.
INCLUDE zabapgit_object_shlp.
INCLUDE zabapgit_object_sicf.
INCLUDE zabapgit_object_smim.
INCLUDE zabapgit_object_splo.
INCLUDE zabapgit_object_ssfo.
INCLUDE zabapgit_object_ssst.
INCLUDE zabapgit_object_susc.
INCLUDE zabapgit_object_suso.
INCLUDE zabapgit_object_tabl.
INCLUDE zabapgit_object_tobj.
INCLUDE zabapgit_object_tran.
INCLUDE zabapgit_object_ttyp.
INCLUDE zabapgit_object_type.
INCLUDE zabapgit_object_vcls.
INCLUDE zabapgit_object_view.
INCLUDE zabapgit_object_w3xx.
INCLUDE zabapgit_object_wdya.
INCLUDE zabapgit_object_wdyn.
INCLUDE zabapgit_object_webi.
INCLUDE zabapgit_object_xslt.
INCLUDE zabapgit_repo_impl. INCLUDE zabapgit_repo_impl.
INCLUDE zabapgit_background. INCLUDE zabapgit_background.
INCLUDE zabapgit_zip.
INCLUDE zabapgit_transport. INCLUDE zabapgit_transport.
INCLUDE zabapgit_popups.
INCLUDE zabapgit_page. INCLUDE zabapgit_services. " All services here
INCLUDE zabapgit_page_commit. INCLUDE zabapgit_gui_asset_manager.
INCLUDE zabapgit_page_merge. INCLUDE zabapgit_gui_pages. " All GUI pages here
INCLUDE zabapgit_page_branch_overview. INCLUDE zabapgit_gui_pages_userexit IF FOUND.
INCLUDE zabapgit_page_stage. INCLUDE zabapgit_gui_router.
INCLUDE zabapgit_page_db.
INCLUDE zabapgit_page_main.
INCLUDE zabapgit_page_background.
INCLUDE zabapgit_gui. INCLUDE zabapgit_gui.
INCLUDE zabapgit_app_impl. INCLUDE zabapgit_app_impl.
INCLUDE zabapgit_unit_test. INCLUDE zabapgit_unit_test.
INCLUDE zabapgit_migrations. " Data migration routines
INCLUDE zabapgit_forms. INCLUDE zabapgit_forms.
**********************************************************************
INITIALIZATION. INITIALIZATION.
lcl_password_dialog=>on_screen_init( ). lcl_password_dialog=>on_screen_init( ).
@ -132,7 +89,7 @@ START-OF-SELECTION.
* Hide Execute button from screen * Hide Execute button from screen
AT SELECTION-SCREEN OUTPUT. AT SELECTION-SCREEN OUTPUT.
IF sy-dynnr = lcl_password_dialog=>DYNNR. IF sy-dynnr = lcl_password_dialog=>dynnr.
lcl_password_dialog=>on_screen_output( ). lcl_password_dialog=>on_screen_output( ).
ELSE. ELSE.
PERFORM output. PERFORM output.
@ -143,6 +100,6 @@ AT SELECTION-SCREEN ON EXIT-COMMAND.
PERFORM exit. PERFORM exit.
AT SELECTION-SCREEN. AT SELECTION-SCREEN.
IF sy-dynnr = lcl_password_dialog=>DYNNR. IF sy-dynnr = lcl_password_dialog=>dynnr.
lcl_password_dialog=>on_screen_event( sscrfields-ucomm ). lcl_password_dialog=>on_screen_event( sscrfields-ucomm ).
ENDIF. ENDIF.

View File

@ -35,27 +35,6 @@
<UCCHECK>X</UCCHECK> <UCCHECK>X</UCCHECK>
</PROGDIR> </PROGDIR>
<DYNPROS/> <DYNPROS/>
<CUA>
<ADM>
<ACTCODE/>
<MENCODE/>
<PFKCODE/>
<DEFAULTACT/>
<DEFAULTPFK/>
<MOD_LANGU/>
</ADM>
<STA/>
<FUN/>
<MEN/>
<MTX/>
<ACT/>
<BUT/>
<PFK/>
<SET/>
<DOC/>
<TIT/>
<BIV/>
</CUA>
<TPOOL> <TPOOL>
<item> <item>
<ID>R</ID> <ID>R</ID>

View File

@ -2,6 +2,12 @@
*& Include ZABAPGIT_APP *& Include ZABAPGIT_APP
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
CLASS lcl_gui DEFINITION DEFERRED.
CLASS lcl_persistence_user DEFINITION DEFERRED.
CLASS lcl_repo_srv DEFINITION DEFERRED.
CLASS lcl_persistence_db DEFINITION DEFERRED.
CLASS lcl_persistence_settings DEFINITION DEFERRED.
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS lcl_app DEFINITION * CLASS lcl_app DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -26,10 +32,14 @@ CLASS lcl_app DEFINITION FINAL.
CLASS-METHODS db CLASS-METHODS db
RETURNING VALUE(ro_db) TYPE REF TO lcl_persistence_db. RETURNING VALUE(ro_db) TYPE REF TO lcl_persistence_db.
CLASS-METHODS settings
RETURNING VALUE(ro_settings) TYPE REF TO lcl_persistence_settings.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-DATA: go_gui TYPE REF TO lcl_gui, CLASS-DATA: go_gui TYPE REF TO lcl_gui,
go_current_user TYPE REF TO lcl_persistence_user, go_current_user TYPE REF TO lcl_persistence_user,
go_db TYPE REF TO lcl_persistence_db, go_db TYPE REF TO lcl_persistence_db,
go_repo_srv TYPE REF TO lcl_repo_srv. go_repo_srv TYPE REF TO lcl_repo_srv,
go_settings TYPE REF TO lcl_persistence_settings.
ENDCLASS. "lcl_app ENDCLASS. "lcl_app

View File

@ -60,4 +60,11 @@ CLASS lcl_app IMPLEMENTATION.
ENDMETHOD. "repo_srv ENDMETHOD. "repo_srv
METHOD settings.
IF go_settings IS NOT BOUND.
CREATE OBJECT go_settings.
ENDIF.
ro_settings = go_settings.
ENDMETHOD.
ENDCLASS. "lcl_app ENDCLASS. "lcl_app

View File

@ -5,11 +5,15 @@
CLASS lcl_background DEFINITION FINAL. CLASS lcl_background DEFINITION FINAL.
PUBLIC SECTION. PUBLIC SECTION.
CLASS-METHODS: run CLASS-METHODS:
run
RAISING lcx_exception. RAISING lcx_exception.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS: CLASS-METHODS:
build_comment
IMPORTING is_files TYPE ty_stage_files
RETURNING VALUE(rv_comment) TYPE string,
push push
IMPORTING io_repo TYPE REF TO lcl_repo_online IMPORTING io_repo TYPE REF TO lcl_repo_online
is_settings TYPE lcl_persistence_background=>ty_background is_settings TYPE lcl_persistence_background=>ty_background
@ -54,14 +58,9 @@ CLASS lcl_background IMPLEMENTATION.
FIELD-SYMBOLS: <ls_local> LIKE LINE OF ls_files-local. FIELD-SYMBOLS: <ls_local> LIKE LINE OF ls_files-local.
ls_files = lcl_stage_logic=>get( io_repo ). ls_files = lcl_stage_logic=>get( io_repo ).
ASSERT lines( ls_files-local ) > 0. ASSERT lines( ls_files-local ) > 0.
ls_comment-username = is_settings-aname.
ls_comment-email = is_settings-amail.
ls_comment-comment = 'abapGit background mode' ##NO_TEXT.
CREATE OBJECT lo_stage CREATE OBJECT lo_stage
EXPORTING EXPORTING
iv_branch_name = io_repo->get_branch_name( ) iv_branch_name = io_repo->get_branch_name( )
@ -76,15 +75,44 @@ CLASS lcl_background IMPLEMENTATION.
iv_data = <ls_local>-file-data ). iv_data = <ls_local>-file-data ).
ENDLOOP. ENDLOOP.
ls_comment-username = is_settings-aname.
ls_comment-email = is_settings-amail.
ls_comment-comment = build_comment( ls_files ).
io_repo->push( is_comment = ls_comment io_repo->push( is_comment = ls_comment
io_stage = lo_stage ). io_stage = lo_stage ).
ENDMETHOD. ENDMETHOD.
METHOD build_comment.
DATA: lt_objects TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
lv_str TYPE string.
FIELD-SYMBOLS: <ls_local> LIKE LINE OF is_files-local.
LOOP AT is_files-local ASSIGNING <ls_local>.
lv_str = |{ <ls_local>-item-obj_type } { <ls_local>-item-obj_name }|.
APPEND lv_str TO lt_objects.
ENDLOOP.
IF lines( lt_objects ) = 1.
rv_comment = |BG: { lv_str }|.
ELSE.
rv_comment = 'BG: Multiple objects'.
LOOP AT lt_objects INTO lv_str.
CONCATENATE rv_comment gc_newline lv_str INTO rv_comment.
ENDLOOP.
ENDIF.
ENDMETHOD.
METHOD push_auto. METHOD push_auto.
DATA: ls_comment TYPE ty_comment, DATA: ls_comment TYPE ty_comment,
ls_files TYPE ty_stage_files, ls_files TYPE ty_stage_files,
ls_user_files LIKE ls_files,
lo_stage TYPE REF TO lcl_stage. lo_stage TYPE REF TO lcl_stage.
FIELD-SYMBOLS: <ls_local> LIKE LINE OF ls_files-local. FIELD-SYMBOLS: <ls_local> LIKE LINE OF ls_files-local.
@ -94,7 +122,6 @@ CLASS lcl_background IMPLEMENTATION.
ls_files = lcl_stage_logic=>get( io_repo ). ls_files = lcl_stage_logic=>get( io_repo ).
DO. DO.
READ TABLE ls_files-local INDEX 1 ASSIGNING <ls_local>. READ TABLE ls_files-local INDEX 1 ASSIGNING <ls_local>.
IF sy-subrc <> 0. IF sy-subrc <> 0.
EXIT. EXIT.
@ -103,13 +130,14 @@ CLASS lcl_background IMPLEMENTATION.
CLEAR ls_comment. CLEAR ls_comment.
ls_comment-username = lcl_objects=>changed_by( <ls_local>-item ). ls_comment-username = lcl_objects=>changed_by( <ls_local>-item ).
ls_comment-email = |{ ls_comment-username }@localhost|. ls_comment-email = |{ ls_comment-username }@localhost|.
ls_comment-comment = 'abapGit background mode' ##NO_TEXT.
CREATE OBJECT lo_stage CREATE OBJECT lo_stage
EXPORTING EXPORTING
iv_branch_name = io_repo->get_branch_name( ) iv_branch_name = io_repo->get_branch_name( )
iv_branch_sha1 = io_repo->get_sha1_remote( ). iv_branch_sha1 = io_repo->get_sha1_remote( ).
CLEAR ls_user_files.
LOOP AT ls_files-local ASSIGNING <ls_local>. LOOP AT ls_files-local ASSIGNING <ls_local>.
IF lcl_objects=>changed_by( <ls_local>-item ) = ls_comment-username. IF lcl_objects=>changed_by( <ls_local>-item ) = ls_comment-username.
WRITE: / 'stage' ##NO_TEXT, WRITE: / 'stage' ##NO_TEXT,
@ -120,9 +148,13 @@ CLASS lcl_background IMPLEMENTATION.
lo_stage->add( iv_path = <ls_local>-file-path lo_stage->add( iv_path = <ls_local>-file-path
iv_filename = <ls_local>-file-filename iv_filename = <ls_local>-file-filename
iv_data = <ls_local>-file-data ). iv_data = <ls_local>-file-data ).
APPEND <ls_local> TO ls_user_files-local.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
ls_comment-comment = build_comment( ls_user_files ).
io_repo->push( is_comment = ls_comment io_repo->push( is_comment = ls_comment
io_stage = lo_stage ). io_stage = lo_stage ).

View File

@ -0,0 +1,608 @@
/*
* ABAPGIT COMMON CSS
*/
/* GLOBALS */
body {
font-family: Arial,Helvetica,sans-serif;
font-size: 12pt;
background: #E8E8E8;
}
a, a:visited {
color: #4078c0;
text-decoration: none;
}
a:hover, a:active {
cursor: pointer;
text-decoration: underline;
}
img { border: 0px; vertical-align: middle; }
table { border-collapse: collapse; }
pre { display: inline; }
form input, textarea, select {
border: 1px solid #DDD;
padding: 3px 6px;
}
form input:focus, textarea:focus {
border: 1px solid #8cadd9;
}
/* MODIFIERS */
.grey { color: lightgrey !important; }
.emphasis { font-weight: bold !important; }
.attention { color: red !important; }
.crossout { text-decoration: line-through !important; }
.right { text-align:right; }
.paddings { padding: 0.5em 0.5em; }
.pad-sides { padding: 0 0.3em; }
.pad4px { padding: 4px; }
/* STRUCTURE DIVS, HEADER & FOOTER */
td.headpad { padding-top: 11px; }
td.logo { width: 164px; }
div#header {
padding: 0.5em 0.5em;
border-bottom: 3px double lightgrey;
}
div#toc {
padding: 0.5em 1em;
background-color: #f2f2f2;
}
div#toc div.toc_grid {
margin: -0.3em 0em;
}
div#toc div.toc_grid a {
color: #ccc;
}
div#toc:hover div.toc_grid a {
color: #4078c0;
}
div#toc div.toc_row {
margin: 0.3em 0em;
}
div#footer {
padding: 0.5em 1em;
border-top: 3px double lightgrey;
text-align: center;
}
div.dummydiv {
background-color: #f2f2f2;
padding: 0.5em 1em;
text-align: center;
}
span.version {
display: block;
color: grey;
margin-top: 0.3em;
}
span.page_title {
font-weight: normal;
font-size: 18pt;
color: #bbb;
padding-left: 0.4em;
}
/* MENU */
div.menu { display: inline; }
div.menu .menu_end { border-right: 0px !important; }
div.menu a {
padding-left: 0.5em;
padding-right: 0.5em;
border-right: 1px solid lightgrey;
font-size: 12pt;
}
div.menu_vertical { display: inline; }
div.menu_vertical a {
display: block;
font-size: 12pt;
}
/*DROP DOWN*/
.dropdown {
position: relative;
display: inline;
}
.dropdown_angle {
position: absolute !important;
right: -4px;
top: -1px;
}
.dropbtn_angle {
width: 0;
height: 0;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #4078c0;
transform: rotate(45deg);
-ms-transform: rotate(45deg);
}
.dropdown_content {
display: none;
z-index: 1;
position: absolute;
right: -12px;
top: 1em;
padding: 6px 10px 10px 10px;
white-space: nowrap;
}
.dropdown div.minizone {
display: none;
z-index: 1;
position: absolute;
padding: 0px;
width: 16px;
height: 16px;
bottom: 0px;
left: -16px;
}
.dropdown_angle .dropdown_content {
top: -1px;
}
.dropdown:hover .dropdown_content { display: block; }
.dropdown:hover .minizone { display: block; }
.dropdown_content a {
padding: 0.2em;
background-color: #f9f9f9;
text-decoration: none;
display: block;
border: none !important;
}
.dropdown_content div.box {
border-bottom: 1px solid #C0C0C0;
border-right: 1px solid #C0C0C0;
background-color: #f9f9f9;
padding: 2px;
}
.dropdown_content td { text-align: left; padding: 2px; }
.dropdown_content td a { padding: 0em 0.2em; }
.dropdown_content td.icon { padding: 0 3px 0 6px; }
.dropdown_content a:hover { background-color: #f1f1f1 }
.dropdown:hover .dropbtn { color: #79a0d2; }
/* REPOSITORY */
div.repo {
margin-top: 3px;
background-color: #f2f2f2;
padding: 0.5em 1em 0.5em 1em;
}
.repo_name span.name {
font-weight: bold;
color: #333;
font-size: 14pt;
}
.repo_name span.url {
color: #ccc;
font-size: 12pt;
margin-left: 0.5em;
}
.repo_name img {
vertical-align: baseline;
margin: 0 5px 0 5px;
}
.repo_attr {
color: grey;
font-size: 12pt;
}
.repo_attr span {
margin-left: 0.2em;
margin-right: 0.5em;
}
.repo_attr span.bg_marker {
border: 1px solid #d2d2d2;
border-radius: 3px;
background: #d8d8d8;
color: #fff;
font-size: 8pt;
padding: 4px 2px 3px 2px;
}
.repo_attr span.branch {
padding: 2px 4px;
border: 1px solid #d9d9d9;
border-radius: 4px;
background-color: #e2e2e2;
}
.repo_attr span.branch_head {
border-color: #d8dff3;
background-color: #eceff9;
}
.repo_attr span.branch_branch {
border-color: #e7d9b1;
background-color: #f8f0d8;
}
/* MISC AND REFACTOR */
.hidden-submit {
border: 0 none;
height: 0;
width: 0;
padding: 0;
margin: 0;
overflow: hidden;
}
#debug-output {
text-align: right;
padding-right: 0.5em;
color: #ccc;
font-style: italic;
font-size: small;
}
/* REPOSITORY TABLE*/
div.repo_container {
position: relative;
}
.repo_tab {
border: 1px solid #DDD;
border-radius: 3px;
background: #fff;
margin-top: 0.5em;
}
.repo_tab td {
border-top: 1px solid #eee;
vertical-align: middle;
color: #333;
padding-top: 2px;
padding-bottom: 2px;
}
.repo_tab td.icon {
width: 32px;
text-align: center;
}
.repo_tab td.type {
width: 3em;
}
.repo_tab td.object {
padding-left: 0.5em;
}
.repo_tab td.files {
padding-left: 0.5em;
}
.repo_tab td.cmd {
text-align: right;
padding-left: 0.5em;
padding-right: 0.7em;
}
.repo_tab tr.unsupported { color: lightgrey; }
.repo_tab tr.modified { background: #fbf7e9; }
.repo_tab tr:first-child td { border-top: 0px; }
.repo_tab td.current_dir { color: #ccc; }
.repo_tab td.cmd span.state-block {
margin-left: 1em;
font-family: Consolas, Lucida Console, Courier, monospace;
font-size: x-small;
vertical-align: 13%;
display: inline-block;
text-align: center;
}
.repo_tab td.cmd span.state-block span {
display: inline-block;
padding: 0px 2px;
border: 1px solid #000;
}
.repo_tab td.cmd span.state-block span.added {
background-color: #69ad74;
border-color: #579e64;
color: white;
}
.repo_tab td.cmd span.state-block span.changed {
background-color: #e0c150;
border-color: #d4af25;
color: white;
}
.repo_tab td.cmd span.state-block span.mixed {
background-color: #e0c150;
border-color: #579e64;
color: #69ad74;
}
.repo_tab td.cmd span.state-block span.deleted {
background-color: #c76861;
border-color: #b8605a;
color: white;
}
.repo_tab td.cmd span.state-block span.none {
background-color: #e8e8e8;
border-color: #dbdbdb;
color: #c8c8c8;
}
/* STAGE */
.stage_tab {
border: 1px solid #DDD;
background: #fff;
margin-top: 0.2em;
}
.stage_tab td {
border-top: 1px solid #eee;
color: #333;
vertical-align: middle;
padding: 2px 0.5em;
}
.stage_tab th {
color: #BBB;
font-size: 10pt;
text-align: left;
font-weight: normal;
background-color: #edf2f9;
padding: 4px 0.5em;
}
.stage_tab td.status {
width: 2em;
text-align: center;
}
.stage_tab tbody tr:first-child td { padding-top: 0.5em; }
.stage_tab tbody tr:last-child td { padding-bottom: 0.5em; }
.stage_tab td.cmd a { padding: 0px 4px; }
/* STAGE */
.stage_tab td.method {
color: #ccc;
}
.stage_tab tr.firstrow td { border-top: 0px; }
.stage_tab tr.title td {
color: #BBB;
font-size: 10pt;
background-color: #edf2f9;
padding: 4px 0.5em;
text-align: center;
}
/* COMMIT */
div.form_div {
margin: 0.5em 0em;
background-color: #F8F8F8;
padding: 1em 1em;
}
div.form_div td.field_name {
color: #BBB;
padding-right: 1em;
}
/* SETTINGS STYLES */
div.settings_container {
padding: 0.5em;
font-size: 10pt;
color: #444;
background-color: #f2f2f2;
}
/* DIFF */
div.diff {
background-color: #f2f2f2;
padding: 0.7em
}
div.diff_head {
padding-bottom: 0.7em;
}
span.diff_name {
padding-left: 0.5em;
color: grey;
}
span.diff_name strong {
color: #333;
}
span.diff_banner {
border-style: solid;
border-width: 1px;
border-radius: 3px;
padding-left: 0.3em;
padding-right: 0.3em;
}
.diff_ins {
border-color: #7bea7b;
background-color: #d3f8d3;
}
.diff_del {
border-color: #ff667d;
background-color: #ffccd4;
}
.diff_upd {
border-color: #dada00;
background-color: #ffffcc;
}
div.diff_content {
background: #fff;
border-top: 1px solid #DDD;
border-bottom: 1px solid #DDD;
}
div.diff_head span.state-block {
margin-left: 0.5em;
font-family: Consolas, Lucida Console, Courier, monospace;
display: inline-block;
text-align: center;
}
div.diff_head span.state-block span {
display: inline-block;
padding: 0px 4px;
border: 1px solid #000;
}
div.diff_head span.state-block span.added {
background-color: #69ad74;
border-color: #579e64;
color: white;
}
div.diff_head span.state-block span.changed {
background-color: #e0c150;
border-color: #d4af25;
color: white;
}
div.diff_head span.state-block span.mixed {
background-color: #e0c150;
border-color: #579e64;
color: #69ad74;
}
div.diff_head span.state-block span.deleted {
background-color: #c76861;
border-color: #b8605a;
color: white;
}
div.diff_head span.state-block span.none {
background-color: #e8e8e8;
border-color: #dbdbdb;
color: #c8c8c8;
}
/* DIFF TABLE */
table.diff_tab {
font-family: Consolas, Courier, monospace;
font-size: 10pt;
}
table.diff_tab td,th {
color: #444;
padding-left: 0.5em;
padding-right: 0.5em;
}
table.diff_tab th {
text-align: left;
font-weight: normal;
padding-top: 3px;
padding-bottom: 3px;
}
table.diff_tab thead.header th {
color: #EEE;
background-color: #BBB;
text-align: left;
font-weight: bold;
padding-left: 0.5em;
font-size: 9pt;
}
table.diff_tab thead.nav_line {
background-color: #edf2f9;
}
table.diff_tab thead.nav_line th {
color: #bbb;
}
table.diff_tab td.num, th.num {
text-align: right;
color: #ccc;
border-left: 1px solid #eee;
border-right: 1px solid #eee;
}
table.diff_tab code {
font-family: inherit;
white-space: pre;
}
table.diff_tab code span.keyword { color: #0a69ce; }
table.diff_tab code span.text { color: #48ce4f; }
table.diff_tab code span.comment { color: #808080; font-style: italic; }
table.diff_tab tbody tr:first-child td { padding-top: 0.5em; }
table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; }
/* DEBUG INFO STYLES */
div.debug_container {
padding: 0.5em;
font-size: 10pt;
color: #444;
font-family: Consolas, Courier, monospace;
}
div.debug_container p {
margin: 0px;
}
/* DB ENTRIES */
div.db_list {
background-color: #f2f2f2;
padding: 0.5em;
}
table.db_tab pre {
display: inline-block;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
margin: 0px;
width: 30em;
}
table.db_tab tr.firstrow td { padding-top: 0.5em; }
table.db_tab th {
text-align: left;
color: #888;
padding: 0.5em;
border-bottom: 1px #ddd solid;
}
table.db_tab td {
color: #333;
padding: 0.5em;
vertical-align: top;
}
table.db_tab td.data {
color: #888;
font-style: italic;
}
/* DB ENTRY DISPLAY */
div.db_entry {
background-color: #f2f2f2;
padding: 0.5em;
}
div.db_entry pre {
display: block;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
background-color: #eaeaea;
padding: 0.5em;
margin: 0.5em 0em;
width: 50em;
}
div.db_entry table.toolbar {
width: 50em;
}
table.tag {
display: inline-block;
border: 1px #b3c1cc solid;
background-color: #eee;
border-radius: 3px;
margin-right: 0.5em;
}
table.tag td { padding: 0.2em 0.5em; }
table.tag td.label { background-color: #b3c1cc; }
/* DB ENTRY DISPLAY */
div.db_entry textarea { margin: 0.5em 0em; }
table.tag {
display: inline-block;
border: 1px #b3c1cc solid;
background-color: #eee;
border-radius: 3px;
margin-right: 0.5em;
}
table.tag td { padding: 0.2em 0.5em; }
table.tag td.label { background-color: #b3c1cc; }
/* TUTORIAL */
div.tutorial {
margin-top: 3px;
background-color: #f2f2f2;
padding: 0.5em 1em 0.5em 1em;
}
div.tutorial hr { border-color: #CCC; }
div.tutorial li { margin: 2px 0px }
div.tutorial h1 {
font-size: 18pt;
color: #404040;
}
div.tutorial h2 {
font-size: 14pt;
color: #404040;
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_W3MI" serializer_version="v2.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<NAME>ZABAPGIT_CSS_COMMON</NAME>
<TEXT>AbapGit common styles</TEXT>
<PARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>fileextension</NAME>
<VALUE>.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>filename</NAME>
<VALUE>~wwwtmp.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>mimetype</NAME>
<VALUE>text/css</VALUE>
</WWWPARAMS>
</PARAMS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -8,10 +8,18 @@ TYPES: ty_type TYPE c LENGTH 6,
ty_bitbyte TYPE c LENGTH 8, ty_bitbyte TYPE c LENGTH 8,
ty_sha1 TYPE c LENGTH 40. ty_sha1 TYPE c LENGTH 40.
TYPES: BEGIN OF ty_file, TYPES: BEGIN OF ty_file_signature,
path TYPE string, path TYPE string,
filename TYPE string, filename TYPE string,
data TYPE xstring, sha1 TYPE ty_sha1,
END OF ty_file_signature.
TYPES: ty_file_signatures_tt TYPE STANDARD TABLE OF ty_file_signature WITH DEFAULT KEY.
TYPES: ty_file_signatures_ts TYPE SORTED TABLE OF ty_file_signature WITH UNIQUE KEY path filename.
TYPES: BEGIN OF ty_file.
INCLUDE TYPE ty_file_signature.
TYPES: data TYPE xstring,
END OF ty_file. END OF ty_file.
TYPES: ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY. TYPES: ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY.
@ -27,7 +35,10 @@ TYPES: BEGIN OF ty_comment,
TYPES: BEGIN OF ty_item, TYPES: BEGIN OF ty_item,
obj_type TYPE tadir-object, obj_type TYPE tadir-object,
obj_name TYPE tadir-obj_name, obj_name TYPE tadir-obj_name,
END OF ty_item. devclass TYPE devclass,
END OF ty_item,
ty_items_tt TYPE STANDARD TABLE OF ty_item WITH DEFAULT KEY,
ty_items_ts TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY obj_type obj_name.
TYPES: BEGIN OF ty_file_item, TYPES: BEGIN OF ty_file_item,
file TYPE ty_file, file TYPE ty_file,
@ -39,11 +50,13 @@ TYPES: BEGIN OF ty_metadata,
class TYPE string, class TYPE string,
version TYPE string, version TYPE string,
late_deser TYPE string, late_deser TYPE string,
delete_tadir TYPE abap_bool,
END OF ty_metadata. END OF ty_metadata.
TYPES: BEGIN OF ty_web_asset, TYPES: BEGIN OF ty_web_asset,
url TYPE w3url, url TYPE w3url,
content TYPE string, base64 TYPE string,
content TYPE xstring,
END OF ty_web_asset. END OF ty_web_asset.
TYPES tt_web_assets TYPE STANDARD TABLE OF ty_web_asset WITH DEFAULT KEY. TYPES tt_web_assets TYPE STANDARD TABLE OF ty_web_asset WITH DEFAULT KEY.
@ -51,6 +64,8 @@ TYPES: BEGIN OF ty_repo_file,
path TYPE string, path TYPE string,
filename TYPE string, filename TYPE string,
is_changed TYPE abap_bool, is_changed TYPE abap_bool,
rstate TYPE char1,
lstate TYPE char1,
END OF ty_repo_file. END OF ty_repo_file.
TYPES tt_repo_files TYPE STANDARD TABLE OF ty_repo_file WITH DEFAULT KEY. TYPES tt_repo_files TYPE STANDARD TABLE OF ty_repo_file WITH DEFAULT KEY.
@ -88,15 +103,25 @@ TYPES: ty_tadir_tt TYPE STANDARD TABLE OF ty_tadir WITH DEFAULT KEY.
TYPES: BEGIN OF ty_result, TYPES: BEGIN OF ty_result,
obj_type TYPE tadir-object, obj_type TYPE tadir-object,
obj_name TYPE tadir-obj_name, obj_name TYPE tadir-obj_name,
match TYPE sap_bool, path TYPE string,
filename TYPE string, filename TYPE string,
package TYPE devclass, package TYPE devclass,
path TYPE string, match TYPE sap_bool,
lstate TYPE char1,
rstate TYPE char1,
END OF ty_result. END OF ty_result.
TYPES: ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY. TYPES: ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY.
TYPES: ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY. TYPES: ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY.
CONSTANTS: BEGIN OF gc_state, " https://git-scm.com/docs/git-status
unchanged TYPE char1 VALUE '',
added TYPE char1 VALUE 'A',
modified TYPE char1 VALUE 'M',
deleted TYPE char1 VALUE 'D', "For future use
mixed TYPE char1 VALUE '*',
END OF gc_state.
CONSTANTS: BEGIN OF gc_chmod, CONSTANTS: BEGIN OF gc_chmod,
file TYPE ty_chmod VALUE '100644', file TYPE ty_chmod VALUE '100644',
executable TYPE ty_chmod VALUE '100755', executable TYPE ty_chmod VALUE '100755',
@ -111,11 +136,13 @@ CONSTANTS: BEGIN OF gc_event_state,
no_more_act VALUE 4, no_more_act VALUE 4,
new_page_w_bookmark VALUE 5, new_page_w_bookmark VALUE 5,
go_back_to_bookmark VALUE 6, go_back_to_bookmark VALUE 6,
new_page_replacing VALUE 7,
END OF gc_event_state. END OF gc_event_state.
CONSTANTS: BEGIN OF gc_html_opt, CONSTANTS: BEGIN OF gc_html_opt,
emphas TYPE c VALUE 'E', emphas TYPE c VALUE 'E',
cancel TYPE c VALUE 'C', cancel TYPE c VALUE 'C',
crossout TYPE c VALUE 'X',
END OF gc_html_opt. END OF gc_html_opt.
CONSTANTS: BEGIN OF gc_action_type, CONSTANTS: BEGIN OF gc_action_type,
@ -128,7 +155,59 @@ CONSTANTS: gc_newline TYPE abap_char1 VALUE cl_abap_char_utilities=>newline.
CONSTANTS: gc_english TYPE spras VALUE 'E'. CONSTANTS: gc_english TYPE spras VALUE 'E'.
CONSTANTS: gc_abapgit_homepage TYPE string VALUE 'http://www.abapgit.org' ##NO_TEXT.
CONSTANTS: gc_root_dir TYPE string VALUE '/', CONSTANTS: gc_root_dir TYPE string VALUE '/',
gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT. gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT,
gc_author_regex TYPE string VALUE '^([\w\s\.@\-_1-9]+) <(.*)> (\d{10}) .\d{4}$' ##NO_TEXT.
CONSTANTS: BEGIN OF gc_action,
repo_clone TYPE string VALUE 'repo_clone',
repo_refresh TYPE string VALUE 'repo_refresh',
repo_remove TYPE string VALUE 'repo_remove',
repo_purge TYPE string VALUE 'repo_purge',
repo_newoffline TYPE string VALUE 'repo_newoffline',
repo_remote_attach TYPE string VALUE 'repo_remote_attach',
repo_remote_detach TYPE string VALUE 'repo_remote_detach',
repo_remote_change TYPE string VALUE 'repo_remote_change',
repo_refresh_checksums TYPE string VALUE 'repo_refresh_checksums',
repo_toggle_fav TYPE string VALUE 'repo_toggle_fav',
abapgit_home TYPE string VALUE 'abapgit_home',
abapgit_wiki TYPE string VALUE 'abapgit_wiki',
abapgit_install TYPE string VALUE 'abapgit_install',
abapgit_install_pi TYPE string VALUE 'abapgit_install_pi',
zip_import TYPE string VALUE 'zip_import',
zip_export TYPE string VALUE 'zip_export',
zip_package TYPE string VALUE 'zip_package',
zip_transport TYPE string VALUE 'zip_transport',
zip_object TYPE string VALUE 'zip_object',
git_pull TYPE string VALUE 'git_pull',
git_reset TYPE string VALUE 'git_reset',
git_branch_create TYPE string VALUE 'git_branch_create',
git_branch_switch TYPE string VALUE 'git_branch_switch',
git_branch_delete TYPE string VALUE 'git_branch_delete',
git_commit TYPE string VALUE 'git_commit',
db_delete TYPE string VALUE 'db_delete',
db_update TYPE string VALUE 'db_update',
db_display TYPE string VALUE 'db_display',
db_edit TYPE string VALUE 'db_edit',
bg_update TYPE string VALUE 'bg_update',
go_main TYPE string VALUE 'go_main',
go_explore TYPE string VALUE 'go_explore',
go_db TYPE string VALUE 'go_db',
go_background TYPE string VALUE 'go_background',
go_background_run TYPE string VALUE 'go_background_run',
go_diff TYPE string VALUE 'go_diff',
go_stage TYPE string VALUE 'go_stage',
go_commit TYPE string VALUE 'go_commit',
go_branch_overview TYPE string VALUE 'go_branch_overview',
go_playground TYPE string VALUE 'go_playground',
go_debuginfo TYPE string VALUE 'go_debuginfo',
go_settings TYPE STRING VALUE 'go_settings',
go_tutorial TYPE STRING VALUE 'go_tutorial',
jump TYPE string VALUE 'jump',
jump_pkg TYPE string VALUE 'jump_pkg',
END OF gc_action.

View File

@ -35,9 +35,12 @@ CLASS lcl_dot_abapgit DEFINITION CREATE PRIVATE FINAL FRIENDS ltcl_dot_abapgit.
* set_starting_folder * set_starting_folder
* IMPORTING iv_path TYPE string, * IMPORTING iv_path TYPE string,
get_master_language get_master_language
RETURNING VALUE(rv_language) TYPE spras. RETURNING VALUE(rv_language) TYPE spras,
* set_master_language * set_master_language
* IMPORTING iv_language TYPE spras. * IMPORTING iv_language TYPE spras.
get_signature
RETURNING VALUE(rs_signature) TYPE ty_file_signature
RAISING lcx_exception.
PRIVATE SECTION. PRIVATE SECTION.
TYPES: BEGIN OF ty_dot_abapgit, TYPES: BEGIN OF ty_dot_abapgit,
@ -207,4 +210,13 @@ CLASS lcl_dot_abapgit IMPLEMENTATION.
* ms_data-master_language = iv_language. * ms_data-master_language = iv_language.
* ENDMETHOD. * ENDMETHOD.
METHOD get_signature.
rs_signature-path = gc_root_dir.
rs_signature-filename = gc_dot_abapgit.
rs_signature-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob
iv_data = serialize( ) ).
ENDMETHOD. "get_signature
ENDCLASS. ENDCLASS.

View File

@ -5,8 +5,6 @@
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS LCX_EXCEPTION DEFINITION * CLASS LCX_EXCEPTION DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check FINAL. CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check FINAL.
PUBLIC SECTION. PUBLIC SECTION.
@ -27,8 +25,6 @@ ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS LCX_EXCEPTION IMPLEMENTATION * CLASS LCX_EXCEPTION IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcx_exception IMPLEMENTATION. CLASS lcx_exception IMPLEMENTATION.
METHOD constructor. METHOD constructor.
@ -48,8 +44,6 @@ ENDCLASS. "lcx_exception IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS LCX_NOT_FOUND DEFINITION * CLASS LCX_NOT_FOUND DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcx_not_found DEFINITION INHERITING FROM cx_static_check FINAL. CLASS lcx_not_found DEFINITION INHERITING FROM cx_static_check FINAL.
ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION
@ -57,8 +51,20 @@ ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS LCX_NOT_FOUND IMPLEMENTATION * CLASS LCX_NOT_FOUND IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcx_not_found IMPLEMENTATION. CLASS lcx_not_found IMPLEMENTATION.
ENDCLASS. "lcx_not_found IMPLEMENTATION ENDCLASS. "lcx_not_found IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS LCX_CANCEL DEFINITION
*----------------------------------------------------------------------*
CLASS lcx_cancel DEFINITION INHERITING FROM cx_static_check FINAL.
ENDCLASS. "lcx_cancel DEFINITION
*----------------------------------------------------------------------*
* CLASS LCX_CANCEL IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcx_cancel IMPLEMENTATION.
ENDCLASS. "lcx_cancel IMPLEMENTATION

View File

@ -5,9 +5,10 @@
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS lcl_file_status DEFINITION * CLASS lcl_file_status DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS ltcl_file_status DEFINITION DEFERRED.
*----------------------------------------------------------------------*
CLASS lcl_file_status DEFINITION FINAL. CLASS lcl_file_status DEFINITION FINAL
FRIENDS ltcl_file_status.
PUBLIC SECTION. PUBLIC SECTION.
@ -19,180 +20,272 @@ CLASS lcl_file_status DEFINITION FINAL.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS compare_files CLASS-METHODS calculate_status
IMPORTING it_repo TYPE ty_files_tt IMPORTING it_local TYPE ty_files_item_tt
is_gen TYPE ty_file it_remote TYPE ty_files_tt
RETURNING VALUE(rv_match) TYPE sap_bool it_cur_state TYPE ty_file_signatures_tt
RAISING lcx_exception. RETURNING VALUE(rt_results) TYPE ty_results_tt.
CLASS-METHODS:
build_existing
IMPORTING is_local TYPE ty_file_item
is_remote TYPE ty_file
it_state TYPE ty_file_signatures_ts
RETURNING VALUE(rs_result) TYPE ty_result,
build_new_local
IMPORTING is_local TYPE ty_file_item
RETURNING VALUE(rs_result) TYPE ty_result,
build_new_remote
IMPORTING is_remote TYPE ty_file
it_items TYPE ty_items_ts
it_state TYPE ty_file_signatures_ts
RETURNING VALUE(rs_result) TYPE ty_result,
identify_object
IMPORTING iv_filename TYPE string
EXPORTING es_item TYPE ty_item
ev_is_xml TYPE abap_bool.
ENDCLASS. "lcl_file_status DEFINITION ENDCLASS. "lcl_file_status DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS lcl_file_status IMPLEMENTATION * CLASS lcl_file_status IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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. METHOD status.
DATA: lv_pre TYPE tadir-obj_name, DATA: lv_index LIKE sy-tabix,
lt_files TYPE ty_files_tt, lo_dot_abapgit TYPE REF TO lcl_dot_abapgit.
ls_result LIKE LINE OF rt_results,
lv_type TYPE string,
ls_item TYPE ty_item,
lt_tadir TYPE 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, FIELD-SYMBOLS <ls_result> LIKE LINE OF rt_results.
<ls_tadir> LIKE LINE OF lt_tadir,
rt_results = calculate_status(
it_local = io_repo->get_files_local( io_log )
it_remote = io_repo->get_files_remote( )
it_cur_state = io_repo->get_local_checksums_per_file( ) ).
lo_dot_abapgit = io_repo->get_dot_abapgit( ).
" Remove ignored files, fix .abapgit
LOOP AT rt_results ASSIGNING <ls_result>.
lv_index = sy-tabix.
IF lo_dot_abapgit->is_ignored(
iv_path = <ls_result>-path
iv_filename = <ls_result>-filename ) = abap_true.
DELETE rt_results INDEX lv_index.
ENDIF.
ENDLOOP.
lcl_sap_package=>check(
io_log = io_log
it_results = rt_results
iv_start = lo_dot_abapgit->get_starting_folder( )
iv_top = io_repo->get_package( ) ).
ENDMETHOD. "status
METHOD calculate_status.
DATA: lt_remote LIKE it_remote,
lt_items TYPE ty_items_tt,
ls_item LIKE LINE OF lt_items,
lv_is_xml TYPE abap_bool,
lt_items_idx TYPE ty_items_ts,
lt_state_idx TYPE ty_file_signatures_ts. " Sorted by path+filename
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF it_remote,
<ls_result> LIKE LINE OF rt_results, <ls_result> LIKE LINE OF rt_results,
<ls_local> LIKE LINE OF lt_local, <ls_local> LIKE LINE OF it_local.
<ls_gen> LIKE LINE OF lt_files.
lt_remote = io_repo->get_files_remote( ). lt_state_idx = it_cur_state. " Force sort it
lt_local = io_repo->get_files_local( io_log ). lt_remote = it_remote.
SORT lt_remote BY path filename.
LOOP AT lt_remote ASSIGNING <ls_remote>. " Process local files and new local files
lcl_progress=>show( iv_key = 'Status' LOOP AT it_local ASSIGNING <ls_local>.
iv_current = sy-tabix APPEND INITIAL LINE TO rt_results ASSIGNING <ls_result>.
iv_total = lines( lt_remote ) IF <ls_local>-item IS NOT INITIAL.
iv_text = <ls_remote>-filename ) ##NO_TEXT. APPEND <ls_local>-item TO lt_items. " Collect for item index
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. ENDIF.
* handle namespaces READ TABLE lt_remote ASSIGNING <ls_remote>
REPLACE ALL OCCURRENCES OF '#' IN lv_pre WITH '/'. WITH KEY path = <ls_local>-file-path filename = <ls_local>-file-filename
BINARY SEARCH.
CLEAR ls_result. IF sy-subrc = 0. " Exist local and remote
ls_result-obj_type = lv_type. <ls_result> = build_existing(
ls_result-obj_name = lv_pre. is_local = <ls_local>
is_remote = <ls_remote>
CLEAR ls_item. it_state = lt_state_idx ).
ls_item-obj_type = lv_type. ASSERT <ls_remote>-sha1 IS NOT INITIAL.
ls_item-obj_name = lv_pre. CLEAR <ls_remote>-sha1. " Mark as processed
ELSE. " Only L exists
CLEAR lt_files. <ls_result> = build_new_local( is_local = <ls_local> ).
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. ENDIF.
ENDLOOP. ENDLOOP.
* add path information for files " Complete item index for unmarked remote files
LOOP AT lt_remote ASSIGNING <ls_remote>. LOOP AT lt_remote ASSIGNING <ls_remote> WHERE sha1 IS NOT INITIAL.
READ TABLE rt_results ASSIGNING <ls_result> WITH KEY filename = <ls_remote>-filename. identify_object( EXPORTING iv_filename = <ls_remote>-filename
IF sy-subrc = 0. IMPORTING es_item = ls_item
<ls_result>-path = <ls_remote>-path. ev_is_xml = lv_is_xml ).
ENDIF.
CHECK lv_is_xml = abap_true. " Skip all but obj definitions
ls_item-devclass = lcl_tadir=>get_object_package(
iv_object = ls_item-obj_type
iv_obj_name = ls_item-obj_name ).
APPEND ls_item TO lt_items.
ENDLOOP. ENDLOOP.
* find objects only existing locally SORT lt_items. " Default key - type, name, pkg
lt_tadir = lcl_tadir=>read( io_repo->get_package( ) ). DELETE ADJACENT DUPLICATES FROM lt_items.
LOOP AT lt_tadir ASSIGNING <ls_tadir>. lt_items_idx = lt_items. " Self protection + UNIQUE records assertion
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. " Process new remote files (marked above with empty SHA1)
ls_result-match = abap_true. LOOP AT lt_remote ASSIGNING <ls_remote> WHERE sha1 IS NOT INITIAL.
ls_result-obj_type = <ls_tadir>-object. APPEND INITIAL LINE TO rt_results ASSIGNING <ls_result>.
ls_result-obj_name = <ls_tadir>-obj_name. <ls_result> = build_new_remote( is_remote = <ls_remote>
APPEND ls_result TO rt_results. it_items = lt_items_idx
ENDIF. it_state = lt_state_idx ).
LOOP AT rt_results ASSIGNING <ls_result>
WHERE obj_type = <ls_tadir>-object
AND obj_name = <ls_tadir>-obj_name
AND path IS INITIAL.
* new file added locally to existing object
<ls_result>-path = io_repo->get_dot_abapgit( )->get_starting_folder( ) && <ls_tadir>-path.
ENDLOOP.
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. ENDLOOP.
SORT rt_results BY SORT rt_results BY
obj_type ASCENDING obj_type ASCENDING
obj_name ASCENDING obj_name ASCENDING
filename ASCENDING. filename ASCENDING.
DELETE ADJACENT DUPLICATES FROM rt_results
COMPARING obj_type obj_name filename.
lcl_sap_package=>check( ENDMETHOD. "calculate_status.
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 METHOD identify_object.
DATA: lv_name TYPE tadir-obj_name,
lv_type TYPE string,
lv_ext TYPE string.
" Guess object type and name
SPLIT to_upper( iv_filename ) AT '.' INTO lv_name lv_type lv_ext.
" Handle namespaces
REPLACE ALL OCCURRENCES OF '#' IN lv_name WITH '/'.
CLEAR es_item.
es_item-obj_type = lv_type.
es_item-obj_name = lv_name.
ev_is_xml = boolc( lv_ext = 'XML' AND strlen( lv_type ) = 4 ).
ENDMETHOD. "identify_object.
METHOD build_existing.
DATA: ls_file_sig LIKE LINE OF it_state.
" Item
rs_result-obj_type = is_local-item-obj_type.
rs_result-obj_name = is_local-item-obj_name.
rs_result-package = is_local-item-devclass.
" File
rs_result-path = is_local-file-path.
rs_result-filename = is_local-file-filename.
" Match against current state
READ TABLE it_state INTO ls_file_sig
WITH KEY path = is_local-file-path filename = is_local-file-filename
BINARY SEARCH.
IF sy-subrc = 0.
IF ls_file_sig-sha1 <> is_local-file-sha1.
rs_result-lstate = gc_state-modified.
ENDIF.
IF ls_file_sig-sha1 <> is_remote-sha1.
rs_result-rstate = gc_state-modified.
ENDIF.
rs_result-match = boolc( rs_result-lstate IS INITIAL AND rs_result-rstate IS INITIAL ).
ELSE.
" This is a strange situation. As both local and remote exist
" the state should also be present. Maybe this is a first run of the code.
" In this case just compare hashes directly and mark both changed
" the user will presumably decide what to do after checking the actual diff
rs_result-match = boolc( is_local-file-sha1 = is_remote-sha1 ).
IF rs_result-match = abap_false.
rs_result-lstate = gc_state-modified.
rs_result-rstate = gc_state-modified.
ENDIF.
ENDIF.
ENDMETHOD. "build_existing
METHOD build_new_local.
" Item
rs_result-obj_type = is_local-item-obj_type.
rs_result-obj_name = is_local-item-obj_name.
rs_result-package = is_local-item-devclass.
" File
rs_result-path = is_local-file-path.
rs_result-filename = is_local-file-filename.
" Match
rs_result-match = abap_false.
rs_result-lstate = gc_state-added.
ENDMETHOD. "build_new_local
METHOD build_new_remote.
DATA: ls_item LIKE LINE OF it_items,
ls_file_sig LIKE LINE OF it_state.
" Common and default part
rs_result-path = is_remote-path.
rs_result-filename = is_remote-filename.
rs_result-match = abap_false.
rs_result-rstate = gc_state-added.
identify_object( EXPORTING iv_filename = is_remote-filename
IMPORTING es_item = ls_item ).
" Check if in item index + get package
READ TABLE it_items INTO ls_item
WITH KEY obj_type = ls_item-obj_type obj_name = ls_item-obj_name
BINARY SEARCH.
IF sy-subrc = 0.
" Completely new (xml, abap) and new file in an existing object
rs_result-obj_type = ls_item-obj_type.
rs_result-obj_name = ls_item-obj_name.
rs_result-package = ls_item-devclass.
READ TABLE it_state INTO ls_file_sig
WITH KEY path = is_remote-path filename = is_remote-filename
BINARY SEARCH.
" Existing file but from another package
" was not added during local file proc as was not in tadir for repo package
IF sy-subrc = 0.
IF ls_file_sig-sha1 = is_remote-sha1.
rs_result-match = abap_true.
CLEAR rs_result-rstate.
ELSE.
rs_result-rstate = gc_state-modified.
ENDIF.
" Item is in state and in cache but with no package - it was deleted
IF ls_item-devclass IS INITIAL.
rs_result-match = abap_false.
rs_result-lstate = gc_state-deleted.
ENDIF.
ENDIF.
ELSE. " Completely unknown file, probably non-abapgit
ASSERT 1 = 1. " No action, just follow defaults
ENDIF.
ENDMETHOD. "build_new_remote
ENDCLASS. "lcl_file_status IMPLEMENTATION ENDCLASS. "lcl_file_status IMPLEMENTATION

View File

@ -2,7 +2,6 @@
*& Include ZABAPGIT_FORMS *& Include ZABAPGIT_FORMS
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
*& Form run *& Form run
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
@ -22,7 +21,7 @@ FORM run.
ENDIF. ENDIF.
TRY. TRY.
lcl_persistence_migrate=>run( ). lcl_migrations=>run( ).
lcl_app=>run( ). lcl_app=>run( ).
CATCH lcx_exception INTO lx_exception. CATCH lcx_exception INTO lx_exception.
MESSAGE lx_exception->mv_text TYPE 'E'. MESSAGE lx_exception->mv_text TYPE 'E'.

View File

@ -34,12 +34,7 @@ CLASS lcl_git_transport DEFINITION FINAL.
RETURNING VALUE(ro_branch_list) TYPE REF TO lcl_git_branch_list RETURNING VALUE(ro_branch_list) TYPE REF TO lcl_git_branch_list
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS class_constructor.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-DATA: gv_agent TYPE string.
CONSTANTS: BEGIN OF c_service, CONSTANTS: BEGIN OF c_service,
receive TYPE string VALUE 'receive', "#EC NOTEXT receive TYPE string VALUE 'receive', "#EC NOTEXT
upload TYPE string VALUE 'upload', "#EC NOTEXT upload TYPE string VALUE 'upload', "#EC NOTEXT
@ -48,7 +43,7 @@ CLASS lcl_git_transport DEFINITION FINAL.
CLASS-METHODS branch_list CLASS-METHODS branch_list
IMPORTING iv_url TYPE string IMPORTING iv_url TYPE string
iv_service TYPE string iv_service TYPE string
EXPORTING ei_client TYPE REF TO if_http_client EXPORTING eo_client TYPE REF TO lcl_http_client
eo_branch_list TYPE REF TO lcl_git_branch_list eo_branch_list TYPE REF TO lcl_git_branch_list
RAISING lcx_exception. RAISING lcx_exception.
@ -56,7 +51,7 @@ CLASS lcl_git_transport DEFINITION FINAL.
IMPORTING iv_url TYPE string IMPORTING iv_url TYPE string
iv_service TYPE string iv_service TYPE string
iv_branch_name TYPE string iv_branch_name TYPE string
EXPORTING ei_client TYPE REF TO if_http_client EXPORTING eo_client TYPE REF TO lcl_http_client
ev_branch TYPE ty_sha1 ev_branch TYPE ty_sha1
RAISING lcx_exception. RAISING lcx_exception.
@ -65,30 +60,6 @@ CLASS lcl_git_transport DEFINITION FINAL.
CHANGING cv_data TYPE xstring CHANGING cv_data TYPE xstring
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS set_headers
IMPORTING iv_url TYPE string
iv_service TYPE string
ii_client TYPE REF TO if_http_client
RAISING lcx_exception.
CLASS-METHODS check_http_200
IMPORTING ii_client TYPE REF TO if_http_client
RAISING lcx_exception.
CLASS-METHODS send_receive
IMPORTING ii_client TYPE REF TO if_http_client
RAISING lcx_exception.
CLASS-METHODS check_auth_requested
IMPORTING ii_client TYPE REF TO if_http_client
RETURNING VALUE(rv_auth_requested) TYPE abap_bool
RAISING lcx_exception.
CLASS-METHODS acquire_login_details
IMPORTING ii_client TYPE REF TO if_http_client
iv_url TYPE string
RAISING lcx_exception.
ENDCLASS. "lcl_transport DEFINITION ENDCLASS. "lcl_transport DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -189,114 +160,6 @@ ENDCLASS. "lcl_pack DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_git_transport IMPLEMENTATION. CLASS lcl_git_transport IMPLEMENTATION.
METHOD class_constructor.
* bitbucket require agent prefix = "git/"
gv_agent = 'git/abapGit-' && gc_abap_version.
ENDMETHOD. "class_constructor
METHOD set_headers.
DATA: lv_value TYPE string.
ii_client->request->set_header_field(
name = '~request_method'
value = 'POST' ).
lv_value = lcl_url=>path_name( iv_url ) &&
'.git/git-' &&
iv_service &&
'-pack'.
ii_client->request->set_header_field(
name = '~request_uri'
value = lv_value ).
lv_value = 'application/x-git-'
&& iv_service && '-pack-request'. "#EC NOTEXT
ii_client->request->set_header_field(
name = 'Content-Type'
value = lv_value ). "#EC NOTEXT
lv_value = 'application/x-git-'
&& iv_service && '-pack-result'. "#EC NOTEXT
ii_client->request->set_header_field(
name = 'Accept'
value = lv_value ). "#EC NOTEXT
ENDMETHOD. "set_headers
METHOD check_http_200.
DATA: lv_code TYPE i.
ii_client->response->get_status(
IMPORTING
code = lv_code ).
CASE lv_code.
WHEN 200.
RETURN.
WHEN 302.
lcx_exception=>raise( 'HTTP redirect, check URL' ).
WHEN 401.
lcx_exception=>raise( 'HTTP 401, unauthorized' ).
WHEN 403.
lcx_exception=>raise( 'HTTP 403, forbidden' ).
WHEN 404.
lcx_exception=>raise( 'HTTP 404, not found' ).
WHEN 415.
lcx_exception=>raise( 'HTTP 415, unsupported media type' ).
WHEN OTHERS.
lcx_exception=>raise( 'HTTP error code' ).
ENDCASE.
ENDMETHOD. "http_200
METHOD check_auth_requested.
DATA: lv_code TYPE i.
ii_client->response->get_status(
IMPORTING
code = lv_code ).
IF lv_code = 401.
rv_auth_requested = abap_true.
ENDIF.
ENDMETHOD. "check_auth_requested
METHOD acquire_login_details.
DATA:
lv_default_user TYPE string,
lv_user TYPE string,
lv_pass TYPE string.
lv_default_user = lcl_app=>user( )->get_repo_username( iv_url = iv_url ).
lv_user = lv_default_user.
lcl_password_dialog=>popup(
EXPORTING
iv_repo_url = iv_url
CHANGING
cv_user = lv_user
cv_pass = lv_pass ).
IF lv_user IS INITIAL.
lcx_exception=>raise( 'HTTP 401, unauthorized' ).
ENDIF.
IF lv_user <> lv_default_user.
lcl_app=>user( )->set_repo_username( iv_url = iv_url iv_username = lv_user ).
ENDIF.
ii_client->authenticate(
username = lv_user
password = lv_pass ).
ENDMETHOD. "acquire_login_details
METHOD find_branch. METHOD find_branch.
DATA: lo_branch_list TYPE REF TO lcl_git_branch_list. DATA: lo_branch_list TYPE REF TO lcl_git_branch_list.
@ -306,7 +169,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
iv_url = iv_url iv_url = iv_url
iv_service = iv_service iv_service = iv_service
IMPORTING IMPORTING
ei_client = ei_client eo_client = eo_client
eo_branch_list = lo_branch_list ). eo_branch_list = lo_branch_list ).
IF ev_branch IS SUPPLIED. IF ev_branch IS SUPPLIED.
@ -317,7 +180,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
METHOD branches. METHOD branches.
DATA: li_client TYPE REF TO if_http_client. DATA: lo_client TYPE REF TO lcl_http_client.
lcl_git_transport=>branch_list( lcl_git_transport=>branch_list(
@ -325,98 +188,33 @@ CLASS lcl_git_transport IMPLEMENTATION.
iv_url = iv_url iv_url = iv_url
iv_service = c_service-upload iv_service = c_service-upload
IMPORTING IMPORTING
ei_client = li_client eo_client = lo_client
eo_branch_list = ro_branch_list ). eo_branch_list = ro_branch_list ).
li_client->close( ).
lo_client->close( ).
ENDMETHOD. "branches ENDMETHOD. "branches
METHOD branch_list. METHOD branch_list.
DATA: lv_data TYPE string, DATA: lv_data TYPE string.
lv_uri TYPE string,
lv_expect_potentual_auth TYPE abap_bool.
cl_http_client=>create_by_url( eo_client = lcl_http=>create_by_url(
iv_url = iv_url
iv_service = iv_service ).
lv_data = eo_client->get_cdata( ).
CREATE OBJECT eo_branch_list
EXPORTING EXPORTING
url = lcl_url=>host( iv_url ) iv_data = lv_data.
ssl_id = 'ANONYM'
IMPORTING
client = ei_client ).
ei_client->request->set_cdata( '' ).
ei_client->request->set_header_field(
name = '~request_method'
value = 'GET' ).
ei_client->request->set_header_field(
name = 'user-agent'
value = gv_agent ). "#EC NOTEXT
lv_uri = lcl_url=>path_name( iv_url ) &&
'.git/info/refs?service=git-' &&
iv_service &&
'-pack'.
ei_client->request->set_header_field(
name = '~request_uri'
value = lv_uri ).
" Disable internal auth dialog (due to its unclarity)
ei_client->propertytype_logon_popup = if_http_client=>co_disabled.
lv_expect_potentual_auth = boolc(
lcl_login_manager=>load( iv_uri = iv_url
ii_client = ei_client ) IS INITIAL ).
send_receive( ei_client ).
IF lv_expect_potentual_auth = abap_true
AND check_auth_requested( ei_client ) = abap_true.
acquire_login_details( ii_client = ei_client iv_url = iv_url ).
send_receive( ei_client ).
ENDIF.
check_http_200( ei_client ).
lcl_login_manager=>save( iv_uri = iv_url
ii_client = ei_client ).
lv_data = ei_client->response->get_cdata( ).
create object eo_branch_list exporting iv_data = lv_data.
ENDMETHOD. "branch_list ENDMETHOD. "branch_list
METHOD send_receive.
DATA lv_text TYPE string.
ii_client->send( ).
ii_client->receive(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
" make sure:
" a) SSL is setup properly in STRUST
" b) no firewalls
" check trace file in transaction SMICM
lv_text = 'HTTP Communication Failure'. "#EC NOTEXT
WHEN 2.
lv_text = 'HTTP Invalid State'. "#EC NOTEXT
WHEN 3.
lv_text = 'HTTP Processing failed'. "#EC NOTEXT
WHEN OTHERS.
lv_text = 'Another error occured'. "#EC NOTEXT
ENDCASE.
lcx_exception=>raise( lv_text ).
ENDIF.
ENDMETHOD. "send_receive
METHOD receive_pack. METHOD receive_pack.
DATA: li_client TYPE REF TO if_http_client, DATA: lo_client TYPE REF TO lcl_http_client,
lv_cmd_pkt TYPE string, lv_cmd_pkt TYPE string,
lv_line TYPE string, lv_line TYPE string,
lv_tmp TYPE xstring, lv_tmp TYPE xstring,
@ -432,14 +230,13 @@ CLASS lcl_git_transport IMPLEMENTATION.
iv_service = c_service-receive iv_service = c_service-receive
iv_branch_name = iv_branch_name iv_branch_name = iv_branch_name
IMPORTING IMPORTING
ei_client = li_client ). eo_client = lo_client ).
set_headers( lo_client->set_headers(
iv_url = iv_url iv_url = iv_url
iv_service = c_service-receive iv_service = c_service-receive ).
ii_client = li_client ).
lv_cap_list = 'report-status agent=' && gv_agent ##NO_TEXT. lv_cap_list = 'report-status agent=' && lcl_http=>get_agent( ) ##NO_TEXT.
lv_line = iv_old && lv_line = iv_old &&
` ` && ` ` &&
@ -457,13 +254,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE. CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE.
li_client->request->set_data( lv_xstring ). lv_xstring = lo_client->send_receive_close( lv_xstring ).
send_receive( li_client ).
check_http_200( li_client ).
lv_xstring = li_client->response->get_data( ).
li_client->close( ).
lv_string = lcl_convert=>xstring_to_string_utf8( lv_xstring ). lv_string = lcl_convert=>xstring_to_string_utf8( lv_xstring ).
IF NOT lv_string CP '*unpack ok*'. IF NOT lv_string CP '*unpack ok*'.
@ -512,7 +303,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
METHOD upload_pack. METHOD upload_pack.
DATA: li_client TYPE REF TO if_http_client, DATA: lo_client TYPE REF TO lcl_http_client,
lv_buffer TYPE string, lv_buffer TYPE string,
lv_xstring TYPE xstring, lv_xstring TYPE xstring,
lv_line TYPE string, lv_line TYPE string,
@ -531,7 +322,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
iv_service = c_service-upload iv_service = c_service-upload
iv_branch_name = io_repo->get_branch_name( ) iv_branch_name = io_repo->get_branch_name( )
IMPORTING IMPORTING
ei_client = li_client eo_client = lo_client
ev_branch = ev_branch ). ev_branch = ev_branch ).
IF it_branches IS INITIAL. IF it_branches IS INITIAL.
@ -541,13 +332,12 @@ CLASS lcl_git_transport IMPLEMENTATION.
lt_branches = it_branches. lt_branches = it_branches.
ENDIF. ENDIF.
set_headers( iv_url = io_repo->get_url( ) lo_client->set_headers( iv_url = io_repo->get_url( )
iv_service = c_service-upload iv_service = c_service-upload ).
ii_client = li_client ).
LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>. LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>.
IF sy-tabix = 1. IF sy-tabix = 1.
lv_capa = 'side-band-64k no-progress agent=' && gv_agent ##NO_TEXT. lv_capa = 'side-band-64k no-progress multi_ack agent=' && lcl_http=>get_agent( ) ##NO_TEXT.
lv_line = 'want' && ` ` && <ls_branch>-sha1 lv_line = 'want' && ` ` && <ls_branch>-sha1
&& ` ` && lv_capa && gc_newline. "#EC NOTEXT && ` ` && lv_capa && gc_newline. "#EC NOTEXT
ELSE. ELSE.
@ -565,12 +355,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
&& '0000' && '0000'
&& '0009done' && gc_newline. && '0009done' && gc_newline.
* do not use set_cdata as it modifies the Content-Type header field lv_xstring = lo_client->send_receive_close( lcl_convert=>string_to_xstring_utf8( lv_buffer ) ).
li_client->request->set_data( lcl_convert=>string_to_xstring_utf8( lv_buffer ) ).
send_receive( li_client ).
check_http_200( li_client ).
lv_xstring = li_client->response->get_data( ).
li_client->close( ).
parse( IMPORTING ev_pack = lv_pack parse( IMPORTING ev_pack = lv_pack
CHANGING cv_data = lv_xstring ). CHANGING cv_data = lv_xstring ).
@ -1285,7 +1070,8 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain.
IMPORTING io_repo TYPE REF TO lcl_repo_online IMPORTING io_repo TYPE REF TO lcl_repo_online
is_comment TYPE ty_comment is_comment TYPE ty_comment
io_stage TYPE REF TO lcl_stage io_stage TYPE REF TO lcl_stage
RETURNING VALUE(rv_branch) TYPE ty_sha1 EXPORTING ev_branch TYPE ty_sha1
et_updated_files TYPE ty_file_signatures_tt
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS create_branch CLASS-METHODS create_branch
@ -1489,10 +1275,13 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
lt_stage TYPE lcl_stage=>ty_stage_tt. lt_stage TYPE lcl_stage=>ty_stage_tt.
FIELD-SYMBOLS: <ls_stage> LIKE LINE OF lt_stage, FIELD-SYMBOLS: <ls_stage> LIKE LINE OF lt_stage,
<ls_updated> LIKE LINE OF et_updated_files,
<ls_branch> LIKE LINE OF lt_branches, <ls_branch> LIKE LINE OF lt_branches,
<ls_exp> LIKE LINE OF lt_expanded. <ls_exp> LIKE LINE OF lt_expanded.
CLEAR et_updated_files.
IF io_stage->get_branch_sha1( ) = io_repo->get_sha1_remote( ). IF io_stage->get_branch_sha1( ) = io_repo->get_sha1_remote( ).
* objects cached in io_repo can be used, if pushing to the branch configured in repo * objects cached in io_repo can be used, if pushing to the branch configured in repo
lt_objects = io_repo->get_objects( ). lt_objects = io_repo->get_objects( ).
@ -1511,6 +1300,11 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
lt_stage = io_stage->get_all( ). lt_stage = io_stage->get_all( ).
LOOP AT lt_stage ASSIGNING <ls_stage>. LOOP AT lt_stage ASSIGNING <ls_stage>.
" Save file ref to updated files table
APPEND INITIAL LINE TO et_updated_files ASSIGNING <ls_updated>.
MOVE-CORRESPONDING <ls_stage>-file TO <ls_updated>.
CASE <ls_stage>-method. CASE <ls_stage>-method.
WHEN lcl_stage=>c_method-add. WHEN lcl_stage=>c_method-add.
@ -1531,11 +1325,17 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
IF <ls_exp>-sha1 <> lv_sha1. IF <ls_exp>-sha1 <> lv_sha1.
<ls_exp>-sha1 = lv_sha1. <ls_exp>-sha1 = lv_sha1.
ENDIF. ENDIF.
<ls_updated>-sha1 = lv_sha1. "New sha1
WHEN lcl_stage=>c_method-rm. WHEN lcl_stage=>c_method-rm.
DELETE lt_expanded DELETE lt_expanded
WHERE name = <ls_stage>-file-filename WHERE name = <ls_stage>-file-filename
AND path = <ls_stage>-file-path. AND path = <ls_stage>-file-path.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
CLEAR <ls_updated>-sha1. " Mark as deleted
WHEN OTHERS. WHEN OTHERS.
lcx_exception=>raise( 'stage method not supported, todo' ). lcx_exception=>raise( 'stage method not supported, todo' ).
ENDCASE. ENDCASE.
@ -1543,7 +1343,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
lt_trees = build_trees( lt_expanded ). lt_trees = build_trees( lt_expanded ).
rv_branch = receive_pack( is_comment = is_comment ev_branch = receive_pack( is_comment = is_comment
io_repo = io_repo io_repo = io_repo
it_trees = lt_trees it_trees = lt_trees
it_blobs = lt_blobs it_blobs = lt_blobs
@ -1763,6 +1563,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
ls_file-path = iv_path. ls_file-path = iv_path.
ls_file-filename = <ls_node>-name. ls_file-filename = <ls_node>-name.
ls_file-data = <ls_blob>-data. ls_file-data = <ls_blob>-data.
ls_file-sha1 = <ls_blob>-sha1.
APPEND ls_file TO ct_files. APPEND ls_file TO ct_files.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.

View File

@ -268,7 +268,7 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
METHOD is_ignored. METHOD is_ignored.
IF iv_branch_name EQ 'refs/heads/gh-pages'. " Github pages IF iv_branch_name = 'refs/heads/gh-pages'. " Github pages
rv_ignore = abap_true. rv_ignore = abap_true.
ENDIF. ENDIF.
@ -302,7 +302,6 @@ CLASS lcl_git_branch_list IMPLEMENTATION.
IF iv_branch_name CP 'refs/tags/*'. IF iv_branch_name CP 'refs/tags/*'.
rv_type = c_type-tag. rv_type = c_type-tag.
RETURN.
ENDIF. ENDIF.
ENDMETHOD. "get_type ENDMETHOD. "get_type

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,414 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_GUI_ASSET_MANAGER
*&---------------------------------------------------------------------*
CLASS lcl_gui_asset_manager DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_gui.
PUBLIC SECTION.
METHODS get_asset
IMPORTING iv_asset_name TYPE string
RETURNING VALUE(rv_data) TYPE xstring
RAISING lcx_exception.
METHODS get_images
RETURNING VALUE(rt_images) TYPE tt_web_assets.
PRIVATE SECTION.
METHODS get_inline_asset
IMPORTING iv_asset_name TYPE string
RETURNING VALUE(rv_data) TYPE xstring
RAISING lcx_exception.
METHODS get_mime_asset
IMPORTING iv_asset_name TYPE c
RETURNING VALUE(rv_data) TYPE xstring
RAISING lcx_exception.
METHODS get_inline_images
RETURNING VALUE(rt_images) TYPE tt_web_assets.
ENDCLASS. "lcl_gui_asset_manager
CLASS lcl_gui_asset_manager IMPLEMENTATION.
METHOD get_asset.
DATA: lv_asset_name TYPE string,
lv_mime_name TYPE wwwdatatab-objid.
lv_asset_name = to_upper( iv_asset_name ).
CASE lv_asset_name.
WHEN 'CSS_COMMON'.
lv_mime_name = 'ZABAPGIT_CSS_COMMON'.
WHEN 'JS_COMMON'.
lv_mime_name = 'ZABAPGIT_JS_COMMON'.
WHEN OTHERS.
lcx_exception=>raise( |Improper resource name: { iv_asset_name }| ).
ENDCASE.
rv_data = get_mime_asset( lv_mime_name ).
IF rv_data IS INITIAL. " Fallback to inline asset
rv_data = get_inline_asset( lv_asset_name ).
ENDIF.
IF rv_data IS INITIAL.
lcx_exception=>raise( |Failed to get GUI resource: { iv_asset_name }| ).
ENDIF.
ENDMETHOD. " get_asset.
METHOD get_mime_asset.
DATA: ls_key TYPE wwwdatatab,
lv_size_c TYPE wwwparams-value,
lv_size TYPE i,
lt_w3mime TYPE STANDARD TABLE OF w3mime.
ls_key-relid = 'MI'.
ls_key-objid = iv_asset_name.
" Get exact file size
CALL FUNCTION 'WWWPARAMS_READ'
EXPORTING
relid = ls_key-relid
objid = ls_key-objid
name = 'filesize'
IMPORTING
value = lv_size_c
EXCEPTIONS
entry_not_exists = 1.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
lv_size = lv_size_c.
" Get binary data
CALL FUNCTION 'WWWDATA_IMPORT'
EXPORTING
key = ls_key
TABLES
mime = lt_w3mime
EXCEPTIONS
wrong_object_type = 1
import_error = 2.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = rv_data
TABLES
binary_tab = lt_w3mime
EXCEPTIONS
failed = 1.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
ENDMETHOD. " get_mime_asset.
METHOD get_images.
FIELD-SYMBOLS <image> LIKE LINE OF rt_images.
rt_images = get_inline_images( ).
" Convert to xstring
LOOP AT rt_images ASSIGNING <image>.
CALL FUNCTION 'SSFC_BASE64_DECODE'
EXPORTING
b64data = <image>-base64
IMPORTING
bindata = <image>-content
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0. " Image data error
ENDLOOP.
ENDMETHOD. " get_images.
DEFINE _inline.
APPEND &1 TO lt_data.
END-OF-DEFINITION.
METHOD get_inline_asset.
DATA: lt_data TYPE ty_string_tt,
lv_str TYPE string.
CASE iv_asset_name.
WHEN 'CSS_COMMON'.
" @@abapmerge include zabapgit_css_common.w3mi.data.css > _inline '$$'.
WHEN 'JS_COMMON'.
" @@abapmerge include zabapgit_js_common.w3mi.data.js > _inline '$$'.
WHEN OTHERS.
lcx_exception=>raise( |No inline resource: { iv_asset_name }| ).
ENDCASE.
CONCATENATE LINES OF lt_data INTO lv_str SEPARATED BY gc_newline.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_str
IMPORTING
buffer = rv_data
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0.
ENDMETHOD. " get_inline_asset.
METHOD get_inline_images.
DATA ls_image TYPE ty_web_asset.
* see https://github.com/larshp/abapGit/issues/201 for source SVG
ls_image-url = 'img/logo' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAKMAAAAoCAYAAACSG0qbAAAABHNCSVQICAgIfAhkiAAA'
&& 'AAlwSFlzAAAEJQAABCUBprHeCQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9y'
&& 'Z5vuPBoAAA8VSURBVHic7Zx7cJzVeYef31nJAtvYko1JjM3FYHlXimwZkLWyLEMcwIGQ'
&& 'cEkDJWmTltLStGkoDCkzwBAuCemUlksDNCkhJTTTljJpZhIuBQxxAWPvyuYiW7UkG8Il'
&& 'UByIsS1sLEu75+0fu5JXu9/etAJz0TOzM/rOec85765+37m+3yczY8w0NU3qrwv9npfa'
&& 'Hfx02pPPd469sgk+7misYnyjpWXy5IOG7kd8ZjjNjEtr13TdOm7eTfCxwo2lUJAQASRu'
&& '2dnRfMn4uDbBx42yxZhPiMNMCHKCsVK2GGuqqqoQUwrZTAhygrFQshjfaGmZ/M7yxQtm'
&& 'xGL9/qDqzwLxQvYTgpygXEoS4/DQ7LE1O05atLBu1YZdE4KcYLwpupoOmCO+5Z2dXPfE'
&& 'xk07Tm2ZroGhBwX1wAygKqiOiVX2Rw9Jam/gyH0wuGGzvTEudRYSY4HFyogghxN2n7Sw'
&& 'IendvcCioLoOtCCXNeqohOf0oDwPq9f3Wt/77dOHlWhYzUj/BRybTnrGEnZO5wv2m0rq'
&& 'DezJoOiqeZbzegzpk6TVPPWJTT39y5svMogF1ZcesjlQgkwYp4F+EJQXwv4E+MiLUZJa'
&& 'F7AIcRq4hWZ2mMRhQD/oZcErXv7FScaja3rt/wpU9E/sFyLACQq57wB/XIl/gWIstn2T'
&& 'xpHVre7ZW71p8sFDeQscSEHKu3pTBadNH2Lq61VT57iwNazLgaNSqYaUaWXLDZCJIbBo'
&& 'g3tK2A2xHns0oMrm3CRrqdTPnAVMiUIEmLlz2XGLMxNmH7YrifFcoUIHalHj8f8p6UfA'
&& 'O+932weStno1zghps6Q7GBFiUYRxopkeaZ2vIwLyfxtQ4vV8lbWHNScacf+T/vwqn90o'
&& 'MZYhRADJ+bv725vmj6Q8tHWffPKUD6IgO/tsfawneRHYd97Pdg8kSyJaZiGtBY4pYPYO'
&& 'kH84C0Cyv8tKSiK7OZ99EpYAJ2V8AhkRY5lCHGaxhaq+BLCzY/EXd5y0aOG0td1vf1AF'
&& 'CWCw7/1u80DQEtahQvcB03MyjQfM7Hwnmxfv9dPivX5SssqOwuzPSqk71mN3ymw5ZtdK'
&& 'dmVIdly8xx7JZ29yy0qptwrGLMRRCA6T1w93nLTo5Lq13Zv625tOMRd6DLF4v0lWmQO8'
&& 'qPko45y7TWaHZyUnwa6M99mN2fYbuu1V4K5oxF1B4Z4UgFifrQHWFLNbvkh1QheV5DNN'
&& 'TZMqFWIGs5zX48M95PTqGa3TZ4erzbvj8/WUErf0L2++uNyGJLn2Js1oDeuYlkbNbmlR'
&& 'deXup2hq0qS2es2VlHMDFaOlRdXL5uuwlnodG23QTEljCkbJV3d7WHOK+dXWqHqZnZeb'
&& 'Y1fGe3OFOArRU5GTGbSHNWdwUL8Epo1qIQ9V/bXu3HES4jCznNfjb7e1zZ8Ri/UD1MLz'
&& 'u05s/huMx4IKGNy4+8Tj/2Pqk8++Vaji86TQqxEuNNM5rWGtSCaokSDkgd0QjbidoPvN'
&& '+5s7t9jz5TgdbdBMvLsG2cop6FgLUdUaZk804jYKuyrWa6vzlT2+XrOqQnxd6KwQOj5R'
&& 'hULpL9Yaxkcj7g3QT6zK397ZbdtGtbtAZ+B0U3adkt0c67E7OyI6fFDuSpktC6HGpJjU'
&& 'GmZ3NOI2mdnVnX32eHZZ7903hGXfBG8mp3J7sd/B0DPCTgUmBf9O7lmMybk56or3Jn8f'
&& 'oLVB7Q5dZ9Iy4OBsw2jYbUUk96fwQrzHf955iBZzsDA+aL9k1owZ20fNzaY/tfFXwK48'
&& 'ldQkSZ5YqJXmZk15JaJfmOmfgdOAmgCzWrCvyum5aIO+Uor3AIbOx7QV2TeBMPu3vKYA'
&& 'Sw091hbWt4PKRhu0oDqkmND1wAnk3vkOmAN2lRLa2hrWMVm5Tek2R3286YzWiK4eQltk'
&& '9g1gMfsFMhVYKunR1obQddk+SXZqwLe8acMGe7fYb9HZk7wm3utrBmpsqiXsyClHMHK6'
&& '0hLWoRjHBfmLbP9K3bPYjFPIFWLaQeZnlZ8H4JyFflrMwcK4wG63v3/ycZnXOzqalxE0'
&& 'mU7x9rvvVv93oVZqBtzNGGeU7Jbp9pZGzS7ReiVQVyDfmXRda4PaA9p5mBLmWGmmSron'
&& 'M0FytUGGgjPTAi8UIeVk9u1og5YOJ0QbNBOjIac+Y22JPgLQ1WV7Ol+w36xebYnhtGpj'
&& 'FjBYTj3l4KY9/dx6My4d74pN/Ki/Y9HpSG5HR/Nyh/1DHtO9OM6dvWFDwbtWslOykt6U'
&& 's5VWZbOFnQtsyMqvc56Ty3T7NeBhLGAfDZDpe5nX6V5uXpbZ43K2NGQ2V9glwLas/I62'
&& 'hfrE8EWsJ3mFsGYs+OQqze+A1cBLgbmma4f/9AmOJGBe5vKVLYN1W6wnOWSHmdkVhexM'
&& 'PG6yC0x2AbmjoQ3njdh4uwrSw1Htmq5bd3Y0I3FLpQ5n0GTSQ7s6Fva70RPYTPbi+Pz0'
&& 'J7ryboRC+m5PnRfsJjVEAfp5bLNflTb52dKIBj36RWY5ZyX2WCLukvbX67ZYHFLHZtGw'
&& '+1fD/jDL8qQljWpav9m6Uw3wKYzXgUNJTxsk+0Fssw0L6x+j4dCx6eF/BEtwDBkbx7Fe'
&& '29gWCa0yrC2rvXXO26WZfrWG3V2kji8zWbm0QUev67GX5ZgZ8A0H121hXIIZNrxou9oW'
&& '6m4b4m/z2aTP+fsAohF3PaNHROvssZ8ElRs5DnyPBAkovxDFF4oJESDeY9tJD4Ur5umg'
&& 'PSFm1Uy23Zk2SaM7e43p5Y4uxUMzu2f4H56+tuZmff2gfTqHrGEy5DkW6Abo7LH7gfsB'
&& '2uo1LQGzBmoYFSwg57vNcjqqo4F1JXh2S7Zfx83TZZNqdD6MXkQkU369jONgcmfxe83M'
&& 'B7XQEdEhg1B0HzDk2ZHpy3vBqLPpMQhyi/f2AIA3WyPZG6KkeVpKiE925awEi7H6JRsA'
&& 'cqJDfIi9oayfW8ZB5dY/TFeX7YlGQg+RmgJkcnSQfWyr9QP92enmGcgeNCvx67mXbGdb'
&& 'xD1hjI5AklJ+ydgTUGz6iiZNXd09+gYGGIRlQgXn6wDesZYSRFsJOYES5QjSw7fqnu7q'
&& 'Bqh7uqu7f3nzdw3uKFJszEIcpqVRs12SRuAYiTrJ1YXMzSGgS6iQnHmWyQWe70pySz/F'
&& 'MZagMWnMlaiTuTqTTih7s7IIHm1T1ncVI37l3BAAA4McAYF7iAvG17uxExi1U6Igd9XN'
&& 'Dj+UmZA8qPrf3MDQbeSPIN8Ldub0JzeWLcT2I3Swn8JFhr4VQnMze5uKnv0ugOHfUXa3'
&& 'ZhySedkR0eGDuMtbw/rTZCI1pA9PF0yWf4e3MnJ7YKXm0pOr6H03QRIIZeYnUj1njhid'
&& '8aaRscKX/VGWSRLsCjnK2rcdC3njGUsQ5PSdv92yqJaMk5WBoRMpJsSnNgZufBdCkmsN'
&& '60FgRbllK8PNzOlttT/qpz2sOUnpeWGHvq9ewcyc28/7XQCru213NOL+l6wgZ0kXAjnD'
&& 'cazP7gXuTdu41rCyxbgr3mt/P16+F6LgUVXtmq5bC237yNsNu5YtPBZgx4kLFznZ1XlM'
&& 'BzB/1liECBAN801yhfiq0HflbKXz1ojZ4qCylSBsbm6q/93wX0n0Q1Ir6UzWYXaZyZaF'
&& 'qqxeZn813n4ZlhPWJWXMo00P5OTDF5c0qmm8fRlPip6bFhHk6Ti3ddfy5i3OXBemJQE2'
&& 'A5g/c/qaTasC8krC0KdzE+3qWG/y6thmW7Vui/UkQ7w51vqDaGnRZFInPdlshNQ2C8oJ'
&& 'h0oqaefF++zmzh5bu7bbXrBxjp88bp5qgZzNdyfWD/9t+B+TO4GW8/p+R0SHcGBxLWEF'
&& 'jiQlHeIXEaRIPZAVRMVCTDcQCUh8LfOyaqjgCcr+YpY7NRFa2VY/egsqtNtdw8ie5gjJ'
&& 'oUTqicjofOYA2f/YgcR03s5MMBF4wlIa7rMr5mnUyru6xl0LZAeFvDG3l83DF5199muk'
&& 'oJO1FUMoviSi8Nh9Kg+Ru7qvUvCqPO+cMZsxbPsM4HXW9KcrEyKApTa7s9BVSyLaF3Ik'
&& 'SbLSQros18RyInkkV2u5q+6zLaS+aCT0oJl/QVI78IWcsvDos1vtLYCE551QKNuCKW63'
&& '+157g36cMOYI9yWhC3K+j4KDEHKxC9+t0altDaFHwL/kvVZIBJw761/uM5/MTJlU7S/Z'
&& 'N6hTBNlhZA0OPReNuGdM6nL4jR4G5ZnRusAtKmVHwg1Slcxe11nODZJKh1fJ6kwM3dQa'
&& 'VgOw3omjkGuL9/o/L/vFTzs7mi8pQZBpIT4f9PxE2bRFQncY9pdjKDoExDH7ebzPbgFo'
&& 'bQjdng48KBfvzZau77ORN61FI66PsW2N7ARiZnZTZ589BtAWCV1v5J1zF+JNVdui2CbL'
&& 'OcJsq1ejD2lVgCDL4e14r58J0N6k+cmEu0HYIssdrbxgnaGeeG9yJEg32hC6GbOix81y'
&& 'trTsWLtiixpgQNLZ4yVEgCT++xSP0H7C0N1ZadVAh6SR3kRm2WfJO0H/XqTuQcn+IlOI'
&& 'AFjRVaZhus3g2az0WuA0wcIi5QP3DDNIIPtakBABYltts7AO4OEi9eTFYGCksSRzwM4L'
&& 'ECKAM1gG9tVR5UP+RkqZN5s7a0yBnwUEOSDp7GlPPp83BH0srO+1PmQrDIIen9wOdnln'
&& 'n31G5n9ZtDLL6ck2x3uTf6DUee8rASX6vNnyWI/dmZ0R77O7LNXLBkWy9CE7Pd6XvNih'
&& 'QkEQeZHZl9PBFtsDstebtyWFwv0B4r32UrzXn+6xDtBdwIslNL0N+JnMvravxiraFO/s'
&& 'tm0y+xzQlcfkddCNCe/vGfP7GQH6lzdfbHAjqSCBHZK+PN5CzESSlixgnhMLzXAeXp+3'
&& 'hWfuM0sWL10abQv1CdtHixzvmtiYPhcvSFOTJk1NEPEQkWdPUry4oc96y2o3YJiWs5Wx'
&& 'zbYq83THHHu9Y1N2kG45tDRqdsgzxxuznKPOGbsTsN2M7d6zfXhePJ5Ici1h6mUcAcw0'
&& '8Zo5fp35NoqKxAjwTrRhZmLSpPY9ySmPzV27dm+lTn9cKSTGA+XT+03Jq+l8HBLv2Q7c'
&& 'X9K+ygQTFGDcHhaaoGJyouDNV7JH+eGj4mF6gspoC+tzJt1ObsT4MDsF2zxs886+Ml5v'
&& '/PogUvEwPUGFiE+SX4gAtQa1gkhV7onQR4oJMR5oxC6stDeghd7Dh6E+CPw/HL4vVO2f'
&& 'cpUAAAAASUVORK5CYII='.
APPEND ls_image TO rt_images.
* http://fa2png.io/r/octicons/
* colour: #808080
* size: 16
* https://www.base64-image.de/ can be used to convert images to base64
ls_image-url = 'img/sync' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQYGY3BIWuUAQAG'
&& '4Pc7N72xsbGBYNE8tYpVZKDZX2CcYLEZ9yQxOQSz3D/YmkUsVovRQ2SYNJnlkFfH7VZu'
&& 'wefJgrGHXnjrpQeu5B93smCwr6qqqp54433mDI5Ucds1u577o+p35hyoqe2cMThWVatJ'
&& '7KiZrZxz18SJqqtJPFXPssRgw0oSH9WNXMCQU76qzSxx2cxxTlk3yhKb6mcSQy7kvjpM'
&& 'Ylt98tpjN3POyFTdSuKSqppayxkjE/Uhc36p+m7PhhXr7vmmfhhnzpHPJqqqquqdcRY8'
&& 'spq47sAXMyde2c3/+wvX7Y18BexhBwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/toc' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgIAO39T0AAAABnRSTlMABBCRlMXJzV0oAAAAN0lEQVQIW2NgwABuaWlB'
&& 'YWlpDgwJDAxiAgxACshgYwAz0tLY2NISSBWBMYAmg4ADyBZhARCJAQBBchGypGCbQgAA'
&& 'AABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/repo_online' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAAABQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJz+TJ01AAAANnRSTlMAAQIDBAcJCgwSFBocHygqMTM1NkRHSU1QUWFiZGlweHuDiImL'
&& 'lZiio6a5vsfT3uTo6e3x9fsxY2JuAAAAgUlEQVQYGXXB6RaBUBSA0e+IEuIiMs9zhlDn'
&& '/R/NZWmt/LA3f1RcoaB50SydCbn20wjedkPu3sKSpMGH21PhLdZ0BATZ+cCXtxtDHGLV'
&& 'pgFW9QqJj2U0wvJvMF+5jiNGI3HK9dMQSouH6sRoFGoWd8l1dEDRWlWPQsFS98KPvvDH'
&& 'C3HLClrWc70ZAAAAAElFTkSuQmCC'.
APPEND ls_image TO rt_images.
ls_image-url = 'img/repo_offline' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICuaWnmAAAAG3RSTlMAAgQFBgsQFxweIiMtN3yI'
&& 'nqOvt9Hp6/Hz9fktMNR/AAAAXElEQVQYV5WO2xJAMAxES1q3ugfF/v9/0qLyyL4k58xk'
&& 'J0p9D7N5oeqZgSwy7fDZnHNdEE1gWK116tksl7hPimGFFPWYl7MU0zksRCl8TStKg1AJ'
&& '0XNC8Zm4/c0BUVQHi0llOUYAAAAASUVORK5CYII='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/pkg' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA30lEQVQoU43OIUuDcRSF'
&& '8fvqhuB0mFwaKLbVBVdkX0GTFss+wYL2H4rJIIgyQQSzZcUPoGHZ9CKCmAwTMS8Y/ga3'
&& 'BWVjT7hwOQ+HEzEbMhU7jrTd69q2KhtFRU2nrvS927dm3pyqPXcuNRVD7sxiRIQlDSc+'
&& 'PGjZUFDWkYekLfdoV2XYua4rSZ61pZBkEUq2XPty41XuXJIiZGNhPDVZiFCYIMSor+Db'
&& '7RQhYnQnCsNvNmGgPFFYMQh1PU9aqrLxyGUNx/p66r9mUc2hFx3JhU9vDtQU4y9KGjaV'
&& '/gXT+AGZVIinhU2EAwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/branch' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAqFBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgID/OyosAAAAN3RSTlMAAQIDBAYICQ8TFRweJScoKSo3Oj1FRk1dYWJjZmhzdIaJ'
&& 'j5GVm6CwsrS5vsHDyszV19ne7/X583teZAAAAIFJREFUGFdVytkagVAYheFvFzJlnqc0'
&& 'EEoR+u//zhxI7dbZ9z4LMJ1op9DmjpntdXiBigHbLiAYqukBVr63+YGRSazgCY/iEooP'
&& 'xKZxr0EnSbo14B1Rg4msKzj150fJrQpERPLBv7mIfNxlq+zRbZsu0JYpGlcdwjY9Twfr'
&& 'nAbNsr6IKQxJI/U5CgAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/link' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwFMKAAAAHnRSTlMAAwQFBgcK'
&& 'FR4gIiMmP0JHSm+RmKDByM/R09rg+/0jN/q+AAAAX0lEQVQYV43Nxw6AIBAE0FGw916Z'
&& '//9MRQ0S4sG5bPZlCxqSCyBGXgFUJKUA4A8PUOKONzuQOxOZIjcLkrMvxGQg3skSCFYL'
&& 'Kl1Ds5LWz+33yyf4rQOSf6CjnV6rHeAA87gJtKzI8ocAAAAASUVORK5CYII='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/code' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
&& 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAAA1SURBVAhbY2AODQ0NEWBgYGVg'
&& 'YGByhNAMKgIMrKyhAQxMDhA+QwCCZgVqIIUP1Q+yJzTUAAAfUAq+Os55uAAAAABJRU5E'
&& 'rkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/bin' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
&& 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAABBSURBVAhbXcqxDYAwAMRAK8h9'
&& 'hmAARoANvuD3X4UCiojqZMlsbe8JAuN6ZZ9ozThRCVmsJe9H0HwdXf19W9v2eAA6Fws2'
&& 'RotPsQAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/obj' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgIDcWqnoAAAACnRSTlMABD1AZI+RlcPFIaFe1gAA'
&& 'AEVJREFUCFtjYF+1atVKAQYGLgYGBuaJEJrBUgBCM0+A0AwLgLQIgyOIZmwCSgNptgAG'
&& '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/lock' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAACIiIiIiIiI'
&& 'iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjNaTNB'
&& 'AAAAEnRSTlMABgdBVXt8iYuRsNXZ3uDi6Pmu6tfUAAAASUlEQVQYV63KSxJAQBAE0TQ0'
&& 'Znym1f0PayE0QdjJ5asCgGTu1hClqjppvaRXB60swBeA2QNUAIq+ICvKx367nqAn/P8Y'
&& 't2jg3Q5rgASaF3KNRwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/dir' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAABmksxmksxm'
&& 'ksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxm'
&& 'ksxmksxmksxmksxMwQo8AAAAF3RSTlMABhIYIy1fZmhpe3+IiYuMkZvD7e/x93sipD4A'
&& 'AAA+SURBVBhXY2BABzwiokAgzAYXEGdiBAIWIYQAPzcQCApzgwEXM4M4KuBDFxAYKAEx'
&& 'VAFeBlYOTiTAzoThewD5hBAcnWM4gwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/burger' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAHlBMVEUAAABtktltktlt'
&& 'ktltktltktltktltktltktltktk7ccVDAAAACXRSTlMAFDBLY2SFoPGv/DFMAAAAJ0lE'
&& 'QVQIW2NggIHKmWAwmaETwpjGoBoKBo4MmIAkxXApuGK4dgwAAJa5IzLs+gRBAAAAAElF'
&& 'TkSuQmCC'.
APPEND ls_image TO rt_images.
ls_image-url = 'img/star' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAABejclejcle'
&& 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle'
&& 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle'
&& 'jclejclejclejclejclejclejclejclejcn2yvsVAAAALXRSTlMAAQIFBwkKCw0QERUY'
&& 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC'
&& 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV'
&& 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o'
&& 'ahA3YV7OfwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/star-grey' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAADQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NC2QdifAAAALXRSTlMAAQIFBwkKCw0QERUY'
&& 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC'
&& 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV'
&& 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o'
&& 'ahA3YV7OfwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ENDMETHOD. " get_inline_images.
ENDCLASS. "lcl_gui_asset_manager

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_GUI_ASSET_MANAGER</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_GUI_ASSET_MANAGER</ENTRY>
<LENGTH>34</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,30 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_GUI_PAGES
*&---------------------------------------------------------------------*
* All UI pages
* Super class
INCLUDE zabapgit_page.
* Utils and helpers
INCLUDE zabapgit_html_action_utils.
INCLUDE zabapgit_repo_browser_util.
* Components and templates
INCLUDE zabapgit_view_repo.
INCLUDE zabapgit_view_tutorial.
INCLUDE zabapgit_syntax_highlighter.
* Pages
INCLUDE zabapgit_page_commit.
INCLUDE zabapgit_page_merge.
INCLUDE zabapgit_page_background.
INCLUDE zabapgit_page_branch_overview.
INCLUDE zabapgit_page_db.
INCLUDE zabapgit_page_diff.
INCLUDE zabapgit_page_explore.
INCLUDE zabapgit_page_main.
INCLUDE zabapgit_page_stage.
INCLUDE zabapgit_page_debug.
INCLUDE zabapgit_page_settings.

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_GUI_PAGES</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_GUI_PAGES</ENTRY>
<LENGTH>26</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,345 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_GUI_ROUTER
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_gui_router DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_gui_router DEFINITION FINAL.
PUBLIC SECTION.
METHODS on_event
IMPORTING iv_action TYPE clike
iv_prev_page TYPE clike
iv_getdata TYPE clike OPTIONAL
it_postdata TYPE cnht_post_data_tab OPTIONAL
EXPORTING ei_page TYPE REF TO lif_gui_page
ev_state TYPE i
RAISING lcx_exception lcx_cancel.
PRIVATE SECTION.
METHODS get_page_by_name
IMPORTING iv_name TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_diff
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_branch_overview
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_stage
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_db_by_name
IMPORTING iv_name TYPE clike
iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_background
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_playground
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception lcx_cancel.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_gui_router IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_gui_router IMPLEMENTATION.
METHOD on_event.
DATA: lv_url TYPE string,
lv_key TYPE lcl_persistence_repo=>ty_repo-key,
ls_db TYPE lcl_persistence_db=>ty_content,
ls_item TYPE ty_item.
lv_key = iv_getdata. " TODO refactor
lv_url = iv_getdata. " TODO refactor
CASE iv_action.
" General routing
WHEN gc_action-go_main " Go Main page
OR gc_action-go_explore " Go Explore page
OR gc_action-go_db " Go DB util page
OR gc_action-go_background_run " Go background run page
OR gc_action-go_debuginfo " Go debug info page
OR gc_action-go_settings. " Go settings page
ei_page = get_page_by_name( iv_action ).
ev_state = gc_event_state-new_page.
WHEN gc_action-go_background. " Go Background page
ei_page = get_page_background( lv_key ).
ev_state = gc_event_state-new_page.
WHEN gc_action-go_diff. " Go Diff page
ei_page = get_page_diff( iv_getdata ).
ev_state = gc_event_state-new_page.
WHEN gc_action-go_stage. " Go Staging page
ei_page = get_page_stage( lv_key ).
ev_state = gc_event_state-new_page_w_bookmark.
WHEN gc_action-go_branch_overview. " Go repo branch overview
ei_page = get_page_branch_overview( iv_getdata ).
ev_state = gc_event_state-new_page.
WHEN gc_action-go_playground. " Create playground page
ei_page = get_page_playground( ).
ev_state = gc_event_state-new_page.
WHEN gc_action-go_tutorial. " Go to tutorial
lcl_app=>user( )->set_repo_show( '' ). " Clear show_id
ev_state = gc_event_state-re_render. " Assume we are on main page
" SAP GUI actions
WHEN gc_action-jump. " Open object editor
lcl_html_action_utils=>jump_decode( EXPORTING iv_string = iv_getdata
IMPORTING ev_obj_type = ls_item-obj_type
ev_obj_name = ls_item-obj_name ).
lcl_objects=>jump( ls_item ).
ev_state = gc_event_state-no_more_act.
WHEN gc_action-jump_pkg. " Open SE80
lcl_services_repo=>open_se80( |{ iv_getdata }| ).
ev_state = gc_event_state-no_more_act.
" DB actions
WHEN gc_action-db_display OR gc_action-db_edit. " DB Display/Edit
ei_page = get_page_db_by_name( iv_name = iv_action iv_getdata = iv_getdata ).
ev_state = gc_event_state-new_page.
IF iv_prev_page = 'PAGE_DB_DISPLAY'.
ev_state = gc_event_state-new_page_replacing.
ENDIF.
WHEN gc_action-db_delete. " DB Delete
ls_db = lcl_html_action_utils=>dbkey_decode( iv_getdata ).
lcl_services_db=>delete( ls_db ).
ev_state = gc_event_state-re_render.
WHEN gc_action-db_update. " DB Update
ls_db = lcl_html_action_utils=>dbcontent_decode( it_postdata ).
lcl_services_db=>update( ls_db ).
ev_state = gc_event_state-go_back.
" Abapgit services actions
WHEN gc_action-abapgit_home. " Go abapGit homepage
lcl_services_abapgit=>open_abapgit_homepage( ).
ev_state = gc_event_state-no_more_act.
WHEN gc_action-abapgit_wiki. " Go abapGit wikipage
lcl_services_abapgit=>open_abapgit_wikipage( ).
ev_state = gc_event_state-no_more_act.
WHEN gc_action-abapgit_install. " Install abapGit
lcl_services_abapgit=>install_abapgit( ).
ev_state = gc_event_state-re_render.
WHEN gc_action-abapgit_install_pi. " Install abapGit plugins
lcl_services_abapgit=>install_abapgit_pi( ).
ev_state = gc_event_state-re_render.
" Repository services actions
WHEN gc_action-repo_newoffline. " New offline repo
lcl_services_repo=>new_offline( ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_refresh. " Repo refresh
lcl_services_repo=>refresh( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_purge. " Repo remove & purge all objects
lcl_services_repo=>purge( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_remove. " Repo remove
lcl_services_repo=>remove( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_clone OR 'install'. " Repo clone, 'install' is for explore page
lcl_services_repo=>clone( lv_url ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_refresh_checksums. " Rebuil local checksums
lcl_services_repo=>refresh_local_checksums( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_toggle_fav. " Toggle repo as favorite
lcl_services_repo=>toggle_favorite( lv_key ).
ev_state = gc_event_state-re_render.
" ZIP services actions
WHEN gc_action-zip_import. " Import repo from ZIP
lcl_zip=>import( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-zip_export. " Export repo as ZIP
lcl_zip=>export( lcl_app=>repo_srv( )->get( lv_key ) ).
ev_state = gc_event_state-no_more_act.
WHEN gc_action-zip_package. " Export package as ZIP
lcl_zip=>export_package( ).
ev_state = gc_event_state-no_more_act.
WHEN gc_action-zip_transport. " Export transport as ZIP
lcl_transport=>zip( ).
ev_state = gc_event_state-no_more_act.
WHEN gc_action-zip_object. " Export object as ZIP
lcl_zip=>export_object( ).
ev_state = gc_event_state-no_more_act.
" Remote origin manipulations
WHEN gc_action-repo_remote_attach. " Remote attach
lcl_services_repo=>remote_attach( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_remote_detach. " Remote detach
lcl_services_repo=>remote_detach( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-repo_remote_change. " Remote change
lcl_services_repo=>remote_change( lv_key ).
ev_state = gc_event_state-re_render.
" Git actions
WHEN gc_action-git_pull. " GIT Pull
lcl_services_git=>pull( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-git_reset. " GIT Reset
lcl_services_git=>reset( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-git_branch_create. " GIT Create new branch
lcl_services_git=>create_branch( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-git_branch_delete. " Delete remote branch
lcl_services_git=>delete_branch( lv_key ).
ev_state = gc_event_state-re_render.
WHEN gc_action-git_branch_switch. " Switch branch
lcl_services_git=>switch_branch( lv_key ).
ev_state = gc_event_state-re_render.
"Others
WHEN OTHERS.
ev_state = gc_event_state-not_handled.
ENDCASE.
ENDMETHOD. " on_event
METHOD get_page_by_name.
DATA: lv_page_class TYPE string,
lv_page_name TYPE string.
lv_page_name = iv_name.
SHIFT lv_page_name LEFT DELETING LEADING 'go_'.
lv_page_class = |LCL_GUI_PAGE_{ to_upper( lv_page_name ) }|.
TRY.
CREATE OBJECT ri_page TYPE (lv_page_class).
CATCH cx_sy_create_object_error.
lcx_exception=>raise( |Cannot create page class { lv_page_class }| ).
ENDTRY.
ENDMETHOD. " get_page_by_name
METHOD get_page_db_by_name.
DATA: lv_page_class TYPE string,
lv_message TYPE string,
ls_key TYPE lcl_persistence_db=>ty_content.
lv_page_class = |LCL_GUI_PAGE_{ to_upper( iv_name ) }|.
ls_key = lcl_html_action_utils=>dbkey_decode( iv_getdata ).
TRY.
CREATE OBJECT ri_page TYPE (lv_page_class)
EXPORTING
is_key = ls_key.
CATCH cx_sy_create_object_error.
lv_message = |Cannot create page class { lv_page_class }|.
lcx_exception=>raise( lv_message ).
ENDTRY.
ENDMETHOD. " get_page_db_by_name
METHOD get_page_branch_overview.
DATA: lo_repo TYPE REF TO lcl_repo_online,
lo_page TYPE REF TO lcl_gui_page_branch_overview,
lv_key TYPE lcl_persistence_repo=>ty_repo-key.
lv_key = iv_getdata.
lo_repo ?= lcl_app=>repo_srv( )->get( lv_key ).
CREATE OBJECT lo_page
EXPORTING
io_repo = lo_repo.
ri_page = lo_page.
ENDMETHOD. "get_page_branch_overview
METHOD get_page_diff.
DATA: ls_file TYPE ty_file,
ls_object TYPE ty_item,
lo_page TYPE REF TO lcl_gui_page_diff,
lv_key TYPE lcl_persistence_repo=>ty_repo-key.
lcl_html_action_utils=>file_obj_decode( EXPORTING iv_string = iv_getdata
IMPORTING ev_key = lv_key
eg_file = ls_file
eg_object = ls_object ).
CREATE OBJECT lo_page
EXPORTING
iv_key = lv_key
is_file = ls_file
is_object = ls_object.
ri_page = lo_page.
ENDMETHOD. "get_page_diff
METHOD get_page_stage.
DATA: lo_repo TYPE REF TO lcl_repo_online,
lo_stage_page TYPE REF TO lcl_gui_page_stage.
lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ).
" force refresh on stage, to make sure the latest local and remote files are used
lo_repo->refresh( ).
CREATE OBJECT lo_stage_page
EXPORTING
io_repo = lo_repo.
ri_page = lo_stage_page.
ENDMETHOD. "get_page_stage
METHOD get_page_background.
CREATE OBJECT ri_page TYPE lcl_gui_page_background
EXPORTING
iv_key = iv_key.
ENDMETHOD. "get_page_background
METHOD get_page_playground.
DATA: lv_class_name TYPE string,
lv_cancel TYPE abap_bool.
lcl_popups=>run_page_class_popup( IMPORTING ev_name = lv_class_name
ev_cancel = lv_cancel ).
IF lv_cancel = abap_true.
RAISE EXCEPTION TYPE lcx_cancel.
ENDIF.
TRY.
CREATE OBJECT ri_page TYPE (lv_class_name).
CATCH cx_sy_create_object_error.
lcx_exception=>raise( |Cannot create page class { lv_class_name }| ).
ENDTRY.
ENDMETHOD. "get_page_playground
ENDCLASS. " lcl_gui_router

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_GUI_ROUTER</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_GUI_ROUTER</ENTRY>
<LENGTH>27</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -6,263 +6,6 @@ DEFINE _add.
ro_html->add( &1 ) ##NO_TEXT. ro_html->add( &1 ) ##NO_TEXT.
END-OF-DEFINITION. END-OF-DEFINITION.
*----------------------------------------------------------------------*
* 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.
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
ENDCLASS. "lcl_html_action_utils IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* CLASS lcl_html_helper DEFINITION * CLASS lcl_html_helper DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -273,15 +16,18 @@ CLASS lcl_html_helper DEFINITION FINAL.
DATA mv_html TYPE string READ-ONLY. DATA mv_html TYPE string READ-ONLY.
DATA mv_indent TYPE i READ-ONLY. DATA mv_indent TYPE i READ-ONLY.
DATA mv_within_style TYPE i READ-ONLY. DATA mv_within_style TYPE i READ-ONLY.
DATA mv_within_js TYPE i READ-ONLY.
METHODS add IMPORTING iv_chunk TYPE any. METHODS add IMPORTING iv_chunk TYPE any.
METHODS reset. METHODS reset.
METHODS add_anchor IMPORTING iv_txt TYPE string METHODS add_anchor IMPORTING iv_txt TYPE string
iv_act TYPE string iv_act TYPE string
iv_opt TYPE char1 OPTIONAL iv_opt TYPE clike OPTIONAL
iv_typ TYPE char1 DEFAULT gc_action_type-sapevent iv_typ TYPE char1 DEFAULT gc_action_type-sapevent
iv_class TYPE string OPTIONAL. iv_class TYPE string OPTIONAL
iv_id TYPE string OPTIONAL
iv_style TYPE string OPTIONAL.
PRIVATE SECTION. PRIVATE SECTION.
METHODS _add_str IMPORTING iv_str TYPE csequence. METHODS _add_str IMPORTING iv_str TYPE csequence.
@ -336,6 +82,8 @@ CLASS lcl_html_helper IMPLEMENTATION.
DATA lv_shift_back TYPE i. DATA lv_shift_back TYPE i.
DATA lv_style_tag_open TYPE i. DATA lv_style_tag_open TYPE i.
DATA lv_style_tag_close TYPE i. DATA lv_style_tag_close TYPE i.
DATA lv_js_tag_open TYPE i.
DATA lv_js_tag_close TYPE i.
DATA lv_curly TYPE i. DATA lv_curly TYPE i.
FIND FIRST OCCURRENCE OF '</' IN iv_str MATCH OFFSET lv_close_offs. FIND FIRST OCCURRENCE OF '</' IN iv_str MATCH OFFSET lv_close_offs.
@ -344,7 +92,8 @@ CLASS lcl_html_helper IMPLEMENTATION.
ENDIF. ENDIF.
FIND FIRST OCCURRENCE OF '}' IN iv_str MATCH OFFSET lv_close_offs. " Find close } @beginning FIND FIRST OCCURRENCE OF '}' IN iv_str MATCH OFFSET lv_close_offs. " Find close } @beginning
IF mv_within_style > 0 AND sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0. IF ( mv_within_style > 0 OR mv_within_js > 0 )
AND sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0.
lv_shift_back = 1. lv_shift_back = 1.
ENDIF. ENDIF.
@ -363,7 +112,11 @@ CLASS lcl_html_helper IMPLEMENTATION.
FIND ALL OCCURRENCES OF '</style>' IN iv_str MATCH COUNT lv_style_tag_close IGNORING CASE. FIND ALL OCCURRENCES OF '</style>' IN iv_str MATCH COUNT lv_style_tag_close IGNORING CASE.
mv_within_style = mv_within_style + lv_style_tag_open - lv_style_tag_close. mv_within_style = mv_within_style + lv_style_tag_open - lv_style_tag_close.
IF mv_within_style > 0. FIND ALL OCCURRENCES OF '<script' IN iv_str MATCH COUNT lv_js_tag_open IGNORING CASE.
FIND ALL OCCURRENCES OF '</script>' IN iv_str MATCH COUNT lv_js_tag_close IGNORING CASE.
mv_within_js = mv_within_js + lv_js_tag_open - lv_js_tag_close.
IF mv_within_style > 0 OR mv_within_js > 0.
FIND ALL OCCURRENCES OF '{' IN iv_str MATCH COUNT lv_curly. FIND ALL OCCURRENCES OF '{' IN iv_str MATCH COUNT lv_curly.
lv_tags_open = lv_tags_open + lv_curly. lv_tags_open = lv_tags_open + lv_curly.
FIND ALL OCCURRENCES OF '}' IN iv_str MATCH COUNT lv_curly. FIND ALL OCCURRENCES OF '}' IN iv_str MATCH COUNT lv_curly.
@ -394,16 +147,21 @@ CLASS lcl_html_helper IMPLEMENTATION.
METHOD add_anchor. METHOD add_anchor.
DATA: lv_class TYPE string, DATA: lv_class TYPE string,
lv_href TYPE string. lv_href TYPE string,
lv_id TYPE string,
lv_style TYPE string.
lv_class = iv_class. lv_class = iv_class.
IF iv_opt = gc_html_opt-emphas. IF iv_opt CA gc_html_opt-emphas.
lv_class = lv_class && ' emphasis' ##NO_TEXT. lv_class = lv_class && ' emphasis' ##NO_TEXT.
ENDIF. ENDIF.
IF iv_opt = gc_html_opt-cancel. IF iv_opt CA gc_html_opt-cancel.
lv_class = lv_class && ' attention' ##NO_TEXT. lv_class = lv_class && ' attention' ##NO_TEXT.
ENDIF. ENDIF.
IF iv_opt CA gc_html_opt-crossout.
lv_class = lv_class && ' crossout grey' ##NO_TEXT.
ENDIF.
IF lv_class IS NOT INITIAL. IF lv_class IS NOT INITIAL.
SHIFT lv_class LEFT DELETING LEADING space. SHIFT lv_class LEFT DELETING LEADING space.
lv_class = | class="{ lv_class }"|. lv_class = | class="{ lv_class }"|.
@ -420,7 +178,15 @@ CLASS lcl_html_helper IMPLEMENTATION.
ENDCASE. ENDCASE.
ENDIF. ENDIF.
_add_str( |<a{ lv_class }{ lv_href }>{ iv_txt }</a>| ). IF iv_id IS NOT INITIAL.
lv_id = | id="{ iv_id }"|.
ENDIF.
IF iv_style IS NOT INITIAL.
lv_style = | style="{ iv_style }"|.
ENDIF.
_add_str( |<a{ lv_id }{ lv_class }{ lv_href }{ lv_style }>{ iv_txt }</a>| ).
ENDMETHOD. "add_action ENDMETHOD. "add_action
@ -438,6 +204,7 @@ CLASS lcl_html_toolbar DEFINITION FINAL.
iv_txt TYPE string iv_txt TYPE string
io_sub TYPE REF TO lcl_html_toolbar OPTIONAL io_sub TYPE REF TO lcl_html_toolbar OPTIONAL
iv_act TYPE string OPTIONAL iv_act TYPE string OPTIONAL
iv_ico TYPE string OPTIONAL
iv_opt TYPE c OPTIONAL iv_opt TYPE c OPTIONAL
iv_typ TYPE c DEFAULT gc_action_type-sapevent, iv_typ TYPE c DEFAULT gc_action_type-sapevent,
count count
@ -448,6 +215,9 @@ CLASS lcl_html_toolbar DEFINITION FINAL.
iv_no_separator TYPE abap_bool OPTIONAL iv_no_separator TYPE abap_bool OPTIONAL
iv_vertical TYPE abap_bool OPTIONAL iv_vertical TYPE abap_bool OPTIONAL
iv_sort TYPE abap_bool OPTIONAL iv_sort TYPE abap_bool OPTIONAL
iv_as_angle TYPE abap_bool OPTIONAL
iv_with_icons TYPE abap_bool OPTIONAL
iv_add_minizone TYPE abap_bool OPTIONAL
RETURNING RETURNING
VALUE(ro_html) TYPE REF TO lcl_html_helper. VALUE(ro_html) TYPE REF TO lcl_html_helper.
@ -455,6 +225,7 @@ CLASS lcl_html_toolbar DEFINITION FINAL.
TYPES: BEGIN OF ty_item, TYPES: BEGIN OF ty_item,
txt TYPE string, txt TYPE string,
act TYPE string, act TYPE string,
ico TYPE string,
sub TYPE REF TO lcl_html_toolbar, sub TYPE REF TO lcl_html_toolbar,
opt TYPE char1, opt TYPE char1,
typ TYPE char1, typ TYPE char1,
@ -483,47 +254,66 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ls_item-txt = iv_txt. ls_item-txt = iv_txt.
ls_item-act = iv_act. ls_item-act = iv_act.
ls_item-ico = iv_ico.
ls_item-sub = io_sub. ls_item-sub = io_sub.
ls_item-opt = iv_opt. ls_item-opt = iv_opt.
ls_item-typ = iv_typ. ls_item-typ = iv_typ.
APPEND ls_item TO mt_items. APPEND ls_item TO mt_items.
ENDMETHOD. "add ENDMETHOD. "add
METHOD render. METHOD render. "TODO refactor
DATA: lv_class TYPE string, DATA: lv_class TYPE string,
lv_is_drop TYPE abap_bool,
lv_last TYPE abap_bool. lv_last TYPE abap_bool.
FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items. FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
lv_is_drop = boolc( iv_as_droplist_with_label IS NOT INITIAL OR iv_as_angle IS NOT INITIAL ).
IF iv_as_droplist_with_label IS INITIAL. IF lv_is_drop = abap_false. " Normal menu
IF iv_vertical = abap_true. IF iv_vertical = abap_true.
lv_class = 'menu_vertical' ##NO_TEXT. lv_class = 'menu_vertical' ##NO_TEXT.
ELSE. ELSE.
lv_class = 'menu' ##NO_TEXT. lv_class = 'menu' ##NO_TEXT.
ENDIF. ENDIF.
ELSEIF iv_as_angle IS NOT INITIAL.
lv_class = 'dropdown dropdown_angle' ##NO_TEXT.
ELSE. ELSE.
lv_class = 'dropdown' ##NO_TEXT. lv_class = 'dropdown' ##NO_TEXT.
ENDIF. ENDIF.
ro_html->add( |<div class="{ lv_class }">| ). ro_html->add( |<div class="{ lv_class }">| ).
IF iv_as_droplist_with_label IS NOT INITIAL. IF lv_is_drop = abap_true. " Dropdown
IF iv_as_angle = abap_true.
ro_html->add( '<div class="dropbtn_angle"></div>' ).
ELSE.
lv_class = 'dropbtn'. lv_class = 'dropbtn'.
IF iv_no_separator = abap_true. IF iv_no_separator = abap_true.
lv_class = lv_class && ' menu_end' ##NO_TEXT. lv_class = lv_class && ' menu_end' ##NO_TEXT.
ENDIF. ENDIF.
ro_html->add( |<a class="{ lv_class }">{ iv_as_droplist_with_label }</a>| ). ro_html->add( |<a class="{ lv_class }">{ iv_as_droplist_with_label }</a>| ).
ENDIF.
IF iv_add_minizone = abap_true.
ro_html->add( '<div class="minizone"></div>' ).
ENDIF.
ro_html->add( '<div class="dropdown_content">' ). ro_html->add( '<div class="dropdown_content">' ).
ro_html->add( '<div class="box">' ).
ENDIF. ENDIF.
IF iv_sort = abap_true. IF iv_sort = abap_true.
SORT mt_items BY txt ASCENDING AS TEXT. SORT mt_items BY txt ASCENDING AS TEXT.
ENDIF. ENDIF.
IF iv_with_icons = abap_true.
ro_html->add( '<table>' ).
ENDIF.
LOOP AT mt_items ASSIGNING <ls_item>. LOOP AT mt_items ASSIGNING <ls_item>.
lv_last = boolc( sy-tabix = lines( mt_items ) ). lv_last = boolc( sy-tabix = lines( mt_items ) ).
@ -534,11 +324,24 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
AND iv_as_droplist_with_label IS INITIAL. AND iv_as_droplist_with_label IS INITIAL.
lv_class = 'menu_end'. lv_class = 'menu_end'.
ENDIF. ENDIF.
IF iv_with_icons = abap_true.
ro_html->add( '<tr>' ).
ro_html->add( |<td class="icon">{ <ls_item>-ico }</td>| ).
ro_html->add( '<td width="100%">' ).
ENDIF.
ro_html->add_anchor( iv_txt = <ls_item>-txt ro_html->add_anchor( iv_txt = <ls_item>-txt
iv_act = <ls_item>-act iv_act = <ls_item>-act
iv_opt = <ls_item>-opt iv_opt = <ls_item>-opt
iv_typ = <ls_item>-typ iv_typ = <ls_item>-typ
iv_class = lv_class ). iv_class = lv_class ).
IF iv_with_icons = abap_true.
ro_html->add( '</td>' ).
ro_html->add( '</tr>' ).
ENDIF.
ELSE. ELSE.
ro_html->add( <ls_item>-sub->render( ro_html->add( <ls_item>-sub->render(
iv_as_droplist_with_label = <ls_item>-txt iv_as_droplist_with_label = <ls_item>-txt
@ -547,8 +350,12 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDLOOP. ENDLOOP.
IF iv_as_droplist_with_label IS NOT INITIAL. IF iv_with_icons = abap_true.
ro_html->add( '</div>' ). ro_html->add( '</table>' ).
ENDIF.
IF lv_is_drop = abap_true. " Dropdown
ro_html->add( '</div></div>' ).
ENDIF. ENDIF.
ro_html->add( '</div>' ). ro_html->add( '</div>' ).
@ -556,83 +363,3 @@ CLASS lcl_html_toolbar IMPLEMENTATION.
ENDMETHOD. "render ENDMETHOD. "render
ENDCLASS. "lcl_html_toolbar IMPLEMENTATION ENDCLASS. "lcl_html_toolbar IMPLEMENTATION
CLASS lcl_log DEFINITION FINAL.
PUBLIC SECTION.
METHODS:
add
IMPORTING
iv_msgv1 TYPE csequence
iv_msgv2 TYPE csequence OPTIONAL
iv_msgv3 TYPE csequence OPTIONAL
iv_msgv4 TYPE csequence OPTIONAL,
count
RETURNING VALUE(rv_count) TYPE i,
to_html
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
show.
PRIVATE SECTION.
DATA: mt_log TYPE rs_t_msg.
ENDCLASS.
CLASS lcl_log IMPLEMENTATION.
METHOD to_html.
DATA: lv_string TYPE string.
FIELD-SYMBOLS: <ls_log> LIKE LINE OF mt_log.
CREATE OBJECT ro_html.
IF count( ) = 0.
RETURN.
ENDIF.
ro_html->add( '<br>' ).
LOOP AT mt_log ASSIGNING <ls_log>.
CONCATENATE <ls_log>-msgv1
<ls_log>-msgv2
<ls_log>-msgv3
<ls_log>-msgv4 INTO lv_string SEPARATED BY space.
ro_html->add( lv_string ).
ro_html->add( '<br>' ).
ENDLOOP.
ro_html->add( '<br>' ).
ENDMETHOD.
METHOD add.
FIELD-SYMBOLS: <ls_log> LIKE LINE OF mt_log.
APPEND INITIAL LINE TO mt_log ASSIGNING <ls_log>.
<ls_log>-msgty = 'W'.
<ls_log>-msgid = '00'.
<ls_log>-msgno = '001'.
<ls_log>-msgv1 = iv_msgv1.
<ls_log>-msgv2 = iv_msgv2.
<ls_log>-msgv3 = iv_msgv3.
<ls_log>-msgv4 = iv_msgv4.
ENDMETHOD.
METHOD show.
CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP'
EXPORTING
i_t_msg = mt_log
i_txt = 'Warning'
i_with_s_on_empty = abap_false
i_one_msg_direct = abap_false
i_one_msg_type_s = abap_false
##no_text.
ENDMETHOD.
METHOD count.
rv_count = lines( mt_log ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,329 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_HTML_ACTION_UTILS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_html_action_utils DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_html_action_utils DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS field_keys_to_upper
CHANGING ct_fields TYPE tihttpnvp.
CLASS-METHODS add_field
IMPORTING name TYPE string
iv TYPE any
CHANGING ct TYPE tihttpnvp.
CLASS-METHODS get_field
IMPORTING name TYPE string
it TYPE tihttpnvp
CHANGING cv TYPE any.
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 dir_encode
IMPORTING iv_path TYPE string
RETURNING VALUE(rv_string) TYPE string.
CLASS-METHODS dir_decode
IMPORTING iv_string TYPE clike
RETURNING VALUE(rv_path) TYPE string
RAISING lcx_exception.
CLASS-METHODS file_encode
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
ig_file TYPE any "assuming ty_file
RETURNING VALUE(rv_string) TYPE string.
CLASS-METHODS obj_encode
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
ig_object TYPE any "assuming ty_item
RETURNING VALUE(rv_string) TYPE string.
CLASS-METHODS file_obj_decode
IMPORTING iv_string TYPE clike
EXPORTING ev_key TYPE lcl_persistence_repo=>ty_repo-key
eg_file TYPE any "assuming ty_file
eg_object TYPE any "assuming ty_item
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 dbcontent_decode
IMPORTING it_postdata TYPE cnht_post_data_tab
RETURNING VALUE(rs_content) TYPE lcl_persistence_db=>ty_content.
CLASS-METHODS parse_commit_request
IMPORTING it_postdata TYPE cnht_post_data_tab
EXPORTING es_fields TYPE any.
CLASS-METHODS decode_bg_update
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(rs_fields) TYPE lcl_persistence_background=>ty_background.
ENDCLASS. "lcl_html_action_utils DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_html_action_utils IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_html_action_utils IMPLEMENTATION.
METHOD field_keys_to_upper.
FIELD-SYMBOLS <field> LIKE LINE OF ct_fields.
LOOP AT ct_fields ASSIGNING <field>.
<field>-name = to_upper( <field>-name ).
ENDLOOP.
ENDMETHOD. "field_keys_to_upper
METHOD add_field.
DATA ls_field LIKE LINE OF ct.
FIELD-SYMBOLS <src> TYPE any.
ls_field-name = name.
CASE cl_abap_typedescr=>describe_by_data( iv )->kind.
WHEN cl_abap_typedescr=>kind_elem.
ls_field-value = iv.
WHEN cl_abap_typedescr=>kind_struct.
ASSIGN COMPONENT name OF STRUCTURE iv TO <src>.
ASSERT <src> IS ASSIGNED.
ls_field-value = <src>.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
APPEND ls_field TO ct.
ENDMETHOD. "add_field
METHOD get_field.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF it,
<dest> TYPE any.
READ TABLE it ASSIGNING <ls_field> WITH KEY name = name.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
CASE cl_abap_typedescr=>describe_by_data( cv )->kind.
WHEN cl_abap_typedescr=>kind_elem.
cv = <ls_field>-value.
WHEN cl_abap_typedescr=>kind_struct.
ASSIGN COMPONENT name OF STRUCTURE cv TO <dest>.
ASSERT <dest> IS ASSIGNED.
<dest> = <ls_field>-value.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
ENDMETHOD. "get_field
METHOD jump_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING name = 'TYPE' iv = iv_obj_type CHANGING ct = lt_fields ).
add_field( EXPORTING name = 'NAME' iv = iv_obj_name CHANGING ct = 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.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = ev_obj_type ).
get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ev_obj_name ).
ENDMETHOD. "jump_decode
METHOD dir_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING name = 'PATH' iv = iv_path CHANGING ct = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD. "dir_encode
METHOD dir_decode.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = rv_path ).
ENDMETHOD. "dir_decode
METHOD file_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ).
add_field( EXPORTING name = 'PATH' iv = ig_file CHANGING ct = lt_fields ).
add_field( EXPORTING name = 'FILENAME' iv = ig_file CHANGING ct = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD. "file_encode
METHOD obj_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ).
add_field( EXPORTING name = 'OBJ_TYPE' iv = ig_object CHANGING ct = lt_fields ).
add_field( EXPORTING name = 'OBJ_NAME' iv = ig_object CHANGING ct = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD. "obj_encode
METHOD file_obj_decode.
DATA: lt_fields TYPE tihttpnvp.
ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED.
CLEAR: ev_key, eg_file, eg_object.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
field_keys_to_upper( CHANGING ct_fields = lt_fields ).
get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ).
IF eg_file IS SUPPLIED.
get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = eg_file ).
get_field( EXPORTING name = 'FILENAME' it = lt_fields CHANGING cv = eg_file ).
ENDIF.
IF eg_object IS SUPPLIED.
get_field( EXPORTING name = 'OBJ_TYPE' it = lt_fields CHANGING cv = eg_object ).
get_field( EXPORTING name = 'OBJ_NAME' it = lt_fields CHANGING cv = eg_object ).
ENDIF.
ENDMETHOD. "file_decode
METHOD dbkey_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING name = 'TYPE' iv = is_key-type CHANGING ct = lt_fields ).
add_field( EXPORTING name = 'VALUE' iv = is_key-value CHANGING ct = 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.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
field_keys_to_upper( CHANGING ct_fields = lt_fields ).
get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = rs_key-type ).
get_field( EXPORTING name = 'VALUE' it = lt_fields CHANGING cv = rs_key-value ).
ENDMETHOD. "dbkey_decode
METHOD dbcontent_decode.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_string.
rs_content = dbkey_decode( lv_string ).
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
field_keys_to_upper( CHANGING ct_fields = lt_fields ).
get_field( EXPORTING name = 'XMLDATA' it = lt_fields CHANGING cv = rs_content-data_str ).
IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ???
rs_content-data_str = rs_content-data_str+1.
ELSE.
CLEAR rs_content-data_str.
ENDIF.
ENDMETHOD. "dbcontent_decode
METHOD parse_commit_request.
CONSTANTS: lc_replace TYPE string VALUE '<<new>>'.
DATA: lv_string TYPE string,
lt_fields TYPE tihttpnvp.
FIELD-SYMBOLS <body> TYPE string.
CLEAR es_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 ).
field_keys_to_upper( CHANGING ct_fields = lt_fields ).
get_field( EXPORTING name = 'REPO_KEY' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'EMAIL' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'COMMENT' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ).
ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO <body>.
ASSERT <body> IS ASSIGNED.
REPLACE ALL OCCURRENCES OF lc_replace IN <body> WITH gc_newline.
ASSERT es_fields IS NOT INITIAL.
ENDMETHOD. "parse_commit_request
METHOD decode_bg_update.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_getdata }| ).
field_keys_to_upper( CHANGING ct_fields = lt_fields ).
get_field( EXPORTING name = 'METHOD' it = lt_fields CHANGING cv = rs_fields ).
get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = rs_fields ).
get_field( EXPORTING name = 'PASSWORD' it = lt_fields CHANGING cv = rs_fields ).
get_field( EXPORTING name = 'AMETHOD' it = lt_fields CHANGING cv = rs_fields ).
get_field( EXPORTING name = 'ANAME' it = lt_fields CHANGING cv = rs_fields ).
get_field( EXPORTING name = 'AMAIL' it = lt_fields CHANGING cv = rs_fields ).
ASSERT NOT rs_fields IS INITIAL.
ENDMETHOD. "decode_bg_update
ENDCLASS. "lcl_html_action_utils 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_ACTION_UTILS</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_ACTION_UTILS</ENTRY>
<LENGTH>34</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

520
src/zabapgit_http.prog.abap Normal file
View File

@ -0,0 +1,520 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_HTTP
*&---------------------------------------------------------------------*
CLASS lcl_http_digest DEFINITION FINAL.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING
ii_client TYPE REF TO if_http_client
iv_username TYPE string
iv_password TYPE string
RAISING lcx_exception,
run
IMPORTING
ii_client TYPE REF TO if_http_client
RAISING lcx_exception.
PRIVATE SECTION.
DATA: mv_ha1 TYPE string,
mv_username TYPE string,
mv_realm TYPE string,
mv_qop TYPE string,
mv_nonce TYPE string.
CLASS-DATA: gv_nc TYPE n LENGTH 8.
CLASS-METHODS:
md5
IMPORTING
iv_data TYPE string
RETURNING
VALUE(rv_hash) TYPE string
RAISING lcx_exception.
METHODS:
hash
IMPORTING
iv_qop TYPE string
iv_nonce TYPE string
iv_uri TYPE string
iv_method TYPE string
iv_cnonse TYPE string
RETURNING
VALUE(rv_response) TYPE string
RAISING lcx_exception,
parse
IMPORTING
ii_client TYPE REF TO if_http_client.
ENDCLASS.
CLASS lcl_http_client DEFINITION FINAL.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING ii_client TYPE REF TO if_http_client,
close,
set_digest
IMPORTING io_digest TYPE REF TO lcl_http_digest,
send_receive_close
IMPORTING
iv_data TYPE xstring
RETURNING
VALUE(rv_data) TYPE xstring
RAISING lcx_exception,
get_cdata
RETURNING VALUE(rv_value) TYPE string,
check_http_200
RAISING lcx_exception,
send_receive
RAISING lcx_exception,
set_headers
IMPORTING iv_url TYPE string
iv_service TYPE string
RAISING lcx_exception.
PRIVATE SECTION.
DATA: mi_client TYPE REF TO if_http_client,
mo_digest TYPE REF TO lcl_http_digest.
ENDCLASS.
CLASS lcl_http_client IMPLEMENTATION.
METHOD constructor.
mi_client = ii_client.
ENDMETHOD.
METHOD set_digest.
mo_digest = io_digest.
ENDMETHOD.
METHOD send_receive_close.
* do not use set_cdata as it modifies the Content-Type header field
mi_client->request->set_data( iv_data ).
send_receive( ).
check_http_200( ).
rv_data = mi_client->response->get_data( ).
mi_client->close( ).
ENDMETHOD.
METHOD get_cdata.
rv_value = mi_client->response->get_cdata( ).
ENDMETHOD.
METHOD close.
mi_client->close( ).
ENDMETHOD.
METHOD set_headers.
DATA: lv_value TYPE string.
mi_client->request->set_header_field(
name = '~request_method'
value = 'POST' ).
lv_value = lcl_url=>path_name( iv_url ) &&
'/git-' &&
iv_service &&
'-pack'.
mi_client->request->set_header_field(
name = '~request_uri'
value = lv_value ).
lv_value = 'application/x-git-'
&& iv_service && '-pack-request'. "#EC NOTEXT
mi_client->request->set_header_field(
name = 'Content-Type'
value = lv_value ). "#EC NOTEXT
lv_value = 'application/x-git-'
&& iv_service && '-pack-result'. "#EC NOTEXT
mi_client->request->set_header_field(
name = 'Accept'
value = lv_value ). "#EC NOTEXT
IF mo_digest IS BOUND.
mo_digest->run( mi_client ).
ENDIF.
ENDMETHOD. "set_headers
METHOD send_receive.
DATA lv_text TYPE string.
mi_client->send( ).
mi_client->receive(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
" make sure:
" a) SSL is setup properly in STRUST
" b) no firewalls
" check trace file in transaction SMICM
lv_text = 'HTTP Communication Failure'. "#EC NOTEXT
WHEN 2.
lv_text = 'HTTP Invalid State'. "#EC NOTEXT
WHEN 3.
lv_text = 'HTTP Processing failed'. "#EC NOTEXT
WHEN OTHERS.
lv_text = 'Another error occured'. "#EC NOTEXT
ENDCASE.
lcx_exception=>raise( lv_text ).
ENDIF.
ENDMETHOD. "send_receive
METHOD check_http_200.
DATA: lv_code TYPE i,
lv_text TYPE string.
mi_client->response->get_status(
IMPORTING
code = lv_code ).
CASE lv_code.
WHEN 200.
RETURN.
WHEN 302.
lcx_exception=>raise( 'HTTP redirect, check URL' ).
WHEN 401.
lcx_exception=>raise( 'HTTP 401, unauthorized' ).
WHEN 403.
lcx_exception=>raise( 'HTTP 403, forbidden' ).
WHEN 404.
lcx_exception=>raise( 'HTTP 404, not found' ).
WHEN 415.
lcx_exception=>raise( 'HTTP 415, unsupported media type' ).
WHEN OTHERS.
lv_text = mi_client->response->get_cdata( ).
lcx_exception=>raise( |HTTP error code: { lv_code }, { lv_text }| ).
ENDCASE.
ENDMETHOD. "http_200
ENDCLASS.
CLASS lcl_http_digest IMPLEMENTATION.
METHOD constructor.
parse( ii_client ).
mv_ha1 = md5( |{ iv_username }:{ mv_realm }:{ iv_password }| ).
mv_username = iv_username.
ENDMETHOD.
METHOD hash.
DATA: lv_ha2 TYPE string.
lv_ha2 = md5( |{ iv_method }:{ iv_uri }| ).
ASSERT NOT iv_cnonse IS INITIAL.
rv_response = md5( |{ mv_ha1 }:{ iv_nonce }:{ gv_nc }:{ iv_cnonse }:{ iv_qop }:{ lv_ha2 }| ).
ENDMETHOD.
METHOD run.
DATA: lv_response TYPE string,
lv_method TYPE string,
lv_cnonce TYPE string,
lv_uri TYPE string,
lv_auth TYPE string.
ASSERT NOT mv_nonce IS INITIAL.
lv_method = ii_client->request->get_header_field( '~request_method' ).
lv_uri = ii_client->request->get_header_field( '~request_uri' ).
CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
EXPORTING
number_chars = 24
IMPORTING
random_string = lv_cnonce.
lv_response = hash(
iv_qop = mv_qop
iv_nonce = mv_nonce
iv_uri = lv_uri
iv_method = lv_method
iv_cnonse = lv_cnonce ).
* client response
lv_auth = |Digest username="{ mv_username
}", realm="{ mv_realm
}", nonce="{ mv_nonce
}", uri="{ lv_uri
}", qop={ mv_qop
}, nc={ gv_nc
}, cnonce="{ lv_cnonce
}", response="{ lv_response }"|.
ii_client->request->set_header_field(
name = 'Authorization'
value = lv_auth ).
ENDMETHOD.
METHOD parse.
DATA: lv_value TYPE string.
lv_value = ii_client->response->get_header_field( 'www-authenticate' ).
FIND REGEX 'realm="([\w ]+)"' IN lv_value SUBMATCHES mv_realm.
FIND REGEX 'qop="(\w+)"' IN lv_value SUBMATCHES mv_qop.
FIND REGEX 'nonce="([\w=/+\$]+)"' IN lv_value SUBMATCHES mv_nonce.
ENDMETHOD.
METHOD md5.
DATA: lv_xstr TYPE xstring,
lv_hash TYPE xstring.
lv_xstr = lcl_convert=>string_to_xstring_utf8( iv_data ).
CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
EXPORTING
alg = 'MD5'
data = lv_xstr
IMPORTING
hashxstring = lv_hash
EXCEPTIONS
unknown_alg = 1
param_error = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from CALCULATE_HASH_FOR_RAW' ).
ENDIF.
rv_hash = lv_hash.
TRANSLATE rv_hash TO LOWER CASE.
ENDMETHOD.
ENDCLASS.
CLASS lcl_http DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: BEGIN OF gc_scheme,
digest TYPE string VALUE 'Digest',
END OF gc_scheme.
CLASS-METHODS:
get_agent
RETURNING VALUE(rv_agent) TYPE string,
create_by_url
IMPORTING iv_url TYPE string
iv_service TYPE string
RETURNING VALUE(ro_client) TYPE REF TO lcl_http_client
RAISING lcx_exception.
PRIVATE SECTION.
CLASS-METHODS:
check_auth_requested
IMPORTING ii_client TYPE REF TO if_http_client
RETURNING VALUE(rv_auth_requested) TYPE abap_bool
RAISING lcx_exception,
is_local_system
IMPORTING iv_url TYPE string
RETURNING VALUE(rv_bool) TYPE abap_bool,
acquire_login_details
IMPORTING ii_client TYPE REF TO if_http_client
io_client TYPE REF TO lcl_http_client
iv_url TYPE string
RETURNING VALUE(rv_scheme) TYPE string
RAISING lcx_exception.
ENDCLASS.
CLASS lcl_http IMPLEMENTATION.
METHOD get_agent.
* bitbucket require agent prefix = "git/"
rv_agent = 'git/abapGit-' && gc_abap_version.
ENDMETHOD.
METHOD create_by_url.
DATA: lv_uri TYPE string,
lv_scheme TYPE string,
li_client TYPE REF TO if_http_client,
lo_settings TYPE REF TO lcl_settings.
lo_settings = lcl_app=>settings( )->read( ).
cl_http_client=>create_by_url(
EXPORTING
url = lcl_url=>host( iv_url )
ssl_id = 'ANONYM'
proxy_host = lo_settings->get_proxy_url( )
proxy_service = lo_settings->get_proxy_port( )
IMPORTING
client = li_client ).
CREATE OBJECT ro_client
EXPORTING
ii_client = li_client.
IF is_local_system( iv_url ) = abap_true.
li_client->send_sap_logon_ticket( ).
ENDIF.
li_client->request->set_cdata( '' ).
li_client->request->set_header_field(
name = '~request_method'
value = 'GET' ).
li_client->request->set_header_field(
name = 'user-agent'
value = get_agent( ) ). "#EC NOTEXT
lv_uri = lcl_url=>path_name( iv_url ) &&
'/info/refs?service=git-' &&
iv_service &&
'-pack'.
li_client->request->set_header_field(
name = '~request_uri'
value = lv_uri ).
" Disable internal auth dialog (due to its unclarity)
li_client->propertytype_logon_popup = if_http_client=>co_disabled.
lcl_login_manager=>load( iv_uri = iv_url
ii_client = li_client ).
ro_client->send_receive( ).
IF check_auth_requested( li_client ) = abap_true.
lv_scheme = acquire_login_details( ii_client = li_client
io_client = ro_client
iv_url = iv_url ).
ro_client->send_receive( ).
ENDIF.
ro_client->check_http_200( ).
IF lv_scheme <> gc_scheme-digest.
lcl_login_manager=>save( iv_uri = iv_url
ii_client = li_client ).
ENDIF.
ENDMETHOD.
METHOD is_local_system.
DATA: lv_host TYPE string,
lt_list TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY.
CALL FUNCTION 'ICM_GET_INFO2'
TABLES
servlist = lt_list
EXCEPTIONS
icm_error = 1
icm_timeout = 2
icm_not_authorized = 3
OTHERS = 4.
IF sy-subrc <> 0.
RETURN.
ENDIF.
FIND REGEX 'https?://([^/^:]*)' IN iv_url
SUBMATCHES lv_host.
READ TABLE lt_list WITH KEY hostname = lv_host TRANSPORTING NO FIELDS.
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD.
METHOD check_auth_requested.
DATA: lv_code TYPE i.
ii_client->response->get_status(
IMPORTING
code = lv_code ).
IF lv_code = 401.
rv_auth_requested = abap_true.
ENDIF.
ENDMETHOD. "check_auth_requested
METHOD acquire_login_details.
DATA: lv_default_user TYPE string,
lv_user TYPE string,
lv_pass TYPE string,
lo_digest TYPE REF TO lcl_http_digest.
lv_default_user = lcl_app=>user( )->get_repo_username( iv_url ).
lv_user = lv_default_user.
lcl_password_dialog=>popup(
EXPORTING
iv_repo_url = iv_url
CHANGING
cv_user = lv_user
cv_pass = lv_pass ).
IF lv_user IS INITIAL.
lcx_exception=>raise( 'HTTP 401, unauthorized' ).
ENDIF.
IF lv_user <> lv_default_user.
lcl_app=>user( )->set_repo_username( iv_url = iv_url
iv_username = lv_user ).
ENDIF.
rv_scheme = ii_client->response->get_header_field( 'www-authenticate' ).
FIND REGEX '^(\w+)' IN rv_scheme SUBMATCHES rv_scheme.
CASE rv_scheme.
WHEN gc_scheme-digest.
* https://en.wikipedia.org/wiki/Digest_access_authentication
* e.g. used by https://www.gerritcodereview.com/
CREATE OBJECT lo_digest
EXPORTING
ii_client = ii_client
iv_username = lv_user
iv_password = lv_pass.
lo_digest->run( ii_client ).
io_client->set_digest( lo_digest ).
WHEN OTHERS.
* https://en.wikipedia.org/wiki/Basic_access_authentication
ii_client->authenticate(
username = lv_user
password = lv_pass ).
ENDCASE.
ENDMETHOD. "acquire_login_details
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_HTTP</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_HTTP</ENTRY>
<LENGTH>21</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,208 @@
/**********************************************************
* ABAPGIT JS function library
**********************************************************/
/**********************************************************
* Polyfills
**********************************************************/
// Bind polyfill (for IE7), taken from https://developer.mozilla.org/
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== "function") {
throw new TypeError("Function.prototype.bind - subject is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(this instanceof fNOP
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
if (this.prototype) {
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP();
return fBound;
};
}
/**********************************************************
* Common functions
**********************************************************/
// Output text to the debug div
function debugOutput(text, dstID) {
var stdout = document.getElementById(dstID || "debug-output");
var wrapped = "<p>" + text + "</p>";
stdout.innerHTML = stdout.innerHTML + wrapped;
}
// Create hidden form and submit with sapevent
function submitSapeventForm(params, action) {
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "sapevent:" + action);
for(var key in params) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
document.body.appendChild(form);
form.submit();
}
// Set focus to a control
function setInitialFocus(id) {
document.getElementById(id).focus();
}
// Submit an existing form
function submitFormById(id) {
document.getElementById(id).submit();
}
/**********************************************************
* STAGE PAGE Logic
**********************************************************/
// Stage helper constructor
function StageHelper(params) {
this.pageSeed = params.seed;
this.tabId = params.stageTabId;
this.formAction = params.formAction;
this.commitNodeId = params.commitNodeId;
this.commitAllNodeId = params.commitAllNodeId;
this.choiseCount = 0;
this.setHook();
}
// Hook global click listener on table, load/unload actions
StageHelper.prototype.setHook = function() {
var stageTab = document.getElementById(this.tabId);
if (stageTab.addEventListener) {
stageTab.addEventListener("click", this.onEvent.bind(this));
} else {
stageTab.attachEvent("onclick", this.onEvent.bind(this));
}
window.onbeforeunload = this.onPageUnload.bind(this);
window.onload = this.onPageLoad.bind(this);
}
// Store table state on leaving the page
StageHelper.prototype.onPageUnload = function() {
var data = this.collectData();
window.sessionStorage.setItem(this.pageSeed, JSON.stringify(data));
}
// Re-store table state on entering the page
StageHelper.prototype.onPageLoad = function() {
var data = JSON.parse(window.sessionStorage.getItem(this.pageSeed));
var stage = document.getElementById(this.tabId);
for (var i = stage.rows.length - 1; i >= 0; i--) {
var tr = stage.rows[i];
if (tr.parentNode.tagName == "THEAD") continue;
var context = tr.parentNode.className;
var cmd = data[tr.cells[1].innerText];
if (!cmd) continue;
this.formatTR(tr, cmd, context);
this.choiseCount += (this.countChoiceImpact(cmd) > 0) ? 1 : 0;
}
this.updateMenu();
}
// Event handler, change status
StageHelper.prototype.onEvent = function (event) {
if (!event.target) {
if (event.srcElement) { event.target = event.srcElement; }
else { return; }
}
if (event.target.tagName != "A") return;
var td = event.target.parentNode;
if (!td || td.tagName != "TD" || td.className != "cmd") return;
var cmd = event.target.innerText;
var tr = td.parentNode;
var context = tr.parentNode.className;
switch (cmd) {
case "add": cmd = "A"; break;
case "remove": cmd = "R"; break;
case "ignore": cmd = "I"; break;
case "reset": cmd = "?"; break;
}
this.formatTR(tr, cmd, context);
this.choiseCount += this.countChoiceImpact(cmd);
this.updateMenu();
}
// Update action counter -> affects menu update after
StageHelper.prototype.countChoiceImpact = function (cmd) {
if ("ARI".indexOf(cmd) > -1) { return 1; }
else if ("?".indexOf(cmd) > -1) { return -1; }
else { alert("Unknown command"); }
}
// Re-format table line
StageHelper.prototype.formatTR = function (tr, cmd, context) {
var cmdReset = "<a>reset</a>";
var cmdLocal = "<a>add</a>";
var cmdRemote = "<a>ignore</a><a>remove</a>";
tr.cells[0].innerText = cmd;
if (cmd == "?") {
tr.cells[0].style.color = "#CCC"; //grey
tr.cells[2].innerHTML = (context == "local") ? cmdLocal : cmdRemote;
} else {
tr.cells[0].style.color = "";
tr.cells[2].innerHTML = cmdReset;
}
}
// Update menu items visibility
StageHelper.prototype.updateMenu = function () {
if (this.choiseCount > 0) {
document.getElementById(this.commitNodeId).style.display = "inline";
document.getElementById(this.commitAllNodeId).style.display = "none";
} else {
document.getElementById(this.commitNodeId).style.display = "none";
document.getElementById(this.commitAllNodeId).style.display = "inline";
}
}
// Submin stage state to the server
StageHelper.prototype.submit = function () {
var data = this.collectData();
submitSapeventForm(data, this.formAction);
}
// Extract data from the table
StageHelper.prototype.collectData = function () {
var stage = document.getElementById(this.tabId);
var data = {};
for (var i = 0; i < stage.rows.length; i++) {
var row = stage.rows[i];
if (row.parentNode.tagName == "THEAD") continue;
data[row.cells[1].innerText] = row.cells[0].innerText;
}
return data;
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_W3MI" serializer_version="v2.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<NAME>ZABAPGIT_JS_COMMON</NAME>
<TEXT>Abapgit common JS library</TEXT>
<PARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>fileextension</NAME>
<VALUE>.js</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>filename</NAME>
<VALUE>common.js</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>mimetype</NAME>
<VALUE>text/javascript</VALUE>
</WWWPARAMS>
</PARAMS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,23 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_MACROS
*&---------------------------------------------------------------------*
* Macros
DEFINE _object_check_timestamp.
IF sy-subrc = 0 AND &1 IS NOT INITIAL AND &2 IS NOT INITIAL.
cl_abap_tstmp=>systemtstmp_syst2utc(
EXPORTING syst_date = &1
syst_time = &2
IMPORTING utc_tstmp = lv_ts ).
IF lv_ts < iv_timestamp.
rv_changed = abap_false. " Unchanged
ELSE.
rv_changed = abap_true.
RETURN.
ENDIF.
ELSE. " Not found? => changed
rv_changed = abap_true.
RETURN.
ENDIF.
END-OF-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_MACROS</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_MACROS</ENTRY>
<LENGTH>23</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,93 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_MIGRATIONS
*&---------------------------------------------------------------------*
CLASS lcl_migrations DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS run
RAISING lcx_exception.
CLASS-METHODS rebuild_local_checksums_161112
RAISING lcx_exception.
ENDCLASS. "lcl_migrations
CLASS lcl_migrations IMPLEMENTATION.
METHOD run.
" Migrate STDTEXT to TABLE
lcl_persistence_migrate=>run( ).
" Rebuild local file checksums
rebuild_local_checksums_161112( ).
ENDMETHOD. " run.
METHOD rebuild_local_checksums_161112.
DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt,
lv_repo_list TYPE string,
lv_question TYPE string,
lv_answer TYPE c,
lv_index TYPE i,
lo_repo TYPE REF TO lcl_repo_online.
FIELD-SYMBOLS: <repo> LIKE LINE OF lt_repos.
lt_repos = lcl_app=>repo_srv( )->list( ).
LOOP AT lt_repos ASSIGNING <repo>.
lv_index = sy-tabix.
IF <repo>->is_offline( ) = abap_true. " Skip local repos
DELETE lt_repos INDEX lv_index.
CONTINUE.
ENDIF.
" Ignore empty repos or repos with file checksums
IF lines( <repo>->get_local_checksums( ) ) = 0
OR lines( <repo>->get_local_checksums_per_file( ) ) > 0 .
DELETE lt_repos INDEX lv_index.
CONTINUE.
ENDIF.
lv_repo_list = lv_repo_list && `, ` && <repo>->get_name( ).
ENDLOOP.
IF lines( lt_repos ) = 0.
RETURN. " All OK
ENDIF.
SHIFT lv_repo_list BY 2 PLACES LEFT. " Remove leading ', '
lv_question = 'abapGit wants to rebuild missing local checksums'
&& ' (changes from 2016-12-11).'
&& ' Generally this is safe except if there are both local '
&& ' and remote changes at the same time. If unsure, please'
&& ' skip and update repos individually'
&& ' by "Advances/Update local checksums" command.'
&& | Repos affected: { lv_repo_list }|.
lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Warning'
text_question = lv_question
text_button_1 = 'OK'
icon_button_1 = 'ICON_OK'
text_button_2 = 'Skip update'
icon_button_2 = 'ICON_CANCEL'
default_button = '2'
display_cancel_button = abap_false ). "#EC NOTEXT
IF lv_answer = '2'.
RETURN.
ENDIF.
LOOP AT lt_repos ASSIGNING <repo>.
lo_repo ?= <repo>.
lo_repo->rebuild_local_checksums( ).
ENDLOOP.
ENDMETHOD. " rebuild_local_checksums_20161112.
ENDCLASS. "lcl_migrations

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_MIGRATIONS</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_MIGRATIONS</ENTRY>
<LENGTH>27</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

File diff suppressed because it is too large Load Diff

View File

@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_acid DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_acid IMPLEMENTATION. CLASS lcl_object_acid IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
@ -142,4 +146,8 @@ CLASS lcl_object_acid IMPLEMENTATION.
ENDMETHOD. "lif_object~jump ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_acid IMPLEMENTATION ENDCLASS. "lcl_object_acid IMPLEMENTATION

View File

@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_auth DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_auth IMPLEMENTATION. CLASS lcl_object_auth IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
@ -115,4 +119,8 @@ CLASS lcl_object_auth IMPLEMENTATION.
ENDMETHOD. "lif_object~jump ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_auth IMPLEMENTATION ENDCLASS. "lcl_object_auth IMPLEMENTATION

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_OBJECT_CLAS</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_OBJECT_CLAS</ENTRY>
<LENGTH>28</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -32,8 +32,13 @@ ENDCLASS. "lcl_object_msag DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_doct IMPLEMENTATION. CLASS lcl_object_doct IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD read. METHOD read.
@ -146,4 +151,8 @@ CLASS lcl_object_doct IMPLEMENTATION.
ENDMETHOD. "serialize ENDMETHOD. "serialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_msag IMPLEMENTATION ENDCLASS. "lcl_object_msag IMPLEMENTATION

View File

@ -31,6 +31,10 @@ ENDCLASS. "lcl_object_msag DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_docv IMPLEMENTATION. CLASS lcl_object_docv IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = read( )-head-tdluser. rv_user = read( )-head-tdluser.
ENDMETHOD. "lif_object~changed_by ENDMETHOD. "lif_object~changed_by
@ -61,6 +65,7 @@ CLASS lcl_object_docv IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -150,4 +155,8 @@ CLASS lcl_object_docv IMPLEMENTATION.
ENDMETHOD. "serialize ENDMETHOD. "serialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_msag IMPLEMENTATION ENDCLASS. "lcl_object_msag IMPLEMENTATION

View File

@ -13,6 +13,34 @@ CLASS lcl_object_doma DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object. INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files. ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: BEGIN OF ty_dd01_texts,
ddlanguage TYPE dd01v-ddlanguage,
ddtext TYPE dd01v-ddtext,
END OF ty_dd01_texts,
BEGIN OF ty_dd07_texts,
valpos TYPE dd07v-valpos,
ddlanguage TYPE dd07v-ddlanguage,
domvalue_l TYPE dd07v-domvalue_l,
domvalue_h TYPE dd07v-domvalue_h,
ddtext TYPE dd07v-ddtext,
domval_ld TYPE dd07v-domval_ld,
domval_hd TYPE dd07v-domval_hd,
END OF ty_dd07_texts,
tt_dd01_texts TYPE STANDARD TABLE OF ty_dd01_texts,
tt_dd07_texts TYPE STANDARD TABLE OF ty_dd07_texts.
METHODS:
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
is_dd01v TYPE dd01v
it_dd07v TYPE dd07v_tab
RAISING lcx_exception.
ENDCLASS. "lcl_object_doma DEFINITION ENDCLASS. "lcl_object_doma DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -22,6 +50,22 @@ ENDCLASS. "lcl_object_doma DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_doma IMPLEMENTATION. CLASS lcl_object_doma IMPLEMENTATION.
METHOD lif_object~has_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp.
SELECT SINGLE as4date as4time FROM dd01l
INTO (lv_date, lv_time)
WHERE domname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
_object_check_timestamp lv_date lv_time.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE as4user FROM dd01l INTO rv_user SELECT SINGLE as4user FROM dd01l INTO rv_user
@ -102,12 +146,9 @@ CLASS lcl_object_doma IMPLEMENTATION.
EXCEPTIONS EXCEPTIONS
illegal_input = 1 illegal_input = 1
OTHERS = 2. OTHERS = 2.
IF sy-subrc <> 0. IF sy-subrc <> 0 OR ls_dd01v IS INITIAL.
lcx_exception=>raise( 'error from DDIF_DOMA_GET' ). lcx_exception=>raise( 'error from DDIF_DOMA_GET' ).
ENDIF. ENDIF.
IF ls_dd01v IS INITIAL.
RETURN. " does not exist
ENDIF.
CLEAR: ls_dd01v-as4user, CLEAR: ls_dd01v-as4user,
ls_dd01v-as4date, ls_dd01v-as4date,
@ -118,6 +159,8 @@ CLASS lcl_object_doma IMPLEMENTATION.
io_xml->add( iv_name = 'DD07V_TAB' io_xml->add( iv_name = 'DD07V_TAB'
ig_data = lt_dd07v ). ig_data = lt_dd07v ).
serialize_texts( io_xml ).
ENDMETHOD. "serialize ENDMETHOD. "serialize
METHOD lif_object~deserialize. METHOD lif_object~deserialize.
@ -128,8 +171,8 @@ CLASS lcl_object_doma IMPLEMENTATION.
* fm TR_TADIR_INTERFACE * fm TR_TADIR_INTERFACE
* fm RS_CORR_INSERT ? * fm RS_CORR_INSERT ?
DATA: ls_dd01v TYPE dd01v, DATA: lv_name TYPE ddobjname,
lv_name TYPE ddobjname, ls_dd01v TYPE dd01v,
lt_dd07v TYPE TABLE OF dd07v. lt_dd07v TYPE TABLE OF dd07v.
@ -159,8 +202,153 @@ CLASS lcl_object_doma IMPLEMENTATION.
lcx_exception=>raise( 'error from DDIF_DOMA_PUT' ). lcx_exception=>raise( 'error from DDIF_DOMA_PUT' ).
ENDIF. ENDIF.
deserialize_texts( io_xml = io_xml
is_dd01v = ls_dd01v
it_dd07v = lt_dd07v ).
lcl_objects_activation=>add_item( ms_item ). lcl_objects_activation=>add_item( ms_item ).
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD serialize_texts.
DATA: lv_name TYPE ddobjname,
lv_index TYPE i,
ls_dd01v TYPE dd01v,
lt_dd07v TYPE TABLE OF dd07v,
lt_i18n_langs TYPE TABLE OF langu,
lt_dd01_texts TYPE tt_dd01_texts,
lt_dd07_texts TYPE tt_dd07_texts.
FIELD-SYMBOLS: <lang> LIKE LINE OF lt_i18n_langs,
<dd07v> LIKE LINE OF lt_dd07v,
<dd01_text> LIKE LINE OF lt_dd01_texts,
<dd07_text> LIKE LINE OF lt_dd07_texts.
lv_name = ms_item-obj_name.
" Collect additional languages
SELECT DISTINCT ddlanguage AS langu INTO TABLE lt_i18n_langs
FROM dd01v
WHERE domname = lv_name
AND ddlanguage <> mv_language. " Skip master lang - it was serialized already
LOOP AT lt_i18n_langs ASSIGNING <lang>.
lv_index = sy-tabix.
CALL FUNCTION 'DDIF_DOMA_GET'
EXPORTING
name = lv_name
langu = <lang>
IMPORTING
dd01v_wa = ls_dd01v
TABLES
dd07v_tab = lt_dd07v
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc <> 0 OR ls_dd01v-ddlanguage IS INITIAL.
DELETE lt_i18n_langs INDEX lv_index. " Don't save this lang
CONTINUE.
ENDIF.
APPEND INITIAL LINE TO lt_dd01_texts ASSIGNING <dd01_text>.
MOVE-CORRESPONDING ls_dd01v TO <dd01_text>.
LOOP AT lt_dd07v ASSIGNING <dd07v>.
APPEND INITIAL LINE TO lt_dd07_texts ASSIGNING <dd07_text>.
MOVE-CORRESPONDING <dd07v> TO <dd07_text>.
ENDLOOP.
ENDLOOP.
SORT lt_i18n_langs ASCENDING.
SORT lt_dd01_texts BY ddlanguage ASCENDING.
SORT lt_dd07_texts BY ddlanguage ASCENDING.
IF lines( lt_i18n_langs ) > 1.
io_xml->add( iv_name = 'I18N_LANGS'
ig_data = lt_i18n_langs ).
io_xml->add( iv_name = 'DD01_TEXTS'
ig_data = lt_dd01_texts ).
io_xml->add( iv_name = 'DD07_TEXTS'
ig_data = lt_dd07_texts ).
ENDIF.
ENDMETHOD. "serialize_texts
METHOD deserialize_texts.
DATA: lv_name TYPE ddobjname,
ls_dd01v_tmp TYPE dd01v,
lt_dd07v_tmp TYPE TABLE OF dd07v,
lt_i18n_langs TYPE TABLE OF langu,
lt_dd01_texts TYPE tt_dd01_texts,
lt_dd07_texts TYPE tt_dd07_texts.
FIELD-SYMBOLS: <lang> LIKE LINE OF lt_i18n_langs,
<dd07v> LIKE LINE OF it_dd07v,
<dd01_text> LIKE LINE OF lt_dd01_texts,
<dd07_text> LIKE LINE OF lt_dd07_texts.
lv_name = ms_item-obj_name.
io_xml->read( EXPORTING iv_name = 'I18N_LANGS'
CHANGING cg_data = lt_i18n_langs ).
io_xml->read( EXPORTING iv_name = 'DD01_TEXTS'
CHANGING cg_data = lt_dd01_texts ).
io_xml->read( EXPORTING iv_name = 'DD07_TEXTS'
CHANGING cg_data = lt_dd07_texts ).
SORT lt_i18n_langs.
SORT lt_dd07_texts BY ddlanguage. " Optimization
LOOP AT lt_i18n_langs ASSIGNING <lang>.
" Domain description
ls_dd01v_tmp = is_dd01v.
READ TABLE lt_dd01_texts ASSIGNING <dd01_text> WITH KEY ddlanguage = <lang>.
IF sy-subrc > 0.
lcx_exception=>raise( |DD01_TEXTS cannot find lang { <lang> } in XML| ).
ENDIF.
MOVE-CORRESPONDING <dd01_text> TO ls_dd01v_tmp.
" Domain values
lt_dd07v_tmp = it_dd07v.
LOOP AT lt_dd07v_tmp ASSIGNING <dd07v>.
READ TABLE lt_dd07_texts ASSIGNING <dd07_text>
WITH KEY ddlanguage = <lang> valpos = <dd07v>-valpos.
CHECK sy-subrc = 0. " ! no translation -> master translation remain (maybe not OK)
MOVE-CORRESPONDING <dd07_text> TO <dd07v>.
DELETE lt_dd07_texts INDEX sy-tabix. " Optimization
ENDLOOP.
CALL FUNCTION 'DDIF_DOMA_PUT'
EXPORTING
name = lv_name
dd01v_wa = ls_dd01v_tmp
TABLES
dd07v_tab = lt_dd07v_tmp
EXCEPTIONS
doma_not_found = 1
name_inconsistent = 2
doma_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from DDIF_DOMA_PUT @TEXTS' ).
ENDIF.
ENDLOOP.
ENDMETHOD. "deserialize_texts
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_doma IMPLEMENTATION ENDCLASS. "lcl_object_doma IMPLEMENTATION

View File

@ -13,6 +13,27 @@ CLASS lcl_object_dtel DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object. INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files. ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: BEGIN OF ty_dd04_texts,
ddlanguage TYPE dd04t-ddlanguage,
ddtext TYPE dd04t-ddtext,
reptext TYPE dd04t-reptext,
scrtext_s TYPE dd04t-scrtext_s,
scrtext_m TYPE dd04t-scrtext_m,
scrtext_l TYPE dd04t-scrtext_l,
END OF ty_dd04_texts,
tt_dd04_texts TYPE STANDARD TABLE OF ty_dd04_texts.
METHODS:
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
is_dd04v TYPE dd04v
RAISING lcx_exception.
ENDCLASS. "lcl_object_dtel DEFINITION ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -22,6 +43,22 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_dtel IMPLEMENTATION. CLASS lcl_object_dtel IMPLEMENTATION.
METHOD lif_object~has_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp.
SELECT SINGLE as4date as4time FROM dd04l
INTO (lv_date, lv_time)
WHERE rollname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
_object_check_timestamp lv_date lv_time.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE as4user FROM dd04l INTO rv_user SELECT SINGLE as4user FROM dd04l INTO rv_user
@ -62,9 +99,9 @@ CLASS lcl_object_dtel IMPLEMENTATION.
DATA: lv_objname TYPE rsedd0-ddobjname. DATA: lv_objname TYPE rsedd0-ddobjname.
lv_objname = ms_item-obj_name. lv_objname = ms_item-obj_name.
CALL FUNCTION 'RS_DD_DELETE_OBJ' CALL FUNCTION 'RS_DD_DELETE_OBJ'
EXPORTING EXPORTING
no_ask = abap_true no_ask = abap_true
@ -87,9 +124,9 @@ CLASS lcl_object_dtel IMPLEMENTATION.
ls_dd04v TYPE dd04v, ls_dd04v TYPE dd04v,
ls_tpara TYPE tpara. ls_tpara TYPE tpara.
lv_name = ms_item-obj_name. lv_name = ms_item-obj_name.
CALL FUNCTION 'DDIF_DTEL_GET' CALL FUNCTION 'DDIF_DTEL_GET'
EXPORTING EXPORTING
name = lv_name name = lv_name
@ -100,22 +137,34 @@ CLASS lcl_object_dtel IMPLEMENTATION.
EXCEPTIONS EXCEPTIONS
illegal_input = 1 illegal_input = 1
OTHERS = 2. OTHERS = 2.
IF sy-subrc <> 0. IF sy-subrc <> 0 OR ls_dd04v IS INITIAL.
lcx_exception=>raise( 'Error from DDIF_DTEL_GET' ). lcx_exception=>raise( 'Error from DDIF_DTEL_GET' ).
ENDIF. ENDIF.
IF ls_dd04v IS INITIAL.
RETURN. " does not exist
ENDIF.
CLEAR: ls_dd04v-as4user, CLEAR: ls_dd04v-as4user,
ls_dd04v-as4date, ls_dd04v-as4date,
ls_dd04v-as4time. ls_dd04v-as4time.
IF ls_dd04v-refkind = 'D'.
* clear values inherited from domain
CLEAR: ls_dd04v-datatype,
ls_dd04v-leng,
ls_dd04v-decimals,
ls_dd04v-outputlen,
ls_dd04v-valexi,
ls_dd04v-lowercase,
ls_dd04v-signflag,
ls_dd04v-convexit,
ls_dd04v-entitytab.
ENDIF.
io_xml->add( iv_name = 'DD04V' io_xml->add( iv_name = 'DD04V'
ig_data = ls_dd04v ). ig_data = ls_dd04v ).
io_xml->add( iv_name = 'TPARA' io_xml->add( iv_name = 'TPARA'
ig_data = ls_tpara ). ig_data = ls_tpara ).
serialize_texts( io_xml ).
ENDMETHOD. "serialize ENDMETHOD. "serialize
METHOD lif_object~deserialize. METHOD lif_object~deserialize.
@ -149,8 +198,116 @@ CLASS lcl_object_dtel IMPLEMENTATION.
lcx_exception=>raise( 'error from DDIF_DTEL_PUT' ). lcx_exception=>raise( 'error from DDIF_DTEL_PUT' ).
ENDIF. ENDIF.
deserialize_texts( io_xml = io_xml
is_dd04v = ls_dd04v ).
lcl_objects_activation=>add_item( ms_item ). lcl_objects_activation=>add_item( ms_item ).
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD serialize_texts.
DATA: lv_name TYPE ddobjname,
lv_index TYPE i,
ls_dd04v TYPE dd04v,
lt_dd04_texts TYPE tt_dd04_texts,
lt_i18n_langs TYPE TABLE OF langu.
FIELD-SYMBOLS: <lang> LIKE LINE OF lt_i18n_langs,
<dd04_text> TYPE ty_dd04_texts.
lv_name = ms_item-obj_name.
" Collect additional languages
SELECT DISTINCT ddlanguage AS langu INTO TABLE lt_i18n_langs
FROM dd04v
WHERE rollname = lv_name
AND ddlanguage <> mv_language. " Skip master lang - it was serialized already
LOOP AT lt_i18n_langs ASSIGNING <lang>.
lv_index = sy-tabix.
CALL FUNCTION 'DDIF_DTEL_GET'
EXPORTING
name = lv_name
langu = <lang>
IMPORTING
dd04v_wa = ls_dd04v
* tpara_wa = ls_tpara
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc <> 0 OR ls_dd04v-ddlanguage IS INITIAL.
DELETE lt_i18n_langs INDEX lv_index. " Don't save this lang
CONTINUE.
ENDIF.
APPEND INITIAL LINE TO lt_dd04_texts ASSIGNING <dd04_text>.
MOVE-CORRESPONDING ls_dd04v TO <dd04_text>.
ENDLOOP.
SORT lt_i18n_langs ASCENDING.
SORT lt_dd04_texts BY ddlanguage ASCENDING.
IF lines( lt_i18n_langs ) > 0.
io_xml->add( iv_name = 'I18N_LANGS'
ig_data = lt_i18n_langs ).
io_xml->add( iv_name = 'DD04_TEXTS'
ig_data = lt_dd04_texts ).
ENDIF.
ENDMETHOD.
METHOD deserialize_texts.
DATA: lv_name TYPE ddobjname,
ls_dd04v_tmp TYPE dd04v,
lt_i18n_langs TYPE TABLE OF langu,
lt_dd04_texts TYPE tt_dd04_texts.
FIELD-SYMBOLS: <lang> LIKE LINE OF lt_i18n_langs,
<dd04_text> TYPE ty_dd04_texts.
lv_name = ms_item-obj_name.
io_xml->read( EXPORTING iv_name = 'I18N_LANGS'
CHANGING cg_data = lt_i18n_langs ).
io_xml->read( EXPORTING iv_name = 'DD04_TEXTS'
CHANGING cg_data = lt_dd04_texts ).
SORT lt_i18n_langs.
SORT lt_dd04_texts BY ddlanguage. " Optimization
LOOP AT lt_i18n_langs ASSIGNING <lang>.
" Data element description
ls_dd04v_tmp = is_dd04v.
READ TABLE lt_dd04_texts ASSIGNING <dd04_text> WITH KEY ddlanguage = <lang>.
IF sy-subrc > 0.
lcx_exception=>raise( |DD04_TEXTS cannot find lang { <lang> } in XML| ).
ENDIF.
MOVE-CORRESPONDING <dd04_text> TO ls_dd04v_tmp.
CALL FUNCTION 'DDIF_DTEL_PUT'
EXPORTING
name = lv_name
dd04v_wa = ls_dd04v_tmp
EXCEPTIONS
dtel_not_found = 1
name_inconsistent = 2
dtel_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from DDIF_DTEL_PUT @TEXTS' ).
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_dtel IMPLEMENTATION ENDCLASS. "lcl_object_dtel IMPLEMENTATION

View File

@ -14,6 +14,13 @@ CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL.
ALIASES mo_files FOR lif_object~mo_files. ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION. PRIVATE SECTION.
TYPES: BEGIN OF ty_spaces,
full_name TYPE string.
TYPES: spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
END OF ty_spaces.
TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY.
METHODS deserialize_badi METHODS deserialize_badi
IMPORTING io_xml TYPE REF TO lcl_xml_input IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass iv_package TYPE devclass
@ -34,6 +41,15 @@ CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL.
ii_enh_tool TYPE REF TO if_enh_tool ii_enh_tool TYPE REF TO if_enh_tool
RAISING lcx_exception. RAISING lcx_exception.
METHODS hook_impl_serialize
EXPORTING et_spaces TYPE ty_spaces_tt
CHANGING ct_impl TYPE enh_hook_impl_it
RAISING lcx_exception.
METHODS hook_impl_deserialize
IMPORTING it_spaces TYPE ty_spaces_tt
CHANGING ct_impl TYPE enh_hook_impl_it
RAISING lcx_exception.
ENDCLASS. "lcl_object_enho DEFINITION ENDCLASS. "lcl_object_enho DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -43,6 +59,10 @@ ENDCLASS. "lcl_object_enho DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_enho IMPLEMENTATION. CLASS lcl_object_enho IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
@ -51,6 +71,53 @@ CLASS lcl_object_enho IMPLEMENTATION.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
METHOD hook_impl_serialize.
* handle normalization of XML values
* i.e. remove leading spaces
FIELD-SYMBOLS: <ls_impl> LIKE LINE OF ct_impl,
<ls_space> LIKE LINE OF et_spaces,
<lv_space> TYPE i,
<lv_line> TYPE string.
LOOP AT ct_impl ASSIGNING <ls_impl>.
APPEND INITIAL LINE TO et_spaces ASSIGNING <ls_space>.
<ls_space>-full_name = <ls_impl>-full_name.
LOOP AT <ls_impl>-source ASSIGNING <lv_line>.
APPEND INITIAL LINE TO <ls_space>-spaces ASSIGNING <lv_space>.
WHILE strlen( <lv_line> ) >= 1 AND <lv_line>(1) = ` `.
<lv_line> = <lv_line>+1.
<lv_space> = <lv_space> + 1.
ENDWHILE.
ENDLOOP.
ENDLOOP.
ENDMETHOD.
METHOD hook_impl_deserialize.
FIELD-SYMBOLS: <ls_impl> LIKE LINE OF ct_impl,
<lv_line> TYPE string,
<lv_space> TYPE i,
<ls_spaces> LIKE LINE OF it_spaces.
LOOP AT ct_impl ASSIGNING <ls_impl>.
READ TABLE it_spaces ASSIGNING <ls_spaces> WITH KEY full_name = <ls_impl>-full_name.
IF sy-subrc = 0.
LOOP AT <ls_impl>-source ASSIGNING <lv_line>.
READ TABLE <ls_spaces>-spaces ASSIGNING <lv_space> INDEX sy-tabix.
IF sy-subrc = 0 AND <lv_space> > 0.
DO <lv_space> TIMES.
CONCATENATE space <lv_line> INTO <lv_line> RESPECTING BLANKS.
ENDDO.
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD lif_object~exists. METHOD lif_object~exists.
DATA: ls_tadir TYPE tadir. DATA: ls_tadir TYPE tadir.
@ -78,7 +145,9 @@ CLASS lcl_object_enho IMPLEMENTATION.
lv_enh_id = ms_item-obj_name. lv_enh_id = ms_item-obj_name.
TRY. TRY.
li_enh_tool = cl_enh_factory=>get_enhancement( lv_enh_id ). li_enh_tool = cl_enh_factory=>get_enhancement(
enhancement_id = lv_enh_id
bypassing_buffer = abap_true ).
CATCH cx_enh_root. CATCH cx_enh_root.
lcx_exception=>raise( 'Error from CL_ENH_FACTORY' ). lcx_exception=>raise( 'Error from CL_ENH_FACTORY' ).
ENDTRY. ENDTRY.
@ -100,7 +169,7 @@ CLASS lcl_object_enho IMPLEMENTATION.
* WHEN cl_wdr_cfg_enhancement=>tooltype. * WHEN cl_wdr_cfg_enhancement=>tooltype.
* WHEN 'ENHWDYN'. "cl_enh_tool_wdy * WHEN 'ENHWDYN'. "cl_enh_tool_wdy
WHEN OTHERS. WHEN OTHERS.
lcx_exception=>raise( 'Unsupported ENHO type' ). lcx_exception=>raise( |Unsupported ENHO type { lv_tool }| ).
ENDCASE. ENDCASE.
ENDMETHOD. "serialize ENDMETHOD. "serialize
@ -130,7 +199,7 @@ CLASS lcl_object_enho IMPLEMENTATION.
* WHEN cl_wdr_cfg_enhancement=>tooltype. * WHEN cl_wdr_cfg_enhancement=>tooltype.
* WHEN 'ENHWDYN'. "cl_enh_tool_wdy * WHEN 'ENHWDYN'. "cl_enh_tool_wdy
WHEN OTHERS. WHEN OTHERS.
lcx_exception=>raise( 'Unsupported ENHO type' ). lcx_exception=>raise( |Unsupported ENHO type { lv_tool }| ).
ENDCASE. ENDCASE.
lcl_objects_activation=>add_item( ms_item ). lcl_objects_activation=>add_item( ms_item ).
@ -192,6 +261,7 @@ CLASS lcl_object_enho IMPLEMENTATION.
lv_enhname TYPE enhname, lv_enhname TYPE enhname,
lv_package TYPE devclass, lv_package TYPE devclass,
ls_original_object TYPE enh_hook_admin, ls_original_object TYPE enh_hook_admin,
lt_spaces TYPE ty_spaces_tt,
lt_enhancements TYPE enh_hook_impl_it. lt_enhancements TYPE enh_hook_impl_it.
FIELD-SYMBOLS: <ls_enhancement> LIKE LINE OF lt_enhancements. FIELD-SYMBOLS: <ls_enhancement> LIKE LINE OF lt_enhancements.
@ -203,6 +273,11 @@ CLASS lcl_object_enho IMPLEMENTATION.
CHANGING cg_data = ls_original_object ). CHANGING cg_data = ls_original_object ).
io_xml->read( EXPORTING iv_name = 'ENHANCEMENTS' io_xml->read( EXPORTING iv_name = 'ENHANCEMENTS'
CHANGING cg_data = lt_enhancements ). CHANGING cg_data = lt_enhancements ).
io_xml->read( EXPORTING iv_name = 'SPACES'
CHANGING cg_data = lt_spaces ).
hook_impl_deserialize( EXPORTING it_spaces = lt_spaces
CHANGING ct_impl = lt_enhancements ).
lv_enhname = ms_item-obj_name. lv_enhname = ms_item-obj_name.
lv_package = iv_package. lv_package = iv_package.
@ -275,6 +350,7 @@ CLASS lcl_object_enho IMPLEMENTATION.
DATA: lv_shorttext TYPE string, DATA: lv_shorttext TYPE string,
lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl, lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl,
ls_original_object TYPE enh_hook_admin, ls_original_object TYPE enh_hook_admin,
lt_spaces TYPE ty_spaces_tt,
lt_enhancements TYPE enh_hook_impl_it. lt_enhancements TYPE enh_hook_impl_it.
@ -292,6 +368,10 @@ CLASS lcl_object_enho IMPLEMENTATION.
ls_original_object-include_bound = lo_hook_impl->get_include_bound( ). ls_original_object-include_bound = lo_hook_impl->get_include_bound( ).
lt_enhancements = lo_hook_impl->get_hook_impls( ). lt_enhancements = lo_hook_impl->get_hook_impls( ).
hook_impl_serialize(
IMPORTING et_spaces = lt_spaces
CHANGING ct_impl = lt_enhancements ).
io_xml->add( iv_name = 'TOOL' io_xml->add( iv_name = 'TOOL'
ig_data = iv_tool ). ig_data = iv_tool ).
io_xml->add( ig_data = lv_shorttext io_xml->add( ig_data = lv_shorttext
@ -300,6 +380,8 @@ CLASS lcl_object_enho IMPLEMENTATION.
iv_name = 'ORIGINAL_OBJECT' ). iv_name = 'ORIGINAL_OBJECT' ).
io_xml->add( iv_name = 'ENHANCEMENTS' io_xml->add( iv_name = 'ENHANCEMENTS'
ig_data = lt_enhancements ). ig_data = lt_enhancements ).
io_xml->add( iv_name = 'SPACES'
ig_data = lt_spaces ).
ENDMETHOD. "serialize_hook ENDMETHOD. "serialize_hook
@ -334,4 +416,8 @@ CLASS lcl_object_enho IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_enho IMPLEMENTATION ENDCLASS. "lcl_object_enho IMPLEMENTATION

View File

@ -6,6 +6,7 @@
* CLASS lcl_object_enhs DEFINITION * CLASS lcl_object_enhs DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_enhs DEFINITION INHERITING FROM lcl_objects_super FINAL. CLASS lcl_object_enhs DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES lif_object. INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files. ALIASES mo_files FOR lif_object~mo_files.
@ -17,11 +18,29 @@ ENDCLASS. "lcl_object_enhs
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_enhs IMPLEMENTATION. CLASS lcl_object_enhs IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo
DATA: lv_spot_name TYPE enhspotname,
li_spot_ref TYPE REF TO if_enh_spot_tool.
lv_spot_name = ms_item-obj_name.
TRY.
li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ).
li_spot_ref->get_attributes( IMPORTING changedby = rv_user ).
CATCH cx_enh_root.
rv_user = c_user_unknown.
ENDTRY.
ENDMETHOD. ENDMETHOD.
METHOD lif_object~deserialize. METHOD lif_object~deserialize.
DATA: lv_message TYPE string, DATA: lv_message TYPE string,
lv_parent TYPE enhspotcompositename, lv_parent TYPE enhspotcompositename,
lv_spot_name TYPE enhspotname, lv_spot_name TYPE enhspotname,
@ -82,22 +101,24 @@ CLASS lcl_object_enhs IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~serialize. METHOD lif_object~serialize.
DATA: lv_message TYPE string,
lv_spot_name TYPE enhspotname, DATA: lv_spot_name TYPE enhspotname,
lv_enh_shtext TYPE string, lv_enh_shtext TYPE string,
lv_parent TYPE enhspotcompositename, lv_parent TYPE enhspotcompositename,
lt_enh_badi TYPE enh_badi_data_it, lt_enh_badi TYPE enh_badi_data_it,
lv_tool TYPE enhspottooltype,
lx_root TYPE REF TO cx_root, lx_root TYPE REF TO cx_root,
li_spot_ref TYPE REF TO if_enh_spot_tool, li_spot_ref TYPE REF TO if_enh_spot_tool,
lo_badidef_tool TYPE REF TO cl_enh_tool_badi_def. lo_badidef_tool TYPE REF TO cl_enh_tool_badi_def.
lv_spot_name = ms_item-obj_name. lv_spot_name = ms_item-obj_name.
TRY. TRY.
li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ). li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ).
lv_tool = li_spot_ref->get_tool( ).
lo_badidef_tool ?= li_spot_ref. lo_badidef_tool ?= li_spot_ref.
lv_enh_shtext = lo_badidef_tool->if_enh_object_docu~get_shorttext( ). lv_enh_shtext = lo_badidef_tool->if_enh_object_docu~get_shorttext( ).
"get parent = composite enhs (ENHC) "get parent = composite enhs (ENHC)
@ -105,6 +126,8 @@ CLASS lcl_object_enhs IMPLEMENTATION.
"get subsequent BADI definitions "get subsequent BADI definitions
lt_enh_badi = lo_badidef_tool->get_badi_defs( ). lt_enh_badi = lo_badidef_tool->get_badi_defs( ).
io_xml->add( ig_data = lv_tool
iv_name = 'TOOL' ).
io_xml->add( ig_data = lv_parent io_xml->add( ig_data = lv_parent
iv_name = 'PARENT_COMP' ). iv_name = 'PARENT_COMP' ).
io_xml->add( ig_data = lv_enh_shtext io_xml->add( ig_data = lv_enh_shtext
@ -113,9 +136,8 @@ CLASS lcl_object_enhs IMPLEMENTATION.
iv_name = 'BADI_DATA' ). iv_name = 'BADI_DATA' ).
CATCH cx_enh_root INTO lx_root. CATCH cx_enh_root INTO lx_root.
lv_message = `Error occured while serializing EHNS: ` lcx_exception=>raise( `Error occured while serializing EHNS: `
&& lx_root->get_text( ) ##NO_TEXT. && lx_root->get_text( ) ) ##NO_TEXT.
lcx_exception=>raise( lv_message ).
ENDTRY. ENDTRY.
ENDMETHOD. "serialize ENDMETHOD. "serialize
@ -123,6 +145,7 @@ CLASS lcl_object_enhs IMPLEMENTATION.
METHOD lif_object~exists. METHOD lif_object~exists.
DATA: lv_spot_name TYPE enhspotname, DATA: lv_spot_name TYPE enhspotname,
lv_tool TYPE enhspottooltype,
li_spot_ref TYPE REF TO if_enh_spot_tool. li_spot_ref TYPE REF TO if_enh_spot_tool.
@ -131,12 +154,14 @@ CLASS lcl_object_enhs IMPLEMENTATION.
TRY. TRY.
li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ). li_spot_ref = cl_enh_factory=>get_enhancement_spot( lv_spot_name ).
* Check that is is realy a BAdI lv_tool = li_spot_ref->get_tool( ).
IF li_spot_ref->get_tool( ) = cl_enh_tool_badi_def=>tooltype. CASE lv_tool.
WHEN cl_enh_tool_badi_def=>tooltype.
rv_bool = abap_true. rv_bool = abap_true.
ELSE. WHEN OTHERS.
* todo: implement additional tool types
rv_bool = abap_false. rv_bool = abap_false.
ENDIF. ENDCASE.
CATCH cx_enh_root. CATCH cx_enh_root.
rv_bool = abap_false. rv_bool = abap_false.
ENDTRY. ENDTRY.
@ -144,8 +169,8 @@ CLASS lcl_object_enhs IMPLEMENTATION.
ENDMETHOD. "exists ENDMETHOD. "exists
METHOD lif_object~delete. METHOD lif_object~delete.
DATA: lv_spot_name TYPE enhspotname, DATA: lv_spot_name TYPE enhspotname,
lv_message TYPE string,
lx_root TYPE REF TO cx_root, lx_root TYPE REF TO cx_root,
li_spot_ref TYPE REF TO if_enh_spot_tool, li_spot_ref TYPE REF TO if_enh_spot_tool,
lo_badidef_tool TYPE REF TO cl_enh_tool_badi_def. lo_badidef_tool TYPE REF TO cl_enh_tool_badi_def.
@ -155,19 +180,18 @@ CLASS lcl_object_enhs IMPLEMENTATION.
TRY. TRY.
li_spot_ref = cl_enh_factory=>get_enhancement_spot( li_spot_ref = cl_enh_factory=>get_enhancement_spot(
spot_name = lv_spot_name spot_name = lv_spot_name
lock = 'X' ). lock = abap_true ).
IF li_spot_ref IS BOUND. IF li_spot_ref IS BOUND.
lo_badidef_tool ?= li_spot_ref. lo_badidef_tool ?= li_spot_ref.
lo_badidef_tool->if_enh_object~delete( lo_badidef_tool->if_enh_object~delete(
nevertheless_delete = 'X' nevertheless_delete = abap_true
run_dark = 'X' ). run_dark = abap_true ).
ENDIF. ENDIF.
lo_badidef_tool->if_enh_object~unlock( ). lo_badidef_tool->if_enh_object~unlock( ).
CATCH cx_enh_root INTO lx_root. CATCH cx_enh_root INTO lx_root.
lv_message = `Error occured while deleting EHNS: ` lcx_exception=>raise( `Error occured while deleting EHNS: `
&& lx_root->get_text( ) ##NO_TEXT. && lx_root->get_text( ) ) ##NO_TEXT.
lcx_exception=>raise( lv_message ).
ENDTRY. ENDTRY.
ENDMETHOD. "delete ENDMETHOD. "delete
@ -187,4 +211,8 @@ CLASS lcl_object_enhs IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_enhs ENDCLASS. "lcl_object_enhs

View File

@ -22,8 +22,33 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_enqu IMPLEMENTATION. CLASS lcl_object_enqu IMPLEMENTATION.
METHOD lif_object~has_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp.
SELECT SINGLE as4date as4time FROM dd25l
INTO (lv_date, lv_time)
WHERE viewname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
_object_check_timestamp lv_date lv_time.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo
SELECT SINGLE AS4USER FROM dd25l
INTO rv_user
WHERE viewname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
@ -157,4 +182,8 @@ CLASS lcl_object_enqu IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_enqu IMPLEMENTATION ENDCLASS. "lcl_object_enqu IMPLEMENTATION

View File

@ -14,6 +14,10 @@ ENDCLASS. "lcl_object_ensc
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_ensc IMPLEMENTATION. CLASS lcl_object_ensc IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -86,7 +90,6 @@ CLASS lcl_object_ensc IMPLEMENTATION.
DATA: lv_spot_name TYPE enhspotcompositename, DATA: lv_spot_name TYPE enhspotcompositename,
lv_message TYPE string, lv_message TYPE string,
lv_enh_shtext TYPE string, lv_enh_shtext TYPE string,
lv_parent TYPE enhspotcompositename,
lt_enh_spots TYPE enhspotname_it, lt_enh_spots TYPE enhspotname_it,
lt_comp_spots TYPE enhspotname_it, lt_comp_spots TYPE enhspotname_it,
lx_root TYPE REF TO cx_root, lx_root TYPE REF TO cx_root,
@ -105,7 +108,7 @@ CLASS lcl_object_ensc IMPLEMENTATION.
lv_enh_shtext = li_spot_ref->if_enh_object_docu~get_shorttext( ). lv_enh_shtext = li_spot_ref->if_enh_object_docu~get_shorttext( ).
"find parent = composite enhancement (ENSC) "find parent = composite enhancement (ENSC)
lv_parent = cl_r3standard_persistence=>enh_find_parent_composite( lv_spot_name ). * lv_parent = cl_r3standard_persistence=>enh_find_parent_composite( lv_spot_name ).
"find subsequent enhancement spots "find subsequent enhancement spots
lt_enh_spots = lo_spot_ref->if_enh_spot_composite~get_enh_spot_childs( ). lt_enh_spots = lo_spot_ref->if_enh_spot_composite~get_enh_spot_childs( ).
"find subsequent composite enhancement spots "find subsequent composite enhancement spots
@ -187,4 +190,8 @@ CLASS lcl_object_ensc IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_ensc ENDCLASS. "lcl_object_ensc

View File

@ -0,0 +1,726 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_FUGR
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_object_fugr DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY.
TYPES: BEGIN OF ty_function,
funcname TYPE rs38l_fnam,
include TYPE progname,
global_flag TYPE rs38l-global,
remote_call TYPE rs38l-remote,
update_task TYPE rs38l-utask,
short_text TYPE tftit-stext,
remote_basxml TYPE rs38l-basxml_enabled,
import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY,
changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY,
export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY,
tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY,
exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY,
documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY,
END OF ty_function.
TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY.
METHODS main_name
RETURNING VALUE(rv_program) TYPE program
RAISING lcx_exception.
METHODS functions
RETURNING VALUE(rt_functab) TYPE ty_rs38l_incl_tt
RAISING lcx_exception.
METHODS includes
RETURNING VALUE(rt_includes) TYPE rso_t_objnm
RAISING lcx_exception.
METHODS serialize_functions
RETURNING VALUE(rt_functions) TYPE ty_function_tt
RAISING lcx_exception.
METHODS deserialize_functions
IMPORTING it_functions TYPE ty_function_tt
RAISING lcx_exception.
METHODS serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception.
METHODS deserialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
METHODS serialize_includes
RAISING lcx_exception.
METHODS deserialize_includes
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
ENDCLASS. "lcl_object_fugr DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_dtel IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_fugr IMPLEMENTATION.
* function group SEUF
* function group SIFP
* function group SUNI
METHOD lif_object~has_changed_since.
DATA: lt_functab TYPE ty_rs38l_incl_tt,
lt_includes TYPE rso_t_objnm.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF lt_functab,
<include_name> LIKE LINE OF lt_includes.
lt_includes = includes( ). " Main prog also included here
LOOP AT lt_includes ASSIGNING <include_name>.
rv_changed = check_prog_changed_since(
iv_program = <include_name>
iv_timestamp = iv_timestamp ).
IF rv_changed = abap_true.
RETURN.
ENDIF.
ENDLOOP.
lt_functab = functions( ).
LOOP AT lt_functab ASSIGNING <ls_func>.
rv_changed = check_prog_changed_since(
iv_program = <ls_func>-include
iv_timestamp = iv_timestamp ).
IF rv_changed = abap_true.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by.
TYPES: BEGIN OF ty_stamps,
user TYPE xubname,
date TYPE d,
time TYPE t,
END OF ty_stamps.
DATA: lt_stamps TYPE STANDARD TABLE OF ty_stamps WITH DEFAULT KEY,
lv_program TYPE program,
lt_includes TYPE rso_t_objnm.
FIELD-SYMBOLS: <ls_stamp> LIKE LINE OF lt_stamps,
<lv_include> LIKE LINE OF lt_includes.
lv_program = main_name( ).
CALL FUNCTION 'RS_GET_ALL_INCLUDES'
EXPORTING
program = lv_program
TABLES
includetab = lt_includes
EXCEPTIONS
not_existent = 1
no_program = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RS_GET_ALL_INCLUDES' ).
ENDIF.
SELECT unam AS user udat AS date utime AS time FROM reposrc
APPENDING CORRESPONDING FIELDS OF TABLE lt_stamps
WHERE progname = lv_program
AND r3state = 'A'.
LOOP AT lt_includes ASSIGNING <lv_include>.
SELECT unam AS user udat AS date utime AS time FROM reposrc
APPENDING CORRESPONDING FIELDS OF TABLE lt_stamps
WHERE progname = <lv_include>
AND r3state = 'A'.
ENDLOOP.
SELECT unam AS user udat AS date utime AS time FROM repotext " Program text pool
APPENDING CORRESPONDING FIELDS OF TABLE lt_stamps
WHERE progname = lv_program
AND r3state = 'A'.
SELECT vautor AS user vdatum AS date vzeit AS time FROM eudb " GUI
APPENDING CORRESPONDING FIELDS OF TABLE lt_stamps
WHERE relid = 'CU'
AND name = lv_program
AND srtf2 = 0 ##TOO_MANY_ITAB_FIELDS.
* Screens: username not stored in D020S database table
SORT lt_stamps BY date DESCENDING time DESCENDING.
READ TABLE lt_stamps INDEX 1 ASSIGNING <ls_stamp>.
IF sy-subrc = 0.
rv_user = <ls_stamp>-user.
ELSE.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists.
DATA: lv_pool TYPE tlibg-area.
lv_pool = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_EXISTS'
EXPORTING
function_pool = lv_pool
EXCEPTIONS
pool_not_exists = 1.
rv_bool = boolc( sy-subrc <> 1 ).
ENDMETHOD. "lif_object~exists
METHOD deserialize_functions.
DATA: lv_include TYPE rs38l-include,
lv_area TYPE rs38l-area,
lt_source TYPE TABLE OF abaptxt255.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF it_functions.
LOOP AT it_functions ASSIGNING <ls_func>.
lt_source = mo_files->read_abap( iv_extra = <ls_func>-funcname ).
lv_area = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = <ls_func>-funcname
IMPORTING
include = lv_include
EXCEPTIONS
function_not_exist = 1.
IF sy-subrc = 0.
* delete the function module to make sure the parameters are updated
* havent found a nice way to update the paramters
CALL FUNCTION 'FUNCTION_DELETE'
EXPORTING
funcname = <ls_func>-funcname
suppress_success_message = abap_true
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from FUNCTION_DELETE' ).
ENDIF.
ENDIF.
CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT'
EXPORTING
funcname = <ls_func>-funcname
function_pool = lv_area
interface_global = <ls_func>-global_flag
remote_call = <ls_func>-remote_call
short_text = <ls_func>-short_text
update_task = <ls_func>-update_task
* NAMESPACE = ' ' todo
remote_basxml_supported = <ls_func>-remote_basxml
IMPORTING
function_include = lv_include
TABLES
import_parameter = <ls_func>-import
export_parameter = <ls_func>-export
tables_parameter = <ls_func>-tables
changing_parameter = <ls_func>-changing
exception_list = <ls_func>-exception
parameter_docu = <ls_func>-documentation
EXCEPTIONS
double_task = 1
error_message = 2
function_already_exists = 3
invalid_function_pool = 4
invalid_name = 5
too_many_functions = 6
no_modify_permission = 7
no_show_permission = 8
enqueue_system_failure = 9
canceled_in_corr = 10
OTHERS = 11.
IF sy-subrc <> 0.
lcx_exception=>raise( |error from RS_FUNCTIONMODULE_INSERT: {
sy-subrc } { sy-msgid }{ sy-msgno }| ).
ENDIF.
INSERT REPORT lv_include FROM lt_source.
* lcl_objects_activation=>add( iv_type = 'FUNC'
* iv_name = <ls_func>-funcname ).
ENDLOOP.
ENDMETHOD. "deserialize_functions
METHOD deserialize_includes.
DATA: lo_xml TYPE REF TO lcl_xml_input,
ls_progdir TYPE ty_progdir,
lt_includes TYPE rso_t_objnm,
lt_tpool TYPE textpool_table,
lt_tpool_ext TYPE ty_tpool_tt,
lt_source TYPE TABLE OF abaptxt255.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF lt_includes.
io_xml->read( EXPORTING iv_name = 'INCLUDES'
CHANGING cg_data = lt_includes ).
LOOP AT lt_includes ASSIGNING <lv_include>.
lt_source = mo_files->read_abap( iv_extra = <lv_include> ).
lo_xml = mo_files->read_xml( <lv_include> ).
lo_xml->read( EXPORTING iv_name = 'PROGDIR'
CHANGING cg_data = ls_progdir ).
lo_xml->read( EXPORTING iv_name = 'TPOOL'
CHANGING cg_data = lt_tpool_ext ).
lt_tpool = read_tpool( lt_tpool_ext ).
deserialize_program( is_progdir = ls_progdir
it_source = lt_source
it_tpool = lt_tpool
iv_package = iv_package ).
ENDLOOP.
ENDMETHOD. "deserialize_includes
METHOD deserialize_xml.
DATA: lv_complete TYPE rs38l-area,
lv_namespace TYPE rs38l-namespace,
lv_areat TYPE tlibt-areat,
lv_stext TYPE tftit-stext,
lv_group TYPE rs38l-area.
lv_complete = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
complete_area = lv_complete
IMPORTING
namespace = lv_namespace
group = lv_group
EXCEPTIONS
include_not_exists = 1
group_not_exists = 2
no_selections = 3
no_function_include = 4
no_function_pool = 5
delimiter_wrong_position = 6
no_customer_function_group = 7
no_customer_function_include = 8
reserved_name_customer = 9
namespace_too_long = 10
area_length_error = 11
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ).
ENDIF.
io_xml->read( EXPORTING iv_name = 'AREAT'
CHANGING cg_data = lv_areat ).
lv_stext = lv_areat.
CALL FUNCTION 'RS_FUNCTION_POOL_INSERT'
EXPORTING
function_pool = lv_group
short_text = lv_stext
namespace = lv_namespace
devclass = iv_package
EXCEPTIONS
name_already_exists = 1
name_not_correct = 2
function_already_exists = 3
invalid_function_pool = 4
invalid_name = 5
too_many_functions = 6
no_modify_permission = 7
no_show_permission = 8
enqueue_system_failure = 9
canceled_in_corr = 10
undefined_error = 11
OTHERS = 12.
IF sy-subrc <> 0 AND sy-subrc <> 1 AND sy-subrc <> 3.
* todo, change description
lcx_exception=>raise( 'error from RS_FUNCTION_POOL_INSERT' ).
ENDIF.
ENDMETHOD. "deserialize_xml
METHOD serialize_xml.
DATA: lt_functab TYPE ty_rs38l_incl_tt,
lt_includes TYPE rso_t_objnm,
lv_areat TYPE tlibt-areat.
SELECT SINGLE areat INTO lv_areat
FROM tlibt
WHERE spras = mv_language
AND area = ms_item-obj_name. "#EC CI_GENBUFF
IF sy-subrc <> 0.
lcx_exception=>raise( 'not found in TLIBT' ).
ENDIF.
lt_functab = functions( ).
lt_includes = includes( ).
io_xml->add( iv_name = 'AREAT'
ig_data = lv_areat ).
io_xml->add( iv_name = 'INCLUDES'
ig_data = lt_includes ).
ENDMETHOD. "serialize_xml
METHOD includes.
DATA: lv_program TYPE program,
lv_cnam TYPE reposrc-cnam,
lv_tabix LIKE sy-tabix,
lt_functab TYPE ty_rs38l_incl_tt.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF rt_includes,
<ls_func> LIKE LINE OF lt_functab.
lv_program = main_name( ).
lt_functab = functions( ).
CALL FUNCTION 'RS_GET_ALL_INCLUDES'
EXPORTING
program = lv_program
* WITH_RESERVED_INCLUDES =
* WITH_CLASS_INCLUDES = ' ' hmm, todo
TABLES
includetab = rt_includes
EXCEPTIONS
not_existent = 1
no_program = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RS_GET_ALL_INCLUDES' ).
ENDIF.
LOOP AT lt_functab ASSIGNING <ls_func>.
DELETE TABLE rt_includes FROM <ls_func>-include.
ENDLOOP.
LOOP AT rt_includes ASSIGNING <lv_include>.
lv_tabix = sy-tabix.
* skip SAP standard includes
SELECT SINGLE cnam FROM reposrc INTO lv_cnam
WHERE progname = <lv_include>
AND r3state = 'A'
AND cnam = 'SAP'.
IF sy-subrc = 0.
DELETE rt_includes INDEX lv_tabix.
CONTINUE.
ENDIF.
* also make sure the include exists
SELECT SINGLE cnam FROM reposrc INTO lv_cnam
WHERE progname = <lv_include>
AND r3state = 'A'.
IF sy-subrc <> 0.
DELETE rt_includes INDEX lv_tabix.
ENDIF.
ENDLOOP.
APPEND lv_program TO rt_includes.
ENDMETHOD. "includes
METHOD functions.
DATA: lv_area TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_CONTENTS'
EXPORTING
function_pool = lv_area
TABLES
functab = rt_functab
EXCEPTIONS
function_pool_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ).
ENDIF.
ENDMETHOD. "functions
METHOD main_name.
DATA: lv_area TYPE rs38l-area,
lv_namespace TYPE rs38l-namespace,
lv_group TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
complete_area = lv_area
IMPORTING
namespace = lv_namespace
group = lv_group
EXCEPTIONS
include_not_exists = 1
group_not_exists = 2
no_selections = 3
no_function_include = 4
no_function_pool = 5
delimiter_wrong_position = 6
no_customer_function_group = 7
no_customer_function_include = 8
reserved_name_customer = 9
namespace_too_long = 10
area_length_error = 11
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from FUNCTION_INCLUDE_SPLIT' ).
ENDIF.
CONCATENATE lv_namespace 'SAPL' lv_group INTO rv_program.
ENDMETHOD. "main_name
METHOD serialize_functions.
DATA:
lt_source TYPE TABLE OF rssource,
lt_functab TYPE ty_rs38l_incl_tt,
lt_new_source TYPE rsfb_source.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF lt_functab,
<ls_ret> LIKE LINE OF rt_functions.
lt_functab = functions( ).
LOOP AT lt_functab ASSIGNING <ls_func>.
* fm RPY_FUNCTIONMODULE_READ does not support source code
* lines longer than 72 characters
APPEND INITIAL LINE TO rt_functions ASSIGNING <ls_ret>.
MOVE-CORRESPONDING <ls_func> TO <ls_ret>.
CLEAR lt_new_source.
CLEAR lt_source.
CALL FUNCTION 'RPY_FUNCTIONMODULE_READ_NEW'
EXPORTING
functionname = <ls_func>-funcname
IMPORTING
global_flag = <ls_ret>-global_flag
remote_call = <ls_ret>-remote_call
update_task = <ls_ret>-update_task
short_text = <ls_ret>-short_text
remote_basxml_supported = <ls_ret>-remote_basxml
TABLES
import_parameter = <ls_ret>-import
changing_parameter = <ls_ret>-changing
export_parameter = <ls_ret>-export
tables_parameter = <ls_ret>-tables
exception_list = <ls_ret>-exception
documentation = <ls_ret>-documentation
source = lt_source
CHANGING
new_source = lt_new_source
EXCEPTIONS
error_message = 1
function_not_found = 2
invalid_name = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ).
ENDIF.
IF NOT lt_new_source IS INITIAL.
mo_files->add_abap( iv_extra = <ls_func>-funcname
it_abap = lt_new_source ).
ELSE.
mo_files->add_abap( iv_extra = <ls_func>-funcname
it_abap = lt_source ).
ENDIF.
ENDLOOP.
ENDMETHOD. "serialize_functions
METHOD serialize_includes.
DATA: lt_includes TYPE rso_t_objnm.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF lt_includes.
lt_includes = includes( ).
LOOP AT lt_includes ASSIGNING <lv_include>.
* todo, filename is not correct, a include can be used in several programs
serialize_program( is_item = ms_item
io_files = mo_files
iv_program = <lv_include>
iv_extra = <lv_include> ).
ENDLOOP.
ENDMETHOD. "serialize_includes
METHOD lif_object~serialize.
DATA: lt_functions TYPE ty_function_tt,
ls_progdir TYPE ty_progdir,
lv_program_name TYPE programm,
lt_dynpros TYPE ty_dynpro_tt,
ls_cua TYPE ty_cua.
IF lif_object~exists( ) = abap_false.
RETURN.
ENDIF.
serialize_xml( io_xml ).
lt_functions = serialize_functions( ).
io_xml->add( iv_name = 'FUNCTIONS'
ig_data = lt_functions ).
serialize_includes( ).
lv_program_name = main_name( ).
ls_progdir = read_progdir( lv_program_name ).
IF ls_progdir-subc = 'F'.
lt_dynpros = serialize_dynpros( lv_program_name ).
io_xml->add( iv_name = 'DYNPROS'
ig_data = lt_dynpros ).
ls_cua = serialize_cua( lv_program_name ).
io_xml->add( iv_name = 'CUA'
ig_data = ls_cua ).
ENDIF.
ENDMETHOD. "serialize
METHOD lif_object~deserialize.
DATA: lv_program_name TYPE programm,
lt_functions TYPE ty_function_tt,
lt_dynpros TYPE ty_dynpro_tt,
ls_cua TYPE ty_cua.
deserialize_xml(
io_xml = io_xml
iv_package = iv_package ).
io_xml->read( EXPORTING iv_name = 'FUNCTIONS'
CHANGING cg_data = lt_functions ).
deserialize_functions( lt_functions ).
deserialize_includes(
io_xml = io_xml
iv_package = iv_package ).
lv_program_name = main_name( ).
io_xml->read( EXPORTING iv_name = 'DYNPROS'
CHANGING cg_data = lt_dynpros ).
deserialize_dynpros( it_dynpros = lt_dynpros ).
io_xml->read( EXPORTING iv_name = 'CUA'
CHANGING cg_data = ls_cua ).
deserialize_cua( iv_program_name = lv_program_name
is_cua = ls_cua ).
ENDMETHOD. "deserialize
METHOD lif_object~delete.
DATA: lv_area TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_DELETE'
EXPORTING
area = lv_area
suppress_popups = abap_true
skip_progress_ind = abap_true
EXCEPTIONS
canceled_in_corr = 1
enqueue_system_failure = 2
function_exist = 3
not_executed = 4
no_modify_permission = 5
no_show_permission = 6
permission_failure = 7
pool_not_exist = 8
cancelled = 9
OTHERS = 10.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_FUNCTION_POOL_DELETE' ).
ENDIF.
ENDMETHOD. "delete
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = 'FUGR'
in_new_window = abap_true.
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_fugr 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_OBJECT_FUGR</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_OBJECT_FUGR</ENTRY>
<LENGTH>28</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -33,6 +33,10 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_iarp IMPLEMENTATION. CLASS lcl_object_iarp IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -184,4 +188,8 @@ CLASS lcl_object_iarp IMPLEMENTATION.
lcx_exception=>raise( 'todo, IARP, jump' ). lcx_exception=>raise( 'todo, IARP, jump' ).
ENDMETHOD. "lif_object~jump ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_iarp IMPLEMENTATION ENDCLASS. "lcl_object_iarp IMPLEMENTATION

View File

@ -33,6 +33,10 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_iasp IMPLEMENTATION. CLASS lcl_object_iasp IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -184,4 +188,8 @@ CLASS lcl_object_iasp IMPLEMENTATION.
lcx_exception=>raise( 'todo, IASP, jump' ). lcx_exception=>raise( 'todo, IASP, jump' ).
ENDMETHOD. "lif_object~jump ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_iasp IMPLEMENTATION ENDCLASS. "lcl_object_iasp IMPLEMENTATION

View File

@ -33,6 +33,10 @@ ENDCLASS. "lcl_object_iatu DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_iatu IMPLEMENTATION. CLASS lcl_object_iatu IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -201,4 +205,8 @@ CLASS lcl_object_iatu IMPLEMENTATION.
lcx_exception=>raise( 'todo, IATU, jump' ). lcx_exception=>raise( 'todo, IATU, jump' ).
ENDMETHOD. "lif_object~jump ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_iatu IMPLEMENTATION ENDCLASS. "lcl_object_iatu IMPLEMENTATION

View File

@ -13,6 +13,23 @@ CLASS lcl_object_msag DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object. INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files. ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: BEGIN OF ty_t100_texts,
sprsl TYPE t100-sprsl,
msgnr TYPE t100-msgnr,
text TYPE t100-text,
END OF ty_t100_texts,
tt_t100_texts TYPE STANDARD TABLE OF ty_t100_texts.
METHODS:
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception.
ENDCLASS. "lcl_object_msag DEFINITION ENDCLASS. "lcl_object_msag DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -22,6 +39,10 @@ ENDCLASS. "lcl_object_msag DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_msag IMPLEMENTATION. CLASS lcl_object_msag IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE lastuser FROM t100a INTO rv_user SELECT SINGLE lastuser FROM t100a INTO rv_user
@ -81,7 +102,8 @@ CLASS lcl_object_msag IMPLEMENTATION.
DATA: ls_t100a TYPE t100a, DATA: ls_t100a TYPE t100a,
ls_t100t TYPE t100t, ls_t100t TYPE t100t,
ls_t100u TYPE t100u, ls_t100u TYPE t100u,
lt_t100 TYPE TABLE OF t100. lt_t100 TYPE TABLE OF t100,
lt_before TYPE TABLE OF t100u.
FIELD-SYMBOLS: <ls_t100> LIKE LINE OF lt_t100. FIELD-SYMBOLS: <ls_t100> LIKE LINE OF lt_t100.
@ -106,17 +128,24 @@ CLASS lcl_object_msag IMPLEMENTATION.
lcx_exception=>raise( 'Error from RS_CORR_INSERT' ). lcx_exception=>raise( 'Error from RS_CORR_INSERT' ).
ENDIF. ENDIF.
LOOP AT lt_t100 ASSIGNING <ls_t100>. SELECT * FROM t100u INTO TABLE lt_before
MODIFY t100 FROM <ls_t100>. "#EC CI_SUBRC WHERE arbgb = ls_t100a-arbgb ORDER BY msgnr. "#EC CI_GENBUFF "#EC CI_BYPASS
ASSERT sy-subrc = 0.
LOOP AT lt_t100 ASSIGNING <ls_t100>.
DELETE lt_before WHERE msgnr = <ls_t100>-msgnr.
MODIFY t100 FROM <ls_t100>. "#EC CI_SUBRC
IF sy-subrc <> 0.
lcx_exception=>raise( 'MSAG: Table T100 modify failed' ).
ENDIF.
CLEAR ls_t100u. CLEAR ls_t100u.
MOVE-CORRESPONDING <ls_t100> TO ls_t100u ##enh_ok. MOVE-CORRESPONDING <ls_t100> TO ls_t100u ##enh_ok.
ls_t100u-name = sy-uname. ls_t100u-name = sy-uname.
ls_t100u-datum = sy-datum. ls_t100u-datum = sy-datum.
ls_t100u-selfdef = '3'. ls_t100u-selfdef = '3'.
MODIFY t100u FROM ls_t100u. "#EC CI_SUBRC MODIFY t100u FROM ls_t100u. "#EC CI_SUBRC
ASSERT sy-subrc = 0. IF sy-subrc <> 0.
lcx_exception=>raise( 'MSAG: Table T100U modify failed' ).
ENDIF.
ENDLOOP. ENDLOOP.
ls_t100a-masterlang = mv_language. ls_t100a-masterlang = mv_language.
@ -125,13 +154,25 @@ CLASS lcl_object_msag IMPLEMENTATION.
ls_t100a-ldate = sy-datum. ls_t100a-ldate = sy-datum.
ls_t100a-ltime = sy-uzeit. ls_t100a-ltime = sy-uzeit.
MODIFY t100a FROM ls_t100a. "#EC CI_SUBRC MODIFY t100a FROM ls_t100a. "#EC CI_SUBRC
ASSERT sy-subrc = 0. IF sy-subrc <> 0.
lcx_exception=>raise( 'MSAG: Table T100A modify failed' ).
ENDIF.
ls_t100t-sprsl = mv_language. ls_t100t-sprsl = mv_language.
ls_t100t-arbgb = ls_t100a-arbgb. ls_t100t-arbgb = ls_t100a-arbgb.
ls_t100t-stext = ls_t100a-stext. ls_t100t-stext = ls_t100a-stext.
MODIFY t100t FROM ls_t100t. "#EC CI_SUBRC MODIFY t100t FROM ls_t100t. "#EC CI_SUBRC
ASSERT sy-subrc = 0. IF sy-subrc <> 0.
lcx_exception=>raise( 'MSAG: Table T100T modify failed' ).
ENDIF.
LOOP AT lt_before INTO ls_t100u.
DELETE FROM t100 WHERE arbgb = ls_t100u-arbgb AND msgnr = ls_t100u-msgnr.
DELETE FROM t100u WHERE arbgb = ls_t100u-arbgb AND msgnr = ls_t100u-msgnr.
ENDLOOP.
deserialize_texts( io_xml = io_xml ).
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
@ -165,6 +206,98 @@ CLASS lcl_object_msag IMPLEMENTATION.
io_xml->add( ig_data = lt_source io_xml->add( ig_data = lt_source
iv_name = 'T100' ). iv_name = 'T100' ).
serialize_texts( io_xml ).
ENDMETHOD. "serialize ENDMETHOD. "serialize
METHOD serialize_texts.
DATA: lv_msg_id TYPE rglif-message_id,
lt_t100_texts TYPE tt_t100_texts,
lt_t100t TYPE table of t100t,
lt_i18n_langs TYPE TABLE OF langu.
lv_msg_id = ms_item-obj_name.
" Collect additional languages
" Skip master lang - it has been already serialized
SELECT DISTINCT sprsl AS langu INTO TABLE lt_i18n_langs
FROM t100t
WHERE arbgb = lv_msg_id
AND sprsl <> mv_language. "#EC CI_BYPASS "#EC CI_GENBUFF.
SORT lt_i18n_langs ASCENDING.
IF LINES( lt_i18n_langs ) > 0.
SELECT * FROM t100t INTO CORRESPONDING FIELDS OF TABLE lt_t100t
WHERE sprsl <> mv_language
AND arbgb = lv_msg_id. "#EC CI_GENBUFF
SELECT * FROM t100 INTO CORRESPONDING FIELDS OF TABLE lt_t100_texts
FOR ALL ENTRIES IN lt_i18n_langs
WHERE sprsl = lt_i18n_langs-table_line
AND arbgb = lv_msg_id
ORDER BY PRIMARY KEY. "#EC CI_SUBRC "#EC CI_GENBUFF
SORT lt_t100t BY sprsl ASCENDING.
SORT lt_t100_texts BY sprsl msgnr ASCENDING.
io_xml->add( iv_name = 'I18N_LANGS'
ig_data = lt_i18n_langs ).
io_xml->add( iv_name = 'T100T'
ig_data = lt_t100t ).
io_xml->add( iv_name = 'T100_TEXTS'
ig_data = lt_t100_texts ).
ENDIF.
ENDMETHOD.
METHOD deserialize_texts.
DATA: lv_msg_id TYPE rglif-message_id,
ls_t100 TYPE t100,
lt_t100t TYPE table of t100t,
lt_t100_texts TYPE tt_t100_texts,
lt_t100u TYPE TABLE OF t100u.
FIELD-SYMBOLS: <ls_t100_text> TYPE ty_t100_texts.
lv_msg_id = ms_item-obj_name.
SELECT * FROM t100u INTO TABLE lt_t100u
WHERE arbgb = lv_msg_id ORDER BY PRIMARY KEY. "#EC CI_GENBUFF
io_xml->read( EXPORTING iv_name = 'T100_TEXTS'
CHANGING cg_data = lt_t100_texts ).
io_xml->read( EXPORTING iv_name = 'T100T'
CHANGING cg_data = lt_t100t ).
MODIFY t100t FROM TABLE lt_t100t. "#EC CI_SUBRC
LOOP AT lt_t100_texts ASSIGNING <ls_t100_text>.
"check if message exists
READ TABLE lt_t100u TRANSPORTING NO FIELDS
WITH KEY arbgb = lv_msg_id msgnr = <ls_t100_text>-msgnr BINARY SEARCH.
CHECK sy-subrc = 0. "if original message doesn't exist no translations added
MOVE-CORRESPONDING <ls_t100_text> TO ls_t100.
ls_t100-arbgb = lv_msg_id.
MODIFY t100 FROM ls_t100. "#EC CI_SUBRC
IF sy-subrc <> 0.
lcx_exception=>raise( 'MSAG: Table T100 modify failed' ).
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_msag IMPLEMENTATION ENDCLASS. "lcl_object_msag IMPLEMENTATION

View File

@ -13,6 +13,11 @@ CLASS lcl_object_nrob DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object. INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files. ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
METHODS:
delete_intervals IMPORTING iv_object TYPE inri-object
RAISING lcx_exception.
ENDCLASS. "lcl_object_nrob DEFINITION ENDCLASS. "lcl_object_nrob DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -22,6 +27,10 @@ ENDCLASS. "lcl_object_nrob DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_nrob IMPLEMENTATION. CLASS lcl_object_nrob IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
DATA: lv_objectid TYPE cdhdr-objectid, DATA: lv_objectid TYPE cdhdr-objectid,
@ -59,6 +68,7 @@ CLASS lcl_object_nrob IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-late_deser = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -161,6 +171,73 @@ CLASS lcl_object_nrob IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD delete_intervals.
DATA: lv_error TYPE c LENGTH 1,
ls_error TYPE inrer,
lt_list TYPE STANDARD TABLE OF inriv WITH DEFAULT KEY,
lt_error_iv TYPE STANDARD TABLE OF inriv WITH DEFAULT KEY.
FIELD-SYMBOLS: <ls_list> LIKE LINE OF lt_list.
CALL FUNCTION 'NUMBER_RANGE_INTERVAL_LIST'
EXPORTING
object = iv_object
TABLES
interval = lt_list
EXCEPTIONS
nr_range_nr1_not_found = 1
nr_range_nr1_not_intern = 2
nr_range_nr2_must_be_space = 3
nr_range_nr2_not_extern = 4
nr_range_nr2_not_found = 5
object_not_found = 6
subobject_must_be_space = 7
subobject_not_found = 8
OTHERS = 9.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from NUMBER_RANGE_INTERVAL_LIST' ).
ENDIF.
IF lines( lt_list ) = 0.
RETURN.
ENDIF.
LOOP AT lt_list ASSIGNING <ls_list>.
CLEAR <ls_list>-nrlevel.
<ls_list>-procind = 'D'.
ENDLOOP.
CALL FUNCTION 'NUMBER_RANGE_INTERVAL_UPDATE'
EXPORTING
object = iv_object
IMPORTING
error = ls_error
error_occured = lv_error
TABLES
error_iv = lt_error_iv
interval = lt_list
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0 OR lv_error = abap_true.
lcx_exception=>raise( 'error from NUMBER_RANGE_INTERVAL_UPDATE' ).
ENDIF.
CALL FUNCTION 'NUMBER_RANGE_UPDATE_CLOSE'
EXPORTING
object = iv_object
EXCEPTIONS
no_changes_made = 1
object_not_initialized = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from NUMBER_RANGE_UPDATE_CLOSE' ).
ENDIF.
ENDMETHOD.
METHOD lif_object~delete. METHOD lif_object~delete.
DATA: lv_object TYPE tnro-object. DATA: lv_object TYPE tnro-object.
@ -168,6 +245,8 @@ CLASS lcl_object_nrob IMPLEMENTATION.
lv_object = ms_item-obj_name. lv_object = ms_item-obj_name.
delete_intervals( lv_object ).
CALL FUNCTION 'NUMBER_RANGE_OBJECT_DELETE' CALL FUNCTION 'NUMBER_RANGE_OBJECT_DELETE'
EXPORTING EXPORTING
language = mv_language language = mv_language
@ -189,4 +268,8 @@ CLASS lcl_object_nrob IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_nrob IMPLEMENTATION ENDCLASS. "lcl_object_nrob IMPLEMENTATION

View File

@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_para DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_para IMPLEMENTATION. CLASS lcl_object_para IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
* looks like "changed by user" is not stored in the database * looks like "changed by user" is not stored in the database
rv_user = c_user_unknown. rv_user = c_user_unknown.
@ -143,4 +147,8 @@ CLASS lcl_object_para IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_para IMPLEMENTATION ENDCLASS. "lcl_object_para IMPLEMENTATION

View File

@ -47,6 +47,10 @@ ENDCLASS. "lcl_object_PINF DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_pinf IMPLEMENTATION. CLASS lcl_object_pinf IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE changed_by FROM intf INTO rv_user SELECT SINGLE changed_by FROM intf INTO rv_user
@ -189,18 +193,18 @@ CLASS lcl_object_pinf IMPLEMENTATION.
lt_add TYPE scomeldata, lt_add TYPE scomeldata,
lv_index TYPE i, lv_index TYPE i,
lv_found TYPE abap_bool, lv_found TYPE abap_bool,
ls_sign TYPE scomelsign, * ls_sign TYPE scomelsign,
ls_attr TYPE scomeldtln. ls_attr TYPE scomeldtln.
FIELD-SYMBOLS: <li_element> LIKE LINE OF lt_existing, FIELD-SYMBOLS: <li_element> LIKE LINE OF lt_existing,
<ls_element> LIKE LINE OF is_pinf-elements. <ls_element> LIKE LINE OF is_pinf-elements.
ls_sign-usag_restr = abap_true. * ls_sign-usag_restr = abap_true.
ls_sign-stability = abap_true. * ls_sign-stability = abap_true.
ls_sign-no_check = abap_true. * ls_sign-no_check = abap_true.
ls_sign-useastype = abap_true. * ls_sign-useastype = abap_true.
ls_sign-asforgnkey = abap_true. * ls_sign-asforgnkey = abap_true.
* ls_sign-deprecation_type = abap_true. backport * ls_sign-deprecation_type = abap_true. backport
* ls_sign-replacement_object_type = abap_true. backport * ls_sign-replacement_object_type = abap_true. backport
* ls_sign-replacement_object_name = abap_true. backport * ls_sign-replacement_object_name = abap_true. backport
@ -219,11 +223,8 @@ CLASS lcl_object_pinf IMPLEMENTATION.
<li_element>->get_all_attributes( IMPORTING e_element_data = ls_attr ). <li_element>->get_all_attributes( IMPORTING e_element_data = ls_attr ).
IF <ls_element>-elem_type = ls_attr-elem_type IF <ls_element>-elem_type = ls_attr-elem_type
AND <ls_element>-elem_key = ls_attr-elem_key. AND <ls_element>-elem_key = ls_attr-elem_key.
<li_element>->set_all_attributes( DELETE lt_existing INDEX lv_index.
i_element_data = <ls_element> CONTINUE. " current loop
i_data_sign = ls_sign ).
lv_found = abap_true.
EXIT. " current loop
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
@ -232,10 +233,10 @@ CLASS lcl_object_pinf IMPLEMENTATION.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
ii_interface->add_elements( lt_add ).
ii_interface->remove_elements( lt_existing ). ii_interface->remove_elements( lt_existing ).
ii_interface->add_elements( lt_add ).
ii_interface->save_elements( ). ii_interface->save_elements( ).
ii_interface->set_elements_changeable( abap_false ). ii_interface->set_elements_changeable( abap_false ).
@ -347,4 +348,8 @@ CLASS lcl_object_pinf IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_PINF IMPLEMENTATION ENDCLASS. "lcl_object_PINF IMPLEMENTATION

View File

@ -0,0 +1,168 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_PROG
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_object_prog DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_prog DEFINITION INHERITING FROM lcl_objects_program FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
METHODS deserialize_textpool
IMPORTING it_tpool TYPE textpool_table
RAISING lcx_exception.
ENDCLASS. "lcl_object_prog DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_prog IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_prog IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = check_prog_changed_since(
iv_program = ms_item-obj_name
iv_timestamp = iv_timestamp ).
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by.
SELECT SINGLE unam FROM reposrc INTO rv_user
WHERE progname = ms_item-obj_name
AND r3state = 'A'.
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists.
DATA: lv_progname TYPE reposrc-progname.
SELECT SINGLE progname FROM reposrc INTO lv_progname
WHERE progname = ms_item-obj_name
AND r3state = 'A'.
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = 'PROG'
in_new_window = abap_true.
ENDMETHOD. "jump
METHOD lif_object~delete.
DATA: lv_program LIKE sy-repid.
lv_program = ms_item-obj_name.
CALL FUNCTION 'RS_DELETE_PROGRAM'
EXPORTING
program = lv_program
suppress_popup = abap_true
EXCEPTIONS
enqueue_lock = 1
object_not_found = 2
permission_failure = 3
reject_deletion = 4
OTHERS = 5.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_DELETE_PROGRAM' ).
ENDIF.
ENDMETHOD. "delete
METHOD deserialize_textpool.
READ TABLE it_tpool WITH KEY id = 'R' TRANSPORTING NO FIELDS.
IF ( sy-subrc = 0 AND lines( it_tpool ) = 1 ) OR lines( it_tpool ) = 0.
RETURN. " no action for includes
ENDIF.
INSERT TEXTPOOL ms_item-obj_name
FROM it_tpool
LANGUAGE mv_language
STATE 'I'.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from INSERT TEXTPOOL' ).
ENDIF.
lcl_objects_activation=>add( iv_type = 'REPT'
iv_name = ms_item-obj_name ).
ENDMETHOD. "deserialize_textpool
METHOD lif_object~serialize.
serialize_program( io_xml = io_xml
is_item = ms_item
io_files = mo_files ).
ENDMETHOD. "lif_serialize~serialize
METHOD lif_object~deserialize.
DATA: lv_program_name TYPE programm,
ls_progdir TYPE ty_progdir,
lt_tpool TYPE textpool_table,
lt_dynpros TYPE ty_dynpro_tt,
lt_tpool_ext TYPE ty_tpool_tt,
ls_cua TYPE ty_cua,
lt_source TYPE abaptxt255_tab.
lv_program_name = ms_item-obj_name.
lt_source = mo_files->read_abap( ).
io_xml->read( EXPORTING iv_name = 'TPOOL'
CHANGING cg_data = lt_tpool_ext ).
lt_tpool = read_tpool( lt_tpool_ext ).
io_xml->read( EXPORTING iv_name = 'PROGDIR'
CHANGING cg_data = ls_progdir ).
deserialize_program( is_progdir = ls_progdir
it_source = lt_source
it_tpool = lt_tpool
iv_package = iv_package ).
io_xml->read( EXPORTING iv_name = 'DYNPROS'
CHANGING cg_data = lt_dynpros ).
deserialize_dynpros( it_dynpros = lt_dynpros ).
io_xml->read( EXPORTING iv_name = 'CUA'
CHANGING cg_data = ls_cua ).
deserialize_cua( iv_program_name = lv_program_name
is_cua = ls_cua ).
deserialize_textpool( lt_tpool ).
ENDMETHOD. "lif_serialize~deserialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_prog 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_OBJECT_PROG</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_OBJECT_PROG</ENTRY>
<LENGTH>28</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,51 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_SERIALIZATION
*&---------------------------------------------------------------------*
* All object serializing classes
INCLUDE zabapgit_object_acid.
INCLUDE zabapgit_object_auth.
INCLUDE zabapgit_object_clas.
INCLUDE zabapgit_object_doct.
INCLUDE zabapgit_object_docv.
INCLUDE zabapgit_object_doma.
INCLUDE zabapgit_object_dtel.
INCLUDE zabapgit_object_enho.
INCLUDE zabapgit_object_enhs.
INCLUDE zabapgit_object_enqu.
INCLUDE zabapgit_object_ensc.
INCLUDE zabapgit_object_fugr.
INCLUDE zabapgit_object_iarp.
INCLUDE zabapgit_object_iasp.
INCLUDE zabapgit_object_iatu.
INCLUDE zabapgit_object_msag.
INCLUDE zabapgit_object_nrob.
INCLUDE zabapgit_object_para.
INCLUDE zabapgit_object_pinf.
INCLUDE zabapgit_object_prog.
INCLUDE zabapgit_object_sfbf.
INCLUDE zabapgit_object_sfbs.
INCLUDE zabapgit_object_sfsw.
INCLUDE zabapgit_object_shi3.
INCLUDE zabapgit_object_shlp.
INCLUDE zabapgit_object_sicf.
INCLUDE zabapgit_object_smim.
INCLUDE zabapgit_object_splo.
INCLUDE zabapgit_object_ssfo.
INCLUDE zabapgit_object_ssst.
INCLUDE zabapgit_object_susc.
INCLUDE zabapgit_object_suso.
INCLUDE zabapgit_object_tabl_valid.
INCLUDE zabapgit_object_tabl.
INCLUDE zabapgit_object_tobj.
INCLUDE zabapgit_object_tran.
INCLUDE zabapgit_object_ttyp.
INCLUDE zabapgit_object_type.
INCLUDE zabapgit_object_vcls.
INCLUDE zabapgit_object_view.
INCLUDE zabapgit_object_w3xx.
INCLUDE zabapgit_object_wdya.
INCLUDE zabapgit_object_wdyn.
INCLUDE zabapgit_object_webi.
INCLUDE zabapgit_object_xslt.

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_OBJECT_SERIALIZING</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_OBJECT_SERIALIZATION</ENTRY>
<LENGTH>37</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_SFBF DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_sfbf IMPLEMENTATION. CLASS lcl_object_sfbf IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = get( )->get_header_data( )-changedby. rv_user = get( )->get_header_data( )-changedby.
@ -229,4 +233,8 @@ CLASS lcl_object_sfbf IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_SFBF IMPLEMENTATION ENDCLASS. "lcl_object_SFBF IMPLEMENTATION

View File

@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_SFBS DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_sfbs IMPLEMENTATION. CLASS lcl_object_sfbs IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = get( )->get_header_data( )-changedby. rv_user = get( )->get_header_data( )-changedby.
@ -203,4 +207,10 @@ CLASS lcl_object_sfbs IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_SFBS IMPLEMENTATION ENDCLASS. "lcl_object_SFBS IMPLEMENTATION

View File

@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_sfsw DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_sfsw IMPLEMENTATION. CLASS lcl_object_sfsw IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = get( )->get_header_data( )-changedby. rv_user = get( )->get_header_data( )-changedby.
@ -197,4 +201,8 @@ CLASS lcl_object_sfsw IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_sfsw IMPLEMENTATION ENDCLASS. "lcl_object_sfsw IMPLEMENTATION

View File

@ -54,6 +54,10 @@ ENDCLASS. "lcl_object_shi3 DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_shi3 IMPLEMENTATION. CLASS lcl_object_shi3 IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -326,4 +330,8 @@ CLASS lcl_object_shi3 IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_shi3 IMPLEMENTATION ENDCLASS. "lcl_object_shi3 IMPLEMENTATION

View File

@ -22,6 +22,21 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_shlp IMPLEMENTATION. CLASS lcl_object_shlp IMPLEMENTATION.
METHOD lif_object~has_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp.
SELECT SINGLE as4date as4time FROM dd30l
INTO (lv_date, lv_time)
WHERE shlpname = ms_item-obj_name
AND as4local = 'A'.
_object_check_timestamp lv_date lv_time.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE as4user FROM dd30l INTO rv_user SELECT SINGLE as4user FROM dd30l INTO rv_user
@ -87,6 +102,8 @@ CLASS lcl_object_shlp IMPLEMENTATION.
lt_dd32p TYPE TABLE OF dd32p, lt_dd32p TYPE TABLE OF dd32p,
lt_dd33v TYPE TABLE OF dd33v. lt_dd33v TYPE TABLE OF dd33v.
FIELD-SYMBOLS: <ls_dd32p> LIKE LINE OF lt_dd32p.
lv_name = ms_item-obj_name. lv_name = ms_item-obj_name.
@ -115,6 +132,21 @@ CLASS lcl_object_shlp IMPLEMENTATION.
ls_dd30v-as4date, ls_dd30v-as4date,
ls_dd30v-as4time. ls_dd30v-as4time.
LOOP AT lt_dd32p ASSIGNING <ls_dd32p>.
* clear information inherited from domain
CLEAR: <ls_dd32p>-domname,
<ls_dd32p>-headlen,
<ls_dd32p>-scrlen1,
<ls_dd32p>-scrlen2,
<ls_dd32p>-datatype,
<ls_dd32p>-leng,
<ls_dd32p>-outputlen,
<ls_dd32p>-decimals,
<ls_dd32p>-lowercase,
<ls_dd32p>-signflag,
<ls_dd32p>-convexit.
ENDLOOP.
io_xml->add( iv_name = 'DD30V' io_xml->add( iv_name = 'DD30V'
ig_data = ls_dd30v ). ig_data = ls_dd30v ).
io_xml->add( ig_data = lt_dd31v io_xml->add( ig_data = lt_dd31v
@ -171,4 +203,8 @@ CLASS lcl_object_shlp IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_shlp IMPLEMENTATION ENDCLASS. "lcl_object_shlp IMPLEMENTATION

View File

@ -62,6 +62,10 @@ ENDCLASS. "lcl_object_sicf DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_sicf IMPLEMENTATION. CLASS lcl_object_sicf IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
DATA: ls_icfservice TYPE icfservice. DATA: ls_icfservice TYPE icfservice.
@ -414,4 +418,8 @@ CLASS lcl_object_sicf IMPLEMENTATION.
lcx_exception=>raise( 'todo, SICF, jump' ). lcx_exception=>raise( 'todo, SICF, jump' ).
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_sicf IMPLEMENTATION ENDCLASS. "lcl_object_sicf IMPLEMENTATION

View File

@ -42,6 +42,10 @@ ENDCLASS. "lcl_object_smim DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_smim IMPLEMENTATION. CLASS lcl_object_smim IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
DATA: lv_loio TYPE sdok_docid. DATA: lv_loio TYPE sdok_docid.
@ -188,7 +192,7 @@ CLASS lcl_object_smim IMPLEMENTATION.
permission_failure = 4 permission_failure = 4
OTHERS = 5 ). OTHERS = 5 ).
IF sy-subrc <> 0. IF sy-subrc <> 0.
lcx_exception=>raise( 'error from mime api->get' ). lcx_exception=>raise( 'error from mime api->get:' && sy-msgv1 ).
ENDIF. ENDIF.
lv_filename = get_filename( lv_url ). lv_filename = get_filename( lv_url ).
@ -313,4 +317,8 @@ CLASS lcl_object_smim IMPLEMENTATION.
lcx_exception=>raise( 'todo, SMIM, jump' ). lcx_exception=>raise( 'todo, SMIM, jump' ).
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_smim IMPLEMENTATION ENDCLASS. "lcl_object_smim IMPLEMENTATION

View File

@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_splo DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_splo IMPLEMENTATION. CLASS lcl_object_splo IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE chgname1 FROM tsp1d INTO rv_user SELECT SINGLE chgname1 FROM tsp1d INTO rv_user
@ -34,6 +38,7 @@ CLASS lcl_object_splo IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~serialize. METHOD lif_object~serialize.
@ -105,14 +110,6 @@ CLASS lcl_object_splo IMPLEMENTATION.
DELETE FROM tsp1d WHERE papart = ms_item-obj_name. "#EC CI_SUBRC DELETE FROM tsp1d WHERE papart = ms_item-obj_name. "#EC CI_SUBRC
DELETE FROM tsp0p WHERE pdpaper = ms_item-obj_name. "#EC CI_SUBRC DELETE FROM tsp0p WHERE pdpaper = ms_item-obj_name. "#EC CI_SUBRC
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_delete_tadir_entry = abap_true
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = ms_item-obj_type
wi_tadir_obj_name = ms_item-obj_name
wi_test_modus = abap_false.
ENDMETHOD. "lif_object~delete ENDMETHOD. "lif_object~delete
METHOD lif_object~exists. METHOD lif_object~exists.
@ -130,4 +127,8 @@ CLASS lcl_object_splo IMPLEMENTATION.
lcx_exception=>raise( 'todo, jump, SPLO' ). lcx_exception=>raise( 'todo, jump, SPLO' ).
ENDMETHOD. "lif_object~jump ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_splo IMPLEMENTATION ENDCLASS. "lcl_object_splo IMPLEMENTATION

View File

@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_ssfo IMPLEMENTATION. CLASS lcl_object_ssfo IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE lastuser FROM stxfadm INTO rv_user SELECT SINGLE lastuser FROM stxfadm INTO rv_user
@ -34,6 +38,7 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -233,4 +238,8 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_ssfo IMPLEMENTATION ENDCLASS. "lcl_object_ssfo IMPLEMENTATION

View File

@ -27,6 +27,10 @@ ENDCLASS. "lcl_object_ssst DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_ssst IMPLEMENTATION. CLASS lcl_object_ssst IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE lastuser FROM stxsadm INTO rv_user SELECT SINGLE lastuser FROM stxsadm INTO rv_user
@ -39,6 +43,7 @@ CLASS lcl_object_ssst IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -198,4 +203,8 @@ CLASS lcl_object_ssst IMPLEMENTATION.
lcx_exception=>raise( 'todo' ). lcx_exception=>raise( 'todo' ).
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_ssst IMPLEMENTATION ENDCLASS. "lcl_object_ssst IMPLEMENTATION

View File

@ -22,12 +22,17 @@ ENDCLASS. "lcl_object_susc DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_susc IMPLEMENTATION. CLASS lcl_object_susc IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.
@ -118,4 +123,8 @@ CLASS lcl_object_susc IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_susc IMPLEMENTATION ENDCLASS. "lcl_object_susc IMPLEMENTATION

View File

@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_suso DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_suso IMPLEMENTATION. CLASS lcl_object_suso IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -165,4 +169,8 @@ CLASS lcl_object_suso IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_suso IMPLEMENTATION ENDCLASS. "lcl_object_suso IMPLEMENTATION

View File

@ -7,6 +7,7 @@
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* *
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_tabl DEFINITION INHERITING FROM lcl_objects_super FINAL. CLASS lcl_object_tabl DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION. PUBLIC SECTION.
@ -22,6 +23,43 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_tabl IMPLEMENTATION. CLASS lcl_object_tabl IMPLEMENTATION.
METHOD lif_object~has_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp,
lt_indexes TYPE STANDARD TABLE OF dd09l.
FIELD-SYMBOLS <ls_index> LIKE LINE OF lt_indexes.
SELECT SINGLE as4date as4time FROM dd02l " Table
INTO (lv_date, lv_time)
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
_object_check_timestamp lv_date lv_time.
SELECT SINGLE as4date as4time FROM dd09l " Table tech settings
INTO (lv_date, lv_time)
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
_object_check_timestamp lv_date lv_time.
SELECT as4date as4time FROM dd12l " Table tech settings
INTO CORRESPONDING FIELDS OF TABLE lt_indexes
WHERE sqltab = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000' ##TOO_MANY_ITAB_FIELDS.
LOOP AT lt_indexes ASSIGNING <ls_index>.
_object_check_timestamp <ls_index>-as4date <ls_index>-as4time.
ENDLOOP.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE as4user FROM dd02l INTO rv_user SELECT SINGLE as4user FROM dd02l INTO rv_user
@ -92,9 +130,12 @@ CLASS lcl_object_tabl IMPLEMENTATION.
lt_dd12v TYPE dd12vtab, lt_dd12v TYPE dd12vtab,
lt_dd17v TYPE dd17vtab, lt_dd17v TYPE dd17vtab,
lt_dd35v TYPE TABLE OF dd35v, lt_dd35v TYPE TABLE OF dd35v,
lv_index LIKE sy-index,
lt_dd36m TYPE dd36mttyp. lt_dd36m TYPE dd36mttyp.
FIELD-SYMBOLS: <ls_dd12v> LIKE LINE OF lt_dd12v, FIELD-SYMBOLS: <ls_dd12v> LIKE LINE OF lt_dd12v,
<ls_dd05m> LIKE LINE OF lt_dd05m,
<ls_dd36m> LIKE LINE OF lt_dd36m,
<ls_dd03p> LIKE LINE OF lt_dd03p. <ls_dd03p> LIKE LINE OF lt_dd03p.
@ -139,9 +180,15 @@ CLASS lcl_object_tabl IMPLEMENTATION.
<ls_dd12v>-as4time. <ls_dd12v>-as4time.
ENDLOOP. ENDLOOP.
* remove nested structures
DELETE lt_dd03p WHERE depth <> '00'.
* remove fields from .INCLUDEs
DELETE lt_dd03p WHERE adminfield <> '0'.
LOOP AT lt_dd03p ASSIGNING <ls_dd03p> WHERE NOT rollname IS INITIAL. LOOP AT lt_dd03p ASSIGNING <ls_dd03p> WHERE NOT rollname IS INITIAL.
CLEAR: <ls_dd03p>-ddlanguage, CLEAR: <ls_dd03p>-ddlanguage,
<ls_dd03p>-dtelmaster, <ls_dd03p>-dtelmaster,
<ls_dd03p>-logflag,
<ls_dd03p>-ddtext, <ls_dd03p>-ddtext,
<ls_dd03p>-reptext, <ls_dd03p>-reptext,
<ls_dd03p>-scrtext_s, <ls_dd03p>-scrtext_s,
@ -162,6 +209,8 @@ CLASS lcl_object_tabl IMPLEMENTATION.
<ls_dd03p>-datatype, <ls_dd03p>-datatype,
<ls_dd03p>-leng, <ls_dd03p>-leng,
<ls_dd03p>-outputlen, <ls_dd03p>-outputlen,
<ls_dd03p>-deffdname,
<ls_dd03p>-convexit,
<ls_dd03p>-entitytab, <ls_dd03p>-entitytab,
<ls_dd03p>-dommaster, <ls_dd03p>-dommaster,
<ls_dd03p>-domname3l. <ls_dd03p>-domname3l.
@ -179,10 +228,32 @@ CLASS lcl_object_tabl IMPLEMENTATION.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
* remove foreign keys inherited from .INCLUDEs
DELETE lt_dd08v WHERE noinherit = 'N'.
LOOP AT lt_dd05m ASSIGNING <ls_dd05m>.
lv_index = sy-tabix.
READ TABLE lt_dd08v WITH KEY fieldname = <ls_dd05m>-fieldname TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
DELETE lt_dd05m INDEX lv_index.
ENDIF.
ENDLOOP.
* remove inherited search helps
DELETE lt_dd35v WHERE shlpinher = abap_true.
LOOP AT lt_dd36m ASSIGNING <ls_dd36m>.
lv_index = sy-tabix.
READ TABLE lt_dd35v WITH KEY fieldname = <ls_dd36m>-fieldname TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
DELETE lt_dd36m INDEX lv_index.
ENDIF.
ENDLOOP.
io_xml->add( iv_name = 'DD02V' io_xml->add( iv_name = 'DD02V'
ig_data = ls_dd02v ). ig_data = ls_dd02v ).
IF NOT ls_dd09l IS INITIAL.
io_xml->add( iv_name = 'DD09L' io_xml->add( iv_name = 'DD09L'
ig_data = ls_dd09l ). ig_data = ls_dd09l ).
ENDIF.
io_xml->add( ig_data = lt_dd03p io_xml->add( ig_data = lt_dd03p
iv_name = 'DD03P_TABLE' ). iv_name = 'DD03P_TABLE' ).
io_xml->add( ig_data = lt_dd05m io_xml->add( ig_data = lt_dd05m
@ -309,4 +380,32 @@ CLASS lcl_object_tabl IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
DATA: lo_table_validation TYPE REF TO lcl_object_tabl_validation,
lo_local_version_output TYPE REF TO lcl_xml_output,
lo_local_version_input TYPE REF TO lcl_xml_input,
lv_validation_text TYPE string.
CREATE OBJECT lo_local_version_output.
me->lif_object~serialize( lo_local_version_output ).
CREATE OBJECT lo_local_version_input
EXPORTING
iv_xml = lo_local_version_output->render( ).
CREATE OBJECT lo_table_validation.
lv_validation_text = lo_table_validation->validate(
io_remote_version = io_remote_version_xml
io_local_version = lo_local_version_input ).
IF lv_validation_text IS NOT INITIAL.
lv_validation_text = |Database Table { ms_item-obj_name }: { lv_validation_text }|.
CREATE OBJECT ro_comparison_result TYPE lcl_tabl_validation_dialog
EXPORTING
iv_message = lv_validation_text.
ELSE.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDIF.
ENDMETHOD.
ENDCLASS. "lcl_object_TABL IMPLEMENTATION ENDCLASS. "lcl_object_TABL IMPLEMENTATION

View File

@ -0,0 +1,225 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_object_tabl_valid
*&---------------------------------------------------------------------*
CLASS lcl_object_tabl_validation DEFINITION FINAL.
PUBLIC SECTION.
METHODS validate
IMPORTING
io_remote_version TYPE REF TO lcl_xml_input
io_local_version TYPE REF TO lcl_xml_input
RETURNING
VALUE(rv_message) TYPE string
RAISING
lcx_exception.
ENDCLASS.
CLASS lcl_tabl_validation_dialog DEFINITION FINAL.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING
iv_message TYPE string.
INTERFACES: lif_object_comparison_result.
PRIVATE SECTION.
DATA mv_message TYPE string.
DATA mv_halt TYPE string.
ENDCLASS.
CLASS lcl_object_tabl_validation IMPLEMENTATION.
METHOD validate.
DATA: lt_previous_table_fields TYPE TABLE OF dd03p,
ls_previous_table_field LIKE LINE OF lt_previous_table_fields,
lt_current_table_fields TYPE TABLE OF dd03p,
ls_current_table_field LIKE LINE OF lt_current_table_fields.
io_remote_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_previous_table_fields ).
io_local_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_current_table_fields ).
LOOP AT lt_previous_table_fields INTO ls_previous_table_field.
READ TABLE lt_current_table_fields WITH KEY fieldname = ls_previous_table_field-fieldname
INTO ls_current_table_field.
IF sy-subrc = 0.
IF ls_current_table_field-rollname <> ls_previous_table_field-rollname.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ELSE.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
CLASS lcl_tabl_validation_dialog IMPLEMENTATION.
METHOD constructor.
mv_message = iv_message.
ENDMETHOD.
METHOD lif_object_comparison_result~is_result_complete_halt.
rv_response = mv_halt.
ENDMETHOD.
METHOD lif_object_comparison_result~show_confirmation_dialog.
DATA lv_answer TYPE string.
TRY.
lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Warning'
text_question = mv_message
text_button_1 = 'Abort'
icon_button_1 = 'ICON_CANCEL'
text_button_2 = 'Pull anyway'
icon_button_2 = 'ICON_OKAY'
default_button = '2'
display_cancel_button = abap_false ).
CATCH lcx_exception.
mv_halt = abap_true.
ENDTRY.
IF lv_answer = 1.
mv_halt = abap_true.
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS lct_table_validation DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
PRIVATE SECTION.
METHODS:
setup,
type_changed FOR TESTING RAISING lcx_exception,
no_type_changes FOR TESTING RAISING lcx_exception,
field_not_found FOR TESTING RAISING lcx_exception,
no_fields_no_message FOR TESTING RAISING lcx_exception,
create_xmls
RAISING
lcx_exception.
DATA: mo_table_validator TYPE REF TO lcl_object_tabl_validation,
mo_previous_version_out_xml TYPE REF TO lcl_xml_output,
mo_previous_version_input_xml TYPE REF TO lcl_xml_input,
mo_current_version_out_xml TYPE REF TO lcl_xml_output,
mo_current_version_input_xml TYPE REF TO lcl_xml_input,
mt_previous_table_fields TYPE TABLE OF dd03p,
mt_current_table_fields TYPE TABLE OF dd03p,
mv_validation_message TYPE string.
ENDCLASS.
CLASS lct_table_validation IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_table_validator.
ENDMETHOD.
METHOD type_changed.
DATA:
ls_previous_table_field LIKE LINE OF mt_previous_table_fields,
ls_current_table_field LIKE LINE OF mt_current_table_fields.
ls_previous_table_field-fieldname = 'FIELD1'.
ls_previous_table_field-rollname = 'INT4'.
APPEND ls_previous_table_field TO mt_previous_table_fields.
ls_current_table_field-fieldname = 'FIELD1'.
ls_current_table_field-rollname = 'CHAR30'.
APPEND ls_current_table_field TO mt_current_table_fields.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_equals(
act = mv_validation_message
exp = 'Fields were changed. This may lead to inconsistencies.' ).
ENDMETHOD.
METHOD no_type_changes.
DATA:
ls_previous_table_field LIKE LINE OF mt_previous_table_fields.
ls_previous_table_field-fieldname = 'FIELD1'.
ls_previous_table_field-rollname = 'INT4'.
APPEND ls_previous_table_field TO mt_previous_table_fields.
mt_current_table_fields = mt_previous_table_fields.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_equals(
act = mv_validation_message
exp = '' ).
ENDMETHOD.
METHOD field_not_found.
DATA:
ls_previous_table_field LIKE LINE OF mt_previous_table_fields,
ls_current_table_field LIKE LINE OF mt_current_table_fields.
ls_previous_table_field-fieldname = 'FIELD1'.
ls_previous_table_field-rollname = 'INT4'.
APPEND ls_previous_table_field TO mt_previous_table_fields.
ls_current_table_field-fieldname = 'ANOTHER_FIELD'.
ls_current_table_field-rollname = 'CHAR30'.
APPEND ls_current_table_field TO mt_current_table_fields.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_equals(
act = mv_validation_message
exp = 'Fields were changed. This may lead to inconsistencies.' ).
ENDMETHOD.
METHOD no_fields_no_message.
DATA:
ls_current_table_field LIKE LINE OF mt_current_table_fields.
create_xmls( ).
mv_validation_message = mo_table_validator->validate(
io_remote_version = mo_previous_version_input_xml
io_local_version = mo_current_version_input_xml ).
cl_abap_unit_assert=>assert_initial( mv_validation_message ).
ENDMETHOD.
METHOD create_xmls.
CREATE OBJECT mo_previous_version_out_xml.
mo_previous_version_out_xml->add(
iv_name = 'DD03P_TABLE'
ig_data = mt_previous_table_fields ).
CREATE OBJECT mo_previous_version_input_xml
EXPORTING
iv_xml = mo_previous_version_out_xml->render( ).
CREATE OBJECT mo_current_version_out_xml.
mo_current_version_out_xml->add(
iv_name = 'DD03P_TABLE'
ig_data = mt_current_table_fields ).
CREATE OBJECT mo_current_version_input_xml
EXPORTING
iv_xml = mo_current_version_out_xml->render( ).
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_OBJECT_TABL_VALID</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_OBJECT_TABL_VALID</ENTRY>
<LENGTH>34</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -22,6 +22,10 @@ ENDCLASS. "lcl_object_tobj DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_tobj IMPLEMENTATION. CLASS lcl_object_tobj IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -179,4 +183,8 @@ CLASS lcl_object_tobj IMPLEMENTATION.
lcx_exception=>raise( 'todo, TOBJ jump' ). lcx_exception=>raise( 'todo, TOBJ jump' ).
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_tobj IMPLEMENTATION ENDCLASS. "lcl_object_tobj IMPLEMENTATION

View File

@ -47,6 +47,10 @@ ENDCLASS. "lcl_object_TRAN DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_tran IMPLEMENTATION. CLASS lcl_object_tran IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -409,4 +413,8 @@ CLASS lcl_object_tran IMPLEMENTATION.
ENDMETHOD. "serialize ENDMETHOD. "serialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_tran IMPLEMENTATION ENDCLASS. "lcl_object_tran IMPLEMENTATION

View File

@ -22,6 +22,21 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_ttyp IMPLEMENTATION. CLASS lcl_object_ttyp IMPLEMENTATION.
METHOD lif_object~has_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp.
SELECT SINGLE as4date as4time FROM dd40l
INTO (lv_date, lv_time)
WHERE typename = ms_item-obj_name
AND as4local = 'A'.
_object_check_timestamp lv_date lv_time.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE as4user FROM dd40l INTO rv_user SELECT SINGLE as4user FROM dd40l INTO rv_user
@ -113,6 +128,10 @@ CLASS lcl_object_ttyp IMPLEMENTATION.
ls_dd40v-as4date, ls_dd40v-as4date,
ls_dd40v-as4time. ls_dd40v-as4time.
IF NOT ls_dd40v-rowkind IS INITIAL.
CLEAR ls_dd40v-typelen.
ENDIF.
io_xml->add( iv_name = 'DD40V' io_xml->add( iv_name = 'DD40V'
ig_data = ls_dd40v ). ig_data = ls_dd40v ).
io_xml->add( iv_name = 'DD42V' io_xml->add( iv_name = 'DD42V'
@ -163,4 +182,8 @@ CLASS lcl_object_ttyp IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_ttyp IMPLEMENTATION ENDCLASS. "lcl_object_ttyp IMPLEMENTATION

View File

@ -35,6 +35,10 @@ ENDCLASS. "lcl_object_type DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_type IMPLEMENTATION. CLASS lcl_object_type IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -201,4 +205,8 @@ CLASS lcl_object_type IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_type IMPLEMENTATION ENDCLASS. "lcl_object_type IMPLEMENTATION

View File

@ -26,6 +26,10 @@ ENDCLASS. "lcl_object_vcls DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_vcls IMPLEMENTATION. CLASS lcl_object_vcls IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -185,4 +189,8 @@ CLASS lcl_object_vcls IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_vcls IMPLEMENTATION ENDCLASS. "lcl_object_vcls IMPLEMENTATION

View File

@ -22,6 +22,30 @@ ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_view IMPLEMENTATION. CLASS lcl_object_view IMPLEMENTATION.
METHOD lif_object~has_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp.
SELECT SINGLE as4date as4time FROM dd25l " View
INTO (lv_date, lv_time)
WHERE viewname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
_object_check_timestamp lv_date lv_time.
SELECT SINGLE as4date as4time FROM dd09l " Table tech settings
INTO (lv_date, lv_time)
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
_object_check_timestamp lv_date lv_time.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
SELECT SINGLE as4user FROM dd25l INTO rv_user SELECT SINGLE as4user FROM dd25l INTO rv_user
@ -193,4 +217,8 @@ CLASS lcl_object_view IMPLEMENTATION.
ENDMETHOD. "deserialize ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_view IMPLEMENTATION ENDCLASS. "lcl_object_view IMPLEMENTATION

View File

@ -12,8 +12,48 @@ CLASS lcl_object_w3super DEFINITION INHERITING FROM lcl_objects_super ABSTRACT.
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES lif_object. INTERFACES lif_object.
TYPES ty_wwwparams_tt TYPE STANDARD TABLE OF wwwparams WITH DEFAULT KEY.
CONSTANTS: BEGIN OF c_param_names,
version TYPE w3_name VALUE 'version',
fileext TYPE w3_name VALUE 'fileextension',
filesize TYPE w3_name VALUE 'filesize',
filename TYPE w3_name VALUE 'filename',
mimetype TYPE w3_name VALUE 'mimetype',
END OF c_param_names.
METHODS constructor
IMPORTING
is_item TYPE ty_item
iv_language TYPE spras.
PROTECTED SECTION.
METHODS get_metadata REDEFINITION.
PRIVATE SECTION. PRIVATE SECTION.
METHODS init_key RETURNING VALUE(rs_key) TYPE wwwdatatab.
DATA ms_key TYPE wwwdatatab.
METHODS get_ext
IMPORTING it_params TYPE ty_wwwparams_tt
RETURNING VALUE(rv_ext) TYPE string
RAISING lcx_exception.
METHODS normalize_params
IMPORTING iv_size TYPE i
CHANGING ct_params TYPE ty_wwwparams_tt " Param table to patch
RAISING lcx_exception.
METHODS strip_params
CHANGING ct_params TYPE ty_wwwparams_tt
RAISING lcx_exception.
METHODS find_param
IMPORTING it_params TYPE ty_wwwparams_tt
iv_name TYPE w3_name
RETURNING VALUE(rv_value) TYPE string
RAISING lcx_exception.
ENDCLASS. "lcl_object_W3SUPER DEFINITION ENDCLASS. "lcl_object_W3SUPER DEFINITION
@ -24,17 +64,22 @@ ENDCLASS. "lcl_object_W3SUPER DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_w3super IMPLEMENTATION. CLASS lcl_object_w3super IMPLEMENTATION.
METHOD constructor.
super->constructor( is_item = is_item iv_language = iv_language ).
ms_key-relid = ms_item-obj_type+2(2).
ms_key-objid = ms_item-obj_name.
ENDMETHOD. " constructor.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
METHOD init_key.
rs_key-relid = ms_item-obj_type+2(2).
rs_key-objid = ms_item-obj_name.
ENDMETHOD. " init_key
METHOD lif_object~jump. METHOD lif_object~jump.
" No idea how to just to SMW0 " No idea how to jump to SMW0
lcx_exception=>raise( 'Please go to SMW0 for W3MI object' ). lcx_exception=>raise( 'Please go to SMW0 for W3MI object' ).
ENDMETHOD. "jump ENDMETHOD. "jump
@ -42,18 +87,17 @@ CLASS lcl_object_w3super IMPLEMENTATION.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" METHOD get_metadata. "Redefinition
" W3xx EXISTS rs_metadata = super->get_metadata( ).
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" rs_metadata-version = 'v2.0.0'. " Seriazation v2, separate data file
ENDMETHOD. " get_metadata. "Redefinition
METHOD lif_object~exists. METHOD lif_object~exists.
DATA ls_key TYPE wwwdatatab.
ls_key = init_key( ). SELECT SINGLE objid INTO ms_key-objid
SELECT SINGLE objid INTO ls_key-objid
FROM wwwdata FROM wwwdata
WHERE relid = ls_key-relid WHERE relid = ms_key-relid
AND objid = ls_key-objid AND objid = ms_key-objid
AND srtf2 = 0. AND srtf2 = 0.
IF sy-subrc IS NOT INITIAL. IF sy-subrc IS NOT INITIAL.
@ -64,26 +108,18 @@ CLASS lcl_object_w3super IMPLEMENTATION.
ENDMETHOD. "lif_object~exists ENDMETHOD. "lif_object~exists
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" W3xx SERIALIZE
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
METHOD lif_object~serialize. METHOD lif_object~serialize.
DATA ls_key TYPE wwwdatatab.
DATA lt_w3mime TYPE STANDARD TABLE OF w3mime. DATA lt_w3mime TYPE STANDARD TABLE OF w3mime.
DATA lt_w3html TYPE STANDARD TABLE OF w3html. DATA lt_w3html TYPE STANDARD TABLE OF w3html.
DATA lt_w3params TYPE STANDARD TABLE OF wwwparams. DATA lt_w3params TYPE STANDARD TABLE OF wwwparams.
DATA lv_xstring TYPE xstring. DATA lv_xstring TYPE xstring.
DATA ls_wwwparam LIKE LINE OF lt_w3params.
DATA lv_size TYPE int4. DATA lv_size TYPE int4.
DATA lv_base64str TYPE string.
DATA lo_utility TYPE REF TO cl_http_utility.
ls_key = init_key( ). SELECT SINGLE * INTO CORRESPONDING FIELDS OF ms_key
SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_key
FROM wwwdata FROM wwwdata
WHERE relid = ls_key-relid WHERE relid = ms_key-relid
AND objid = ls_key-objid AND objid = ms_key-objid
AND srtf2 = 0. AND srtf2 = 0.
IF sy-subrc IS NOT INITIAL. IF sy-subrc IS NOT INITIAL.
@ -92,7 +128,7 @@ CLASS lcl_object_w3super IMPLEMENTATION.
CALL FUNCTION 'WWWDATA_IMPORT' CALL FUNCTION 'WWWDATA_IMPORT'
EXPORTING EXPORTING
key = ls_key key = ms_key
TABLES TABLES
mime = lt_w3mime mime = lt_w3mime
html = lt_w3html html = lt_w3html
@ -106,8 +142,8 @@ CLASS lcl_object_w3super IMPLEMENTATION.
CALL FUNCTION 'WWWPARAMS_READ_ALL' CALL FUNCTION 'WWWPARAMS_READ_ALL'
EXPORTING EXPORTING
type = ls_key-relid type = ms_key-relid
objid = ls_key-objid objid = ms_key-objid
TABLES TABLES
params = lt_w3params params = lt_w3params
EXCEPTIONS EXCEPTIONS
@ -117,14 +153,11 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Cannot read W3xx data' ). lcx_exception=>raise( 'Cannot read W3xx data' ).
ENDIF. ENDIF.
READ TABLE lt_w3params INTO ls_wwwparam WITH KEY name = 'filesize' ##NO_TEXT. lv_size = find_param( it_params = lt_w3params iv_name = c_param_names-filesize ).
IF sy-subrc IS NOT INITIAL. " Clean params (remove version, filesize & clear filename from path)
lcx_exception=>raise( 'Cannot read W3xx filesize' ). strip_params( CHANGING ct_params = lt_w3params ).
ENDIF.
lv_size = ls_wwwparam-value. CASE ms_key-relid.
CASE ls_key-relid.
WHEN 'MI'. WHEN 'MI'.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING EXPORTING
@ -151,53 +184,52 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Cannot convert W3xx to xstring' ). lcx_exception=>raise( 'Cannot convert W3xx to xstring' ).
ENDIF. ENDIF.
CREATE OBJECT lo_utility.
lv_base64str = lo_utility->encode_x_base64( lv_xstring ).
io_xml->add( iv_name = 'NAME' io_xml->add( iv_name = 'NAME'
ig_data = ls_key-objid ). ig_data = ms_key-objid ).
io_xml->add( iv_name = 'TEXT' io_xml->add( iv_name = 'TEXT'
ig_data = ls_key-text ). ig_data = ms_key-text ).
io_xml->add( iv_name = 'DATA'
ig_data = lv_base64str ).
io_xml->add( iv_name = 'PARAMS' io_xml->add( iv_name = 'PARAMS'
ig_data = lt_w3params ). ig_data = lt_w3params ).
" Seriazation v2, separate data file. 'extra' added to prevent conflict with .xml
lif_object~mo_files->add_raw( iv_data = lv_xstring
iv_extra = 'data'
iv_ext = get_ext( lt_w3params ) ).
ENDMETHOD. "serialize ENDMETHOD. "serialize
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" W3xx DESERIALIZE
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
METHOD lif_object~deserialize. METHOD lif_object~deserialize.
DATA ls_key TYPE wwwdatatab.
DATA lv_base64str TYPE string. DATA lv_base64str TYPE string.
DATA lt_w3params TYPE STANDARD TABLE OF wwwparams. DATA lt_w3params TYPE STANDARD TABLE OF wwwparams.
DATA lv_xstring TYPE xstring. DATA lv_xstring TYPE xstring.
DATA lo_utility TYPE REF TO cl_http_utility.
DATA lt_w3mime TYPE STANDARD TABLE OF w3mime. DATA lt_w3mime TYPE STANDARD TABLE OF w3mime.
DATA lt_w3html TYPE STANDARD TABLE OF w3html. DATA lt_w3html TYPE STANDARD TABLE OF w3html.
DATA lv_size TYPE int4. DATA lv_size TYPE int4.
DATA lv_tadir_obj TYPE tadir-object. DATA lv_tadir_obj TYPE tadir-object.
ls_key = init_key( ).
io_xml->read( EXPORTING iv_name = 'TEXT' io_xml->read( EXPORTING iv_name = 'TEXT'
CHANGING cg_data = ls_key-text ). CHANGING cg_data = ms_key-text ).
io_xml->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = lv_base64str ).
io_xml->read( EXPORTING iv_name = 'PARAMS' io_xml->read( EXPORTING iv_name = 'PARAMS'
CHANGING cg_data = lt_w3params ). CHANGING cg_data = lt_w3params ).
CREATE OBJECT lo_utility. CASE io_xml->get_metadata( )-version.
lv_xstring = lo_utility->decode_x_base64( lv_base64str ). WHEN 'v1.0.0'.
io_xml->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = lv_base64str ).
lv_xstring = cl_http_utility=>decode_x_base64( lv_base64str ).
WHEN 'v2.0.0'.
lv_xstring = lif_object~mo_files->read_raw( iv_extra = 'data'
iv_ext = get_ext( lt_w3params ) ).
WHEN OTHERS.
lcx_exception=>raise( 'W3xx: Unknown serializer version' ).
ENDCASE.
CASE ls_key-relid. CASE ms_key-relid.
WHEN 'MI'. WHEN 'MI'.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING EXPORTING
@ -234,6 +266,10 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Wrong W3xx type' ). lcx_exception=>raise( 'Wrong W3xx type' ).
ENDCASE. ENDCASE.
" Update size of file based on actual data file size, prove param object name
normalize_params( EXPORTING iv_size = lv_size
CHANGING ct_params = lt_w3params ).
CALL FUNCTION 'WWWPARAMS_UPDATE' CALL FUNCTION 'WWWPARAMS_UPDATE'
TABLES TABLES
params = lt_w3params params = lt_w3params
@ -244,14 +280,14 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Cannot update W3xx params' ). lcx_exception=>raise( 'Cannot update W3xx params' ).
ENDIF. ENDIF.
ls_key-tdate = sy-datum. ms_key-tdate = sy-datum.
ls_key-ttime = sy-uzeit. ms_key-ttime = sy-uzeit.
ls_key-chname = sy-uname. ms_key-chname = sy-uname.
ls_key-devclass = iv_package. ms_key-devclass = iv_package.
CALL FUNCTION 'WWWDATA_EXPORT' CALL FUNCTION 'WWWDATA_EXPORT'
EXPORTING EXPORTING
key = ls_key key = ms_key
TABLES TABLES
mime = lt_w3mime mime = lt_w3mime
html = lt_w3html html = lt_w3html
@ -263,14 +299,14 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Cannot upload W3xx data' ). lcx_exception=>raise( 'Cannot upload W3xx data' ).
ENDIF. ENDIF.
CONCATENATE 'W3' ls_key-relid INTO lv_tadir_obj. CONCATENATE 'W3' ms_key-relid INTO lv_tadir_obj.
CALL FUNCTION 'TR_TADIR_INTERFACE' CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING EXPORTING
wi_tadir_pgmid = 'R3TR' wi_tadir_pgmid = 'R3TR'
wi_tadir_object = lv_tadir_obj wi_tadir_object = lv_tadir_obj
wi_tadir_devclass = iv_package wi_tadir_devclass = iv_package
wi_tadir_obj_name = ls_key-objid wi_tadir_obj_name = ms_key-objid
wi_test_modus = space wi_test_modus = space
EXCEPTIONS EXCEPTIONS
tadir_entry_not_existing = 1 tadir_entry_not_existing = 1
@ -305,17 +341,11 @@ CLASS lcl_object_w3super IMPLEMENTATION.
ENDMETHOD. "lif_object~deserialize ENDMETHOD. "lif_object~deserialize
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" W3xx DELETE
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
METHOD lif_object~delete. METHOD lif_object~delete.
DATA ls_key TYPE wwwdatatab.
ls_key = init_key( ).
CALL FUNCTION 'WWWDATA_DELETE' CALL FUNCTION 'WWWDATA_DELETE'
EXPORTING EXPORTING
key = ls_key key = ms_key
EXCEPTIONS EXCEPTIONS
wrong_object_type = 1 wrong_object_type = 1
delete_error = 2. delete_error = 2.
@ -326,7 +356,7 @@ CLASS lcl_object_w3super IMPLEMENTATION.
CALL FUNCTION 'WWWPARAMS_DELETE_ALL' CALL FUNCTION 'WWWPARAMS_DELETE_ALL'
EXPORTING EXPORTING
key = ls_key key = ms_key
EXCEPTIONS EXCEPTIONS
delete_error = 1. delete_error = 1.
@ -336,6 +366,67 @@ CLASS lcl_object_w3super IMPLEMENTATION.
ENDMETHOD. "lif_object~delete ENDMETHOD. "lif_object~delete
METHOD get_ext.
rv_ext = find_param( it_params = it_params iv_name = c_param_names-fileext ).
SHIFT rv_ext LEFT DELETING LEADING '.'.
ENDMETHOD. " get_ext.
METHOD normalize_params.
FIELD-SYMBOLS <param> LIKE LINE OF ct_params.
" Ensure filesize param exists
READ TABLE ct_params ASSIGNING <param> WITH KEY name = c_param_names-filesize.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO ct_params ASSIGNING <param>.
<param>-name = c_param_names-filesize.
ENDIF.
LOOP AT ct_params ASSIGNING <param>.
<param>-relid = ms_key-relid. " Ensure param key = object key
<param>-objid = ms_key-objid.
IF <param>-name = c_param_names-filesize. " Patch filesize = real file size
<param>-value = iv_size.
CONDENSE <param>-value.
ENDIF.
ENDLOOP.
ENDMETHOD. " normalize_params.
METHOD strip_params.
FIELD-SYMBOLS <param> LIKE LINE OF ct_params.
" Remove path from filename
find_param( it_params = ct_params iv_name = c_param_names-filename ). " Check exists
READ TABLE ct_params ASSIGNING <param> WITH KEY name = c_param_names-filename.
<param>-value = lcl_path=>get_filename_from_syspath( |{ <param>-value }| ).
" Clear version & filesize
DELETE ct_params WHERE name = c_param_names-version.
DELETE ct_params WHERE name = c_param_names-filesize.
ENDMETHOD. " strip_params.
METHOD find_param.
FIELD-SYMBOLS <param> LIKE LINE OF it_params.
READ TABLE it_params ASSIGNING <param> WITH KEY name = iv_name.
IF sy-subrc > 0.
lcx_exception=>raise( |W3xx: Cannot find { iv_name } for { ms_key-objid }| ).
ENDIF.
rv_value = <param>-value.
ENDMETHOD. " find_param.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_W3SUPER IMPLEMENTATION ENDCLASS. "lcl_object_W3SUPER IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*

View File

@ -34,6 +34,10 @@ ENDCLASS. "lcl_object_wdya DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_wdya IMPLEMENTATION. CLASS lcl_object_wdya IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -207,4 +211,8 @@ CLASS lcl_object_wdya IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_wdya IMPLEMENTATION ENDCLASS. "lcl_object_wdya IMPLEMENTATION

View File

@ -68,6 +68,10 @@ ENDCLASS. "lcl_object_wdyn DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_wdyn IMPLEMENTATION. CLASS lcl_object_wdyn IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -518,8 +522,8 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ls_component_key TYPE wdy_md_component_key, ls_component_key TYPE wdy_md_component_key,
ls_view_key TYPE wdy_md_view_key. ls_view_key TYPE wdy_md_view_key.
FIELD-SYMBOLS: <ls_object> LIKE LINE OF lt_objects. FIELD-SYMBOLS: <ls_object> LIKE LINE OF lt_objects,
<ls_meta> LIKE LINE OF rs_component-ctlr_metadata.
CLEAR mt_components. CLEAR mt_components.
CLEAR mt_sources. CLEAR mt_sources.
@ -546,6 +550,21 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
definition-component_name ASCENDING definition-component_name ASCENDING
definition-controller_name ASCENDING. definition-controller_name ASCENDING.
LOOP AT rs_component-ctlr_metadata ASSIGNING <ls_meta>.
SORT <ls_meta>-descriptions.
SORT <ls_meta>-controller_usages.
SORT <ls_meta>-controller_components.
SORT <ls_meta>-controller_component_texts.
SORT <ls_meta>-controller_parameters.
SORT <ls_meta>-controller_parameter_texts.
SORT <ls_meta>-context_nodes.
SORT <ls_meta>-context_attributes.
SORT <ls_meta>-context_mappings.
SORT <ls_meta>-fieldgroups.
SORT <ls_meta>-controller_exceptions.
SORT <ls_meta>-controller_exception_texts.
ENDLOOP.
SORT mt_components BY SORT mt_components BY
component_name ASCENDING component_name ASCENDING
controller_name ASCENDING controller_name ASCENDING
@ -643,4 +662,8 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ENDMETHOD. "jump ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_wdyn IMPLEMENTATION ENDCLASS. "lcl_object_wdyn IMPLEMENTATION

View File

@ -62,6 +62,10 @@ ENDCLASS. "lcl_object_SFBS DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_webi IMPLEMENTATION. CLASS lcl_object_webi IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. "lif_object~changed_by ENDMETHOD. "lif_object~changed_by
@ -439,4 +443,8 @@ CLASS lcl_object_webi IMPLEMENTATION.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_webi IMPLEMENTATION ENDCLASS. "lcl_object_webi IMPLEMENTATION

View File

@ -28,6 +28,10 @@ ENDCLASS. "lcl_object_xslt DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_object_xslt IMPLEMENTATION. CLASS lcl_object_xslt IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by. METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo rv_user = c_user_unknown. " todo
ENDMETHOD. ENDMETHOD.
@ -121,6 +125,8 @@ CLASS lcl_object_xslt IMPLEMENTATION.
lcx_exception=>raise( 'error from cl_o2_api_xsltdesc=>create_new_from_string' ). lcx_exception=>raise( 'error from cl_o2_api_xsltdesc=>create_new_from_string' ).
ENDIF. ENDIF.
lo_xslt->activate( ).
lo_xslt->save( ). lo_xslt->save( ).
lo_xslt->set_changeable( abap_false ). lo_xslt->set_changeable( abap_false ).
@ -182,4 +188,8 @@ CLASS lcl_object_xslt IMPLEMENTATION.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_object_xslt IMPLEMENTATION ENDCLASS. "lcl_object_xslt IMPLEMENTATION

View File

@ -25,6 +25,10 @@ CLASS lcl_objects_activation DEFINITION FINAL.
CLASS-METHODS clear. CLASS-METHODS clear.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS fix_class_methods
IMPORTING iv_obj_name TYPE trobj_name
CHANGING ct_objects TYPE dwinactiv_tab.
CLASS-DATA: gt_ddic TYPE TABLE OF dwinactiv, CLASS-DATA: gt_ddic TYPE TABLE OF dwinactiv,
gt_programs TYPE TABLE OF dwinactiv. gt_programs TYPE TABLE OF dwinactiv.
@ -87,6 +91,40 @@ CLASS lcl_objects_activation IMPLEMENTATION.
ENDMETHOD. "activate ENDMETHOD. "activate
METHOD fix_class_methods.
* function module RS_WORKING_OBJECTS_ACTIVATE assumes that
* METH lines contains spaces between class and method name
* however, classes named with 30 characters
* eg. ZCL_CLAS_TESTTESTTESTTESTTESTT
* this will not be true, so find all the method includes instead
DATA: lt_methods TYPE seop_methods_w_include,
lv_class TYPE seoclsname.
FIELD-SYMBOLS: <ls_method> LIKE LINE OF lt_methods,
<ls_object> LIKE LINE OF ct_objects.
lv_class = iv_obj_name.
cl_oo_classname_service=>get_all_method_includes(
EXPORTING
clsname = lv_class
RECEIVING
result = lt_methods
EXCEPTIONS
class_not_existing = 1
OTHERS = 2 ).
ASSERT sy-subrc = 0.
DELETE ct_objects WHERE object = 'METH'.
LOOP AT lt_methods ASSIGNING <ls_method>.
APPEND INITIAL LINE TO ct_objects ASSIGNING <ls_object>.
<ls_object>-object = 'METH'.
<ls_object>-obj_name = <ls_method>-incname.
ENDLOOP.
ENDMETHOD.
METHOD add. METHOD add.
* function group SEWORKINGAREA * function group SEWORKINGAREA
@ -117,6 +155,11 @@ CLASS lcl_objects_activation IMPLEMENTATION.
lcx_exception=>raise( 'Error from RS_INACTIVE_OBJECTS_IN_OBJECT' ). lcx_exception=>raise( 'Error from RS_INACTIVE_OBJECTS_IN_OBJECT' ).
ENDIF. ENDIF.
IF iv_type = 'CLAS'.
fix_class_methods( EXPORTING iv_obj_name = lv_obj_name
CHANGING ct_objects = lt_objects ).
ENDIF.
APPEND LINES OF lt_objects TO gt_programs. APPEND LINES OF lt_objects TO gt_programs.
WHEN 'DOMA' OR 'DTEL' OR 'TABL' OR 'INDX' OR 'TTYP' WHEN 'DOMA' OR 'DTEL' OR 'TABL' OR 'INDX' OR 'TTYP'
OR 'VIEW' OR 'SHLP' OR 'ENQU' OR 'VIEW' OR 'SHLP' OR 'ENQU'
@ -187,16 +230,34 @@ CLASS lcl_objects_files DEFINITION FINAL.
RAISING lcx_exception, RAISING lcx_exception,
add add
IMPORTING is_file TYPE ty_file, IMPORTING is_file TYPE ty_file,
add_raw
IMPORTING iv_extra TYPE clike OPTIONAL
iv_ext TYPE string
iv_data TYPE xstring
RAISING lcx_exception,
read_raw
IMPORTING iv_extra TYPE clike OPTIONAL
iv_ext TYPE string
RETURNING VALUE(rv_data) TYPE xstring
RAISING lcx_exception,
get_files get_files
RETURNING VALUE(rt_files) TYPE ty_files_tt, RETURNING VALUE(rt_files) TYPE ty_files_tt,
set_files set_files
IMPORTING it_files TYPE ty_files_tt. IMPORTING it_files TYPE ty_files_tt,
get_accessed_files
RETURNING VALUE(rt_files) TYPE ty_file_signatures_tt.
PRIVATE SECTION. PRIVATE SECTION.
DATA: ms_item TYPE ty_item, DATA: ms_item TYPE ty_item,
mt_accessed_files TYPE ty_file_signatures_tt,
mt_files TYPE ty_files_tt. mt_files TYPE ty_files_tt.
METHODS: METHODS:
read_file
IMPORTING iv_filename TYPE string
iv_error TYPE abap_bool DEFAULT abap_true
EXPORTING ev_data TYPE xstring
RAISING lcx_exception,
filename filename
IMPORTING iv_extra TYPE clike OPTIONAL IMPORTING iv_extra TYPE clike OPTIONAL
iv_ext TYPE string iv_ext TYPE string
@ -204,6 +265,31 @@ CLASS lcl_objects_files DEFINITION FINAL.
ENDCLASS. "lcl_objects_files DEFINITION ENDCLASS. "lcl_objects_files DEFINITION
INTERFACE lif_object_comparison_result.
METHODS:
show_confirmation_dialog,
is_result_complete_halt
RETURNING VALUE(rv_response) TYPE abap_bool.
ENDINTERFACE.
"Null Object Pattern
CLASS lcl_null_comparison_result DEFINITION FINAL.
PUBLIC SECTION.
INTERFACES lif_object_comparison_result.
ENDCLASS.
CLASS lcl_null_comparison_result IMPLEMENTATION.
METHOD lif_object_comparison_result~is_result_complete_halt.
rv_response = abap_false.
ENDMETHOD.
METHOD lif_object_comparison_result~show_confirmation_dialog.
RETURN.
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* INTERFACE lif_object DEFINITION * INTERFACE lif_object DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -230,7 +316,16 @@ INTERFACE lif_object.
jump jump
RAISING lcx_exception, RAISING lcx_exception,
get_metadata get_metadata
RETURNING VALUE(rs_metadata) TYPE ty_metadata. RETURNING VALUE(rs_metadata) TYPE ty_metadata,
has_changed_since
IMPORTING iv_timestamp TYPE timestamp
RETURNING VALUE(rv_changed) TYPE abap_bool
RAISING lcx_exception.
METHODS:
compare_to_remote_version
IMPORTING io_remote_version_xml TYPE REF TO lcl_xml_input
RETURNING VALUE(ro_comparison_result) TYPE REF TO lif_object_comparison_result
RAISING lcx_exception.
DATA: mo_files TYPE REF TO lcl_objects_files. DATA: mo_files TYPE REF TO lcl_objects_files.
@ -259,47 +354,44 @@ CLASS lcl_objects_files IMPLEMENTATION.
mt_files = it_files. mt_files = it_files.
ENDMETHOD. "set_files ENDMETHOD. "set_files
METHOD get_accessed_files.
rt_files = mt_accessed_files.
ENDMETHOD. " get_accessed_files.
METHOD read_string. METHOD read_string.
DATA: lv_filename TYPE string. DATA: lv_filename TYPE string,
lv_data TYPE xstring.
FIELD-SYMBOLS: <ls_html> LIKE LINE OF mt_files.
lv_filename = filename( iv_extra = iv_extra lv_filename = filename( iv_extra = iv_extra
iv_ext = iv_ext ). "#EC NOTEXT iv_ext = iv_ext ). "#EC NOTEXT
READ TABLE mt_files ASSIGNING <ls_html> WITH KEY filename = lv_filename. read_file( EXPORTING iv_filename = lv_filename
IF sy-subrc <> 0. IMPORTING ev_data = lv_data ).
lcx_exception=>raise( 'html not found' ).
ENDIF.
rv_string = lcl_convert=>xstring_to_string_utf8( <ls_html>-data ). rv_string = lcl_convert=>xstring_to_string_utf8( lv_data ).
ENDMETHOD. "read_string ENDMETHOD. "read_string
METHOD read_abap. METHOD read_abap.
DATA: lv_filename TYPE string, DATA: lv_filename TYPE string,
lv_data TYPE xstring,
lv_abap TYPE string. lv_abap TYPE string.
FIELD-SYMBOLS: <ls_abap> LIKE LINE OF mt_files.
CLEAR rt_abap.
lv_filename = filename( iv_extra = iv_extra lv_filename = filename( iv_extra = iv_extra
iv_ext = 'abap' ). "#EC NOTEXT iv_ext = 'abap' ). "#EC NOTEXT
READ TABLE mt_files ASSIGNING <ls_abap> WITH KEY filename = lv_filename. read_file( EXPORTING iv_filename = lv_filename
IF sy-subrc <> 0. iv_error = iv_error
IF iv_error = abap_true. IMPORTING ev_data = lv_data ).
lcx_exception=>raise( 'abap not found' ).
ELSE. IF lv_data IS INITIAL. " Post-handling of iv_error = false
RETURN. RETURN.
ENDIF. ENDIF.
ENDIF.
lv_abap = lcl_convert=>xstring_to_string_utf8( <ls_abap>-data ). lv_abap = lcl_convert=>xstring_to_string_utf8( lv_data ).
SPLIT lv_abap AT gc_newline INTO TABLE rt_abap. SPLIT lv_abap AT gc_newline INTO TABLE rt_abap.
@ -363,20 +455,16 @@ CLASS lcl_objects_files IMPLEMENTATION.
METHOD read_xml. METHOD read_xml.
DATA: lv_filename TYPE string, DATA: lv_filename TYPE string,
lv_data TYPE xstring,
lv_xml TYPE string. lv_xml TYPE string.
FIELD-SYMBOLS: <ls_xml> LIKE LINE OF mt_files.
lv_filename = filename( iv_extra = iv_extra lv_filename = filename( iv_extra = iv_extra
iv_ext = 'xml' ). "#EC NOTEXT iv_ext = 'xml' ). "#EC NOTEXT
READ TABLE mt_files ASSIGNING <ls_xml> WITH KEY filename = lv_filename. read_file( EXPORTING iv_filename = lv_filename
IF sy-subrc <> 0. IMPORTING ev_data = lv_data ).
lcx_exception=>raise( 'xml not found' ).
ENDIF.
lv_xml = lcl_convert=>xstring_to_string_utf8( <ls_xml>-data ). lv_xml = lcl_convert=>xstring_to_string_utf8( lv_data ).
CREATE OBJECT ro_xml CREATE OBJECT ro_xml
EXPORTING EXPORTING
@ -425,6 +513,59 @@ CLASS lcl_objects_files IMPLEMENTATION.
ENDMETHOD. "add_xml_from_plugin ENDMETHOD. "add_xml_from_plugin
METHOD read_file.
FIELD-SYMBOLS: <ls_file> LIKE LINE OF mt_files,
<ls_accessed> LIKE LINE OF mt_accessed_files.
CLEAR ev_data.
READ TABLE mt_files ASSIGNING <ls_file> WITH KEY filename = iv_filename.
IF sy-subrc <> 0.
IF iv_error = abap_true.
lcx_exception=>raise( |File not found: { iv_filename }| ).
ELSE.
RETURN.
ENDIF.
ENDIF.
" Update access table
READ TABLE mt_accessed_files TRANSPORTING NO FIELDS
WITH KEY path = <ls_file>-path filename = <ls_file>-filename.
IF sy-subrc > 0. " Not found ? -> Add
APPEND INITIAL LINE TO mt_accessed_files ASSIGNING <ls_accessed>.
MOVE-CORRESPONDING <ls_file> TO <ls_accessed>.
ENDIF.
ev_data = <ls_file>-data.
ENDMETHOD. " read_file.
METHOD add_raw.
DATA: ls_file TYPE ty_file.
ls_file-path = '/'.
ls_file-data = iv_data.
ls_file-filename = filename( iv_extra = iv_extra
iv_ext = iv_ext ).
APPEND ls_file TO mt_files.
ENDMETHOD. "add_raw
METHOD read_raw.
DATA: lv_filename TYPE string.
lv_filename = filename( iv_extra = iv_extra
iv_ext = iv_ext ).
read_file( EXPORTING iv_filename = lv_filename
IMPORTING ev_data = rv_data ).
ENDMETHOD. "read_raw
ENDCLASS. "lcl_objects_files IMPLEMENTATION ENDCLASS. "lcl_objects_files IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -435,16 +576,17 @@ ENDCLASS. "lcl_objects_files IMPLEMENTATION
CLASS lcl_objects_super DEFINITION ABSTRACT. CLASS lcl_objects_super DEFINITION ABSTRACT.
PUBLIC SECTION. PUBLIC SECTION.
METHODS: METHODS:
constructor constructor
IMPORTING IMPORTING
is_item TYPE ty_item is_item TYPE ty_item
iv_language TYPE spras. iv_language TYPE spras.
PROTECTED SECTION.
CONSTANTS: c_user_unknown TYPE xubname VALUE 'UNKNOWN'. CONSTANTS: c_user_unknown TYPE xubname VALUE 'UNKNOWN'.
PROTECTED SECTION.
DATA: ms_item TYPE ty_item, DATA: ms_item TYPE ty_item,
mv_language TYPE spras. mv_language TYPE spras.
@ -497,6 +639,10 @@ ENDCLASS. "lcl_objects_bridge DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_objects_bridge IMPLEMENTATION. CLASS lcl_objects_bridge IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~GET_METADATA') CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~GET_METADATA')
@ -646,6 +792,10 @@ CLASS lcl_objects_bridge IMPLEMENTATION.
ENDMETHOD. "class_constructor ENDMETHOD. "class_constructor
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
ENDCLASS. "lcl_objects_bridge IMPLEMENTATION ENDCLASS. "lcl_objects_bridge IMPLEMENTATION
********************************************************************** **********************************************************************
@ -706,6 +856,7 @@ CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super.
RAISING lcx_exception. RAISING lcx_exception.
PROTECTED SECTION. PROTECTED SECTION.
TYPES: ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY. TYPES: ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
TYPES: BEGIN OF ty_tpool. TYPES: BEGIN OF ty_tpool.
@ -759,6 +910,12 @@ CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super.
is_cua TYPE ty_cua is_cua TYPE ty_cua
RAISING lcx_exception. RAISING lcx_exception.
METHODS check_prog_changed_since
IMPORTING iv_program TYPE programm
iv_timestamp TYPE timestamp
iv_skip_gui TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rv_changed) TYPE abap_bool.
CLASS-METHODS: CLASS-METHODS:
add_tpool add_tpool
IMPORTING it_tpool TYPE textpool_table IMPORTING it_tpool TYPE textpool_table
@ -880,9 +1037,11 @@ CLASS lcl_objects_program IMPLEMENTATION.
ig_data = lt_dynpros ). ig_data = lt_dynpros ).
ls_cua = serialize_cua( lv_program_name ). ls_cua = serialize_cua( lv_program_name ).
IF NOT ls_cua IS INITIAL.
lo_xml->add( iv_name = 'CUA' lo_xml->add( iv_name = 'CUA'
ig_data = ls_cua ). ig_data = ls_cua ).
ENDIF. ENDIF.
ENDIF.
IF lines( lt_tpool ) = 1. IF lines( lt_tpool ) = 1.
READ TABLE lt_tpool INDEX 1 INTO ls_tpool. READ TABLE lt_tpool INDEX 1 INTO ls_tpool.
@ -1034,6 +1193,16 @@ CLASS lcl_objects_program IMPLEMENTATION.
lcx_exception=>raise( 'PROG, error inserting' ). lcx_exception=>raise( 'PROG, error inserting' ).
ENDIF. ENDIF.
SELECT SINGLE * FROM progdir INTO ls_progdir_new
WHERE name = ls_progdir_new-name
AND state = ls_progdir_new-state.
IF sy-subrc = 0 AND is_progdir-varcl = space AND ls_progdir_new-varcl = abap_true.
* function module UPDATE_PROGDIR does not update VARCL
UPDATE progdir SET varcl = is_progdir-varcl
WHERE name = ls_progdir_new-name
AND state = ls_progdir_new-state.
ENDIF.
lcl_objects_activation=>add( iv_type = 'REPS' lcl_objects_activation=>add( iv_type = 'REPS'
iv_name = is_progdir-name ). iv_name = is_progdir-name ).
@ -1309,6 +1478,57 @@ CLASS lcl_objects_program IMPLEMENTATION.
ENDMETHOD. "deserialize_cua ENDMETHOD. "deserialize_cua
METHOD check_prog_changed_since.
DATA: lv_date TYPE dats,
lv_time TYPE tims,
lv_ts TYPE timestamp,
lt_screens TYPE STANDARD TABLE OF d020s,
lt_eudb TYPE STANDARD TABLE OF eudb.
FIELD-SYMBOLS: <ls_screen> LIKE LINE OF lt_screens,
<ls_eudb> LIKE LINE OF lt_eudb.
SELECT SINGLE udat utime FROM reposrc " Program
INTO (lv_date, lv_time)
WHERE progname = iv_program
AND r3state = 'A'.
_object_check_timestamp lv_date lv_time.
SELECT SINGLE udat utime FROM repotext " Program text pool
INTO (lv_date, lv_time)
WHERE progname = iv_program
AND r3state = 'A'.
IF sy-subrc = 0. " Text not found ? Assuming no changes, see #404
_object_check_timestamp lv_date lv_time.
ENDIF.
IF iv_skip_gui = abap_true.
RETURN.
ENDIF.
SELECT dgen tgen FROM d020s " Screens
INTO CORRESPONDING FIELDS OF TABLE lt_screens
WHERE prog = iv_program ##TOO_MANY_ITAB_FIELDS.
LOOP AT lt_screens ASSIGNING <ls_screen>.
_object_check_timestamp <ls_screen>-dgen <ls_screen>-tgen.
ENDLOOP.
SELECT vdatum vzeit FROM eudb " GUI
INTO CORRESPONDING FIELDS OF TABLE lt_eudb
WHERE relid = 'CU'
AND name = iv_program
AND srtf2 = 0 ##TOO_MANY_ITAB_FIELDS.
LOOP AT lt_eudb ASSIGNING <ls_eudb>.
_object_check_timestamp <ls_eudb>-vdatum <ls_eudb>-vzeit.
ENDLOOP.
ENDMETHOD. "check_prog_changed_since
ENDCLASS. "lcl_objects_program IMPLEMENTATION ENDCLASS. "lcl_objects_program IMPLEMENTATION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -1411,6 +1631,12 @@ CLASS lcl_objects DEFINITION FINAL.
PUBLIC SECTION. PUBLIC SECTION.
TYPES: ty_types_tt TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY. TYPES: ty_types_tt TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY.
TYPES: BEGIN OF ty_late,
obj TYPE REF TO lif_object,
xml TYPE REF TO lcl_xml_input,
package TYPE devclass,
END OF ty_late.
CLASS-METHODS serialize CLASS-METHODS serialize
IMPORTING is_item TYPE ty_item IMPORTING is_item TYPE ty_item
iv_language TYPE spras iv_language TYPE spras
@ -1420,6 +1646,7 @@ CLASS lcl_objects DEFINITION FINAL.
CLASS-METHODS deserialize CLASS-METHODS deserialize
IMPORTING io_repo TYPE REF TO lcl_repo IMPORTING io_repo TYPE REF TO lcl_repo
RETURNING VALUE(rt_accessed_files) TYPE ty_file_signatures_tt
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS delete CLASS-METHODS delete
@ -1435,8 +1662,15 @@ CLASS lcl_objects DEFINITION FINAL.
RETURNING VALUE(rv_user) TYPE xubname RETURNING VALUE(rv_user) TYPE xubname
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS has_changed_since
IMPORTING is_item TYPE ty_item
iv_timestamp TYPE timestamp
RETURNING VALUE(rv_changed) TYPE abap_bool
RAISING lcx_exception.
CLASS-METHODS is_supported CLASS-METHODS is_supported
IMPORTING is_item TYPE ty_item IMPORTING is_item TYPE ty_item
iv_native_only TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rv_bool) TYPE abap_bool. RETURNING VALUE(rv_bool) TYPE abap_bool.
CLASS-METHODS exists CLASS-METHODS exists
@ -1446,7 +1680,14 @@ CLASS lcl_objects DEFINITION FINAL.
CLASS-METHODS supported_list CLASS-METHODS supported_list
RETURNING VALUE(rt_types) TYPE ty_types_tt. RETURNING VALUE(rt_types) TYPE ty_types_tt.
CLASS-METHODS is_language_installed
IMPORTING iv_language TYPE langu
RETURNING VALUE(rv_yes) TYPE abap_bool.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-DATA: mv_langs_installed TYPE scplangs.
CLASS-METHODS check_duplicates CLASS-METHODS check_duplicates
IMPORTING it_files TYPE ty_files_tt IMPORTING it_files TYPE ty_files_tt
RAISING lcx_exception. RAISING lcx_exception.
@ -1455,6 +1696,7 @@ CLASS lcl_objects DEFINITION FINAL.
IMPORTING is_item TYPE ty_item IMPORTING is_item TYPE ty_item
iv_language TYPE spras iv_language TYPE spras
is_metadata TYPE ty_metadata OPTIONAL is_metadata TYPE ty_metadata OPTIONAL
iv_native_only TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(ri_obj) TYPE REF TO lif_object RETURNING VALUE(ri_obj) TYPE REF TO lif_object
RAISING lcx_exception. RAISING lcx_exception.
@ -1497,4 +1739,12 @@ CLASS lcl_objects DEFINITION FINAL.
IMPORTING is_item TYPE ty_item IMPORTING is_item TYPE ty_item
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS compare_remote_to_local
IMPORTING
io_object TYPE REF TO lif_object
it_remote TYPE ty_files_tt
is_result TYPE ty_result
RAISING
lcx_exception.
ENDCLASS. "lcl_object DEFINITION ENDCLASS. "lcl_object DEFINITION

View File

@ -0,0 +1,728 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_objects IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_objects IMPLEMENTATION.
METHOD warning_overwrite.
DATA: lv_index TYPE i,
lv_answer TYPE c,
lv_question TYPE string.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF ct_results.
LOOP AT ct_results ASSIGNING <ls_result>
WHERE NOT obj_type IS INITIAL.
lv_index = sy-tabix.
IF <ls_result>-lstate IS NOT INITIAL
AND <ls_result>-lstate <> gc_state-deleted
AND NOT ( <ls_result>-lstate = gc_state-added
AND <ls_result>-rstate IS INITIAL ).
lv_question = |It looks like object {
<ls_result>-obj_type } { <ls_result>-obj_name
} has been modified locally, overwrite object?|.
lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Warning'
text_question = lv_question
display_cancel_button = abap_false ). "#EC NOTEXT
IF lv_answer = '2'.
DELETE ct_results INDEX lv_index.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD warning_package.
DATA: lv_question TYPE c LENGTH 200,
lv_answer TYPE c,
ls_tadir TYPE tadir.
ls_tadir = lcl_tadir=>read_single( iv_object = is_item-obj_type
iv_obj_name = is_item-obj_name ).
IF NOT ls_tadir IS INITIAL AND ls_tadir-devclass <> iv_package.
CONCATENATE 'Overwrite object' is_item-obj_type is_item-obj_name
'from package' ls_tadir-devclass
INTO lv_question SEPARATED BY space. "#EC NOTEXT
lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Warning'
text_question = lv_question
text_button_1 = 'Ok'
icon_button_1 = 'ICON_DELETE'
text_button_2 = 'Cancel'
icon_button_2 = 'ICON_CANCEL'
default_button = '2'
display_cancel_button = abap_false ). "#EC NOTEXT
IF lv_answer = '2'.
rv_cancel = abap_true.
ENDIF.
ENDIF.
ENDMETHOD. "check_warning
METHOD update_package_tree.
DATA: lt_packages TYPE lcl_sap_package=>ty_devclass_tt,
lv_package LIKE LINE OF lt_packages,
lv_tree TYPE dirtree-tname.
lt_packages = lcl_sap_package=>list_subpackages( iv_package ).
APPEND iv_package TO lt_packages.
LOOP AT lt_packages INTO lv_package.
* update package tree for SE80
lv_tree = 'EU_' && lv_package.
CALL FUNCTION 'WB_TREE_ACTUALIZE'
EXPORTING
tree_name = lv_tree
without_crossreference = abap_true
with_tcode_index = abap_true.
ENDLOOP.
ENDMETHOD. "update_package_tree
METHOD create_object.
TYPES: BEGIN OF ty_obj_serializer_map,
item LIKE is_item,
metadata LIKE is_metadata,
END OF ty_obj_serializer_map.
STATICS st_obj_serializer_map
TYPE SORTED TABLE OF ty_obj_serializer_map WITH UNIQUE KEY item.
DATA: lv_message TYPE string,
lv_class_name TYPE string,
ls_obj_serializer_map LIKE LINE OF st_obj_serializer_map.
READ TABLE st_obj_serializer_map
INTO ls_obj_serializer_map WITH KEY item = is_item.
IF sy-subrc = 0.
lv_class_name = ls_obj_serializer_map-metadata-class.
ELSEIF is_metadata IS NOT INITIAL.
* Metadata is provided only on serialization
* Once this has been triggered, the same serializer shall be used
* for subsequent processes.
* Thus, buffer the metadata afterwards
ls_obj_serializer_map-item = is_item.
ls_obj_serializer_map-metadata = is_metadata.
INSERT ls_obj_serializer_map INTO TABLE st_obj_serializer_map.
lv_class_name = is_metadata-class.
ELSE.
lv_class_name = class_name( is_item ).
ENDIF.
TRY.
CREATE OBJECT ri_obj TYPE (lv_class_name)
EXPORTING
is_item = is_item
iv_language = iv_language.
CATCH cx_sy_create_object_error.
lv_message = |Object type { is_item-obj_type } not supported, serialize|. "#EC NOTEXT
IF iv_native_only = abap_false.
TRY. " 2nd step, try looking for plugins
CREATE OBJECT ri_obj TYPE lcl_objects_bridge
EXPORTING
is_item = is_item.
CATCH cx_sy_create_object_error.
lcx_exception=>raise( lv_message ).
ENDTRY.
ELSE. " No native support? -> fail
lcx_exception=>raise( lv_message ).
ENDIF.
ENDTRY.
ENDMETHOD. "create_object
METHOD has_changed_since.
rv_changed = abap_true. " Assume changed
IF is_supported( is_item ) = abap_false.
RETURN. " Will requre serialize which will log the error
ENDIF.
rv_changed = create_object(
is_item = is_item
iv_language = gc_english )->has_changed_since( iv_timestamp ).
ENDMETHOD. "has_changed_since
METHOD is_supported.
TRY.
create_object( is_item = is_item
iv_language = gc_english
iv_native_only = iv_native_only ).
rv_bool = abap_true.
CATCH lcx_exception.
rv_bool = abap_false.
ENDTRY.
ENDMETHOD. "is_supported
METHOD supported_list.
DATA: lv_type LIKE LINE OF rt_types,
lt_snode TYPE TABLE OF snode.
FIELD-SYMBOLS: <ls_snode> LIKE LINE OF lt_snode.
CALL FUNCTION 'WB_TREE_ACTUALIZE'
EXPORTING
tree_name = 'PG_ZABAPGIT'
without_crossreference = abap_true
with_tcode_index = abap_true
TABLES
p_tree = lt_snode.
DELETE lt_snode WHERE type <> 'OPL'
OR name NP 'LCL_OBJECT_++++'.
LOOP AT lt_snode ASSIGNING <ls_snode>.
lv_type = <ls_snode>-name+11.
APPEND lv_type TO rt_types.
ENDLOOP.
ENDMETHOD. "supported_list
METHOD is_language_installed.
IF mv_langs_installed IS INITIAL.
CALL FUNCTION 'RSAQ_READ_INSTALLED_LANGUAGES'
IMPORTING
inst_languages = mv_langs_installed.
ENDIF.
rv_yes = boolc( mv_langs_installed CA iv_language ).
ENDMETHOD. "is_language_installed
METHOD exists.
DATA: li_obj TYPE REF TO lif_object.
TRY.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
rv_bool = li_obj->exists( ).
CATCH lcx_exception.
* ignore all errors and assume the object exists
rv_bool = abap_true.
ENDTRY.
ENDMETHOD. "exists
METHOD path_to_package.
DATA: lv_length TYPE i,
lv_path TYPE string.
lv_length = strlen( iv_start ) - 1.
lv_path = iv_path+lv_length.
CONCATENATE iv_top lv_path INTO rv_package.
TRANSLATE rv_package USING '/_'.
lv_length = strlen( rv_package ) - 1.
rv_package = rv_package(lv_length).
TRANSLATE rv_package TO UPPER CASE.
IF lcl_sap_package=>exists( rv_package ) = abap_false.
lcl_sap_package=>create_child( iv_parent = iv_top
iv_child = rv_package ).
ENDIF.
ENDMETHOD.
METHOD class_name.
CONCATENATE 'LCL_OBJECT_' is_item-obj_type INTO rv_class_name. "#EC NOTEXT
ENDMETHOD. "class_name
METHOD jump.
DATA: li_obj TYPE REF TO lif_object.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
li_obj->jump( ).
ENDMETHOD. "jump
METHOD changed_by.
DATA: li_obj TYPE REF TO lif_object.
IF is_item IS INITIAL.
* eg. ".abapgit.xml" file
rv_user = lcl_objects_super=>c_user_unknown.
ELSE.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
rv_user = li_obj->changed_by( ).
ENDIF.
ASSERT NOT rv_user IS INITIAL.
* todo, fallback to looking at transports if rv_user = 'UNKNOWN'?
ENDMETHOD.
METHOD delete.
DATA: ls_item TYPE ty_item,
lv_tabclass TYPE dd02l-tabclass,
lt_tadir LIKE it_tadir.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
* misuse field KORRNUM to fix deletion sequence
lt_tadir[] = it_tadir[].
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
CASE <ls_tadir>-object.
WHEN 'IATU'.
<ls_tadir>-korrnum = '5500'.
WHEN 'IARP'.
<ls_tadir>-korrnum = '5510'.
WHEN 'IASP'.
<ls_tadir>-korrnum = '5520'.
WHEN 'SUSC'.
<ls_tadir>-korrnum = '5000'.
WHEN 'TTYP' OR 'TABL' OR 'VIEW'.
SELECT SINGLE tabclass FROM dd02l
INTO lv_tabclass
WHERE tabname = <ls_tadir>-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
IF sy-subrc = 0 AND lv_tabclass = 'APPEND'.
* delete append structures before database tables
<ls_tadir>-korrnum = '6500'.
ELSE.
<ls_tadir>-korrnum = '7000'.
ENDIF.
WHEN 'DTEL'.
<ls_tadir>-korrnum = '8000'.
WHEN 'DOMA'.
<ls_tadir>-korrnum = '9000'.
WHEN 'PROG'.
* delete includes after main programs
SELECT COUNT(*) FROM reposrc
WHERE progname = <ls_tadir>-obj_name
AND r3state = 'A'
AND subc = 'I'.
IF sy-subrc = 0.
<ls_tadir>-korrnum = '2000'.
ELSE.
<ls_tadir>-korrnum = '1000'.
ENDIF.
WHEN OTHERS.
<ls_tadir>-korrnum = '1000'.
ENDCASE.
ENDLOOP.
resolve_ddic( CHANGING ct_tadir = lt_tadir ).
SORT lt_tadir BY korrnum ASCENDING.
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
lcl_progress=>show( iv_key = 'Delete'
iv_current = sy-tabix
iv_total = lines( lt_tadir )
iv_text = <ls_tadir>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_tadir>-object.
ls_item-obj_name = <ls_tadir>-obj_name.
delete_obj( ls_item ).
ENDLOOP.
ENDMETHOD. "delete
METHOD resolve_ddic.
* this will make sure the deletion sequence of structures/tables work
* in case they have dependencies with .INCLUDE
TYPES: BEGIN OF ty_edge,
from TYPE ty_item,
to TYPE ty_item,
END OF ty_edge.
DATA: lt_nodes TYPE TABLE OF ty_item,
lt_edges TYPE TABLE OF ty_edge,
lt_findstrings TYPE TABLE OF rsfind,
lv_plus TYPE i VALUE 1,
lv_find_obj_cls TYPE euobj-id,
lv_index TYPE i,
lv_before TYPE i,
lt_founds TYPE TABLE OF rsfindlst,
lt_scope TYPE STANDARD TABLE OF seu_obj.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir,
<ls_edge> LIKE LINE OF lt_edges,
<ls_found> LIKE LINE OF lt_founds,
<ls_node> LIKE LINE OF lt_nodes.
* build nodes
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE object = 'TABL'
OR object = 'TTYP'.
APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
<ls_node>-obj_name = <ls_tadir>-obj_name.
<ls_node>-obj_type = <ls_tadir>-object.
ENDLOOP.
APPEND 'TABL' TO lt_scope.
APPEND 'STRU' TO lt_scope.
APPEND 'TTYP' TO lt_scope.
* build edges
LOOP AT lt_nodes ASSIGNING <ls_node>.
CLEAR lt_findstrings.
APPEND <ls_node>-obj_name TO lt_findstrings.
lv_find_obj_cls = <ls_node>-obj_type.
CALL FUNCTION 'RS_EU_CROSSREF'
EXPORTING
i_find_obj_cls = lv_find_obj_cls
TABLES
i_findstrings = lt_findstrings
o_founds = lt_founds
i_scope_object_cls = lt_scope
EXCEPTIONS
not_executed = 1
not_found = 2
illegal_object = 3
no_cross_for_this_object = 4
batch = 5
batchjob_error = 6
wrong_type = 7
object_not_exist = 8
OTHERS = 9.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
LOOP AT lt_founds ASSIGNING <ls_found>.
APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
<ls_edge>-from = <ls_node>.
<ls_edge>-to-obj_name = <ls_found>-object.
CASE <ls_found>-object_cls.
WHEN 'DS'
OR 'DT'.
<ls_edge>-to-obj_type = 'TABL'.
WHEN 'DA'.
<ls_edge>-to-obj_type = 'TTYP'.
WHEN OTHERS.
lcx_exception=>raise( 'resolve_ddic, unknown object_cls' ).
ENDCASE.
ENDLOOP.
ENDLOOP.
DO.
lv_before = lines( lt_nodes ).
LOOP AT lt_nodes ASSIGNING <ls_node>.
lv_index = sy-tabix.
READ TABLE lt_edges WITH KEY
from-obj_name = <ls_node>-obj_name
from-obj_type = <ls_node>-obj_type
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE obj_name = <ls_node>-obj_name
AND object = <ls_node>-obj_type.
<ls_tadir>-korrnum = <ls_tadir>-korrnum + lv_plus.
CONDENSE <ls_tadir>-korrnum.
ENDLOOP.
DELETE lt_edges
WHERE to-obj_name = <ls_node>-obj_name
AND to-obj_type = <ls_node>-obj_type.
DELETE lt_nodes INDEX lv_index.
EXIT. " make sure the sequence is fixed
ENDIF.
ENDLOOP.
IF lv_before = lines( lt_nodes ).
EXIT.
ENDIF.
lv_plus = lv_plus + 1.
ENDDO.
ENDMETHOD. "resolve_ddic
METHOD delete_obj.
DATA: li_obj TYPE REF TO lif_object.
IF is_supported( is_item ) = abap_true.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
li_obj->delete( ).
IF li_obj->get_metadata( )-delete_tadir = abap_true.
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_delete_tadir_entry = abap_true
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = is_item-obj_type
wi_tadir_obj_name = is_item-obj_name
wi_test_modus = abap_false.
ENDIF.
ENDIF.
ENDMETHOD. "delete
METHOD serialize.
DATA: li_obj TYPE REF TO lif_object,
lo_xml TYPE REF TO lcl_xml_output,
lo_files TYPE REF TO lcl_objects_files.
IF is_supported( is_item ) = abap_false.
IF NOT io_log IS INITIAL.
io_log->add( iv_msgv1 = 'Object type ignored, not supported:'
iv_msgv2 = is_item-obj_type
iv_msgv3 = '-'
iv_msgv4 = is_item-obj_name ) ##no_text.
ENDIF.
RETURN.
ENDIF.
CREATE OBJECT lo_files
EXPORTING
is_item = is_item.
li_obj = create_object( is_item = is_item
iv_language = iv_language ).
li_obj->mo_files = lo_files.
CREATE OBJECT lo_xml.
li_obj->serialize( lo_xml ).
lo_files->add_xml( io_xml = lo_xml
is_metadata = li_obj->get_metadata( ) ).
rt_files = lo_files->get_files( ).
check_duplicates( rt_files ).
ENDMETHOD. "serialize
METHOD check_duplicates.
DATA: lt_files TYPE ty_files_tt.
lt_files[] = it_files[].
SORT lt_files BY path ASCENDING filename ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path filename.
IF lines( lt_files ) <> lines( it_files ).
lcx_exception=>raise( 'Duplicates' ).
ENDIF.
ENDMETHOD.
METHOD prioritize_deser.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
* XSLT has to be handled before CLAS/PROG
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'XSLT'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* PROG before internet services, as the services might use the screens
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ISAP has to be handled before ISRP
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IASP'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
LOOP AT it_results ASSIGNING <ls_result>
WHERE obj_type <> 'IASP'
AND obj_type <> 'PROG'
AND obj_type <> 'XSLT'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
ENDMETHOD. "prioritize_deser
METHOD deserialize.
DATA: ls_item TYPE ty_item,
lv_cancel TYPE abap_bool,
li_obj TYPE REF TO lif_object,
lt_remote TYPE ty_files_tt,
lv_package TYPE devclass,
lo_files TYPE REF TO lcl_objects_files,
lo_xml TYPE REF TO lcl_xml_input,
lt_results TYPE ty_results_tt,
lt_late TYPE TABLE OF ty_late.
FIELD-SYMBOLS: <ls_result> TYPE ty_result,
<ls_late> LIKE LINE OF lt_late.
lcl_objects_activation=>clear( ).
lt_remote = io_repo->get_files_remote( ).
lt_results = lcl_file_status=>status( io_repo ).
DELETE lt_results WHERE
match = abap_true. " Full match
* OR rstate IS INITIAL. " no remote changes, only local
SORT lt_results BY obj_type ASCENDING obj_name ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_results COMPARING obj_type obj_name.
lt_results = prioritize_deser( lt_results ).
warning_overwrite( EXPORTING io_repo = io_repo
CHANGING ct_results = lt_results ).
LOOP AT lt_results ASSIGNING <ls_result> WHERE obj_type IS NOT INITIAL
AND NOT ( lstate = gc_state-added AND rstate IS INITIAL ).
lcl_progress=>show( iv_key = 'Deserialize'
iv_current = sy-tabix
iv_total = lines( lt_results )
iv_text = <ls_result>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_result>-obj_type.
ls_item-obj_name = <ls_result>-obj_name.
* handle namespaces
REPLACE ALL OCCURRENCES OF '#' IN ls_item-obj_name WITH '/'.
lv_package = path_to_package(
iv_top = io_repo->get_package( )
iv_start = io_repo->get_dot_abapgit( )->get_starting_folder( )
iv_path = <ls_result>-path ).
lv_cancel = warning_package( is_item = ls_item
iv_package = lv_package ).
IF lv_cancel = abap_true.
lcx_exception=>raise( 'cancelled' ).
ENDIF.
CREATE OBJECT lo_files
EXPORTING
is_item = ls_item.
lo_files->set_files( lt_remote ).
* Analyze XML in order to instantiate the proper serializer
lo_xml = lo_files->read_xml( ).
li_obj = create_object( is_item = ls_item
iv_language = io_repo->get_master_language( )
is_metadata = lo_xml->get_metadata( ) ).
compare_remote_to_local(
io_object = li_obj
it_remote = lt_remote
is_result = <ls_result> ).
li_obj->mo_files = lo_files.
IF li_obj->get_metadata( )-late_deser = abap_true.
APPEND INITIAL LINE TO lt_late ASSIGNING <ls_late>.
<ls_late>-obj = li_obj.
<ls_late>-xml = lo_xml.
<ls_late>-package = lv_package.
CONTINUE.
ENDIF.
li_obj->deserialize( iv_package = lv_package
io_xml = lo_xml ).
" Remember accessed files
APPEND LINES OF lo_files->get_accessed_files( ) TO rt_accessed_files.
ENDLOOP.
lcl_objects_activation=>activate( ).
LOOP AT lt_late ASSIGNING <ls_late>.
<ls_late>-obj->deserialize( iv_package = <ls_late>-package
io_xml = <ls_late>-xml ).
ENDLOOP.
update_package_tree( io_repo->get_package( ) ).
SORT rt_accessed_files BY path ASCENDING filename ASCENDING.
DELETE ADJACENT DUPLICATES FROM rt_accessed_files. " Just in case
ENDMETHOD. "deserialize
METHOD compare_remote_to_local.
DATA: ls_remote_file TYPE ty_file,
lo_remote_version TYPE REF TO lcl_xml_input,
lo_comparison_result TYPE REF TO lif_object_comparison_result.
IF is_result-filename CS '.XML'.
IF io_object->exists( ) = abap_false.
RETURN.
ENDIF.
READ TABLE it_remote WITH KEY filename = is_result-filename INTO ls_remote_file.
"if file does not exist in remote, we don't need to validate
IF sy-subrc = 0.
CREATE OBJECT lo_remote_version
EXPORTING
iv_xml = lcl_convert=>xstring_to_string_utf8( ls_remote_file-data ).
lo_comparison_result = io_object->compare_to_remote_version( lo_remote_version ).
lo_comparison_result->show_confirmation_dialog( ).
IF lo_comparison_result->is_result_complete_halt( ) = abap_true.
RAISE EXCEPTION TYPE lcx_exception
EXPORTING
iv_text = 'Deserialization aborted by user'.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
ENDCLASS. "lcl_objects IMPLEMENTATION

View File

@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values> <asx:values>
<PROGDIR> <PROGDIR>
<NAME>ZABAPGIT_OBJECT</NAME> <NAME>ZABAPGIT_OBJECTS_IMPL</NAME>
<STATE>A</STATE> <STATE>A</STATE>
<SQLX/> <SQLX/>
<EDTX/> <EDTX/>

View File

@ -9,25 +9,27 @@ INTERFACE lif_gui_page.
METHODS on_event METHODS on_event
IMPORTING iv_action TYPE clike IMPORTING iv_action TYPE clike
iv_prev_page TYPE clike
iv_getdata TYPE clike OPTIONAL iv_getdata TYPE clike OPTIONAL
it_postdata TYPE cnht_post_data_tab OPTIONAL it_postdata TYPE cnht_post_data_tab OPTIONAL
EXPORTING ei_page TYPE REF TO lif_gui_page EXPORTING ei_page TYPE REF TO lif_gui_page
ev_state TYPE i ev_state TYPE i
RAISING lcx_exception. RAISING lcx_exception lcx_cancel.
METHODS render METHODS render
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception. RAISING lcx_exception.
METHODS get_assets
RETURNING VALUE(rt_assets) TYPE tt_web_assets.
ENDINTERFACE. ENDINTERFACE.
CLASS lcl_gui_page_super DEFINITION ABSTRACT. CLASS lcl_gui_page_super DEFINITION ABSTRACT.
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES lif_gui_page ABSTRACT METHODS render. INTERFACES lif_gui_page ABSTRACT METHODS render.
CLASS-METHODS render_error
IMPORTING ix_error TYPE REF TO lcx_exception
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
PROTECTED SECTION. PROTECTED SECTION.
METHODS render_repo_top METHODS render_repo_top
IMPORTING io_repo TYPE REF TO lcl_repo IMPORTING io_repo TYPE REF TO lcl_repo
@ -38,6 +40,11 @@ CLASS lcl_gui_page_super DEFINITION ABSTRACT.
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception. RAISING lcx_exception.
METHODS render_item_state
IMPORTING iv1 TYPE char1
iv2 TYPE char1
RETURNING VALUE(rv_html) TYPE string.
METHODS render_branch_span METHODS render_branch_span
IMPORTING iv_branch TYPE string IMPORTING iv_branch TYPE string
io_repo TYPE REF TO lcl_repo_online io_repo TYPE REF TO lcl_repo_online
@ -62,9 +69,6 @@ CLASS lcl_gui_page_super DEFINITION ABSTRACT.
IMPORTING iv_url TYPE string IMPORTING iv_url TYPE string
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
PRIVATE SECTION.
METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS. ENDCLASS.
CLASS lcl_gui_page_super IMPLEMENTATION. CLASS lcl_gui_page_super IMPLEMENTATION.
@ -72,10 +76,12 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
METHOD render_repo_top. METHOD render_repo_top.
DATA: lo_repo_online TYPE REF TO lcl_repo_online, DATA: lo_repo_online TYPE REF TO lcl_repo_online,
lo_pback TYPE REF TO lcl_persistence_background,
lv_icon TYPE string. lv_icon TYPE string.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
CREATE OBJECT lo_pback.
IF io_repo->is_offline( ) = abap_true. IF io_repo->is_offline( ) = abap_true.
lv_icon = 'img/repo_offline' ##NO_TEXT. lv_icon = 'img/repo_offline' ##NO_TEXT.
@ -97,10 +103,26 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '<td class="repo_attr right">' ). ro_html->add( '<td class="repo_attr right">' ).
IF abap_true = lcl_app=>user( )->is_favorite_repo( io_repo->get_key( ) ).
lv_icon = 'img/star' ##NO_TEXT.
ELSE.
lv_icon = 'img/star-grey' ##NO_TEXT.
ENDIF.
lv_icon = |<img class="pad-sides" src="{ lv_icon }" title="Click to toggle favorite">|.
ro_html->add_anchor( iv_act = |{ gc_action-repo_toggle_fav }?{ io_repo->get_key( ) }|
iv_txt = lv_icon ).
IF lo_pback->exists( io_repo->get_key( ) ) = abap_true.
ro_html->add( '<span class="bg_marker" title="background">BG</span>' ).
ENDIF.
IF io_repo->is_write_protected( ) = abap_true.
ro_html->add( '<img src="img/lock" title="locked">' ).
ENDIF.
IF io_repo->is_offline( ) = abap_false. IF io_repo->is_offline( ) = abap_false.
lo_repo_online ?= io_repo. lo_repo_online ?= io_repo.
IF iv_show_branch = abap_true. IF iv_show_branch = abap_true.
ro_html->add( '<img src="img/branch">' ).
IF iv_branch IS INITIAL. IF iv_branch IS INITIAL.
ro_html->add( render_branch_span( iv_branch = lo_repo_online->get_branch_name( ) ro_html->add( render_branch_span( iv_branch = lo_repo_online->get_branch_name( )
io_repo = lo_repo_online io_repo = lo_repo_online
@ -115,7 +137,10 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
IF iv_show_package = abap_true. IF iv_show_package = abap_true.
ro_html->add( '<img src="img/pkg">' ). ro_html->add( '<img src="img/pkg">' ).
ro_html->add( |<span>{ io_repo->get_package( ) }</span>| ). ro_html->add( '<span>' ).
ro_html->add_anchor( iv_txt = io_repo->get_package( )
iv_act = |{ gc_action-jump_pkg }?{ io_repo->get_package( ) }| ).
ro_html->add( '</span>' ).
ENDIF. ENDIF.
ro_html->add( '</td>' ). ro_html->add( '</td>' ).
@ -123,27 +148,71 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD render_item_state.
DATA: lv_system TYPE string.
FIELD-SYMBOLS <state> TYPE char1.
rv_html = '<span class="state-block">'.
DO 2 TIMES.
CASE sy-index.
WHEN 1.
ASSIGN iv1 TO <state>.
lv_system = 'Local:'.
WHEN 2.
ASSIGN iv2 TO <state>.
lv_system = 'Remote:'.
ENDCASE.
CASE <state>.
WHEN gc_state-unchanged. "None or unchanged
IF iv1 = gc_state-added OR iv2 = gc_state-added.
rv_html = rv_html && |<span class="none" title="{ lv_system } Not exists">X</span>|.
ELSE.
rv_html = rv_html && |<span class="none" title="{ lv_system } No changes">&nbsp;</span>|.
ENDIF.
WHEN gc_state-modified. "Changed
rv_html = rv_html && |<span class="changed" title="{ lv_system } Modified">M</span>|.
WHEN gc_state-added. "Added new
rv_html = rv_html && |<span class="added" title="{ lv_system } Added new">A</span>|.
WHEN gc_state-mixed. "Multiple changes (multifile)
rv_html = rv_html && |<span class="mixed" title="{ lv_system } Multiple changes">&#x25A0;</span>|.
WHEN gc_state-deleted. "Deleted
rv_html = rv_html && |<span class="deleted" title="{ lv_system } Deleted">D</span>|.
ENDCASE.
ENDDO.
rv_html = rv_html && '</span>'.
ENDMETHOD. "render_item_state
METHOD render_branch_span. METHOD render_branch_span.
DATA: lv_text TYPE string, DATA: lv_text TYPE string,
lv_class TYPE string. lv_class TYPE string.
lv_text = lcl_git_branch_list=>get_display_name( iv_branch ). lv_text = lcl_git_branch_list=>get_display_name( iv_branch ).
CASE lcl_git_branch_list=>get_type( iv_branch ). "TODO IF iv_branch = io_repo->get_head_branch_name( ) OR iv_branch = lcl_git_branch_list=>head_name.
WHEN lcl_git_branch_list=>c_type-branch. lv_class = 'branch branch_head'.
WHEN lcl_git_branch_list=>c_type-tag. ELSEIF lcl_git_branch_list=>get_type( iv_branch ) = lcl_git_branch_list=>c_type-branch.
WHEN OTHERS. lv_class = 'branch branch_branch'.
ENDCASE. ELSE.
lv_class = 'branch'.
ENDIF.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
IF iv_interactive = abap_true.
ro_html->add( |<span class="{ lv_class }">| ). ro_html->add( |<span class="{ lv_class }">| ).
ro_html->add_anchor( iv_act = |switch_branch?{ io_repo->get_key( ) }| ro_html->add( '<img src="img/branch">' ).
iv_txt = lv_text ). "TODO refactor IF iv_interactive = abap_true.
ro_html->add( '</span>' ). ro_html->add_anchor( iv_act = |{ gc_action-git_branch_switch }?{ io_repo->get_key( ) }|
iv_txt = lv_text ).
ELSE. ELSE.
ro_html->add( |<span class="{ lv_class }">{ lv_text }</span>| ). ro_html->add( lv_text ).
ENDIF. ENDIF.
ro_html->add( '</span>' ).
ENDMETHOD. "render_branch_span ENDMETHOD. "render_branch_span
@ -155,15 +224,9 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '<html>' ). "#EC NOTEXT ro_html->add( '<html>' ). "#EC NOTEXT
ro_html->add( '<head>' ). "#EC NOTEXT ro_html->add( '<head>' ). "#EC NOTEXT
ro_html->add( '<title>abapGit</title>' ). "#EC NOTEXT ro_html->add( '<title>abapGit</title>' ). "#EC NOTEXT
ro_html->add( styles( ) ). ro_html->add( '<link rel="stylesheet" type="text/css" href="css/common.css">' ).
IF io_include_style IS BOUND.
ro_html->add( '<style type="text/css">' ). "#EC NOTEXT
ro_html->add( io_include_style ).
ro_html->add( '</style>' ). "#EC NOTEXT
ENDIF.
ro_html->add( '<meta http-equiv="content-type" content="text/html; charset=utf-8">' ). "#EC NOTEXT ro_html->add( '<meta http-equiv="content-type" content="text/html; charset=utf-8">' ). "#EC NOTEXT
ro_html->add( '<script type="text/javascript" src="js/common.js"></script>' ). "#EC NOTEXT
ro_html->add( '</head>' ). "#EC NOTEXT ro_html->add( '</head>' ). "#EC NOTEXT
ro_html->add( '<body>' ). "#EC NOTEXT ro_html->add( '<body>' ). "#EC NOTEXT
@ -177,7 +240,7 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '<table width="100%"><tr>' ). "#EC NOTEXT ro_html->add( '<table width="100%"><tr>' ). "#EC NOTEXT
ro_html->add( '<td class="logo">' ). "#EC NOTEXT ro_html->add( '<td class="logo">' ). "#EC NOTEXT
ro_html->add( '<a href="sapevent:abapgithome">' ). "#EC NOTEXT ro_html->add( |<a href="sapevent:{ gc_action-abapgit_home }">| ). "#EC NOTEXT
ro_html->add( '<img src="img/logo">' ). "#EC NOTEXT ro_html->add( '<img src="img/logo">' ). "#EC NOTEXT
ro_html->add( '</a>' ). "#EC NOTEXT ro_html->add( '</a>' ). "#EC NOTEXT
ro_html->add( '</td>' ). "#EC NOTEXT ro_html->add( '</td>' ). "#EC NOTEXT
@ -203,13 +266,16 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '<div id="footer">' ). "#EC NOTEXT ro_html->add( '<div id="footer">' ). "#EC NOTEXT
ro_html->add( '<img src="img/logo" >' ). "#EC NOTEXT ro_html->add( '<img src="img/logo" >' ). "#EC NOTEXT
ro_html->add( '<table width="100%"><tr><td width="40%"></td><td>' ). "#EC NOTEXT
ro_html->add( |<span class="version">{ gc_abap_version }</span>| ). "#EC NOTEXT ro_html->add( |<span class="version">{ gc_abap_version }</span>| ). "#EC NOTEXT
ro_html->add( '</td><td id="debug-output" width="40%"></td></tr></table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT ro_html->add( '</div>' ). "#EC NOTEXT
ro_html->add( '</body>' ). "#EC NOTEXT ro_html->add( '</body>' ). "#EC NOTEXT
IF io_include_script IS BOUND. IF io_include_script IS BOUND.
ro_html->add( '<script type="text/javascript">' ). ro_html->add( '<script type="text/javascript">' ).
ro_html->add( io_include_script ). ro_html->add( io_include_script ).
ro_html->add( 'debugOutput("js: OK");' ).
ro_html->add( '</script>' ). ro_html->add( '</script>' ).
ENDIF. ENDIF.
@ -217,6 +283,16 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ENDMETHOD. "render html footer & logo ENDMETHOD. "render html footer & logo
METHOD render_error.
CREATE OBJECT ro_html.
ro_html->add( '<div class="dummydiv attention">' ).
ro_html->add( |Error: { ix_error->mv_text }| ).
ro_html->add( '</div>' ).
ENDMETHOD. "render_error
METHOD redirect. METHOD redirect.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
@ -228,285 +304,6 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD styles.
CREATE OBJECT ro_html.
_add '<style type="text/css">'.
" Global styles
_add '/* GLOBALS */'.
_add 'body {'.
_add ' font-family: Arial,Helvetica,sans-serif;'.
_add ' font-size: 12pt;'.
_add ' background: #E8E8E8;'.
_add '}'.
_add 'a, a:visited {'.
_add ' color: #4078c0;'.
_add ' text-decoration: none;'.
_add '}'.
_add 'a:hover, a:active {'.
_add ' cursor: pointer;'.
_add ' text-decoration: underline;'.
_add '}'.
_add 'img { border: 0px; vertical-align: middle; }'.
_add 'table { border-collapse: collapse; }'.
_add 'pre { display: inline; }'.
_add 'form input, textarea, select {'.
_add ' border: 1px solid #DDD;'.
_add ' padding: 3px 6px;'.
_add '}'.
_add 'form input:focus, textarea:focus {'.
_add ' border: 1px solid #8cadd9;'.
_add '}'.
" Modifiers
_add '/* MODIFIERS */'.
_add '.grey { color: lightgrey !important; }'.
_add '.emphasis { font-weight: bold !important; }'.
_add '.attention { color: red !important; }'.
_add '.right { text-align:right; }'.
_add '.paddings { padding: 0.5em 0.5em; }'.
" Structure div styles: header, footer, toc
_add '/* STRUCTURE DIVS, HEADER & FOOTER */'.
_add 'td.headpad { padding-top: 11px; }'.
_add 'td.logo { width: 164px; }'.
_add 'div#header {'.
_add ' padding: 0.5em 0.5em;'.
_add ' border-bottom: 3px double lightgrey;'.
_add '}'.
_add 'div#toc {'.
_add ' padding: 0.5em 1em;'.
_add ' background-color: #f2f2f2;'.
_add '}'.
_add 'div#toc div.toc_grid {'.
_add ' margin: -0.3em 0em;'.
_add '}'.
_add 'div#toc div.toc_grid a {'.
_add ' color: #ccc;'.
_add '}'.
_add 'div#toc:hover div.toc_grid a {'.
_add ' color: #4078c0;'.
_add '}'.
_add 'div#toc div.toc_row {'.
_add ' margin: 0.3em 0em;'.
_add '}'.
_add 'div#footer {'.
_add ' padding: 0.5em 1em;'.
_add ' border-top: 3px double lightgrey;'.
_add ' text-align: center;'.
_add '}'.
_add 'div.dummydiv {'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em 1em;'.
_add ' text-align: center;'.
_add '}'.
_add 'span.version {'.
_add ' display: block;'.
_add ' color: grey;'.
_add ' margin-top: 0.3em;'.
_add '}'.
_add 'span.page_title {'.
_add ' font-weight: normal;'.
_add ' font-size: 18pt;'.
_add ' color: #bbb;'.
_add ' padding-left: 0.4em;'.
_add '}'.
" Menu styles
_add '/* MENU */'.
_add 'div.menu { display: inline; }'.
_add 'div.menu .menu_end { border-right: 0px !important; }'.
_add 'div.menu a {'.
_add ' padding-left: 0.5em;'.
_add ' padding-right: 0.5em;'.
_add ' border-right: 1px solid lightgrey;'.
_add ' font-size: 12pt;'.
_add '}'.
_add 'div.menu_vertical { display: inline; }'.
_add 'div.menu_vertical a {'.
_add ' display: block; '.
_add ' font-size: 12pt;'.
_add '}'.
" Drop down styles
_add '/*DROP DOWN*/'.
_add '.dropdown {'.
_add ' position: relative;'.
_add ' display: inline;'.
_add '}'.
_add '.dropdown_content {'.
_add ' display: none;'.
_add ' z-index: 1;'.
_add ' position: absolute;'.
_add ' right: 0;'.
_add ' top: 1.1em; /*IE7 woraround*/'.
_add ' background-color: #f9f9f9;'.
_add ' white-space: nowrap;'.
* _add ' min-width: 10em;'.
_add ' border-bottom: 1px solid lightgrey;'.
_add '}'.
_add '.dropdown_content a {'.
_add ' padding: 0.2em;'.
_add ' text-decoration: none;'.
_add ' display: block;'.
_add '}'.
_add '.dropdown_content a:hover { background-color: #f1f1f1 }'.
_add '.dropdown:hover .dropdown_content { display: block; }'.
_add '.dropdown:hover .dropbtn { color: #79a0d2; }'.
" REPOSITORY
_add '/* REPOSITORY */'.
_add 'div.repo {'.
_add ' margin-top: 3px;'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em 1em 0.5em 1em;'.
_add '}'.
_add '.repo_name span.name {'.
_add ' font-weight: bold;'.
_add ' color: #333;'.
_add ' font-size: 14pt;'.
_add '}'.
_add '.repo_name span.url {'.
_add ' color: #ccc;'.
_add ' font-size: 12pt;'.
_add ' margin-left: 0.5em;'.
_add '}'.
_add '.repo_name img {'.
_add ' vertical-align: baseline;'.
_add ' margin: 0 5px 0 5px;'.
_add '}'.
_add '.repo_attr {'.
_add ' color: grey;'.
_add ' font-size: 12pt;'.
_add '}'.
_add '.repo_attr span {'.
_add ' margin-left: 0.2em;'.
_add ' margin-right: 0.5em;'.
_add '}'.
" Other and outdated (?) styles
_add '/* MISC AND REFACTOR */'.
_add 'a.grey:link {color: grey; font-size: smaller;}'.
_add 'a.grey:visited {color: grey; font-size: smaller;}'.
_add 'a.plain:link {color: black; text-decoration: none;}'.
_add 'a.plain:visited {color: black; text-decoration: none;}'.
_add 'a.bkg:link {color: #E8E8E8;}'.
_add 'a.bkg:visited {color: #E8E8E8;}'.
_add 'h1 {display: inline;}'.
_add 'h2 {display: inline;}'.
_add 'h3 {'.
_add ' display: inline;'.
_add ' color: grey;'.
_add ' font-weight:normal;'.
_add ' font-size: smaller;'.
_add '}'.
_add '.hidden-submit {'.
_add ' border: 0 none;'.
_add ' height: 0;'.
_add ' width: 0;'.
_add ' padding: 0;'.
_add ' margin: 0;'.
_add ' overflow: hidden;'.
_add '}'.
_add '</style>'.
ENDMETHOD. "common styles
METHOD lif_gui_page~get_assets. " Common images here
DATA ls_image TYPE ty_web_asset.
* see https://github.com/larshp/abapGit/issues/201 for source SVG
ls_image-url = 'img/logo' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAAKMAAAAoCAYAAACSG0qbAAAABHNCSVQICAgIfAhkiAAA'
&& 'AAlwSFlzAAAEJQAABCUBprHeCQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9y'
&& 'Z5vuPBoAAA8VSURBVHic7Zx7cJzVeYef31nJAtvYko1JjM3FYHlXimwZkLWyLEMcwIGQ'
&& 'cEkDJWmTltLStGkoDCkzwBAuCemUlksDNCkhJTTTljJpZhIuBQxxAWPvyuYiW7UkG8Il'
&& 'UByIsS1sLEu75+0fu5JXu9/etAJz0TOzM/rOec85765+37m+3yczY8w0NU3qrwv9npfa'
&& 'Hfx02pPPd469sgk+7misYnyjpWXy5IOG7kd8ZjjNjEtr13TdOm7eTfCxwo2lUJAQASRu'
&& '2dnRfMn4uDbBx42yxZhPiMNMCHKCsVK2GGuqqqoQUwrZTAhygrFQshjfaGmZ/M7yxQtm'
&& 'xGL9/qDqzwLxQvYTgpygXEoS4/DQ7LE1O05atLBu1YZdE4KcYLwpupoOmCO+5Z2dXPfE'
&& 'xk07Tm2ZroGhBwX1wAygKqiOiVX2Rw9Jam/gyH0wuGGzvTEudRYSY4HFyogghxN2n7Sw'
&& 'IendvcCioLoOtCCXNeqohOf0oDwPq9f3Wt/77dOHlWhYzUj/BRybTnrGEnZO5wv2m0rq'
&& 'DezJoOiqeZbzegzpk6TVPPWJTT39y5svMogF1ZcesjlQgkwYp4F+EJQXwv4E+MiLUZJa'
&& 'F7AIcRq4hWZ2mMRhQD/oZcErXv7FScaja3rt/wpU9E/sFyLACQq57wB/XIl/gWIstn2T'
&& 'xpHVre7ZW71p8sFDeQscSEHKu3pTBadNH2Lq61VT57iwNazLgaNSqYaUaWXLDZCJIbBo'
&& 'g3tK2A2xHns0oMrm3CRrqdTPnAVMiUIEmLlz2XGLMxNmH7YrifFcoUIHalHj8f8p6UfA'
&& 'O+932weStno1zghps6Q7GBFiUYRxopkeaZ2vIwLyfxtQ4vV8lbWHNScacf+T/vwqn90o'
&& 'MZYhRADJ+bv725vmj6Q8tHWffPKUD6IgO/tsfawneRHYd97Pdg8kSyJaZiGtBY4pYPYO'
&& 'kH84C0Cyv8tKSiK7OZ99EpYAJ2V8AhkRY5lCHGaxhaq+BLCzY/EXd5y0aOG0td1vf1AF'
&& 'CWCw7/1u80DQEtahQvcB03MyjQfM7Hwnmxfv9dPivX5SssqOwuzPSqk71mN3ymw5ZtdK'
&& 'dmVIdly8xx7JZ29yy0qptwrGLMRRCA6T1w93nLTo5Lq13Zv625tOMRd6DLF4v0lWmQO8'
&& 'qPko45y7TWaHZyUnwa6M99mN2fYbuu1V4K5oxF1B4Z4UgFifrQHWFLNbvkh1QheV5DNN'
&& 'TZMqFWIGs5zX48M95PTqGa3TZ4erzbvj8/WUErf0L2++uNyGJLn2Js1oDeuYlkbNbmlR'
&& 'deXup2hq0qS2es2VlHMDFaOlRdXL5uuwlnodG23QTEljCkbJV3d7WHOK+dXWqHqZnZeb'
&& 'Y1fGe3OFOArRU5GTGbSHNWdwUL8Epo1qIQ9V/bXu3HES4jCznNfjb7e1zZ8Ri/UD1MLz'
&& 'u05s/huMx4IKGNy4+8Tj/2Pqk8++Vaji86TQqxEuNNM5rWGtSCaokSDkgd0QjbidoPvN'
&& '+5s7t9jz5TgdbdBMvLsG2cop6FgLUdUaZk804jYKuyrWa6vzlT2+XrOqQnxd6KwQOj5R'
&& 'hULpL9Yaxkcj7g3QT6zK397ZbdtGtbtAZ+B0U3adkt0c67E7OyI6fFDuSpktC6HGpJjU'
&& 'GmZ3NOI2mdnVnX32eHZZ7903hGXfBG8mp3J7sd/B0DPCTgUmBf9O7lmMybk56or3Jn8f'
&& 'oLVB7Q5dZ9Iy4OBsw2jYbUUk96fwQrzHf955iBZzsDA+aL9k1owZ20fNzaY/tfFXwK48'
&& 'ldQkSZ5YqJXmZk15JaJfmOmfgdOAmgCzWrCvyum5aIO+Uor3AIbOx7QV2TeBMPu3vKYA'
&& 'Sw091hbWt4PKRhu0oDqkmND1wAnk3vkOmAN2lRLa2hrWMVm5Tek2R3286YzWiK4eQltk'
&& '9g1gMfsFMhVYKunR1obQddk+SXZqwLe8acMGe7fYb9HZk7wm3utrBmpsqiXsyClHMHK6'
&& '0hLWoRjHBfmLbP9K3bPYjFPIFWLaQeZnlZ8H4JyFflrMwcK4wG63v3/ycZnXOzqalxE0'
&& 'mU7x9rvvVv93oVZqBtzNGGeU7Jbp9pZGzS7ReiVQVyDfmXRda4PaA9p5mBLmWGmmSron'
&& 'M0FytUGGgjPTAi8UIeVk9u1og5YOJ0QbNBOjIac+Y22JPgLQ1WV7Ol+w36xebYnhtGpj'
&& 'FjBYTj3l4KY9/dx6My4d74pN/Ki/Y9HpSG5HR/Nyh/1DHtO9OM6dvWFDwbtWslOykt6U'
&& 's5VWZbOFnQtsyMqvc56Ty3T7NeBhLGAfDZDpe5nX6V5uXpbZ43K2NGQ2V9glwLas/I62'
&& 'hfrE8EWsJ3mFsGYs+OQqze+A1cBLgbmma4f/9AmOJGBe5vKVLYN1W6wnOWSHmdkVhexM'
&& 'PG6yC0x2AbmjoQ3njdh4uwrSw1Htmq5bd3Y0I3FLpQ5n0GTSQ7s6Fva70RPYTPbi+Pz0'
&& 'J7ryboRC+m5PnRfsJjVEAfp5bLNflTb52dKIBj36RWY5ZyX2WCLukvbX67ZYHFLHZtGw'
&& '+1fD/jDL8qQljWpav9m6Uw3wKYzXgUNJTxsk+0Fssw0L6x+j4dCx6eF/BEtwDBkbx7Fe'
&& '29gWCa0yrC2rvXXO26WZfrWG3V2kji8zWbm0QUev67GX5ZgZ8A0H121hXIIZNrxou9oW'
&& '6m4b4m/z2aTP+fsAohF3PaNHROvssZ8ElRs5DnyPBAkovxDFF4oJESDeY9tJD4Ur5umg'
&& 'PSFm1Uy23Zk2SaM7e43p5Y4uxUMzu2f4H56+tuZmff2gfTqHrGEy5DkW6Abo7LH7gfsB'
&& '2uo1LQGzBmoYFSwg57vNcjqqo4F1JXh2S7Zfx83TZZNqdD6MXkQkU369jONgcmfxe83M'
&& 'B7XQEdEhg1B0HzDk2ZHpy3vBqLPpMQhyi/f2AIA3WyPZG6KkeVpKiE925awEi7H6JRsA'
&& 'cqJDfIi9oayfW8ZB5dY/TFeX7YlGQg+RmgJkcnSQfWyr9QP92enmGcgeNCvx67mXbGdb'
&& 'xD1hjI5AklJ+ydgTUGz6iiZNXd09+gYGGIRlQgXn6wDesZYSRFsJOYES5QjSw7fqnu7q'
&& 'Bqh7uqu7f3nzdw3uKFJszEIcpqVRs12SRuAYiTrJ1YXMzSGgS6iQnHmWyQWe70pySz/F'
&& 'MZagMWnMlaiTuTqTTih7s7IIHm1T1ncVI37l3BAAA4McAYF7iAvG17uxExi1U6Igd9XN'
&& 'Dj+UmZA8qPrf3MDQbeSPIN8Ldub0JzeWLcT2I3Swn8JFhr4VQnMze5uKnv0ugOHfUXa3'
&& 'ZhySedkR0eGDuMtbw/rTZCI1pA9PF0yWf4e3MnJ7YKXm0pOr6H03QRIIZeYnUj1njhid'
&& '8aaRscKX/VGWSRLsCjnK2rcdC3njGUsQ5PSdv92yqJaMk5WBoRMpJsSnNgZufBdCkmsN'
&& '60FgRbllK8PNzOlttT/qpz2sOUnpeWGHvq9ewcyc28/7XQCru213NOL+l6wgZ0kXAjnD'
&& 'cazP7gXuTdu41rCyxbgr3mt/P16+F6LgUVXtmq5bC237yNsNu5YtPBZgx4kLFznZ1XlM'
&& 'BzB/1liECBAN801yhfiq0HflbKXz1ojZ4qCylSBsbm6q/93wX0n0Q1Ir6UzWYXaZyZaF'
&& 'qqxeZn813n4ZlhPWJWXMo00P5OTDF5c0qmm8fRlPip6bFhHk6Ti3ddfy5i3OXBemJQE2'
&& 'A5g/c/qaTasC8krC0KdzE+3qWG/y6thmW7Vui/UkQ7w51vqDaGnRZFInPdlshNQ2C8oJ'
&& 'h0oqaefF++zmzh5bu7bbXrBxjp88bp5qgZzNdyfWD/9t+B+TO4GW8/p+R0SHcGBxLWEF'
&& 'jiQlHeIXEaRIPZAVRMVCTDcQCUh8LfOyaqjgCcr+YpY7NRFa2VY/egsqtNtdw8ie5gjJ'
&& 'oUTqicjofOYA2f/YgcR03s5MMBF4wlIa7rMr5mnUyru6xl0LZAeFvDG3l83DF5199muk'
&& 'oJO1FUMoviSi8Nh9Kg+Ru7qvUvCqPO+cMZsxbPsM4HXW9KcrEyKApTa7s9BVSyLaF3Ik'
&& 'SbLSQros18RyInkkV2u5q+6zLaS+aCT0oJl/QVI78IWcsvDos1vtLYCE551QKNuCKW63'
&& '+157g36cMOYI9yWhC3K+j4KDEHKxC9+t0altDaFHwL/kvVZIBJw761/uM5/MTJlU7S/Z'
&& 'N6hTBNlhZA0OPReNuGdM6nL4jR4G5ZnRusAtKmVHwg1Slcxe11nODZJKh1fJ6kwM3dQa'
&& 'VgOw3omjkGuL9/o/L/vFTzs7mi8pQZBpIT4f9PxE2bRFQncY9pdjKDoExDH7ebzPbgFo'
&& 'bQjdng48KBfvzZau77ORN61FI66PsW2N7ARiZnZTZ589BtAWCV1v5J1zF+JNVdui2CbL'
&& 'OcJsq1ejD2lVgCDL4e14r58J0N6k+cmEu0HYIssdrbxgnaGeeG9yJEg32hC6GbOix81y'
&& 'trTsWLtiixpgQNLZ4yVEgCT++xSP0H7C0N1ZadVAh6SR3kRm2WfJO0H/XqTuQcn+IlOI'
&& 'AFjRVaZhus3g2az0WuA0wcIi5QP3DDNIIPtakBABYltts7AO4OEi9eTFYGCksSRzwM4L'
&& 'ECKAM1gG9tVR5UP+RkqZN5s7a0yBnwUEOSDp7GlPPp83BH0srO+1PmQrDIIen9wOdnln'
&& 'n31G5n9ZtDLL6ck2x3uTf6DUee8rASX6vNnyWI/dmZ0R77O7LNXLBkWy9CE7Pd6XvNih'
&& 'QkEQeZHZl9PBFtsDstebtyWFwv0B4r32UrzXn+6xDtBdwIslNL0N+JnMvravxiraFO/s'
&& 'tm0y+xzQlcfkddCNCe/vGfP7GQH6lzdfbHAjqSCBHZK+PN5CzESSlixgnhMLzXAeXp+3'
&& 'hWfuM0sWL10abQv1CdtHixzvmtiYPhcvSFOTJk1NEPEQkWdPUry4oc96y2o3YJiWs5Wx'
&& 'zbYq83THHHu9Y1N2kG45tDRqdsgzxxuznKPOGbsTsN2M7d6zfXhePJ5Ici1h6mUcAcw0'
&& '8Zo5fp35NoqKxAjwTrRhZmLSpPY9ySmPzV27dm+lTn9cKSTGA+XT+03Jq+l8HBLv2Q7c'
&& 'X9K+ygQTFGDcHhaaoGJyouDNV7JH+eGj4mF6gspoC+tzJt1ObsT4MDsF2zxs886+Ml5v'
&& '/PogUvEwPUGFiE+SX4gAtQa1gkhV7onQR4oJMR5oxC6stDeghd7Dh6E+CPw/HL4vVO2f'
&& 'cpUAAAAASUVORK5CYII='.
APPEND ls_image TO rt_assets.
ENDMETHOD. "lif_gui_page~get_assets
METHOD lif_gui_page~on_event. METHOD lif_gui_page~on_event.
ev_state = gc_event_state-not_handled. ev_state = gc_event_state-not_handled.
ENDMETHOD. "lif_gui_page~on_event ENDMETHOD. "lif_gui_page~on_event

View File

@ -85,14 +85,8 @@ CLASS lcl_gui_page_background DEFINITION FINAL
mv_key TYPE lcl_persistence_repo=>ty_repo-key. mv_key TYPE lcl_persistence_repo=>ty_repo-key.
METHODS: METHODS:
parse_fields
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(rs_fields) TYPE lcl_persistence_background=>ty_background,
render_data render_data
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception,
save
IMPORTING iv_getdata TYPE clike
RAISING lcx_exception. RAISING lcx_exception.
ENDCLASS. ENDCLASS.
@ -104,68 +98,20 @@ CLASS lcl_gui_page_background IMPLEMENTATION.
mv_key = iv_key. mv_key = iv_key.
ENDMETHOD. ENDMETHOD.
METHOD parse_fields.
DEFINE _field.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = &1 ##NO_TEXT.
IF sy-subrc = 0.
rs_fields-&2 = <ls_field>-value.
ENDIF.
END-OF-DEFINITION.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
lv_string = iv_getdata. " type conversion
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
_field 'method' method.
_field 'username' username.
_field 'password' password.
_field 'amethod' amethod.
_field 'aname' aname.
_field 'amail' amail.
ASSERT NOT rs_fields IS INITIAL.
ENDMETHOD.
METHOD lif_gui_page~on_event. METHOD lif_gui_page~on_event.
DATA ls_bg_task TYPE lcl_persistence_background=>ty_background.
CASE iv_action. CASE iv_action.
WHEN 'save'. WHEN gc_action-bg_update.
save( iv_getdata ). ls_bg_task = lcl_html_action_utils=>decode_bg_update( iv_getdata ).
ls_bg_task-key = mv_key.
lcl_services_background=>update_task( ls_bg_task ).
ev_state = gc_event_state-re_render. ev_state = gc_event_state-re_render.
ENDCASE. ENDCASE.
ENDMETHOD. ENDMETHOD.
METHOD save.
DATA: ls_fields TYPE lcl_persistence_background=>ty_background,
lo_persistence TYPE REF TO lcl_persistence_background.
ls_fields = parse_fields( iv_getdata ).
ls_fields-key = mv_key.
CREATE OBJECT lo_persistence.
IF ls_fields-method = lcl_persistence_background=>c_method-nothing.
lo_persistence->delete( ls_fields-key ).
ELSE.
lo_persistence->modify( ls_fields ).
ENDIF.
MESSAGE 'Saved' TYPE 'S' ##NO_TEXT.
COMMIT WORK.
ENDMETHOD.
METHOD render_data. METHOD render_data.
DATA: lo_repo TYPE REF TO lcl_repo_online, DATA: lo_repo TYPE REF TO lcl_repo_online,
@ -176,8 +122,7 @@ CLASS lcl_gui_page_background IMPLEMENTATION.
lv_push TYPE string, lv_push TYPE string,
lv_pull TYPE string, lv_pull TYPE string,
lv_afixed TYPE string, lv_afixed TYPE string,
lv_aauto TYPE string, lv_aauto TYPE string.
lt_list TYPE lcl_repo_srv=>ty_repo_tt.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
@ -221,7 +166,7 @@ CLASS lcl_gui_page_background IMPLEMENTATION.
ro_html->add( '<br>' ). ro_html->add( '<br>' ).
ro_html->add( '<u>Method</u><br>' ) ##NO_TEXT. ro_html->add( '<u>Method</u><br>' ) ##NO_TEXT.
ro_html->add( '<form method="get" action="sapevent:save">' ). ro_html->add( |<form method="get" action="sapevent:{ gc_action-bg_update }">| ).
ro_html->add( '<input type="radio" name="method" value="nothing"' && ro_html->add( '<input type="radio" name="method" value="nothing"' &&
lv_nothing && '>Do nothing<br>' ) ##NO_TEXT. lv_nothing && '>Do nothing<br>' ) ##NO_TEXT.
ro_html->add( '<input type="radio" name="method" value="push"' && ro_html->add( '<input type="radio" name="method" value="push"' &&
@ -286,7 +231,7 @@ CLASS lcl_gui_page_background IMPLEMENTATION.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
lo_toolbar->add( iv_txt = 'Run background logic' lo_toolbar->add( iv_txt = 'Run background logic'
iv_act = 'background_run' ) ##NO_TEXT. iv_act = gc_action-go_background_run ) ##NO_TEXT.
ro_html->add( header( ) ). ro_html->add( header( ) ).
ro_html->add( title( iv_title = 'BACKGROUND' io_menu = lo_toolbar ) ). ro_html->add( title( iv_title = 'BACKGROUND' io_menu = lo_toolbar ) ).

View File

@ -193,7 +193,7 @@ CLASS lcl_branch_overview IMPLEMENTATION.
SPLIT ls_raw-body AT gc_newline INTO ls_commit-message lv_trash. SPLIT ls_raw-body AT gc_newline INTO ls_commit-message lv_trash.
* unix time stamps are in same time zone, so ignore the zone, * unix time stamps are in same time zone, so ignore the zone,
FIND REGEX '^([\w\s]+) <(.*)> (\d{10}) .\d{4}$' IN ls_raw-author FIND REGEX gc_author_regex IN ls_raw-author
SUBMATCHES SUBMATCHES
ls_commit-author ls_commit-author
ls_commit-email ls_commit-email

View File

@ -5,6 +5,12 @@
CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page_super. CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS: BEGIN OF c_action,
commit_post TYPE string VALUE 'commit_post',
commit_cancel TYPE string VALUE 'commit_cancel',
END OF c_action.
METHODS: METHODS:
constructor constructor
IMPORTING io_repo TYPE REF TO lcl_repo_online IMPORTING io_repo TYPE REF TO lcl_repo_online
@ -26,13 +32,8 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
render_form render_form
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception, RAISING lcx_exception,
styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
scripts scripts
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
commit_push
IMPORTING it_postdata TYPE cnht_post_data_tab
RAISING lcx_exception.
ENDCLASS. ENDCLASS.
@ -45,6 +46,50 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
mo_stage = io_stage. mo_stage = io_stage.
ENDMETHOD. ENDMETHOD.
METHOD lif_gui_page~on_event.
DATA: ls_commit TYPE lcl_services_git=>ty_commit_fields.
CASE iv_action.
WHEN c_action-commit_post.
lcl_html_action_utils=>parse_commit_request( EXPORTING it_postdata = it_postdata
IMPORTING es_fields = ls_commit ).
lcl_services_git=>commit( is_commit = ls_commit
io_repo = mo_repo
io_stage = mo_stage ).
ev_state = gc_event_state-go_back_to_bookmark.
WHEN c_action-commit_cancel.
ev_state = gc_event_state-go_back.
ENDCASE.
ENDMETHOD.
METHOD lif_gui_page~render.
CREATE OBJECT ro_html.
ro_html->add( header( ) ).
ro_html->add( title( 'COMMIT' ) ).
ro_html->add( '<div class="repo">' ).
ro_html->add( render_repo_top(
io_repo = mo_repo
iv_show_package = abap_false
iv_branch = mo_stage->get_branch_name( ) ) ).
ro_html->add( render_menu( ) ).
ro_html->add( render_form( ) ).
ro_html->add( render_stage( ) ).
ro_html->add( '</div>' ).
ro_html->add( footer( io_include_script = scripts( ) ) ).
ENDMETHOD. "lif_gui_page~render
METHOD render_stage. METHOD render_stage.
DATA: lt_stage TYPE lcl_stage=>ty_stage_tt. DATA: lt_stage TYPE lcl_stage=>ty_stage_tt.
@ -104,7 +149,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
ro_html->add( '<div class="form_div">' ). ro_html->add( '<div class="form_div">' ).
ro_html->add( '<form id="commit_form" method="post" action="sapevent:commit_post">' ). ro_html->add( '<form id="commit_form" method="post" action="sapevent:commit_post">' ).
ro_html->add( |<input name="key" type="hidden" value="{ lv_key }">| ). ro_html->add( |<input name="repo_key" type="hidden" value="{ lv_key }">| ).
ro_html->add( '<table>' ). ro_html->add( '<table>' ).
ro_html->add( '<tr>' ). ro_html->add( '<tr>' ).
@ -153,7 +198,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
CREATE OBJECT lo_toolbar. CREATE OBJECT lo_toolbar.
lo_toolbar->add( iv_act = 'submitCommit();' lo_toolbar->add( iv_act = 'submitFormById(''commit_form'');'
iv_txt = 'Commit' iv_txt = 'Commit'
iv_typ = gc_action_type-onclick iv_typ = gc_action_type-onclick
iv_opt = gc_html_opt-emphas ) ##NO_TEXT. iv_opt = gc_html_opt-emphas ) ##NO_TEXT.
@ -168,129 +213,10 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
ENDMETHOD. "render_menu ENDMETHOD. "render_menu
METHOD lif_gui_page~on_event.
CASE iv_action.
WHEN 'commit_post'.
commit_push( it_postdata ).
ev_state = gc_event_state-go_back_to_bookmark.
WHEN 'commit_cancel'.
ev_state = gc_event_state-go_back.
ENDCASE.
ENDMETHOD.
METHOD lif_gui_page~render.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( title( 'COMMIT' ) ).
ro_html->add( '<div class="repo">' ).
ro_html->add( render_repo_top(
io_repo = mo_repo
iv_show_package = abap_false
iv_branch = mo_stage->get_branch_name( ) ) ).
ro_html->add( render_menu( ) ).
ro_html->add( render_form( ) ).
ro_html->add( render_stage( ) ).
ro_html->add( '</div>' ).
ro_html->add( footer( io_include_script = scripts( ) ) ).
ENDMETHOD. "lif_gui_page~render
METHOD styles.
CREATE OBJECT ro_html.
_add '/* STAGE */'.
_add '.stage_tab {'.
_add ' border: 1px solid #DDD;'.
_add ' background: #fff;'.
_add ' margin-top: 0.2em;'.
_add '}'.
_add '.stage_tab td {'.
_add ' border-top: 1px solid #eee;'.
_add ' color: #333;'.
_add ' vertical-align: middle;'.
_add ' padding: 2px 0.5em;'.
_add '}'.
_add '.stage_tab td.method {'.
_add ' color: #ccc;'.
_add '}'.
_add '.stage_tab tr.firstrow td { border-top: 0px; } '.
_add '.stage_tab tr.title td {'.
_add ' color: #BBB;'.
_add ' font-size: 10pt;'.
_add ' background-color: #edf2f9;'.
_add ' padding: 4px 0.5em;'.
_add ' text-align: center;'.
_add '}'.
_add '/* COMMIT */'.
_add 'div.form_div {'.
_add ' margin: 0.5em 0em;'.
_add ' background-color: #F8F8F8;'.
_add ' padding: 1em 1em;'.
_add '}'.
_add 'div.form_div td.field_name {'.
_add ' color: #BBB;'.
_add ' padding-right: 1em;'.
_add '}'.
ENDMETHOD. "styles
METHOD commit_push.
DATA: ls_fields TYPE lcl_html_action_utils=>ty_commit_fields,
ls_comment TYPE ty_comment,
lo_user TYPE REF TO lcl_persistence_user.
ls_fields = lcl_html_action_utils=>parse_commit_request( it_postdata ).
lo_user = lcl_app=>user( ).
lo_user->set_repo_username( iv_url = mo_repo->get_url( ) iv_username = ls_fields-username ).
lo_user->set_repo_email( iv_url = mo_repo->get_url( ) iv_email = ls_fields-email ).
IF ls_fields-username IS INITIAL.
lcx_exception=>raise( 'empty username' ).
ELSEIF ls_fields-email IS INITIAL.
lcx_exception=>raise( 'empty email' ).
ELSEIF ls_fields-comment IS INITIAL.
lcx_exception=>raise( 'empty comment' ).
ENDIF.
ls_comment-username = ls_fields-username.
ls_comment-email = ls_fields-email.
ls_comment-comment = ls_fields-comment.
IF NOT ls_fields-body IS INITIAL.
CONCATENATE ls_comment-comment gc_newline ls_fields-body
INTO ls_comment-comment.
ENDIF.
mo_repo->push( is_comment = ls_comment
io_stage = mo_stage ).
COMMIT WORK.
ENDMETHOD. "commit_push
METHOD scripts. METHOD scripts.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
_add 'setInitialFocus("commit_msg");'.
_add 'function setInitialFocus() {'.
_add ' document.getElementById("commit_msg").focus();'.
_add '}'.
_add 'function submitCommit() {'.
_add ' document.getElementById("commit_form").submit();'.
_add '}'.
_add 'setInitialFocus();'.
ENDMETHOD. "scripts ENDMETHOD. "scripts

View File

@ -2,17 +2,6 @@
*& Include ZABAPGIT_PAGE_DB *& Include ZABAPGIT_PAGE_DB
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
CLASS lcl_gui_page_db DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
METHODS lif_gui_page~render REDEFINITION.
PRIVATE SECTION.
METHODS styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS.
CLASS lcl_gui_page_db_display DEFINITION FINAL INHERITING FROM lcl_gui_page_super. CLASS lcl_gui_page_db_display DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION. PUBLIC SECTION.
@ -24,9 +13,6 @@ CLASS lcl_gui_page_db_display DEFINITION FINAL INHERITING FROM lcl_gui_page_supe
PRIVATE SECTION. PRIVATE SECTION.
DATA: ms_key TYPE lcl_persistence_db=>ty_content. DATA: ms_key TYPE lcl_persistence_db=>ty_content.
METHODS styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS. ENDCLASS.
CLASS lcl_gui_page_db_display IMPLEMENTATION. CLASS lcl_gui_page_db_display IMPLEMENTATION.
@ -38,7 +24,9 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION.
METHOD lif_gui_page~render. METHOD lif_gui_page~render.
DATA: lv_data TYPE lcl_persistence_db=>ty_content-data_str. DATA: lv_data TYPE lcl_persistence_db=>ty_content-data_str,
ls_action TYPE lcl_persistence_db=>ty_content,
lv_action TYPE string.
TRY. TRY.
lv_data = lcl_app=>db( )->read( lv_data = lcl_app=>db( )->read(
@ -47,20 +35,30 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION.
CATCH lcx_not_found ##NO_HANDLER. CATCH lcx_not_found ##NO_HANDLER.
ENDTRY. ENDTRY.
lv_data = lcl_xml_pretty=>print( lv_data ). ls_action-type = ms_key-type.
ls_action-value = ms_key-value.
lv_action = lcl_html_action_utils=>dbkey_encode( ls_action ).
lv_data = lcl_xml_pretty=>print( lv_data ).
lv_data = escape( val = lv_data lv_data = escape( val = lv_data
format = cl_abap_format=>e_html_attr ). format = cl_abap_format=>e_html_attr ).
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ). ro_html->add( header( ) ).
ro_html->add( title( 'CONFIG DISPLAY' ) ). ro_html->add( title( 'CONFIG DISPLAY' ) ).
ro_html->add( '<div class="db_entry">' ). ro_html->add( '<div class="db_entry">' ).
ro_html->add( '<table class="toolbar"><tr><td>' ).
ro_html->add( |<table class="tag"><tr><td class="label">Type:</td>| && ro_html->add( |<table class="tag"><tr><td class="label">Type:</td>| &&
| <td>{ ms_key-type }</td></tr></table>| ). | <td>{ ms_key-type }</td></tr></table>| ).
ro_html->add( |<table class="tag"><tr><td class="label">Value:</td>| && ro_html->add( |<table class="tag"><tr><td class="label">Key:</td>| &&
| <td>{ ms_key-value }</td></tr></table>| ). | <td>{ ms_key-value }</td></tr></table>| ).
ro_html->add( '</td><td class="right">' ).
ro_html->add_anchor( iv_txt = 'Edit' iv_act = |{ gc_action-db_edit }?{ lv_action }| ).
ro_html->add( '</td></tr></table>' ).
ro_html->add( |<pre>{ lv_data }</pre>| ). ro_html->add( |<pre>{ lv_data }</pre>| ).
ro_html->add( '</div>' ). ro_html->add( '</div>' ).
@ -68,37 +66,6 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD styles.
CREATE OBJECT ro_html.
_add '/* DB ENTRY DISPLAY */'.
_add 'div.db_entry {'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em;'.
_add '}'.
_add 'div.db_entry pre {'.
_add ' display: block;'.
_add ' overflow: hidden;'.
_add ' word-wrap:break-word;'.
_add ' white-space: pre-wrap;'.
_add ' background-color: #eaeaea;'.
_add ' padding: 0.5em;'.
_add ' width: 50em;'.
_add '}'.
_add 'table.tag {'.
_add ' display: inline-block;'.
_add ' border: 1px #b3c1cc solid;'.
_add ' background-color: #eee;'.
_add ' margin-right: 0.5em; '.
_add '}'.
_add 'table.tag td { padding: 0.2em 0.5em; }'.
_add 'table.tag td.label { background-color: #b3c1cc; }'.
ENDMETHOD. "styles
ENDCLASS. ENDCLASS.
CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page_super. CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
@ -112,12 +79,6 @@ CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PRIVATE SECTION. PRIVATE SECTION.
DATA: ms_key TYPE lcl_persistence_db=>ty_content. DATA: ms_key TYPE lcl_persistence_db=>ty_content.
METHODS styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS scripts
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS. ENDCLASS.
CLASS lcl_gui_page_db_edit IMPLEMENTATION. CLASS lcl_gui_page_db_edit IMPLEMENTATION.
@ -151,7 +112,7 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
CREATE OBJECT lo_toolbar. CREATE OBJECT lo_toolbar.
ro_html->add( header( io_include_style = styles( ) ) ). ro_html->add( header( ) ).
ro_html->add( title( 'CONFIG EDIT' ) ). ro_html->add( title( 'CONFIG EDIT' ) ).
ro_html->add( '<div class="db_entry">' ). ro_html->add( '<div class="db_entry">' ).
@ -159,11 +120,11 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
" Banners " Banners
ro_html->add( |<table class="tag"><tr><td class="label">Type:</td>| && ro_html->add( |<table class="tag"><tr><td class="label">Type:</td>| &&
| <td>{ ms_key-type }</td></tr></table>| ). | <td>{ ms_key-type }</td></tr></table>| ).
ro_html->add( |<table class="tag"><tr><td class="label">Value:</td>| && ro_html->add( |<table class="tag"><tr><td class="label">Key:</td>| &&
| <td>{ ms_key-value }</td></tr></table>| ). | <td>{ ms_key-value }</td></tr></table>| ).
" Form " Form
ro_html->add( '<form id="db_form" method="post" action="sapevent:db_save">' ). ro_html->add( |<form id="db_form" method="post" action="sapevent:{ gc_action-db_update }">| ).
ro_html->add( |<input type="hidden" name="type" value="{ ms_key-type }">| ). ro_html->add( |<input type="hidden" name="type" value="{ ms_key-type }">| ).
ro_html->add( |<input type="hidden" name="value" value="{ ms_key-value }">| ). ro_html->add( |<input type="hidden" name="value" value="{ ms_key-value }">| ).
ro_html->add( |<textarea rows="20" cols="100" name="xmldata">{ lv_data ro_html->add( |<textarea rows="20" cols="100" name="xmldata">{ lv_data
@ -171,7 +132,7 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
ro_html->add( '</form>' ). ro_html->add( '</form>' ).
" Menu " Menu
lo_toolbar->add( iv_act = 'submitDBForm();' lo_toolbar->add( iv_act = 'submitFormById(''db_form'');'
iv_txt = 'Save' iv_txt = 'Save'
iv_typ = gc_action_type-onclick iv_typ = gc_action_type-onclick
iv_opt = gc_html_opt-emphas ) ##NO_TEXT. iv_opt = gc_html_opt-emphas ) ##NO_TEXT.
@ -182,40 +143,23 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
ro_html->add( '</div>' ). "db_entry ro_html->add( '</div>' ). "db_entry
ro_html->add( footer( io_include_script = scripts( ) ) ). ro_html->add( footer( ) ).
ENDMETHOD. ENDMETHOD.
METHOD styles. ENDCLASS.
CREATE OBJECT ro_html. CLASS lcl_gui_page_db DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
_add '/* DB ENTRY DISPLAY */'. PUBLIC SECTION.
_add 'div.db_entry {'. METHODS lif_gui_page~render REDEFINITION.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em;'.
_add '}'.
_add 'div.db_entry textarea { margin: 0.5em 0em; }'.
_add 'table.tag {'.
_add ' display: inline-block;'.
_add ' border: 1px #b3c1cc solid;'.
_add ' background-color: #eee;'.
_add ' margin-right: 0.5em; '.
_add '}'.
_add 'table.tag td { padding: 0.2em 0.5em; }'.
_add 'table.tag td.label { background-color: #b3c1cc; }'.
ENDMETHOD. "styles PRIVATE SECTION.
METHODS explain_content
IMPORTING is_data TYPE lcl_persistence_db=>ty_content
RETURNING VALUE(rv_text) TYPE string
RAISING lcx_exception.
METHOD scripts.
CREATE OBJECT ro_html.
_add 'function submitDBForm() {'.
_add ' document.getElementById("db_form").submit();'.
_add '}'.
ENDMETHOD. "scripts
ENDCLASS. ENDCLASS.
@ -224,7 +168,6 @@ CLASS lcl_gui_page_db IMPLEMENTATION.
METHOD lif_gui_page~render. METHOD lif_gui_page~render.
DATA: lt_data TYPE lcl_persistence_db=>tt_content, DATA: lt_data TYPE lcl_persistence_db=>tt_content,
lv_escaped TYPE string,
lv_action TYPE string, lv_action TYPE string,
lv_trclass TYPE string, lv_trclass TYPE string,
lo_toolbar TYPE REF TO lcl_html_toolbar. lo_toolbar TYPE REF TO lcl_html_toolbar.
@ -236,16 +179,16 @@ CLASS lcl_gui_page_db IMPLEMENTATION.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ). ro_html->add( header( ) ).
ro_html->add( title( 'DATABASE PERSISTENCY' ) ). ro_html->add( title( 'DATABASE PERSISTENCY' ) ).
ro_html->add( '<div class="db_list">' ). ro_html->add( '<div class="db_list">' ).
ro_html->add( '<table width="100%" class="db_tab">' ). ro_html->add( '<table class="db_tab">' ).
" Header " Header
ro_html->add( '<tr>' ). ro_html->add( '<tr>' ).
ro_html->add( '<th>Type</th>' ). ro_html->add( '<th>Type</th>' ).
ro_html->add( '<th>Value</th>' ). ro_html->add( '<th>Key</th>' ).
ro_html->add( '<th>Data</th>' ). ro_html->add( '<th>Data</th>' ).
ro_html->add( '<th></th>' ). ro_html->add( '<th></th>' ).
ro_html->add( '</tr>' ). ro_html->add( '</tr>' ).
@ -257,27 +200,19 @@ CLASS lcl_gui_page_db IMPLEMENTATION.
lv_trclass = ' class="firstrow"' ##NO_TEXT. lv_trclass = ' class="firstrow"' ##NO_TEXT.
ENDIF. ENDIF.
IF strlen( <ls_data>-data_str ) >= 250.
lv_escaped = escape( val = <ls_data>-data_str(250)
format = cl_abap_format=>e_html_attr ).
ELSE.
lv_escaped = escape( val = <ls_data>-data_str
format = cl_abap_format=>e_html_attr ).
ENDIF.
lv_action = lcl_html_action_utils=>dbkey_encode( <ls_data> ). lv_action = lcl_html_action_utils=>dbkey_encode( <ls_data> ).
CREATE OBJECT lo_toolbar. CREATE OBJECT lo_toolbar.
lo_toolbar->add( iv_txt = 'Display' iv_act = |db_display?{ lv_action }| ). lo_toolbar->add( iv_txt = 'Display' iv_act = |{ gc_action-db_display }?{ lv_action }| ).
lo_toolbar->add( iv_txt = 'Edit' iv_act = |db_edit?{ lv_action }| ). lo_toolbar->add( iv_txt = 'Edit' iv_act = |{ gc_action-db_edit }?{ lv_action }| ).
lo_toolbar->add( iv_txt = 'Delete' iv_act = |db_delete?{ lv_action }| ). lo_toolbar->add( iv_txt = 'Delete' iv_act = |{ gc_action-db_delete }?{ lv_action }| ).
ro_html->add( |<tr{ lv_trclass }>| ). ro_html->add( |<tr{ lv_trclass }>| ).
ro_html->add( |<td>{ <ls_data>-type }</td>| ). ro_html->add( |<td>{ <ls_data>-type }</td>| ).
ro_html->add( |<td>{ <ls_data>-value }</td>| ). ro_html->add( |<td>{ <ls_data>-value }</td>| ).
ro_html->add( |<td><pre>{ lv_escaped }</pre></td>| ). ro_html->add( |<td class="data">{ explain_content( <ls_data> ) }</td>| ).
ro_html->add( '<td>' ). ro_html->add( '<td>' ).
ro_html->add( lo_toolbar->render( iv_vertical = abap_true ) ). ro_html->add( lo_toolbar->render( iv_vertical = abap_false ) ).
ro_html->add( '</td>' ). ro_html->add( '</td>' ).
ro_html->add( '</tr>' ). ro_html->add( '</tr>' ).
ENDLOOP. ENDLOOP.
@ -289,37 +224,50 @@ CLASS lcl_gui_page_db IMPLEMENTATION.
ENDMETHOD. "lif_gui_page~render ENDMETHOD. "lif_gui_page~render
METHOD styles. METHOD explain_content.
DATA: lv_result TYPE match_result,
lv_match TYPE submatch_result,
lv_cnt TYPE i.
CREATE OBJECT ro_html. CASE is_data-type.
WHEN 'REPO'.
FIND FIRST OCCURRENCE OF REGEX '<url>(.*)</url>'
IN is_data-data_str IGNORING CASE RESULTS lv_result.
READ TABLE lv_result-submatches INTO lv_match INDEX 1.
IF sy-subrc IS INITIAL.
rv_text = is_data-data_str+lv_match-offset(lv_match-length).
ENDIF.
_add '/* DB ENTRIES */'. FIND FIRST OCCURRENCE OF REGEX '<OFFLINE/>'
_add 'div.db_list {'. IN is_data-data_str IGNORING CASE MATCH COUNT lv_cnt.
_add ' background-color: #f2f2f2;'. IF lv_cnt > 0.
_add ' padding: 0.5em;'. rv_text = |<b>On-line</b>, Name: <b>{ lcl_url=>name( rv_text ) }</b>|.
_add '}'. ELSE.
_add 'table.db_tab pre {'. rv_text = |Off-line, Name: <b>{ rv_text }</b>|.
_add ' display: block;'. ENDIF.
_add ' overflow: hidden;'.
_add ' word-wrap:break-word;'.
_add ' white-space: pre-wrap;'.
_add ' background-color: #eaeaea;'.
_add ' padding: 3px;'.
_add ' width: 50em;'.
_add '}'.
_add 'table.db_tab tr.firstrow td { padding-top: 0.5em; }'.
_add 'table.db_tab th {'.
_add ' text-align: left;'.
_add ' color: #888;'.
_add ' padding: 0.2em;'.
_add ' border-bottom: 1px #ddd solid;'.
_add '}'.
_add 'table.db_tab td {'.
_add ' color: #333;'.
_add ' padding: 0.2em;'.
_add ' vertical-align: top;'.
_add '}'.
ENDMETHOD. "styles WHEN 'BACKGROUND'.
FIND FIRST OCCURRENCE OF REGEX '<method>(.*)</method>'
IN is_data-data_str IGNORING CASE RESULTS lv_result.
READ TABLE lv_result-submatches INTO lv_match INDEX 1.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
rv_text = |Method: { is_data-data_str+lv_match-offset(lv_match-length) }, |
&& |Repository: { lcl_app=>repo_srv( )->get( is_data-value )->get_name( ) }|.
WHEN 'USER'.
rv_text = '-'. " No additional explanation for user
WHEN OTHERS.
IF strlen( is_data-data_str ) >= 250.
rv_text = is_data-data_str(250).
ELSE.
rv_text = is_data-data_str.
ENDIF.
rv_text = escape( val = rv_text
format = cl_abap_format=>e_html_attr ).
rv_text = |<pre>{ rv_text }</pre>|.
ENDCASE.
ENDMETHOD. "explain_content
ENDCLASS. ENDCLASS.

View File

@ -0,0 +1,97 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE_DEBUG
*&---------------------------------------------------------------------*
CLASS lcl_gui_page_debuginfo DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
METHODS lif_gui_page~render REDEFINITION.
PRIVATE SECTION.
METHODS scripts
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_debug_info
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_supported_object_types
RETURNING VALUE(rv_html) TYPE string.
ENDCLASS. "lcl_gui_page_debuginfo
CLASS lcl_gui_page_debuginfo IMPLEMENTATION.
METHOD lif_gui_page~render.
CREATE OBJECT ro_html.
ro_html->add( header( ) ).
ro_html->add( title( 'DEBUG INFO' ) ).
ro_html->add( '<div id="debug_info" class="debug_container">' ).
ro_html->add( render_debug_info( ) ).
ro_html->add( render_supported_object_types( ) ).
ro_html->add( '</div>' ).
ro_html->add( footer( io_include_script = scripts( ) ) ).
ENDMETHOD.
METHOD render_debug_info.
DATA: lt_ver_tab TYPE filetable,
lv_rc TYPE i,
lv_gui_version TYPE string,
ls_version LIKE LINE OF lt_ver_tab.
cl_gui_frontend_services=>get_gui_version(
CHANGING version_table = lt_ver_tab rc = lv_rc
EXCEPTIONS OTHERS = 1 ).
READ TABLE lt_ver_tab INTO ls_version INDEX 1.
lv_gui_version = ls_version-filename.
READ TABLE lt_ver_tab INTO ls_version INDEX 2.
lv_gui_version = |{ lv_gui_version }.{ ls_version-filename }|.
CREATE OBJECT ro_html.
ro_html->add( |<p>abapGit version: { gc_abap_version }</p>| ).
ro_html->add( |<p>XML version: { gc_xml_version }</p>| ).
ro_html->add( |<p>GUI version: { lv_gui_version }</p>| ).
ENDMETHOD. "render_debug_info
METHOD render_supported_object_types.
DATA: lt_objects TYPE STANDARD TABLE OF ko100,
lv_list TYPE string,
ls_item TYPE ty_item.
FIELD-SYMBOLS <object> LIKE LINE OF lt_objects.
CALL FUNCTION 'TR_OBJECT_TABLE'
TABLES
wt_object_text = lt_objects
EXCEPTIONS
OTHERS = 1.
LOOP AT lt_objects ASSIGNING <object> WHERE pgmid = 'R3TR'.
ls_item-obj_type = <object>-object.
IF lcl_objects=>is_supported( is_item = ls_item iv_native_only = abap_true ) = abap_true.
IF lv_list IS INITIAL.
lv_list = ls_item-obj_type.
ELSE.
lv_list = lv_list && `, ` && ls_item-obj_type.
ENDIF.
ENDIF.
ENDLOOP.
rv_html = |</p>Supported objects: { lv_list }</p>|.
ENDMETHOD. " render_supported_object_types
METHOD scripts.
CREATE OBJECT ro_html.
ro_html->add( 'debugOutput("Browser: " + navigator.userAgent, "debug_info");' ).
ENDMETHOD. "scripts
ENDCLASS. "lcl_gui_page_debuginfo

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_PAGE_DEBUG</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_PAGE_DEBUG</ENTRY>
<LENGTH>27</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,371 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE_DIFF
*&---------------------------------------------------------------------*
CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
CONSTANTS:
BEGIN OF c_mod,
local TYPE char1 VALUE 'L',
remote TYPE char1 VALUE 'R',
both TYPE char1 VALUE 'B',
END OF c_mod.
TYPES: BEGIN OF ty_file_diff,
filename TYPE string,
lstate TYPE char1,
rstate TYPE char1,
mod TYPE char1, " Abstraction for shorter ifs
o_diff TYPE REF TO lcl_diff,
END OF ty_file_diff,
tt_file_diff TYPE STANDARD TABLE OF ty_file_diff.
METHODS: constructor
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
is_file TYPE ty_file OPTIONAL
is_object TYPE ty_item OPTIONAL
RAISING lcx_exception.
METHODS lif_gui_page~render REDEFINITION.
PRIVATE SECTION.
DATA: mt_diff_files TYPE tt_file_diff.
METHODS render_diff
IMPORTING is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_diff_head
IMPORTING is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_table_head
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_lines
IMPORTING is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_beacon
IMPORTING is_diff_line TYPE lcl_diff=>ty_diff
is_diff TYPE ty_file_diff
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS get_line_hl
IMPORTING iv_mod TYPE char1
iv_result TYPE lcl_diff=>ty_diff-result
EXPORTING ev_lattr TYPE string
ev_rattr TYPE string.
METHODS append_diff
IMPORTING it_remote TYPE ty_files_tt
it_local TYPE ty_files_item_tt
is_status TYPE ty_result
RAISING lcx_exception.
ENDCLASS. "lcl_gui_page_diff
CLASS lcl_gui_page_diff IMPLEMENTATION.
METHOD constructor.
DATA: lt_remote TYPE ty_files_tt,
lt_local TYPE ty_files_item_tt,
lt_status TYPE ty_results_tt,
lo_repo TYPE REF TO lcl_repo_online.
FIELD-SYMBOLS: <ls_status> LIKE LINE OF lt_status.
super->constructor( ).
ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed
lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ).
lt_remote = lo_repo->get_files_remote( ).
lt_local = lo_repo->get_files_local( ).
lt_status = lo_repo->status( ).
IF is_file IS NOT INITIAL. " Diff for one file
READ TABLE lt_status ASSIGNING <ls_status>
WITH KEY path = is_file-path filename = is_file-filename.
append_diff( it_remote = lt_remote
it_local = lt_local
is_status = <ls_status> ).
ELSEIF is_object IS NOT INITIAL. " Diff for whole object
LOOP AT lt_status ASSIGNING <ls_status>
WHERE obj_type = is_object-obj_type
AND obj_name = is_object-obj_name
AND match IS INITIAL.
append_diff( it_remote = lt_remote
it_local = lt_local
is_status = <ls_status> ).
ENDLOOP.
ELSE. " Diff for the whole repo
LOOP AT lt_status ASSIGNING <ls_status> WHERE match IS INITIAL.
append_diff( it_remote = lt_remote
it_local = lt_local
is_status = <ls_status> ).
ENDLOOP.
ENDIF.
IF lines( mt_diff_files ) = 0.
lcx_exception=>raise( 'PAGE_DIFF ERROR: No diff files found' ).
ENDIF.
ENDMETHOD.
METHOD append_diff.
DATA:
ls_r_dummy LIKE LINE OF it_remote ##NEEDED,
ls_l_dummy LIKE LINE OF it_local ##NEEDED.
FIELD-SYMBOLS: <ls_remote> LIKE LINE OF it_remote,
<ls_local> LIKE LINE OF it_local,
<ls_diff> LIKE LINE OF mt_diff_files.
READ TABLE it_remote ASSIGNING <ls_remote>
WITH KEY filename = is_status-filename
path = is_status-path.
IF sy-subrc <> 0.
ASSIGN ls_r_dummy TO <ls_remote>.
ENDIF.
READ TABLE it_local ASSIGNING <ls_local>
WITH KEY file-filename = is_status-filename
file-path = is_status-path.
IF sy-subrc <> 0.
ASSIGN ls_l_dummy TO <ls_local>.
ENDIF.
IF <ls_local> IS INITIAL AND <ls_remote> IS INITIAL.
lcx_exception=>raise( |DIFF: file not found { is_status-filename }| ).
ENDIF.
APPEND INITIAL LINE TO mt_diff_files ASSIGNING <ls_diff>.
<ls_diff>-filename = is_status-filename.
<ls_diff>-lstate = is_status-lstate.
<ls_diff>-rstate = is_status-rstate.
IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL.
<ls_diff>-mod = c_mod-both.
ELSEIF <ls_diff>-lstate IS NOT INITIAL.
<ls_diff>-mod = c_mod-local.
ELSE. "rstate IS NOT INITIAL, lstate = empty.
<ls_diff>-mod = c_mod-remote.
ENDIF.
IF <ls_diff>-mod = c_mod-remote. " Remote file leading changes
CREATE OBJECT <ls_diff>-o_diff
EXPORTING
iv_new = <ls_remote>-data
iv_old = <ls_local>-file-data.
ELSE. " Local leading changes or both were modified
CREATE OBJECT <ls_diff>-o_diff
EXPORTING
iv_new = <ls_local>-file-data
iv_old = <ls_remote>-data.
ENDIF.
ENDMETHOD. "append_diff
METHOD render_diff_head.
DATA: lo_html TYPE REF TO lcl_html_helper,
ls_stats TYPE lcl_diff=>ty_count.
CREATE OBJECT lo_html.
ls_stats = is_diff-o_diff->stats( ).
IF is_diff-mod = c_mod-both. " Merge stats into 'update' if both were changed
ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete.
CLEAR: ls_stats-insert, ls_stats-delete.
ENDIF.
lo_html->add( '<div class="diff_head">' ). "#EC NOTEXT
lo_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
lo_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
lo_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
lo_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ). "#EC NOTEXT
lo_html->add( render_item_state( iv1 = is_diff-lstate iv2 = is_diff-rstate ) ).
lo_html->add( '</div>' ). "#EC NOTEXT
ro_html = lo_html.
ENDMETHOD.
METHOD render_table_head.
CREATE OBJECT ro_html.
ro_html->add( '<thead class="header">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>LOCAL</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( '</thead>' ). "#EC NOTEXT
ENDMETHOD. " render_table_head.
METHOD render_diff.
CREATE OBJECT ro_html.
ro_html->add( '<div class="diff">' ). "#EC NOTEXT
ro_html->add( render_diff_head( is_diff ) ).
" Content
ro_html->add( '<div class="diff_content">' ). "#EC NOTEXT
ro_html->add( '<table width="100%" class="diff_tab">' ). "#EC NOTEXT
ro_html->add( render_table_head( ) ).
ro_html->add( render_lines( is_diff ) ).
ro_html->add( '</table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT
ENDMETHOD.
METHOD render_beacon.
DATA: lv_beacon TYPE string.
CREATE OBJECT ro_html.
IF is_diff_line-beacon > 0.
READ TABLE is_diff-o_diff->mt_beacons INTO lv_beacon INDEX is_diff_line-beacon.
ELSE.
lv_beacon = '---'.
ENDIF.
ro_html->add( '<thead class="nav_line">' ).
ro_html->add( '<tr>' ).
ro_html->add( '<th class="num"></th>' ).
ro_html->add( |<th colspan="3">@@ { is_diff_line-new_line } @@ { lv_beacon }</th>| ).
ro_html->add( '</tr>' ).
ro_html->add( '</thead>' ).
ENDMETHOD. " render_beacon.
METHOD render_lines.
DATA: lo_highlighter TYPE REF TO lcl_code_highlighter,
lt_diffs TYPE lcl_diff=>ty_diffs_tt,
lv_local TYPE string,
lv_remote TYPE string,
lv_lattr TYPE string,
lv_rattr TYPE string,
lv_highlight TYPE abap_bool,
lv_insert_nav TYPE abap_bool.
FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
CREATE OBJECT lo_highlighter.
CREATE OBJECT ro_html.
lt_diffs = is_diff-o_diff->get( ).
lv_highlight = boolc( is_diff-filename CP '*.abap' ).
LOOP AT lt_diffs ASSIGNING <ls_diff>.
IF <ls_diff>-short = abap_false.
lv_insert_nav = abap_true.
CONTINUE.
ENDIF.
IF lv_insert_nav = abap_true. " Insert separator line with navigation
ro_html->add( render_beacon( is_diff_line = <ls_diff> is_diff = is_diff ) ).
lv_insert_nav = abap_false.
ENDIF.
IF is_diff-mod = c_mod-remote. " Remote file leading changes
lv_local = <ls_diff>-old.
lv_remote = <ls_diff>-new.
ELSE. " Local leading changes or both were modified
lv_local = <ls_diff>-new.
lv_remote = <ls_diff>-old.
ENDIF.
IF lv_highlight = abap_true.
lv_local = lo_highlighter->process_line( lv_local ).
lv_remote = lo_highlighter->process_line( lv_remote ).
ELSE.
lv_local = escape( val = lv_local format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = lv_remote format = cl_abap_format=>e_html_attr ).
ENDIF.
get_line_hl( EXPORTING iv_mod = is_diff-mod
iv_result = <ls_diff>-result
IMPORTING ev_lattr = lv_lattr
ev_rattr = lv_rattr ).
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-new_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_lattr }><code>{ lv_local }</code></td>| ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-old_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_rattr }><code>{ lv_remote }</code></td>| ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDLOOP.
ENDMETHOD.
METHOD get_line_hl.
CLEAR: ev_lattr, ev_rattr. " Class for changed lines
IF iv_result IS INITIAL.
RETURN.
ENDIF.
" Both file changed ? Or line updated ? - All yellow
IF iv_mod = c_mod-both OR iv_result = lcl_diff=>c_diff-update.
ev_lattr = ' class="diff_upd"'. "#EC NOTEXT
ev_rattr = ' class="diff_upd"'. "#EC NOTEXT
ELSEIF iv_mod = c_mod-local. " Changed locally
CASE iv_result.
WHEN lcl_diff=>c_diff-insert.
ev_lattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_rattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE.
ELSEIF iv_mod = c_mod-remote. " Changed remotely - invert sides
CASE iv_result.
WHEN lcl_diff=>c_diff-insert.
ev_rattr = ' class="diff_ins"'. "#EC NOTEXT
WHEN lcl_diff=>c_diff-delete.
ev_lattr = ' class="diff_del"'. "#EC NOTEXT
ENDCASE.
ENDIF.
ENDMETHOD. " get_line_hl.
METHOD lif_gui_page~render.
DATA ls_diff_file LIKE LINE OF mt_diff_files.
CREATE OBJECT ro_html.
ro_html->add( header( ) ).
ro_html->add( title( 'DIFF' ) ).
LOOP AT mt_diff_files INTO ls_diff_file.
lcl_progress=>show( iv_key = 'Diff'
iv_current = sy-tabix
iv_total = lines( mt_diff_files )
iv_text = |Render Diff - { ls_diff_file-filename }| ).
ro_html->add( render_diff( ls_diff_file ) ).
ENDLOOP.
ro_html->add( footer( ) ).
ENDMETHOD.
ENDCLASS. "lcl_gui_page_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_PAGE_DIFF</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_PAGE_DIFF</ENTRY>
<LENGTH>26</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

Some files were not shown because too many files have changed in this diff Show More