diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e3b68a83e..3abfcb45f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,19 @@
+## Bug Reports
+
+A bug is a _demonstrable problem_ that is caused by the code in the repository. Good bug reports are extremely helpful - thank you!
+
+Guidelines for bug reports:
+
+1. **Use the GitHub issue search** — check if the issue has already been
+ reported.
+
+2. **Check if the issue has been fixed** — try to reproduce it using the
+ latest `master` or development branch in the repository.
+
+3. **Demonstrate the problem** — provide clear steps that can be reproduced.
+
+A good bug report should not leave others needing to chase you up for more information. Please try to be as detailed as possible in your report. What is your environment? What steps will reproduce the issue? What would you expect to be the outcome? All these details will help to fix any potential bugs.
+
## Development Guidelines
a. Make sure there is an open issue for the stuff that you want to work on. When starting the development add a comment in the issue. This will allow for discussing possible solutions, and avoid having multiple people look into the same issue.
diff --git a/changelog.txt b/changelog.txt
index fb6f3f255..175ca1a4c 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -8,6 +8,80 @@ Legend
+ : added
- : removed
+2017-09-11 v1.41.2
+------------------
+* FUGR table maintenance, namespaces
+* SICF show error message when deleting root node
+* DDLS better error messages
+* ENHS allow transport popup
++ experimental, optional opt-in: CLAS deserialization performance
+
+2017-09-03 v1.41.1
+------------------
+* DDLS changed_by
+* Deletion of objects when performing "reset local"
+* Moved first class to global in the abapGit development version
+
+2017-08-23 v1.41.0
+------------------
++ SHMA supported
++ ENHO for function groups + web dynpro supported
+
+2017-08-11 v1.40.0
+------------------
++ JOBD supported
++ CMPT supported
+* downport fix
+
+2017-08-07 v1.39.0
+------------------
++ DIAL supported
+* fix XML dump
+
+2017-08-05 v1.38.0
+------------------
+! SICF serialization changed
+* TOBJ serialization added TDDAT, TVDIR, and TVIMF tables
+* TYPE fix overwriting/pull
+
+2017-08-03 v1.37.8
+------------------
+* Fix TABL changed_by
+* Downport to 702
+
+2017-07-28 v1.37.7
+------------------
+* Fix dump when parsing commit author, regex
+* Fix decoding of commit body, newlines
+* SAMC SAPC refactoring
+* DOMA diff fix, sorting
+
+2017-07-23 v1.37.6
+------------------
+* SMIM exists() performance
+* Background mode performance improvements
+* DOCT fix changed_by() dump
+
+2017-07-17 v1.37.5
+------------------
+* fix FUGR namespaces
+* few ASSERTs removed
+* decoding of non-7bit values from html gui
+
+2017-07-09 v1.37.4
+------------------
+* SSFO serialization fix
+* Adler32 optimization
+! progress indicator when encoding object pack
+* CLAS diff fix, texts sorted
+* SSST bug, only inactive exists
+! Global settings persistence changed to XML
+
+2017-06-29 v1.37.3
+------------------
+* fixed 702 compatibility
+* fixed dump when calling branch overview page
+
2017-06-10 v1.37.2
------------------
* fixed unit tests
diff --git a/docs/_includes/header.html b/docs/_includes/header.html
index 72b285bea..94151d45d 100644
--- a/docs/_includes/header.html
+++ b/docs/_includes/header.html
@@ -1,5 +1,5 @@
-
abapGit documentation
+
abapGit documentation
diff --git a/docs/guide-import-zip.md b/docs/guide-import-zip.md
index bd985afea..e51f708e6 100644
--- a/docs/guide-import-zip.md
+++ b/docs/guide-import-zip.md
@@ -6,7 +6,7 @@ order: 10
1: Run report ZABAPGIT via SE38 or SA38
-2: Click "New Offline Repo"
+2: Click "+ Offline"

3: Enter project name eg. "abapOpenChecks", and an empty package eg. "$AOC"
diff --git a/docs/img/offline1.png b/docs/img/offline1.png
index 1f12d9bcc..bb7a52f27 100644
Binary files a/docs/img/offline1.png and b/docs/img/offline1.png differ
diff --git a/docs/img/offline2.png b/docs/img/offline2.png
index eb7c143bd..8ef6559b8 100644
Binary files a/docs/img/offline2.png and b/docs/img/offline2.png differ
diff --git a/docs/img/offline3.png b/docs/img/offline3.png
index ca37533af..b72a29915 100644
Binary files a/docs/img/offline3.png and b/docs/img/offline3.png differ
diff --git a/docs/other-articles-and-presentations.md b/docs/other-articles-and-presentations.md
index 8e3946e89..59cc5b97a 100644
--- a/docs/other-articles-and-presentations.md
+++ b/docs/other-articles-and-presentations.md
@@ -20,6 +20,9 @@ order: 30
[SAP Inside Track Hamburg](https://larshp.github.io/sithh2016/)
-Lars Hvam
+[SAP Inside Track Munich](https://www.slideshare.net/h_neumann/what-the-git-sap-inside-track-munich-2016)
+-Hendrik Neumann
+
[SAP Teched Barcelona](https://larshp.github.io/teched-2016-emea/)
-Lars Hvam
@@ -40,5 +43,14 @@ order: 30
Mastering SAP Technologies, Melbourne, May 23rd
-Graham Robinson
+[abapGit – so easy](https://blogs.sap.com/2017/06/21/abapgit-so-easy/)
+-Graham Robinson
+
+SAUG National Summit 2017, September 5th
+-Graham Robinson
+
SAP Teched Las Vegas
--Graham Robinson
\ No newline at end of file
+-Graham Robinson
+
+abapGit, [IT Conference on SAP Technologies](http://www.itconferencesap.com/), Cluj
+-Lars Hvam
diff --git a/docs/ref-dot-abapgit.md b/docs/ref-dot-abapgit.md
index b0fdbf5ac..abbd77734 100644
--- a/docs/ref-dot-abapgit.md
+++ b/docs/ref-dot-abapgit.md
@@ -31,9 +31,12 @@ Example: abapGit own .abapgit.xml
# Description
+## Location
+The `.abapgit.xml` file must be located in the root folder of the git repository.
+
## Master Language
-The language in which all documentation and dictionary elements texts will be created. Follows SAP `sy-langu` values.
+The language in which all documentation and dictionary elements texts will be created. Follows SAP `sy-langu` values. Note that this implies that all objects in a repository will/should have the same master language.
## Starting Folder
@@ -69,4 +72,4 @@ will give folder structure /zsomething/zhello/
## Ignore
-Files which abapGit will not download into your ABAP system.
\ No newline at end of file
+Files which abapGit will not download into your ABAP system.
diff --git a/docs/ref-supported.md b/docs/ref-supported.md
index ad881886f..e8449895b 100644
--- a/docs/ref-supported.md
+++ b/docs/ref-supported.md
@@ -8,12 +8,16 @@ order: 20
Type | Description | Supported
:------------ | :------------ | ------------:
ACID | Checkpoint Group | Yes
+AOBJ | Archiving Object | [#804](https://github.com/larshp/abapGit/issues/804)
AUTH | Authorization Check Fields | Yes
BOBF | BOPF: Business Object Model | [Plugin](https://github.com/larshp/abapGit-Plugins)
+CHDO | Change Document Object | [#802](https://github.com/larshp/abapGit/issues/802)
CLAS | Class (ABAP Objects) | Yes
CMOD | Customer enhancement projects | [#151](https://github.com/larshp/abapGit/issues/151)
+CMPT | Code Composer Template | Yes
DCLS | ABAP Data Control Language Sources | Yes
DDLS | Data Definition Language Source | Yes
+DIAL | Dialog Module | Yes
DOCT | General Text | Yes
DOCV | Documentation (Independent) | Yes
DOMA | Domain | Yes
@@ -21,7 +25,7 @@ DTEL | Data Element | Yes
ECAT | eCATT Test Script | [#163](https://github.com/larshp/abapGit/issues/163)
ECTD | eCATT Test Data Container | [#105](https://github.com/larshp/abapGit/issues/105)
ENHC | Composite Enhancement Implementation | Yes
-ENHO | Enhancement Implementation | Partial [#113](https://github.com/larshp/abapGit/issues/113)
+ENHO | Enhancement Implementation | Yes
ENHS | Enhancement Spot | Yes
ENQU | Lock Object | Yes
FORM | SAPscript form | Yes
@@ -31,6 +35,7 @@ IARP | Parameters of IAC Language Resource | Yes
IASP | Parameters of an IAC service | Yes
IATU | Language-Independent IAC Templates | Yes
IWPR | Gateway Business Suite Enablement - Service Builder Project | [#75](https://github.com/larshp/abapGit/issues/75)
+JOBD | Technical Job Definition | Yes
LPDC | Launchpad short texts | [#107](https://github.com/larshp/abapGit/issues/107)
MSAG | Message Class | Yes
NROB | Number Range Objects | Yes
@@ -38,24 +43,26 @@ PARA | SPA/GPA Parameters | Yes
PDTS | Standard Task | [#153](https://github.com/larshp/abapGit/issues/153)
PDWS | Workflow templates | [#154](https://github.com/larshp/abapGit/issues/154)
PINF | Package interface | Yes
+PRAG | Pragma in ABAP Source Code | Yes
PROG | Program | Yes
SAMC | ABAP Messaging Channels | Yes
SAPC | ABAP Push Channels | Yes
SFBF | Business Function + Assignment | Yes
SFBS | Business Function Set + Assignment | Yes
+SFPF | Form Object: Form | Yes
+SFPI | Form Object: Interface | Yes
SFSW | Switch + Assignment of Objects to the Switch | Yes
SHI3 | General structure storage: Definition of a structure | Yes
SHLP | Search Help | Yes
+SHMA | Shared Objects: Defined Area Attributes | Yes
SICF | ICF Service | Yes
+SMIM | Info Object from the MIME Repository | Yes
+SOTS | All Concepts (OTR) of a Package - Long Texts | [#792](https://github.com/larshp/abapGit/issues/792)
SPLO | Format Types | Yes
+SPRX | Proxy Object | [#87](https://github.com/larshp/abapGit/issues/87)
SRFC | RFC Service | [#155](https://github.com/larshp/abapGit/issues/155)
SSFO | SAP Smart Form | Yes
SSST | SAP Smart Style | Yes
-SFPI | Form Object: Interface | Yes
-SFPF | Form Object: Form | Yes
-SHMA | Shared Objects: Defined Area Attributes | [#85](https://github.com/larshp/abapGit/issues/85)
-SMIM | Info Object from the MIME Repository | Yes
-SPRX | Proxy Object | [#87](https://github.com/larshp/abapGit/issues/87)
STYL | SAPscript style | Yes
SUSC | Authorization object class | Yes
SUSO | Authorization object | Yes
@@ -77,4 +84,4 @@ WDYN | Web Dynpro Component | Yes
WEBI | Virtual End Point | Yes
XSLT | Transformation | Yes
-Also see https://github.com/larshp/abapGit-Plugins
+Also see [https://github.com/larshp/abapGit-Plugins](https://github.com/larshp/abapGit-Plugins)
diff --git a/docs/repos.json b/docs/repos.json
index 7169fc7cc..98ecc70b4 100644
--- a/docs/repos.json
+++ b/docs/repos.json
@@ -14,6 +14,11 @@
"title": "abap-log",
"description": "Logging library for ABAP"
},
+ "https://github.com/epeterson320/ABAP-Logger.git":
+ {
+ "title": "ABAP-Logger",
+ "description": "ABAP Logging as painless as any other language"
+ },
"https://github.com/sbcgua/mockup_loader.git":
{
"title": "mockup_loader",
diff --git a/package.json b/package.json
index f0cdb6687..bcdf263fe 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"url": "git+https://github.com/larshp/abapGit.git"
},
"devDependencies": {
- "abapmerge": "^0.6.2",
+ "abapmerge": "^0.7.0",
"abaplint": ">=0.26.7"
}
}
diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap
index fa7af4c0e..7ec348804 100644
--- a/src/zabapgit.prog.abap
+++ b/src/zabapgit.prog.abap
@@ -48,6 +48,7 @@ INCLUDE zabapgit_sap_package.
INCLUDE zabapgit_folder_logic.
INCLUDE zabapgit_requirements.
INCLUDE zabapgit_authorizations.
+INCLUDE zabapgit_exit.
INCLUDE zabapgit_stage.
INCLUDE zabapgit_git_helpers.
diff --git a/src/zabapgit_background.prog.abap b/src/zabapgit_background.prog.abap
index 252883901..545e4a5c1 100644
--- a/src/zabapgit_background.prog.abap
+++ b/src/zabapgit_background.prog.abap
@@ -113,25 +113,41 @@ CLASS lcl_background IMPLEMENTATION.
METHOD push_auto.
+ TYPES: BEGIN OF ty_changed,
+ filename TYPE string,
+ path TYPE string,
+ changed_by TYPE xubname,
+ END OF ty_changed.
+
DATA: ls_comment TYPE lif_defs=>ty_comment,
ls_files TYPE lif_defs=>ty_stage_files,
+ lt_changed TYPE STANDARD TABLE OF ty_changed WITH DEFAULT KEY,
+ lt_users TYPE STANDARD TABLE OF xubname WITH DEFAULT KEY,
ls_user_files LIKE ls_files,
+ lv_changed_by TYPE xubname,
lo_stage TYPE REF TO lcl_stage.
- FIELD-SYMBOLS: LIKE LINE OF ls_files-local.
-
+ FIELD-SYMBOLS: LIKE LINE OF lt_changed,
+ LIKE LINE OF ls_files-local.
ls_files = lcl_stage_logic=>get( io_repo ).
- DO.
- READ TABLE ls_files-local INDEX 1 ASSIGNING .
- IF sy-subrc <> 0.
- EXIT.
- ENDIF.
+ LOOP AT ls_files-local ASSIGNING .
+ lv_changed_by = lcl_objects=>changed_by( -item ).
+ APPEND lv_changed_by TO lt_users.
+ APPEND INITIAL LINE TO lt_changed ASSIGNING .
+ -changed_by = lv_changed_by.
+ -filename = -file-filename.
+ -path = -file-path.
+ ENDLOOP.
+ SORT lt_users ASCENDING.
+ DELETE ADJACENT DUPLICATES FROM lt_users.
+
+ LOOP AT lt_users INTO lv_changed_by.
CLEAR ls_comment.
- ls_comment-committer-name = lcl_objects=>changed_by( -item ).
+ ls_comment-committer-name = lv_changed_by.
ls_comment-committer-email = |{ ls_comment-committer-name }@localhost|.
CREATE OBJECT lo_stage
@@ -142,7 +158,12 @@ CLASS lcl_background IMPLEMENTATION.
CLEAR ls_user_files.
LOOP AT ls_files-local ASSIGNING .
- IF lcl_objects=>changed_by( -item ) = ls_comment-committer-name.
+ READ TABLE lt_changed WITH KEY
+ path = -file-path
+ filename = -file-filename
+ changed_by = lv_changed_by
+ TRANSPORTING NO FIELDS.
+ IF sy-subrc = 0.
WRITE: / 'stage' ##NO_TEXT,
ls_comment-committer-name,
-file-path,
@@ -156,14 +177,11 @@ CLASS lcl_background IMPLEMENTATION.
ENDIF.
ENDLOOP.
- ls_comment-comment = build_comment( ls_user_files ).
+ ls_comment-comment = build_comment( ls_user_files ).
io_repo->push( is_comment = ls_comment
io_stage = lo_stage ).
-
- ls_files = lcl_stage_logic=>get( io_repo ).
-
- ENDDO.
+ ENDLOOP.
ENDMETHOD.
diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap
index 07bf82a56..8aae714e6 100644
--- a/src/zabapgit_definitions.prog.abap
+++ b/src/zabapgit_definitions.prog.abap
@@ -7,7 +7,7 @@ TYPE-POOLS seop.
INTERFACE lif_defs.
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
- gc_abap_version TYPE string VALUE 'v1.37.2'. "#EC NOTEXT
+ gc_abap_version TYPE string VALUE 'v1.41.2'. "#EC NOTEXT
TYPES: ty_type TYPE c LENGTH 6,
ty_bitbyte TYPE c LENGTH 8,
@@ -33,6 +33,8 @@ INTERFACE lif_defs.
TYPES: ty_string_tt TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+ TYPES: ty_icm_sinfo2_tt TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY.
+
TYPES:
BEGIN OF ty_git_user,
name TYPE string,
@@ -197,7 +199,7 @@ INTERFACE lif_defs.
CONSTANTS: gc_root_dir TYPE string VALUE '/',
gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT,
- gc_author_regex TYPE string VALUE '^([\w\s\.@\-_1-9]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT.
+ gc_author_regex TYPE string VALUE '^([\\\w\s\.@\-_1-9\(\) ]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT.
CONSTANTS: BEGIN OF gc_action,
repo_clone TYPE string VALUE 'repo_clone',
diff --git a/src/zabapgit_exit.prog.abap b/src/zabapgit_exit.prog.abap
new file mode 100644
index 000000000..2d1136d42
--- /dev/null
+++ b/src/zabapgit_exit.prog.abap
@@ -0,0 +1,51 @@
+*&---------------------------------------------------------------------*
+*& Include ZABAPGIT_USER_EXITS
+*&---------------------------------------------------------------------*
+
+INTERFACE lif_exit.
+
+ METHODS:
+ change_local_host
+ CHANGING ct_hosts TYPE lif_defs=>ty_icm_sinfo2_tt,
+ allow_sap_objects
+ RETURNING VALUE(rv_allowed) TYPE abap_bool.
+
+ENDINTERFACE.
+
+* add class LCL_USER_EXIT implementing LIF_EXIT in following include,
+* place the include in a different package than ZABAPGIT
+INCLUDE zabapgit_user_exit IF FOUND.
+
+*******************
+
+CLASS lcl_exit DEFINITION FINAL.
+
+ PUBLIC SECTION.
+ CLASS-METHODS: get_instance RETURNING VALUE(ri_exit) TYPE REF TO lif_exit.
+
+ INTERFACES: lif_exit.
+
+ENDCLASS.
+
+CLASS lcl_exit IMPLEMENTATION.
+
+ METHOD get_instance.
+
+ TRY.
+ CREATE OBJECT ri_exit TYPE ('LCL_USER_EXIT').
+ CATCH cx_sy_create_object_error.
+ CREATE OBJECT ri_exit TYPE lcl_exit.
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_exit~change_local_host.
+* default behavior
+ RETURN.
+ ENDMETHOD.
+
+ METHOD lif_exit~allow_sap_objects.
+ rv_allowed = abap_false.
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zabapgit_exit.prog.xml b/src/zabapgit_exit.prog.xml
new file mode 100644
index 000000000..47417c874
--- /dev/null
+++ b/src/zabapgit_exit.prog.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ ZABAPGIT_EXIT
+ A
+ X
+ I
+ E
+ X
+
+
+ -
+ R
+ Include ZABAPGIT_USER_EXITS
+ 27
+
+
+
+
+
diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap
index 416b901d3..d7402cfa1 100644
--- a/src/zabapgit_file_status.prog.abap
+++ b/src/zabapgit_file_status.prog.abap
@@ -27,7 +27,8 @@ CLASS lcl_file_status DEFINITION FINAL
it_local TYPE lif_defs=>ty_files_item_tt
it_remote TYPE lif_defs=>ty_files_tt
it_cur_state TYPE lif_defs=>ty_file_signatures_tt
- RETURNING VALUE(rt_results) TYPE lif_defs=>ty_results_tt,
+ RETURNING VALUE(rt_results) TYPE lif_defs=>ty_results_tt
+ RAISING lcx_exception,
run_checks
IMPORTING io_log TYPE REF TO lcl_log
it_results TYPE lif_defs=>ty_results_tt
diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap
index 3075bba11..448defdff 100644
--- a/src/zabapgit_git.prog.abap
+++ b/src/zabapgit_git.prog.abap
@@ -114,6 +114,12 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack.
IMPORTING is_commit TYPE ty_commit
RETURNING VALUE(rv_data) TYPE xstring.
+ CLASS-METHODS type_and_length
+ IMPORTING iv_type TYPE lif_defs=>ty_type
+ iv_length TYPE i
+ RETURNING VALUE(rv_xstring) TYPE xstring
+ RAISING lcx_exception.
+
PRIVATE SECTION.
CONSTANTS: c_pack_start TYPE x LENGTH 4 VALUE '5041434B', " PACK
c_zlib TYPE x LENGTH 2 VALUE '789C',
@@ -124,11 +130,6 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack.
CHANGING ct_objects TYPE lif_defs=>ty_objects_tt
RAISING lcx_exception.
- CLASS-METHODS type_and_length
- IMPORTING is_object TYPE lif_defs=>ty_object
- RETURNING VALUE(rv_xstring) TYPE xstring
- RAISING lcx_exception.
-
CLASS-METHODS delta
IMPORTING is_object TYPE lif_defs=>ty_object
CHANGING ct_objects TYPE lif_defs=>ty_objects_tt
@@ -251,7 +252,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
lcl_git_utils=>get_null( ) &&
` ` &&
lv_cap_list &&
- lif_defs=>gc_newline. "#EC NOTEXT
+ lif_defs=>gc_newline. "#EC NOTEXT
lv_cmd_pkt = lcl_git_utils=>pkt_string( lv_line ).
lv_buffer = lv_cmd_pkt && '0000'.
@@ -347,17 +348,17 @@ CLASS lcl_git_transport IMPLEMENTATION.
lv_capa = 'side-band-64k no-progress multi_ack agent='
&& lcl_http=>get_agent( ) ##NO_TEXT.
lv_line = 'want' && ` ` && -sha1
- && ` ` && lv_capa && lif_defs=>gc_newline. "#EC NOTEXT
+ && ` ` && lv_capa && lif_defs=>gc_newline. "#EC NOTEXT
ELSE.
lv_line = 'want' && ` ` && -sha1
- && lif_defs=>gc_newline. "#EC NOTEXT
+ && lif_defs=>gc_newline. "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( lv_line ).
ENDLOOP.
IF iv_deepen = abap_true.
lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( 'deepen 1'
- && lif_defs=>gc_newline ). "#EC NOTEXT
+ && lif_defs=>gc_newline ). "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer
@@ -430,7 +431,7 @@ CLASS lcl_git_pack IMPLEMENTATION.
lv_x TYPE x LENGTH 1.
- CASE is_object-type.
+ CASE iv_type.
WHEN lif_defs=>gc_type-commit.
lv_type = '001'.
WHEN lif_defs=>gc_type-tree.
@@ -443,7 +444,7 @@ CLASS lcl_git_pack IMPLEMENTATION.
lcx_exception=>raise( 'Unexpected object type while encoding pack' ).
ENDCASE.
- lv_x4 = xstrlen( is_object-data ).
+ lv_x4 = iv_length.
DO 32 TIMES.
GET BIT sy-index OF lv_x4 INTO lv_c.
CONCATENATE lv_bits lv_c INTO lv_bits.
@@ -611,6 +612,7 @@ CLASS lcl_git_pack IMPLEMENTATION.
DATA: lv_string TYPE string,
lv_word TYPE string,
+ lv_length TYPE i,
lv_trash TYPE string ##NEEDED,
lt_string TYPE TABLE OF string.
@@ -622,34 +624,41 @@ CLASS lcl_git_pack IMPLEMENTATION.
SPLIT lv_string AT lif_defs=>gc_newline INTO TABLE lt_string.
LOOP AT lt_string ASSIGNING .
- IF NOT rs_commit-committer IS INITIAL.
- CONCATENATE rs_commit-body INTO rs_commit-body
- SEPARATED BY lif_defs=>gc_newline.
- ELSE.
- SPLIT AT space INTO lv_word lv_trash.
- CASE lv_word.
- WHEN 'tree'.
- rs_commit-tree = +5.
- WHEN 'parent'.
- IF rs_commit-parent IS INITIAL.
- rs_commit-parent = +7.
- ELSE.
- rs_commit-parent2 = +7.
- ENDIF.
- WHEN 'author'.
- rs_commit-author = +7.
- WHEN 'committer'.
- rs_commit-committer = +10.
- WHEN OTHERS.
- ASSERT 0 = 1.
- ENDCASE.
- ENDIF.
+* IF NOT rs_commit-committer IS INITIAL.
+* CONCATENATE rs_commit-body INTO rs_commit-body
+* SEPARATED BY lif_defs=>gc_newline.
+* ELSE.
+ lv_length = strlen( ) + 1.
+ lv_string = lv_string+lv_length.
+
+ SPLIT AT space INTO lv_word lv_trash.
+ CASE lv_word.
+ WHEN 'tree'.
+ rs_commit-tree = +5.
+ WHEN 'parent'.
+ IF rs_commit-parent IS INITIAL.
+ rs_commit-parent = +7.
+ ELSE.
+ rs_commit-parent2 = +7.
+ ENDIF.
+ WHEN 'author'.
+ rs_commit-author = +7.
+ WHEN 'committer'.
+ rs_commit-committer = +10.
+ EXIT. " current loop
+ WHEN OTHERS.
+ ASSERT 0 = 1.
+ ENDCASE.
+
+* ENDIF.
ENDLOOP.
+ rs_commit-body = lv_string+1.
+
* strip first newline
- IF strlen( rs_commit-body ) >= 2.
- rs_commit-body = rs_commit-body+2.
- ENDIF.
+* IF strlen( rs_commit-body ) >= 2.
+* rs_commit-body = rs_commit-body+2.
+* ENDIF.
IF rs_commit-author IS INITIAL
OR rs_commit-committer IS INITIAL
@@ -682,25 +691,24 @@ CLASS lcl_git_pack IMPLEMENTATION.
METHOD delta.
- DATA: lv_delta TYPE xstring,
- lv_base TYPE xstring,
- lv_result TYPE xstring,
-* lv_bitbyte TYPE ty_bitbyte,
- lv_offset TYPE i,
- lv_sha1 TYPE lif_defs=>ty_sha1,
- ls_object LIKE LINE OF ct_objects,
- lv_len TYPE i,
- lv_org TYPE x,
-* lv_i TYPE i,
- lv_x TYPE x.
-
- FIELD-SYMBOLS: LIKE LINE OF ct_objects.
-
DEFINE _eat_byte.
lv_x = lv_delta(1).
lv_delta = lv_delta+1.
END-OF-DEFINITION.
+ DATA: lv_delta TYPE xstring,
+ lv_base TYPE xstring,
+ lv_result TYPE xstring,
+ lv_offset TYPE i,
+ lv_sha1 TYPE lif_defs=>ty_sha1,
+ ls_object LIKE LINE OF ct_objects,
+ lv_len TYPE i,
+ lv_org TYPE x,
+ lv_x TYPE x.
+
+ FIELD-SYMBOLS: LIKE LINE OF ct_objects.
+
+
lv_delta = is_object-data.
* find base
@@ -1025,26 +1033,35 @@ CLASS lcl_git_pack IMPLEMENTATION.
METHOD encode.
- DATA: lv_sha1 TYPE x LENGTH 20,
- lv_adler32 TYPE lcl_hash=>ty_adler32,
- lv_len TYPE i,
- lv_compressed TYPE xstring,
- lv_xstring TYPE xstring.
+ DATA: lv_sha1 TYPE x LENGTH 20,
+ lv_adler32 TYPE lcl_hash=>ty_adler32,
+ lv_compressed TYPE xstring,
+ lv_xstring TYPE xstring,
+ lv_objects_total TYPE i,
+ lv_objects_processed TYPE i.
FIELD-SYMBOLS: LIKE LINE OF it_objects.
-
rv_data = c_pack_start.
CONCATENATE rv_data c_version INTO rv_data IN BYTE MODE.
- lv_len = lines( it_objects ).
- lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_len
- iv_length = 4 ).
+ lv_xstring = lcl_convert=>int_to_xstring4( lines( it_objects ) ).
CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
+ lv_objects_total = lines( it_objects ).
+
LOOP AT it_objects ASSIGNING .
- lv_xstring = type_and_length( ).
+
+ lv_objects_processed = sy-tabix.
+
+ cl_progress_indicator=>progress_indicate( i_text = |encoding objects &1% ( &2 of &3 )|
+ i_processed = lv_objects_processed
+ i_total = lv_objects_total ).
+
+ lv_xstring = type_and_length(
+ iv_type = -type
+ iv_length = xstrlen( -data ) ).
CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
cl_abap_gzip=>compress_binary(
diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap
index 905fb4b15..bf81621fc 100644
--- a/src/zabapgit_html_action_utils.prog.abap
+++ b/src/zabapgit_html_action_utils.prog.abap
@@ -15,6 +15,10 @@ CLASS lcl_html_action_utils DEFINITION FINAL.
IMPORTING iv_string TYPE clike
RETURNING VALUE(rt_fields) TYPE tihttpnvp.
+ CLASS-METHODS parse_fields_upper_case_name
+ IMPORTING iv_string TYPE clike
+ RETURNING VALUE(rt_fields) TYPE tihttpnvp.
+
CLASS-METHODS add_field
IMPORTING name TYPE string
iv TYPE any
@@ -75,8 +79,8 @@ CLASS lcl_html_action_utils DEFINITION FINAL.
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.
+ IMPORTING it_postdata TYPE cnht_post_data_tab
+ EXPORTING es_fields TYPE any.
CLASS-METHODS decode_bg_update
IMPORTING iv_getdata TYPE clike
@@ -88,6 +92,11 @@ CLASS lcl_html_action_utils DEFINITION FINAL.
ev_seed TYPE string
RAISING lcx_exception.
+ PRIVATE SECTION.
+ CLASS-METHODS unescape
+ IMPORTING iv_string TYPE string
+ RETURNING VALUE(rv_string) TYPE string.
+
ENDCLASS. "lcl_html_action_utils DEFINITION
*----------------------------------------------------------------------*
@@ -107,7 +116,43 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
METHOD parse_fields.
- rt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
+ DATA: substrings TYPE stringtab,
+ field LIKE LINE OF rt_fields.
+
+ FIELD-SYMBOLS: LIKE LINE OF substrings.
+
+ SPLIT iv_string AT '&' INTO TABLE substrings.
+
+ LOOP AT substrings ASSIGNING .
+
+ CLEAR: field.
+
+ field-name = substring_before( val =
+ sub = '=' ).
+ field-name = unescape( field-name ).
+
+ field-value = substring_after( val =
+ sub = '=' ).
+ field-value = unescape( field-value ).
+
+ INSERT field INTO TABLE rt_fields.
+
+ ENDLOOP.
+
+ ENDMETHOD.
+
+ METHOD unescape.
+* do not use cl_http_utility as it does strange things with the encoding
+ rv_string = iv_string.
+
+* todo, more to be added here
+ REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'.
+
+ ENDMETHOD.
+
+ METHOD parse_fields_upper_case_name.
+
+ rt_fields = parse_fields( iv_string ).
field_keys_to_upper( CHANGING ct_fields = rt_fields ).
ENDMETHOD. " parse_fields.
@@ -175,8 +220,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
DATA: lt_fields TYPE tihttpnvp.
-
- lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
+ lt_fields = lcl_html_action_utils=>parse_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 ).
@@ -194,7 +238,8 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
METHOD dir_decode.
DATA: lt_fields TYPE tihttpnvp.
- lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
+
+ lt_fields = lcl_html_action_utils=>parse_fields( iv_string ).
get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = rv_path ).
ENDMETHOD. "dir_decode
@@ -232,7 +277,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED.
CLEAR: ev_key, eg_file, eg_object.
- lt_fields = parse_fields( iv_string ).
+ lt_fields = parse_fields_upper_case_name( iv_string ).
get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ).
@@ -263,7 +308,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
DATA: lt_fields TYPE tihttpnvp.
- lt_fields = parse_fields( iv_string ).
+ lt_fields = parse_fields_upper_case_name( cl_http_utility=>unescape_url( |{ iv_string }| ) ).
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 ).
@@ -277,9 +322,12 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
CONCATENATE LINES OF it_postdata INTO lv_string.
+
+ lv_string = cl_http_utility=>unescape_url( lv_string ).
+
rs_content = dbkey_decode( lv_string ).
- lt_fields = parse_fields( lv_string ).
+ lt_fields = parse_fields_upper_case_name( lv_string ).
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 ???
@@ -304,7 +352,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
CONCATENATE LINES OF it_postdata INTO lv_string.
REPLACE ALL OCCURRENCES OF lif_defs=>gc_crlf IN lv_string WITH lc_replace.
REPLACE ALL OCCURRENCES OF lif_defs=>gc_newline IN lv_string WITH lc_replace.
- lt_fields = parse_fields( lv_string ).
+ lt_fields = parse_fields_upper_case_name( lv_string ).
get_field( EXPORTING name = 'COMMITTER_NAME' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'COMMITTER_EMAIL' it = lt_fields CHANGING cv = es_fields ).
@@ -317,15 +365,13 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
ASSERT IS ASSIGNED.
REPLACE ALL OCCURRENCES OF lc_replace IN WITH lif_defs=>gc_newline.
- ASSERT es_fields IS NOT INITIAL.
-
ENDMETHOD. "parse_commit_request
METHOD decode_bg_update.
DATA: lt_fields TYPE tihttpnvp.
- lt_fields = parse_fields( iv_getdata ).
+ lt_fields = parse_fields_upper_case_name( iv_getdata ).
get_field( EXPORTING name = 'METHOD' it = lt_fields CHANGING cv = rs_fields ).
get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = rs_fields ).
@@ -342,7 +388,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
DATA: lt_fields TYPE tihttpnvp.
- lt_fields = parse_fields( iv_getdata ).
+ lt_fields = parse_fields_upper_case_name( iv_getdata ).
get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ).
get_field( EXPORTING name = 'SEED' it = lt_fields CHANGING cv = ev_seed ).
diff --git a/src/zabapgit_http.prog.abap b/src/zabapgit_http.prog.abap
index 72d64fc30..7ff6fab52 100644
--- a/src/zabapgit_http.prog.abap
+++ b/src/zabapgit_http.prog.abap
@@ -501,8 +501,8 @@ CLASS lcl_http IMPLEMENTATION.
METHOD is_local_system.
DATA: lv_host TYPE string,
- lt_list TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY.
-
+ lt_list TYPE lif_defs=>ty_icm_sinfo2_tt,
+ li_exit TYPE ref to lif_exit.
CALL FUNCTION 'ICM_GET_INFO2'
TABLES
@@ -516,6 +516,9 @@ CLASS lcl_http IMPLEMENTATION.
RETURN.
ENDIF.
+ li_exit = lcl_exit=>get_instance( ).
+ li_exit->change_local_host( CHANGING ct_hosts = lt_list ).
+
FIND REGEX 'https?://([^/^:]*)' IN iv_url
SUBMATCHES lv_host.
diff --git a/src/zabapgit_news.prog.abap b/src/zabapgit_news.prog.abap
index 7a6f5a7d6..ceb19df72 100644
--- a/src/zabapgit_news.prog.abap
+++ b/src/zabapgit_news.prog.abap
@@ -112,8 +112,13 @@ CLASS lcl_news IMPLEMENTATION.
lv_last_seen = lcl_app=>user( )->get_repo_last_change_seen( lv_url ).
- " Find changelog
- lt_remote = io_repo->get_files_remote( ).
+ TRY.
+ " Find changelog
+ lt_remote = io_repo->get_files_remote( ).
+ CATCH lcx_exception.
+ RETURN.
+ ENDTRY.
+
READ TABLE lt_remote ASSIGNING
WITH KEY path = lc_log_path filename = lc_log_filename.
diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap
index 0f58fa619..35991602c 100644
--- a/src/zabapgit_object_clas.prog.abap
+++ b/src/zabapgit_object_clas.prog.abap
@@ -18,32 +18,27 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
iv_language TYPE spras.
PROTECTED SECTION.
- METHODS deserialize_abap
- IMPORTING io_xml TYPE REF TO lcl_xml_input
- iv_package TYPE devclass
- RAISING lcx_exception.
-
- METHODS deserialize_docu
- IMPORTING io_xml TYPE REF TO lcl_xml_input
- RAISING lcx_exception.
- DATA mo_object_oriented_object_fct TYPE REF TO lif_oo_object_fnc.
- PRIVATE SECTION.
- DATA mv_skip_testclass TYPE abap_bool.
-
- METHODS deserialize_tpool
- IMPORTING io_xml TYPE REF TO lcl_xml_input
- RAISING lcx_exception.
-
- METHODS deserialize_sotr
- IMPORTING io_xml TYPE REF TO lcl_xml_input
- iv_package TYPE devclass
- RAISING lcx_exception.
-
-
- METHODS serialize_xml
- IMPORTING io_xml TYPE REF TO lcl_xml_output
- RAISING lcx_exception.
+ DATA: mo_object_oriented_object_fct TYPE REF TO lif_oo_object_fnc,
+ mv_skip_testclass TYPE abap_bool.
+ METHODS:
+ deserialize_abap
+ IMPORTING io_xml TYPE REF TO lcl_xml_input
+ iv_package TYPE devclass
+ RAISING lcx_exception,
+ deserialize_docu
+ IMPORTING io_xml TYPE REF TO lcl_xml_input
+ RAISING lcx_exception,
+ deserialize_tpool
+ IMPORTING io_xml TYPE REF TO lcl_xml_input
+ RAISING lcx_exception,
+ deserialize_sotr
+ IMPORTING io_xml TYPE REF TO lcl_xml_input
+ iv_package TYPE devclass
+ RAISING lcx_exception,
+ serialize_xml
+ IMPORTING io_xml TYPE REF TO lcl_xml_output
+ RAISING lcx_exception.
ENDCLASS. "lcl_object_dtel DEFINITION
@@ -366,6 +361,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
iv_package = iv_package
CHANGING
is_properties = ls_vseoclass ).
+
mo_object_oriented_object_fct->generate_locals(
is_key = ls_class_key
iv_force = seox_true
@@ -375,8 +371,8 @@ CLASS lcl_object_clas IMPLEMENTATION.
it_local_test_classes = lt_test_classes ).
mo_object_oriented_object_fct->deserialize_source(
- is_key = ls_class_key
- it_source = lt_source ).
+ is_key = ls_class_key
+ it_source = lt_source ).
io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
CHANGING cg_data = lt_descriptions ).
@@ -385,7 +381,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
is_key = ls_class_key
it_descriptions = lt_descriptions ).
- mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ).
+ mo_object_oriented_object_fct->add_to_activation_list( ms_item ).
ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
@@ -396,7 +392,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
super->constructor(
is_item = is_item
iv_language = iv_language ).
- mo_object_oriented_object_fct = lcl_oo_factory=>make( iv_object_type = ms_item-obj_type ).
+ mo_object_oriented_object_fct = lcl_oo_factory=>make( ms_item-obj_type ).
ENDMETHOD.
ENDCLASS. "lcl_object_CLAS IMPLEMENTATION
@@ -457,8 +453,9 @@ CLASS lcl_oo_class IMPLEMENTATION.
lcx_exception=>raise( 'error from generate_locals' ).
ENDIF.
ENDMETHOD.
+
METHOD lif_oo_object_fnc~insert_text_pool.
- DATA: lv_cp TYPE program.
+ DATA: lv_cp TYPE program.
lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ).
diff --git a/src/zabapgit_object_clas_new.prog.abap b/src/zabapgit_object_clas_new.prog.abap
new file mode 100644
index 000000000..b086f8bdf
--- /dev/null
+++ b/src/zabapgit_object_clas_new.prog.abap
@@ -0,0 +1,412 @@
+*&---------------------------------------------------------------------*
+*& Include ZABAPGIT_OBJECT_CLAS_NEW
+*&---------------------------------------------------------------------*
+
+* todo: refactoring
+* todo: testing, possible from master branch via experimental switch
+
+CLASS lcl_oo_class_new DEFINITION INHERITING FROM lcl_oo_class.
+
+ PUBLIC SECTION.
+ METHODS:
+ lif_oo_object_fnc~create REDEFINITION,
+ lif_oo_object_fnc~generate_locals REDEFINITION,
+ lif_oo_object_fnc~deserialize_source REDEFINITION.
+
+ PRIVATE SECTION.
+ CLASS-METHODS:
+ update_report
+ IMPORTING
+ iv_program TYPE programm
+ it_source TYPE string_table
+ RETURNING
+ VALUE(rv_updated) TYPE abap_bool,
+ generate_classpool
+ IMPORTING
+ iv_name TYPE seoclsname
+ RAISING
+ lcx_exception,
+ update_meta
+ IMPORTING
+ iv_name TYPE seoclsname
+ iv_exposure TYPE seoexpose
+ it_source TYPE rswsourcet
+ RAISING
+ lcx_exception,
+ determine_method_include
+ IMPORTING
+ iv_name TYPE seoclsname
+ iv_method TYPE seocpdname
+ RETURNING
+ VALUE(rv_program) TYPE programm
+ RAISING
+ lcx_exception,
+ init_scanner
+ IMPORTING
+ it_source TYPE lif_defs=>ty_string_tt
+ iv_name TYPE seoclsname
+ RETURNING
+ VALUE(ro_scanner) TYPE REF TO cl_oo_source_scanner_class.
+
+ENDCLASS.
+
+CLASS lcl_oo_class_new IMPLEMENTATION.
+
+ METHOD determine_method_include.
+
+ DATA: ls_mtdkey TYPE seocpdkey.
+
+
+ ls_mtdkey-clsname = iv_name.
+ ls_mtdkey-cpdname = iv_method.
+
+ cl_oo_classname_service=>get_method_include(
+ EXPORTING
+ mtdkey = ls_mtdkey
+ RECEIVING
+ result = rv_program
+ EXCEPTIONS
+ method_not_existing = 1 ).
+ IF sy-subrc = 0.
+ RETURN.
+ ENDIF.
+
+ CALL FUNCTION 'SEO_METHOD_GENERATE_INCLUDE'
+ EXPORTING
+ suppress_mtdkey_check = seox_true
+ mtdkey = ls_mtdkey
+ EXCEPTIONS
+ not_existing = 1
+ model_only = 2
+ include_existing = 3
+ method_imp_not_generated = 4
+ method_imp_not_initialised = 5
+ _internal_class_not_existing = 6
+ _internal_method_overflow = 7
+ cancelled = 8
+ method_is_abstract_implemented = 9
+ method_is_final_implemented = 10
+ internal_error_insert_report = 11
+ OTHERS = 12.
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from SEO_METHOD_GENERATE_INCLUDE' ).
+ ENDIF.
+
+ rv_program = cl_oo_classname_service=>get_method_include( ls_mtdkey ).
+
+ ENDMETHOD.
+
+ METHOD lif_oo_object_fnc~create.
+* same as in super class, but with "version = seoc_version_active"
+
+ CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE'
+ EXPORTING
+ devclass = iv_package
+ overwrite = iv_overwrite
+ version = seoc_version_active
+ CHANGING
+ class = is_properties
+ EXCEPTIONS
+ existing = 1
+ is_interface = 2
+ db_error = 3
+ component_error = 4
+ no_access = 5
+ other = 6
+ OTHERS = 7.
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD init_scanner.
+
+ ro_scanner = cl_oo_source_scanner_class=>create_class_scanner(
+ clif_name = iv_name
+ source = it_source ).
+ ro_scanner->scan( ).
+
+ ENDMETHOD.
+
+ METHOD update_report.
+
+ DATA: lt_old TYPE string_table.
+
+ READ REPORT iv_program INTO lt_old.
+ ASSERT sy-subrc = 0. " include should have been created previously
+ IF lt_old <> it_source.
+ INSERT REPORT iv_program FROM it_source.
+ ASSERT sy-subrc = 0.
+ rv_updated = abap_true.
+ ELSE.
+ rv_updated = abap_false.
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD lif_oo_object_fnc~generate_locals.
+
+ DATA: lv_program TYPE programm.
+
+
+ lv_program = cl_oo_classname_service=>get_ccdef_name( is_key-clsname ).
+ update_report( iv_program = lv_program
+ it_source = it_local_definitions ).
+
+ lv_program = cl_oo_classname_service=>get_ccimp_name( is_key-clsname ).
+ update_report( iv_program = lv_program
+ it_source = it_local_implementations ).
+
+ lv_program = cl_oo_classname_service=>get_ccmac_name( is_key-clsname ).
+ update_report( iv_program = lv_program
+ it_source = it_local_macros ).
+
+ IF lines( it_local_test_classes ) > 0.
+ lv_program = cl_oo_classname_service=>get_ccau_name( is_key-clsname ).
+ update_report( iv_program = lv_program
+ it_source = it_local_test_classes ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD update_meta.
+
+ DATA: lo_update TYPE REF TO cl_oo_class_section_source,
+ ls_clskey TYPE seoclskey,
+ lv_scan_error TYPE seox_boolean.
+
+
+ ls_clskey-clsname = iv_name.
+
+ CREATE OBJECT lo_update
+ EXPORTING
+ clskey = ls_clskey
+ exposure = iv_exposure
+ state = 'A'
+ source = it_source
+ suppress_constrctr_generation = seox_true
+ EXCEPTIONS
+ class_not_existing = 1
+ read_source_error = 2
+ OTHERS = 3.
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error instantiating CL_OO_CLASS_SECTION_SOURCE' ).
+ ENDIF.
+
+ lo_update->set_dark_mode( seox_true ).
+ TRY.
+ CALL METHOD lo_update->('SET_AMDP_SUPPORT')
+ EXPORTING
+ enabled = abap_true.
+ CATCH cx_sy_dyn_call_illegal_method.
+* AMDP not supported in this system, ignore error
+ ENDTRY.
+ lo_update->scan_section_source(
+ RECEIVING
+ scan_error = lv_scan_error
+ EXCEPTIONS
+ scan_abap_source_error = 1
+ OTHERS = 2 ).
+ IF sy-subrc <> 0 OR lv_scan_error = abap_true.
+ lcx_exception=>raise( 'CLAS, error while scanning source' ).
+ ENDIF.
+
+* this will update the SEO* database tables
+ lo_update->revert_scan_result( ).
+
+ IF iv_exposure = seoc_exposure_public.
+ generate_classpool( iv_name ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD generate_classpool.
+
+ DATA: ls_clskey TYPE seoclskey.
+
+ ls_clskey-clsname = iv_name.
+
+ CALL FUNCTION 'SEO_CLASS_GENERATE_CLASSPOOL'
+ EXPORTING
+ clskey = ls_clskey
+ suppress_corr = seox_true
+ EXCEPTIONS
+ not_existing = 1
+ model_only = 2
+ class_pool_not_generated = 3
+ class_stment_not_generated = 4
+ locals_not_generated = 5
+ macros_not_generated = 6
+ public_sec_not_generated = 7
+ protected_sec_not_generated = 8
+ private_sec_not_generated = 9
+ typeref_not_generated = 10
+ class_pool_not_initialised = 11
+ class_stment_not_initialised = 12
+ locals_not_initialised = 13
+ macros_not_initialised = 14
+ public_sec_not_initialised = 15
+ protected_sec_not_initialised = 16
+ private_sec_not_initialised = 17
+ typeref_not_initialised = 18
+ _internal_class_overflow = 19
+ OTHERS = 20.
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from SEO_CLASS_GENERATE_CLASSPOOL' ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD lif_oo_object_fnc~deserialize_source.
+
+ DATA: lv_updated TYPE abap_bool,
+ lv_program TYPE program,
+ lo_scanner TYPE REF TO cl_oo_source_scanner_class,
+ lt_methods TYPE cl_oo_source_scanner_class=>type_method_implementations,
+ lv_method LIKE LINE OF lt_methods,
+ lt_source TYPE seop_source_string.
+
+
+ lo_scanner = init_scanner(
+ it_source = it_source
+ iv_name = is_key-clsname ).
+
+* public
+ lt_source = lo_scanner->get_public_section_source( ).
+ lv_program = cl_oo_classname_service=>get_pubsec_name( is_key-clsname ).
+ lv_updated = update_report( iv_program = lv_program
+ it_source = lt_source ).
+ IF lv_updated = abap_true.
+ update_meta( iv_name = is_key-clsname
+ iv_exposure = seoc_exposure_public
+ it_source = lt_source ).
+ ENDIF.
+
+* protected
+ lt_source = lo_scanner->get_protected_section_source( ).
+ lv_program = cl_oo_classname_service=>get_prosec_name( is_key-clsname ).
+ lv_updated = update_report( iv_program = lv_program
+ it_source = lt_source ).
+ IF lv_updated = abap_true.
+ update_meta( iv_name = is_key-clsname
+ iv_exposure = seoc_exposure_protected
+ it_source = lt_source ).
+ ENDIF.
+
+* private
+ lt_source = lo_scanner->get_private_section_source( ).
+ lv_program = cl_oo_classname_service=>get_prisec_name( is_key-clsname ).
+ lv_updated = update_report( iv_program = lv_program
+ it_source = lt_source ).
+ IF lv_updated = abap_true.
+ update_meta( iv_name = is_key-clsname
+ iv_exposure = seoc_exposure_private
+ it_source = lt_source ).
+ ENDIF.
+
+* methods
+ lt_methods = lo_scanner->get_method_implementations( ).
+
+ LOOP AT lt_methods INTO lv_method.
+ TRY.
+ lt_source = lo_scanner->get_method_impl_source( lv_method ).
+ CATCH cx_oo_clif_component.
+ lcx_exception=>raise( 'error from GET_METHOD_IMPL_SOURCE' ).
+ ENDTRY.
+ lv_program = determine_method_include(
+ iv_name = is_key-clsname
+ iv_method = lv_method ).
+
+ update_report(
+ iv_program = lv_program
+ it_source = lt_source ).
+ ENDLOOP.
+
+ ENDMETHOD.
+
+ENDCLASS.
+
+CLASS lcl_object_clas_new DEFINITION INHERITING FROM lcl_object_clas.
+
+ PUBLIC SECTION.
+ METHODS: constructor
+ IMPORTING
+ is_item TYPE lif_defs=>ty_item
+ iv_language TYPE spras.
+
+ PROTECTED SECTION.
+ METHODS:
+ deserialize_abap REDEFINITION.
+
+ENDCLASS.
+
+CLASS lcl_object_clas_new IMPLEMENTATION.
+
+ METHOD constructor.
+ super->constructor( is_item = is_item
+ iv_language = iv_language ).
+
+ CREATE OBJECT mo_object_oriented_object_fct TYPE lcl_oo_class_new.
+ ENDMETHOD.
+
+ METHOD deserialize_abap.
+* same as in lcl_object_clas, but without "mo_object_oriented_object_fct->add_to_activation_list"
+
+ DATA: ls_vseoclass TYPE vseoclass,
+ lt_source TYPE seop_source_string,
+ lt_local_definitions TYPE seop_source_string,
+ lt_local_implementations TYPE seop_source_string,
+ lt_local_macros TYPE seop_source_string,
+ lt_test_classes TYPE seop_source_string,
+ lt_descriptions TYPE lif_defs=>ty_seocompotx_tt,
+ ls_class_key TYPE seoclskey.
+
+
+ lt_source = mo_files->read_abap( ).
+
+ lt_local_definitions = mo_files->read_abap( iv_extra = 'locals_def'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ lt_local_implementations = mo_files->read_abap( iv_extra = 'locals_imp'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ lt_local_macros = mo_files->read_abap( iv_extra = 'macros'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ lt_test_classes = mo_files->read_abap( iv_extra = 'testclasses'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ ls_class_key-clsname = ms_item-obj_name.
+
+ io_xml->read( EXPORTING iv_name = 'VSEOCLASS'
+ CHANGING cg_data = ls_vseoclass ).
+
+ mo_object_oriented_object_fct->create(
+ EXPORTING
+ iv_package = iv_package
+ CHANGING
+ is_properties = ls_vseoclass ).
+
+ mo_object_oriented_object_fct->generate_locals(
+ is_key = ls_class_key
+ iv_force = seox_true
+ it_local_definitions = lt_local_definitions
+ it_local_implementations = lt_local_implementations
+ it_local_macros = lt_local_macros
+ it_local_test_classes = lt_test_classes ).
+
+ mo_object_oriented_object_fct->deserialize_source(
+ is_key = ls_class_key
+ it_source = lt_source ).
+
+ io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
+ CHANGING cg_data = lt_descriptions ).
+
+ mo_object_oriented_object_fct->update_descriptions(
+ is_key = ls_class_key
+ it_descriptions = lt_descriptions ).
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zabapgit_object_clas_new.prog.xml b/src/zabapgit_object_clas_new.prog.xml
new file mode 100644
index 000000000..7216bb678
--- /dev/null
+++ b/src/zabapgit_object_clas_new.prog.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_CLAS_NEW
+ A
+ X
+ I
+ E
+ X
+
+
+ -
+ R
+ Include ZABAPGIT_OBJECT_CLAS_NEW
+ 32
+
+
+
+
+
diff --git a/src/zabapgit_object_cmpt.prog.abap b/src/zabapgit_object_cmpt.prog.abap
new file mode 100644
index 000000000..63b7ebb77
--- /dev/null
+++ b/src/zabapgit_object_cmpt.prog.abap
@@ -0,0 +1,213 @@
+*&---------------------------------------------------------------------*
+*& Include ZABAPGIT_OBJECT_CMPT
+*&---------------------------------------------------------------------*
+
+CLASS lcl_object_cmpt DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ METHODS:
+ constructor
+ IMPORTING
+ is_item TYPE lif_defs=>ty_item
+ iv_language TYPE spras.
+
+ INTERFACES lif_object.
+
+ PRIVATE SECTION.
+ DATA: mo_cmp_db TYPE REF TO object.
+
+ENDCLASS.
+
+CLASS lcl_object_cmpt IMPLEMENTATION.
+
+ METHOD constructor.
+
+ super->constructor( is_item = is_item
+ iv_language = iv_language ).
+
+ TRY.
+ CALL METHOD ('CL_CMP_TEMPLATE')=>('S_GET_DB_ACCESS')
+ RECEIVING
+ r_ref_db_access = mo_cmp_db.
+
+ CATCH cx_root.
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~has_changed_since.
+
+ rv_changed = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~changed_by.
+
+ DATA: mi_cmp_template TYPE REF TO object.
+
+ TRY.
+ CALL METHOD ('CL_CMP_TEMPLATE')=>('S_CREATE_FROM_DB')
+ EXPORTING
+ i_name = |{ ms_item-obj_name }|
+ i_version = 'A'
+ RECEIVING
+ r_ref_template = mi_cmp_template.
+
+ CALL METHOD mi_cmp_template->('IF_CMP_TEMPLATE_EDIT~GET_CHANGE_USER')
+ RECEIVING
+ r_user = rv_user.
+
+ CATCH cx_root.
+ lcx_exception=>raise( 'CMPT not supported' ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+
+ rs_metadata = get_metadata( ).
+ rs_metadata-delete_tadir = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~exists.
+
+ DATA: name TYPE c LENGTH 30.
+
+ name = ms_item-obj_name.
+
+ TRY.
+ CALL METHOD ('CL_CMP_TEMPLATE')=>('S_TEMPLATE_EXISTS')
+ EXPORTING
+ i_name = name
+ i_version = 'A'
+ RECEIVING
+ r_flg_exists = rv_bool.
+
+ CATCH cx_root.
+ lcx_exception=>raise( 'CMPT not supported' ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~serialize.
+
+ DATA: lr_template TYPE REF TO data.
+ FIELD-SYMBOLS: TYPE any.
+
+ TRY.
+ CREATE DATA lr_template TYPE ('IF_CMP_TEMPLATE_DB=>TYP_TEMPLATE').
+ ASSIGN lr_template->* TO .
+
+ CALL METHOD mo_cmp_db->('IF_CMP_TEMPLATE_DB~READ_TEMPLATE')
+ EXPORTING
+ i_name = |{ ms_item-obj_name }|
+ i_version = 'A'
+ RECEIVING
+ r_template = .
+
+ io_xml->add( iv_name = 'CMPT'
+ ig_data = ).
+
+ CATCH cx_root.
+ lcx_exception=>raise( 'CMPT not supported' ).
+ ENDTRY.
+
+
+ ENDMETHOD.
+
+ METHOD lif_object~deserialize.
+
+ DATA: lr_template TYPE REF TO data.
+ FIELD-SYMBOLS: TYPE any.
+
+ TRY.
+ CREATE DATA lr_template TYPE ('IF_CMP_TEMPLATE_DB=>TYP_TEMPLATE').
+ ASSIGN lr_template->* TO .
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'CMPT'
+ CHANGING
+ cg_data = ).
+
+ CALL METHOD mo_cmp_db->('IF_CMP_TEMPLATE_DB~SAVE_TEMPLATE')
+ EXPORTING
+ i_template_db =
+ i_flg_header = abap_true
+ i_flg_lines = abap_true.
+
+ CATCH cx_root.
+ lcx_exception=>raise( 'CMPT not supported' ).
+ ENDTRY.
+
+ CALL FUNCTION 'RS_CORR_INSERT'
+ EXPORTING
+ object = ms_item-obj_name
+ object_class = ms_item-obj_type
+ mode = 'I'
+ global_lock = abap_true
+ devclass = iv_package
+ master_language = mv_language
+ EXCEPTIONS
+ cancelled = 1
+ permission_failure = 2
+ unknown_objectclass = 3
+ OTHERS = 4.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from RS_CORR_INSERT, CMPT' ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD lif_object~delete.
+
+ DATA: deleted TYPE abap_bool.
+
+ TRY.
+ CALL METHOD mo_cmp_db->('IF_CMP_TEMPLATE_DB~DELETE_TEMPLATE')
+ EXPORTING
+ i_name = |{ ms_item-obj_name }|
+ i_version = 'A'
+ i_flg_header = abap_true
+ i_flg_lines = abap_true
+ RECEIVING
+ r_flg_deleted = deleted.
+
+ CATCH cx_root.
+ lcx_exception=>raise( 'CMPT not supported' ).
+ ENDTRY.
+
+ IF deleted = abap_false.
+ lcx_exception=>raise( |Error deleting CMPT { ms_item-obj_name }| ).
+ ENDIF.
+
+ ENDMETHOD.
+
+
+ METHOD lif_object~jump.
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type
+ EXCEPTIONS
+ not_executed = 1
+ invalid_object_type = 2
+ OTHERS = 3.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( |Error from RS_TOOL_ACCESS, CMPT| ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD lif_object~compare_to_remote_version.
+
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zabapgit_object_cmpt.prog.xml b/src/zabapgit_object_cmpt.prog.xml
new file mode 100644
index 000000000..fc9840ac2
--- /dev/null
+++ b/src/zabapgit_object_cmpt.prog.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_CMPT
+ A
+ X
+ I
+ E
+ X
+
+
+ -
+ R
+ Include ZABAPGIT_OBJECT_CMPT
+ 28
+
+
+
+
+
diff --git a/src/zabapgit_object_ddls.prog.abap b/src/zabapgit_object_ddls.prog.abap
index fcf760998..a79e61e70 100644
--- a/src/zabapgit_object_ddls.prog.abap
+++ b/src/zabapgit_object_ddls.prog.abap
@@ -32,8 +32,42 @@ CLASS lcl_object_ddls IMPLEMENTATION.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by.
-* todo
- rv_user = c_user_unknown.
+
+ DATA: lv_state TYPE objstate,
+ li_ddl TYPE REF TO object,
+ lr_data TYPE REF TO data.
+
+ FIELD-SYMBOLS: TYPE any,
+ TYPE any.
+
+
+ CREATE DATA lr_data TYPE ('DDDDLSRCV').
+ ASSIGN lr_data->* TO .
+
+
+ CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE')
+ RECEIVING
+ handler = li_ddl.
+
+ TRY.
+ CALL METHOD li_ddl->('IF_DD_DDL_HANDLER~READ')
+ EXPORTING
+ name = ms_item-obj_name
+ get_state = 'A'
+ IMPORTING
+ ddddlsrcv_wa = .
+
+ ASSIGN COMPONENT 'AS4USER' OF STRUCTURE TO .
+ IF sy-subrc = 0.
+ rv_user = .
+ ENDIF.
+ CATCH cx_root.
+ ENDTRY.
+
+ IF rv_user IS INITIAL.
+ rv_user = c_user_unknown.
+ ENDIF.
+
ENDMETHOD. "lif_object~changed_by
METHOD lif_object~get_metadata.
@@ -108,7 +142,7 @@ CLASS lcl_object_ddls IMPLEMENTATION.
EXPORTING
name = ms_item-obj_name.
CATCH cx_root.
- lcx_exception=>raise( 'DDLS error' ).
+ lcx_exception=>raise( 'DDLS error deleting' ).
ENDTRY.
ENDMETHOD. "delete
@@ -137,7 +171,7 @@ CLASS lcl_object_ddls IMPLEMENTATION.
IMPORTING
ddddlsrcv_wa = .
CATCH cx_root.
- lcx_exception=>raise( 'DDLS error' ).
+ lcx_exception=>raise( 'DDLS error reading' ).
ENDTRY.
ASSIGN COMPONENT 'AS4USER' OF STRUCTURE TO .
@@ -199,7 +233,7 @@ CLASS lcl_object_ddls IMPLEMENTATION.
devclass = iv_package
prid = 0.
CATCH cx_root.
- lcx_exception=>raise( 'DDLS error' ).
+ lcx_exception=>raise( 'DDLS error writing TADIR' ).
ENDTRY.
lcl_objects_activation=>add_item( ms_item ).
diff --git a/src/zabapgit_object_dial.prog.abap b/src/zabapgit_object_dial.prog.abap
new file mode 100644
index 000000000..1f9dd63f6
--- /dev/null
+++ b/src/zabapgit_object_dial.prog.abap
@@ -0,0 +1,205 @@
+*&---------------------------------------------------------------------*
+*& Include zabapgit_object_dial
+*&---------------------------------------------------------------------*
+
+
+CLASS lcl_object_dial DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ INTERFACES lif_object.
+
+ PRIVATE SECTION.
+ TYPES: BEGIN OF ty_dialog_module,
+ tdct TYPE tdct,
+ dia_pars TYPE STANDARD TABLE OF diapar
+ WITH NON-UNIQUE DEFAULT KEY,
+ END OF ty_dialog_module.
+
+ METHODS:
+ _read_tdct
+ RETURNING
+ VALUE(rs_tdct) TYPE tdct.
+
+ENDCLASS.
+
+CLASS lcl_object_dial IMPLEMENTATION.
+
+ METHOD lif_object~has_changed_since.
+
+ rv_changed = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~changed_by.
+
+ rv_user = c_user_unknown.
+
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+
+ rs_metadata = get_metadata( ).
+
+ ENDMETHOD.
+
+ METHOD lif_object~exists.
+
+ DATA: ls_tdct TYPE tdct.
+
+ ls_tdct = _read_tdct( ).
+
+ rv_bool = boolc( ls_tdct IS NOT INITIAL ).
+
+ ENDMETHOD.
+
+ METHOD lif_object~serialize.
+
+ DATA: ls_dialog_module TYPE ty_dialog_module.
+
+ ls_dialog_module-tdct = _read_tdct( ).
+
+ SELECT * FROM diapar
+ INTO TABLE ls_dialog_module-dia_pars
+ WHERE dnam = ls_dialog_module-tdct-dnam.
+
+ io_xml->add( iv_name = 'DIAL'
+ ig_data = ls_dialog_module ).
+
+ ENDMETHOD.
+
+ METHOD lif_object~deserialize.
+
+ DATA: ls_dialog_module TYPE ty_dialog_module.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'DIAL'
+ CHANGING
+ cg_data = ls_dialog_module ).
+
+ CALL FUNCTION 'RS_DIALOG_CREATE'
+ EXPORTING
+ dialogname = ls_dialog_module-tdct-dnam
+ dynpronumber = ls_dialog_module-tdct-dynr
+ programname = ls_dialog_module-tdct-prog
+ suppress_corr_check = abap_false
+* It seems that dia_par parameter doesn't do anything, but we can't omit it
+* Parameters are inserted below
+ TABLES
+ dia_par = ls_dialog_module-dia_pars
+ EXCEPTIONS
+ dialog_already_exists = 1
+ invalid_name = 2
+ OTHERS = 3.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( |Error deserializing dialogmodule { ms_item-obj_name }| ).
+ ENDIF.
+
+ " It seems that there's no API for diapar, therefore we manipulate it directly
+ INSERT diapar FROM TABLE ls_dialog_module-dia_pars.
+
+ ENDMETHOD.
+
+ METHOD lif_object~delete.
+
+ DATA: ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ ls_bcdata-program = 'SAPMSDIA'.
+ ls_bcdata-dynpro = '1010'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'DIAPAR-DNAM'.
+ ls_bcdata-fval = ms_item-obj_name.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'RS38L-PARM'.
+ ls_bcdata-fval = abap_true.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=DELF'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-program = 'SAPLSPO1'.
+ ls_bcdata-dynpro = '0100'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=YES'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ ls_bcdata-program = 'SAPMSDIA'.
+ ls_bcdata-dynpro = '1010'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=BACK'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ EXPORTING
+ tcode = 'SE35'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SE35' ).
+ ENDIF.
+
+ ENDMETHOD.
+
+
+ METHOD lif_object~jump.
+
+ DATA: objectname TYPE tdct-dnam.
+
+ objectname = ms_item-obj_name.
+
+ CALL FUNCTION 'RS_DIALOG_SHOW'
+ EXPORTING
+ objectname = objectname
+ type = 'VW'
+ EXCEPTIONS
+ object_not_found = 1
+ OTHERS = 2.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( |Error from RS_DIALOG_SHOW, DIAL| ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD lif_object~compare_to_remote_version.
+
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+
+ ENDMETHOD.
+
+
+ METHOD _read_tdct.
+
+ DATA: dnam TYPE tdct-dnam.
+
+ dnam = ms_item-obj_name.
+
+ SELECT SINGLE * FROM tdct
+ INTO rs_tdct
+ WHERE dnam = dnam.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zabapgit_object_dial.prog.xml b/src/zabapgit_object_dial.prog.xml
new file mode 100644
index 000000000..eb942b95c
--- /dev/null
+++ b/src/zabapgit_object_dial.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_DIAL
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ zabapgit_object_dial
+ 20
+
+
+
+
+
diff --git a/src/zabapgit_object_doct.prog.abap b/src/zabapgit_object_doct.prog.abap
index 6700ab155..dccb66670 100644
--- a/src/zabapgit_object_doct.prog.abap
+++ b/src/zabapgit_object_doct.prog.abap
@@ -21,7 +21,7 @@ CLASS lcl_object_doct DEFINITION INHERITING FROM lcl_objects_super FINAL.
END OF ty_data.
METHODS: read
- RETURNING value(rs_data) TYPE ty_data.
+ RETURNING VALUE(rs_data) TYPE ty_data.
ENDCLASS. "lcl_object_msag DEFINITION
@@ -65,6 +65,9 @@ CLASS lcl_object_doct IMPLEMENTATION.
METHOD lif_object~changed_by.
rv_user = read( )-head-tdluser.
+ IF rv_user IS INITIAL.
+ rv_user = c_user_unknown.
+ ENDIF.
ENDMETHOD. "lif_object~changed_by
METHOD lif_object~exists.
@@ -85,7 +88,48 @@ CLASS lcl_object_doct IMPLEMENTATION.
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, jump DOCT' ).
+ DATA: ls_dokentry TYPE dokentry,
+ ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ " We need to modify dokentry directly, otherwise
+ " Batch Input on SE61 wouldn't work because it stores
+ " the last seen Document Class in this table. There's
+ " no standard function to do this. SE61 does this
+ " directly in its dialog modules
+ ls_dokentry-username = sy-uname.
+ ls_dokentry-langu = sy-langu.
+ ls_dokentry-class = c_id.
+ MODIFY dokentry FROM ls_dokentry.
+
+ ls_bcdata-program = 'SAPMSDCU'.
+ ls_bcdata-dynpro = '0100'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'RSDCU-OBJECT7'.
+ ls_bcdata-fval = ms_item-obj_name.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=SHOW'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ STARTING NEW TASK 'GIT'
+ EXPORTING
+ tcode = 'SE61'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, DOCT' ).
+ ENDIF.
ENDMETHOD. "jump
diff --git a/src/zabapgit_object_docv.prog.abap b/src/zabapgit_object_docv.prog.abap
index da0aaaeea..9efd1cec8 100644
--- a/src/zabapgit_object_docv.prog.abap
+++ b/src/zabapgit_object_docv.prog.abap
@@ -87,7 +87,7 @@ CLASS lcl_object_docv IMPLEMENTATION.
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, jump DOCT' ).
+ lcx_exception=>raise( 'todo, jump DOCV' ).
ENDMETHOD. "jump
diff --git a/src/zabapgit_object_doma.prog.abap b/src/zabapgit_object_doma.prog.abap
index bd8194ce9..df967d82f 100644
--- a/src/zabapgit_object_doma.prog.abap
+++ b/src/zabapgit_object_doma.prog.abap
@@ -168,6 +168,10 @@ CLASS lcl_object_doma IMPLEMENTATION.
CLEAR ls_dd01v-masklen.
ENDIF.
+ SORT lt_dd07v BY
+ valpos ASCENDING
+ ddlanguage ASCENDING.
+
io_xml->add( iv_name = 'DD01V'
ig_data = ls_dd01v ).
io_xml->add( iv_name = 'DD07V_TAB'
@@ -278,7 +282,7 @@ CLASS lcl_object_doma IMPLEMENTATION.
SORT lt_i18n_langs ASCENDING.
SORT lt_dd01_texts BY ddlanguage ASCENDING.
- SORT lt_dd07_texts BY ddlanguage ASCENDING.
+ SORT lt_dd07_texts BY valpos ASCENDING ddlanguage ASCENDING.
IF lines( lt_i18n_langs ) > 0.
io_xml->add( iv_name = 'I18N_LANGS'
diff --git a/src/zabapgit_object_dtel.prog.abap b/src/zabapgit_object_dtel.prog.abap
index cb2bac785..44d54a9bb 100644
--- a/src/zabapgit_object_dtel.prog.abap
+++ b/src/zabapgit_object_dtel.prog.abap
@@ -154,7 +154,7 @@ CLASS lcl_object_dtel IMPLEMENTATION.
ON tparat~paramid = tpara~paramid AND
tparat~sprache = mv_language
INTO ls_tpara
- WHERE tpara~paramid = ls_dd04v-memoryid.
+ WHERE tpara~paramid = ls_dd04v-memoryid. "#EC CI_BUFFJOIN
ENDIF.
CLEAR: ls_dd04v-as4user,
diff --git a/src/zabapgit_object_enho.prog.abap b/src/zabapgit_object_enho.prog.abap
index 176963fd5..03330fda4 100644
--- a/src/zabapgit_object_enho.prog.abap
+++ b/src/zabapgit_object_enho.prog.abap
@@ -131,6 +131,133 @@ CLASS lcl_object_enho_wdyc IMPLEMENTATION.
ENDCLASS. "lcl_object_enho_wdyconf IMPLEMENTATION
+*----------------------------------------------------------------------*
+* CLASS lcl_object_enho_wdyconf DEFINITION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS lcl_object_enho_wdyn DEFINITION.
+
+ PUBLIC SECTION.
+ METHODS: constructor
+ IMPORTING
+ is_item TYPE lif_defs=>ty_item
+ io_files TYPE REF TO lcl_objects_files.
+ INTERFACES: lif_object_enho.
+
+ PRIVATE SECTION.
+ DATA: ms_item TYPE lif_defs=>ty_item,
+ mo_files TYPE REF TO lcl_objects_files.
+
+ENDCLASS. "lcl_object_enho_wdyconf DEFINITION
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_enho_wdyconf IMPLEMENTATION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS lcl_object_enho_wdyn IMPLEMENTATION.
+
+ METHOD constructor.
+ ms_item = is_item.
+ mo_files = io_files.
+ ENDMETHOD. "constructor
+
+ METHOD lif_object_enho~deserialize.
+
+ DATA: ls_enh_data TYPE enhwdyn,
+ li_tool TYPE REF TO if_enh_tool,
+ lo_wdyn TYPE REF TO cl_enh_tool_wdy,
+ tool_type TYPE enhtooltype,
+ package TYPE devclass.
+
+ FIELD-SYMBOLS: TYPE enhwdyc,
+ TYPE enhwdyv.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'TOOL'
+ CHANGING
+ cg_data = tool_type ).
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'COMPONENT_DATA'
+ CHANGING
+ cg_data = ls_enh_data ).
+
+ package = iv_package.
+
+ TRY.
+ cl_enh_factory=>create_enhancement(
+ EXPORTING
+ enhname = |{ ms_item-obj_name }|
+ enhtype = ''
+ enhtooltype = tool_type
+ IMPORTING
+ enhancement = li_tool
+ CHANGING
+ devclass = package ).
+
+ lo_wdyn ?= li_tool.
+
+ lo_wdyn->initialize( ls_enh_data-component_name ).
+
+ lo_wdyn->set_component_data( ls_enh_data-component_data ).
+
+ LOOP AT ls_enh_data-controller_data ASSIGNING .
+
+ lo_wdyn->set_controller_data( p_controller_name = -controller_name
+ p_enh_data = ).
+
+ ENDLOOP.
+
+ LOOP AT ls_enh_data-view_data ASSIGNING .
+
+ lo_wdyn->set_view_data( p_view_name = -view_name
+ p_enh_data = ).
+
+ ENDLOOP.
+
+ lo_wdyn->if_enh_object~save( ).
+ lo_wdyn->if_enh_object~unlock( ).
+
+ CATCH cx_root.
+ lcx_exception=>raise( |error deserializing ENHO wdyn { ms_item-obj_name }| ).
+ ENDTRY.
+
+ ENDMETHOD. "lif_object_enho~deserialize
+
+ METHOD lif_object_enho~serialize.
+
+ DATA: lo_wdyn TYPE REF TO cl_enh_tool_wdy,
+ component_name TYPE wdy_component_name,
+ ls_enh_data TYPE enhwdyn.
+
+ lo_wdyn ?= ii_enh_tool.
+
+ component_name = lo_wdyn->get_component_name( ).
+
+ TRY.
+ lo_wdyn->get_all_data_for_comp(
+ EXPORTING
+ p_component_name = component_name
+ IMPORTING
+ p_enh_data = ls_enh_data ).
+
+ io_xml->add( iv_name = 'TOOL'
+ ig_data = ii_enh_tool->get_tool( ) ).
+
+ io_xml->add( iv_name = 'COMPONENT_DATA'
+ ig_data = ls_enh_data ).
+
+ CATCH cx_enh_not_found.
+ lcx_exception=>raise( |error serializing ENHO wdyn { ms_item-obj_name }| ).
+ ENDTRY.
+
+ ENDMETHOD. "lif_object_enho~serialize
+
+ENDCLASS. "lcl_object_enho_wdyconf IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_clif DEFINITION
@@ -159,7 +286,6 @@ CLASS lcl_object_enho_clif DEFINITION.
RAISING lcx_exception.
ENDCLASS. "lcl_object_enho_clif DEFINITION
-
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_clif IMPLEMENTATION
*----------------------------------------------------------------------*
@@ -873,6 +999,136 @@ CLASS lcl_object_enho_class IMPLEMENTATION.
ENDCLASS. "lcl_object_enho_class IMPLEMENTATION
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_enho_wdyconf DEFINITION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS lcl_object_enho_fugr DEFINITION.
+
+ PUBLIC SECTION.
+ METHODS: constructor
+ IMPORTING
+ is_item TYPE lif_defs=>ty_item
+ io_files TYPE REF TO lcl_objects_files.
+ INTERFACES: lif_object_enho.
+
+ PRIVATE SECTION.
+ DATA: ms_item TYPE lif_defs=>ty_item,
+ mo_files TYPE REF TO lcl_objects_files.
+
+ENDCLASS. "lcl_object_enho_wdyconf DEFINITION
+
+*----------------------------------------------------------------------*
+* CLASS lcl_object_enho_wdyconf IMPLEMENTATION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS lcl_object_enho_fugr IMPLEMENTATION.
+
+ METHOD constructor.
+ ms_item = is_item.
+ mo_files = io_files.
+ ENDMETHOD. "constructor
+
+ METHOD lif_object_enho~deserialize.
+
+ DATA: lo_fugrdata TYPE REF TO cl_enh_tool_fugr,
+ ls_enha_data TYPE enhfugrdata,
+ li_tool TYPE REF TO if_enh_tool,
+ tool TYPE enhtooltype,
+ lv_package TYPE devclass.
+
+ FIELD-SYMBOLS: TYPE enhfugrfuncdata.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'TOOL'
+ CHANGING
+ cg_data = tool ).
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'FUGRDATA'
+ CHANGING
+ cg_data = ls_enha_data ).
+
+ lv_package = iv_package.
+
+ TRY.
+ cl_enh_factory=>create_enhancement(
+ EXPORTING
+ enhname = |{ ms_item-obj_name }|
+ enhtype = ''
+ enhtooltype = tool
+ IMPORTING
+ enhancement = li_tool
+ CHANGING
+ devclass = lv_package ).
+
+ lo_fugrdata ?= li_tool.
+
+ lo_fugrdata->set_fugr( ls_enha_data-fugr ).
+
+ LOOP AT ls_enha_data-enh_fubas ASSIGNING .
+
+ lo_fugrdata->set_func_data( func_name = -fuba
+ func_enhadata = ).
+
+ ENDLOOP.
+
+ lo_fugrdata->if_enh_object~save( ).
+ lo_fugrdata->if_enh_object~unlock( ).
+
+ CATCH cx_enh_root.
+ lcx_exception=>raise( |error deserializing ENHO fugrdata { ms_item-obj_name }| ).
+ ENDTRY.
+
+ ENDMETHOD. "lif_object_enho~deserialize
+
+ METHOD lif_object_enho~serialize.
+
+ DATA: lo_fugrdata TYPE REF TO cl_enh_tool_fugr,
+ fugr_name TYPE rs38l-area,
+ ls_enha_data TYPE enhfugrdata.
+
+ FIELD-SYMBOLS: TYPE enhfugrparamdocu.
+
+ lo_fugrdata ?= ii_enh_tool.
+
+ lo_fugrdata->get_fugr(
+ IMPORTING
+ fugr_name = fugr_name ).
+
+ TRY.
+ lo_fugrdata->get_all_data_for_fugr(
+ EXPORTING
+ fugr_name = fugr_name
+ IMPORTING
+ enha_data = ls_enha_data ).
+
+ LOOP AT ls_enha_data-docuobjs ASSIGNING .
+
+ CLEAR: -shorttext,
+ -longtext.
+
+ ENDLOOP.
+
+ CATCH cx_enh_not_found.
+ lcx_exception=>raise( |error deserializing ENHO fugrdata { ms_item-obj_name }| ).
+ ENDTRY.
+
+ io_xml->add( iv_name = 'TOOL'
+ ig_data = lo_fugrdata->if_enh_tool~get_tool( ) ).
+
+ io_xml->add( iv_name = 'FUGRDATA'
+ ig_data = ls_enha_data ).
+
+ ENDMETHOD. "lif_object_enho~serialize
+
+ENDCLASS. "lcl_object_enho_wdyconf IMPLEMENTATION
+
*----------------------------------------------------------------------*
* CLASS lcl_object_enho DEFINITION
*----------------------------------------------------------------------*
@@ -891,7 +1147,7 @@ CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL.
IMPORTING
iv_tool TYPE enhtooltype
RETURNING
- value(ri_enho) TYPE REF TO lif_object_enho
+ VALUE(ri_enho) TYPE REF TO lif_object_enho
RAISING
lcx_exception.
@@ -988,9 +1244,16 @@ CLASS lcl_object_enho IMPLEMENTATION.
EXPORTING
is_item = ms_item
io_files = mo_files.
-* ToDo:
-* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr
-* WHEN 'ENHWDYN'. "cl_enh_tool_wdy
+ WHEN 'FUGRENH'.
+ CREATE OBJECT ri_enho TYPE lcl_object_enho_fugr
+ EXPORTING
+ is_item = ms_item
+ io_files = mo_files.
+ WHEN 'WDYENH'.
+ CREATE OBJECT ri_enho TYPE lcl_object_enho_wdyn
+ EXPORTING
+ is_item = ms_item
+ io_files = mo_files.
WHEN OTHERS.
lcx_exception=>raise( |Unsupported ENHO type { iv_tool }| ).
ENDCASE.
diff --git a/src/zabapgit_object_enhs.prog.abap b/src/zabapgit_object_enhs.prog.abap
index c15baca28..8eacc7b07 100644
--- a/src/zabapgit_object_enhs.prog.abap
+++ b/src/zabapgit_object_enhs.prog.abap
@@ -73,7 +73,7 @@ CLASS lcl_object_enhs IMPLEMENTATION.
EXPORTING
spot_name = lv_spot_name
tooltype = cl_enh_tool_badi_def=>tooltype
- dark = abap_true
+ dark = abap_false
compositename = lv_parent
IMPORTING
spot = li_spot_ref
diff --git a/src/zabapgit_object_fugr.prog.abap b/src/zabapgit_object_fugr.prog.abap
index 3fd94c39f..d6a779652 100644
--- a/src/zabapgit_object_fugr.prog.abap
+++ b/src/zabapgit_object_fugr.prog.abap
@@ -206,19 +206,34 @@ CLASS lcl_object_fugr IMPLEMENTATION.
METHOD deserialize_functions.
- DATA: lv_include TYPE rs38l-include,
- lv_area TYPE rs38l-area,
- lt_source TYPE TABLE OF abaptxt255.
+ DATA: lv_include TYPE rs38l-include,
+ lv_area TYPE rs38l-area,
+ lv_group TYPE rs38l-area,
+ lv_namespace TYPE rs38l-namespace,
+ lt_source TYPE TABLE OF abaptxt255,
+ lv_dummy TYPE string.
FIELD-SYMBOLS: LIKE LINE OF it_functions.
-
LOOP AT it_functions ASSIGNING .
lt_source = mo_files->read_abap( iv_extra = -funcname ).
lv_area = ms_item-obj_name.
+ CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
+ EXPORTING
+ complete_area = lv_area
+ IMPORTING
+ namespace = lv_namespace
+ group = lv_group
+ EXCEPTIONS
+ OTHERS = 12.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ).
+ ENDIF.
+
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = -funcname
@@ -244,13 +259,13 @@ CLASS lcl_object_fugr IMPLEMENTATION.
CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT'
EXPORTING
funcname = -funcname
- function_pool = lv_area
+ function_pool = lv_group
interface_global = -global_flag
remote_call = -remote_call
short_text = -short_text
update_task = -update_task
exception_class = -exception_classes
-* NAMESPACE = ' ' todo
+ namespace = lv_namespace
remote_basxml_supported = -remote_basxml
IMPORTING
function_include = lv_include
@@ -416,11 +431,12 @@ CLASS lcl_object_fugr IMPLEMENTATION.
cnam TYPE reposrc-cnam,
END OF ty_reposrc.
- DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc WITH DEFAULT KEY,
- ls_reposrc LIKE LINE OF lt_reposrc,
- lv_program TYPE program,
- lv_tabix LIKE sy-tabix,
- lt_functab TYPE ty_rs38l_incl_tt.
+ DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc WITH DEFAULT KEY,
+ ls_reposrc LIKE LINE OF lt_reposrc,
+ lv_program TYPE program,
+ lv_offset_ns TYPE i,
+ lv_tabix LIKE sy-tabix,
+ lt_functab TYPE ty_rs38l_incl_tt.
FIELD-SYMBOLS: LIKE LINE OF rt_includes,
LIKE LINE OF lt_functab.
@@ -450,7 +466,15 @@ CLASS lcl_object_fugr IMPLEMENTATION.
* handle generated maintenance views
APPEND INITIAL LINE TO rt_includes ASSIGNING .
- = |L{ ms_item-obj_name }T00|.
+ IF ms_item-obj_name(1) <> '/'.
+ "FGroup name does not contain a namespace
+ = |L{ ms_item-obj_name }T00|.
+ ELSE.
+ "FGroup name contains a namespace
+ lv_offset_ns = find( val = ms_item-obj_name+1 sub = '/' ).
+ lv_offset_ns = lv_offset_ns + 2.
+ = |{ ms_item-obj_name(lv_offset_ns) }L{ ms_item-obj_name+lv_offset_ns }T00|.
+ ENDIF.
IF lines( rt_includes ) > 0.
SELECT progname cnam FROM reposrc
diff --git a/src/zabapgit_object_iarp.prog.abap b/src/zabapgit_object_iarp.prog.abap
index ff3cd15b0..8469d7d5f 100644
--- a/src/zabapgit_object_iarp.prog.abap
+++ b/src/zabapgit_object_iarp.prog.abap
@@ -185,7 +185,13 @@ CLASS lcl_object_iarp IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, IARP, jump' ).
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type.
+
ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
diff --git a/src/zabapgit_object_iasp.prog.abap b/src/zabapgit_object_iasp.prog.abap
index 74c24d2a1..ba1bfff00 100644
--- a/src/zabapgit_object_iasp.prog.abap
+++ b/src/zabapgit_object_iasp.prog.abap
@@ -185,7 +185,13 @@ CLASS lcl_object_iasp IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, IASP, jump' ).
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type.
+
ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
diff --git a/src/zabapgit_object_iatu.prog.abap b/src/zabapgit_object_iatu.prog.abap
index e589eaff8..bd1ce1c75 100644
--- a/src/zabapgit_object_iatu.prog.abap
+++ b/src/zabapgit_object_iatu.prog.abap
@@ -202,7 +202,13 @@ CLASS lcl_object_iatu IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, IATU, jump' ).
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type.
+
ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.
diff --git a/src/zabapgit_object_jobd.prog.abap b/src/zabapgit_object_jobd.prog.abap
new file mode 100644
index 000000000..94feb8df0
--- /dev/null
+++ b/src/zabapgit_object_jobd.prog.abap
@@ -0,0 +1,200 @@
+*&---------------------------------------------------------------------*
+*& Include zabapgit_object_jobd
+*&---------------------------------------------------------------------*
+
+CLASS lcl_object_jobd DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ INTERFACES lif_object.
+
+ PRIVATE SECTION.
+ TYPES: ty_jd_name TYPE c LENGTH 32.
+
+ENDCLASS.
+
+CLASS lcl_object_jobd IMPLEMENTATION.
+
+ METHOD lif_object~has_changed_since.
+
+ rv_changed = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~changed_by.
+
+ rv_user = c_user_unknown.
+
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+
+ rs_metadata = get_metadata( ).
+ rs_metadata-delete_tadir = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~exists.
+
+ DATA: jd_name TYPE ty_jd_name.
+
+ jd_name = ms_item-obj_name.
+
+ TRY.
+ CALL METHOD ('CL_JR_JD_MANAGER')=>('CHECK_JD_EXISTENCE')
+ EXPORTING
+ im_jd_name = jd_name
+ IMPORTING
+ ex_is_existing = rv_bool.
+
+ CATCH cx_root.
+ lcx_exception=>raise( |JOBD not supported| ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~serialize.
+
+ DATA: lr_job_definition TYPE REF TO data,
+ lo_job_definition TYPE REF TO object,
+ jd_name TYPE ty_jd_name.
+
+ FIELD-SYMBOLS: TYPE any,
+ TYPE any.
+
+ jd_name = ms_item-obj_name.
+
+ TRY.
+ CREATE DATA lr_job_definition TYPE ('CL_JR_JOB_DEFINITION=>TY_JOB_DEFINITION').
+ ASSIGN lr_job_definition->* TO .
+ ASSERT sy-subrc = 0.
+
+ CREATE OBJECT lo_job_definition TYPE ('CL_JR_JOB_DEFINITION')
+ EXPORTING
+ im_jd_name = jd_name.
+
+ CALL METHOD lo_job_definition->('GET_JD_ATTRIBUTES')
+ IMPORTING
+ ex_jd_attributes = .
+
+ ASSIGN COMPONENT 'JDPACKAGE' OF STRUCTURE TO .
+ CLEAR .
+
+ ASSIGN COMPONENT 'BTCJOB_USER' OF STRUCTURE TO .
+ CLEAR .
+
+ ASSIGN COMPONENT 'OWNER' OF STRUCTURE TO .
+ CLEAR .
+
+ ASSIGN COMPONENT 'CREATED_DATE' OF STRUCTURE TO .
+ CLEAR .
+
+ ASSIGN COMPONENT 'CREATED_TIME' OF STRUCTURE TO .
+ CLEAR .
+
+ ASSIGN COMPONENT 'CHANGED_DATE' OF STRUCTURE TO .
+ CLEAR .
+
+ ASSIGN COMPONENT 'CHANGED_TIME' OF STRUCTURE TO .
+ CLEAR .
+
+ io_xml->add( iv_name = 'JOBD'
+ ig_data = ).
+
+ CATCH cx_root.
+ lcx_exception=>raise( |Error serializing JOBD| ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~deserialize.
+
+ DATA: lr_job_definition TYPE REF TO data,
+ lo_job_definition TYPE REF TO object,
+ jd_name TYPE ty_jd_name.
+
+ FIELD-SYMBOLS: TYPE any,
+ TYPE any.
+
+ jd_name = ms_item-obj_name.
+
+ TRY.
+ CREATE DATA lr_job_definition TYPE ('CL_JR_JOB_DEFINITION=>TY_JOB_DEFINITION').
+ ASSIGN lr_job_definition->* TO .
+ ASSERT sy-subrc = 0.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'JOBD'
+ CHANGING
+ cg_data = ).
+
+ CREATE OBJECT lo_job_definition TYPE ('CL_JR_JOB_DEFINITION')
+ EXPORTING
+ im_jd_name = jd_name.
+
+
+ ASSIGN COMPONENT 'JDPACKAGE' OF STRUCTURE TO .
+
+ = iv_package.
+
+ CALL METHOD lo_job_definition->('CREATE_JD')
+ EXPORTING
+ im_jd_attributes = .
+
+ CATCH cx_root.
+ lcx_exception=>raise( |Error deserializing JOBD| ).
+ ENDTRY.
+
+ lcl_objects_activation=>add_item( ms_item ).
+
+ ENDMETHOD.
+
+ METHOD lif_object~delete.
+
+ DATA: lo_job_definition TYPE REF TO object,
+ jd_name TYPE c LENGTH 32.
+
+ jd_name = ms_item-obj_name.
+
+ TRY.
+ CREATE OBJECT lo_job_definition TYPE ('CL_JR_JOB_DEFINITION')
+ EXPORTING
+ im_jd_name = jd_name.
+
+ CALL METHOD lo_job_definition->('DELETE_JD').
+
+ CATCH cx_root.
+ lcx_exception=>raise( |Error deleting JOBD| ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~jump.
+
+ DATA: obj_name TYPE e071-obj_name.
+
+ obj_name = ms_item-obj_name.
+
+ CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
+ EXPORTING
+ iv_pgmid = 'R3TR'
+ iv_object = ms_item-obj_type
+ iv_obj_name = obj_name
+ iv_action = 'SHOW'
+ EXCEPTIONS
+ jump_not_possible = 1
+ OTHERS = 2.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( |Error from TR_OBJECT_JUMP_TO_TOOL, JOBD| ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD lif_object~compare_to_remote_version.
+
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zabapgit_object_jobd.prog.xml b/src/zabapgit_object_jobd.prog.xml
new file mode 100644
index 000000000..e74762cd6
--- /dev/null
+++ b/src/zabapgit_object_jobd.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_JOBD
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ ZABAPGIT_OBJECT_JOBD
+ 20
+
+
+
+
+
diff --git a/src/zabapgit_object_nrob.prog.abap b/src/zabapgit_object_nrob.prog.abap
index 1e4fa6e63..f42d6eaaf 100644
--- a/src/zabapgit_object_nrob.prog.abap
+++ b/src/zabapgit_object_nrob.prog.abap
@@ -250,7 +250,37 @@ CLASS lcl_object_nrob IMPLEMENTATION.
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo' ).
+ DATA: ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ ls_bcdata-program = 'SAPMSNRO'.
+ ls_bcdata-dynpro = '0150'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'NRIV-OBJECT'.
+ ls_bcdata-fval = ms_item-obj_name.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=DISP'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ STARTING NEW TASK 'GIT'
+ EXPORTING
+ tcode = 'SNRO'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, NROB' ).
+ ENDIF.
ENDMETHOD. "jump
diff --git a/src/zabapgit_object_oo_functions.prog.abap b/src/zabapgit_object_oo_functions.prog.abap
index fe6c1da0b..ba0fe5da8 100644
--- a/src/zabapgit_object_oo_functions.prog.abap
+++ b/src/zabapgit_object_oo_functions.prog.abap
@@ -603,8 +603,9 @@ CLASS lcl_oo_base IMPLEMENTATION.
METHOD lif_oo_object_fnc~read_descriptions.
SELECT * FROM seocompotx INTO TABLE rt_descriptions
- WHERE clsname = iv_obejct_name. "#EC CI_SUBRC
- DELETE rt_descriptions WHERE descript IS INITIAL.
+ WHERE clsname = iv_obejct_name
+ AND descript <> ''
+ ORDER BY PRIMARY KEY. "#EC CI_SUBRC
ENDMETHOD.
METHOD lif_oo_object_fnc~delete.
diff --git a/src/zabapgit_object_pinf.prog.abap b/src/zabapgit_object_pinf.prog.abap
index 810d7696e..9a5d3c41b 100644
--- a/src/zabapgit_object_pinf.prog.abap
+++ b/src/zabapgit_object_pinf.prog.abap
@@ -77,7 +77,7 @@ CLASS lcl_object_pinf IMPLEMENTATION.
IF rv_bool = abap_true.
SELECT SINGLE mainpack FROM tdevc INTO lv_main_pack
- WHERE devclass = lv_pack_name.
+ WHERE devclass = lv_pack_name. "#EC CI_GENBUFF
rv_bool = boolc( sy-subrc = 0 ).
ENDIF.
diff --git a/src/zabapgit_object_prag.prog.abap b/src/zabapgit_object_prag.prog.abap
new file mode 100644
index 000000000..326d836ee
--- /dev/null
+++ b/src/zabapgit_object_prag.prog.abap
@@ -0,0 +1,176 @@
+*&---------------------------------------------------------------------*
+*& Include zabapgit_object_prag
+*&---------------------------------------------------------------------*
+
+CLASS lcl_object_prag DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ INTERFACES lif_object.
+
+ PRIVATE SECTION.
+ TYPES: BEGIN OF ty_pragma,
+ pragma TYPE c LENGTH 40,
+ extension TYPE c LENGTH 1,
+ signature TYPE c LENGTH 10,
+ description TYPE c LENGTH 255,
+ END OF ty_pragma.
+
+ METHODS:
+ _raise_pragma_not_exists
+ RAISING
+ lcx_exception,
+
+ _raise_pragma_exists
+ RAISING
+ lcx_exception,
+
+ _raise_pragma_enqueue
+ RAISING
+ lcx_exception.
+
+ENDCLASS.
+
+CLASS lcl_object_prag IMPLEMENTATION.
+
+ METHOD lif_object~has_changed_since.
+
+ rv_changed = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~changed_by.
+
+ rv_user = c_user_unknown.
+
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+
+ rs_metadata = get_metadata( ).
+ rs_metadata-delete_tadir = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~exists.
+
+ TRY.
+ cl_abap_pragma=>get_ref( ms_item-obj_name ).
+
+ CATCH cx_abap_pragma_not_exists.
+ rv_bool = abap_false.
+ RETURN.
+ ENDTRY.
+
+ rv_bool = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~serialize.
+
+ DATA: lo_pragma TYPE REF TO cl_abap_pragma,
+ pragma TYPE lcl_object_prag=>ty_pragma.
+
+ TRY.
+ lo_pragma = cl_abap_pragma=>get_ref( ms_item-obj_name ).
+
+ pragma-pragma = lo_pragma->pragma.
+ pragma-extension = lo_pragma->extension.
+ pragma-signature = lo_pragma->signature.
+ pragma-description = lo_pragma->description.
+
+ io_xml->add( iv_name = 'PRAG'
+ ig_data = pragma ).
+
+ CATCH cx_abap_pragma_not_exists.
+ _raise_pragma_not_exists( ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~deserialize.
+
+ DATA: pragma TYPE ty_pragma,
+ lo_pragma TYPE REF TO cl_abap_pragma.
+
+ TRY.
+ io_xml->read(
+ EXPORTING
+ iv_name = 'PRAG'
+ CHANGING
+ cg_data = pragma ).
+
+ lo_pragma = cl_abap_pragma=>create( p_pragma = ms_item-obj_name
+ p_package = iv_package ).
+
+ lo_pragma->set_info( p_description = pragma-description
+ p_signature = pragma-signature
+ p_extension = pragma-extension ).
+
+ lo_pragma->save( ).
+
+ CATCH cx_abap_pragma_not_exists.
+ _raise_pragma_not_exists( ).
+ CATCH cx_abap_pragma_exists.
+ _raise_pragma_exists( ).
+ CATCH cx_abap_pragma_enqueue.
+ _raise_pragma_enqueue( ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~delete.
+
+ DATA: lo_pragma TYPE REF TO cl_abap_pragma.
+
+ TRY.
+ lo_pragma = cl_abap_pragma=>get_ref( ms_item-obj_name ).
+
+ lo_pragma->delete( ).
+
+ CATCH cx_abap_pragma_not_exists.
+ _raise_pragma_not_exists( ).
+ CATCH cx_abap_pragma_enqueue.
+ _raise_pragma_enqueue( ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~jump.
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type
+ EXCEPTIONS
+ not_executed = 1
+ invalid_object_type = 2
+ OTHERS = 3.
+
+ ENDMETHOD.
+
+ METHOD lif_object~compare_to_remote_version.
+
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+
+ ENDMETHOD.
+
+ METHOD _raise_pragma_enqueue.
+
+ lcx_exception=>raise( |Pragma { ms_item-obj_name } enqueue error| ).
+
+ ENDMETHOD.
+
+ METHOD _raise_pragma_exists.
+
+ lcx_exception=>raise( |Pragma { ms_item-obj_name } exists| ).
+
+ ENDMETHOD.
+
+ METHOD _raise_pragma_not_exists.
+
+ lcx_exception=>raise( |Pragma { ms_item-obj_name } doesn't exist| ).
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zabapgit_object_prag.prog.xml b/src/zabapgit_object_prag.prog.xml
new file mode 100644
index 000000000..04387e60c
--- /dev/null
+++ b/src/zabapgit_object_prag.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_PRAG
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ ZABAPGIT_OBJECT_PRAG
+ 20
+
+
+
+
+
diff --git a/src/zabapgit_object_samc.prog.abap b/src/zabapgit_object_samc.prog.abap
index 166d48a1c..9f078afd7 100644
--- a/src/zabapgit_object_samc.prog.abap
+++ b/src/zabapgit_object_samc.prog.abap
@@ -2,41 +2,13 @@
*& Include ZABAPGIT_OBJECT_SAMC
*&---------------------------------------------------------------------*
-CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_super FINAL.
-
- PUBLIC SECTION.
- INTERFACES lif_object.
-
- PRIVATE SECTION.
- DATA: mo_persistence TYPE REF TO if_wb_object_persist,
- mo_amc_appl_obj_data TYPE REF TO if_wb_object_data_model.
+CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_saxx_super FINAL.
+ PROTECTED SECTION.
METHODS:
- get_data_object
- RETURNING
- VALUE(ro_amc_appl_obj_data) TYPE REF TO if_wb_object_data_model
- RAISING
- lcx_exception,
-
- get_persistence
- RETURNING
- VALUE(ro_persistence) TYPE REF TO if_wb_object_persist
- RAISING
- lcx_exception,
-
- get_data
- EXPORTING
- p_data TYPE any
- RAISING
- lcx_exception,
-
- lock
- RAISING
- lcx_exception,
-
- unlock
- RAISING
- lcx_exception.
+ get_persistence_class_name REDEFINITION,
+ get_data_class_name REDEFINITION,
+ get_data_structure_name REDEFINITION.
ENDCLASS. "lcl_object_samc DEFINITION
@@ -47,319 +19,22 @@ ENDCLASS. "lcl_object_samc DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_object_samc IMPLEMENTATION.
- METHOD lif_object~has_changed_since.
- rv_changed = abap_true.
- ENDMETHOD. "lif_object~has_changed_since
+ METHOD get_data_class_name.
- METHOD lif_object~changed_by.
-
- DATA: lr_data TYPE REF TO data.
- FIELD-SYMBOLS: TYPE any,
- TYPE any,
- TYPE any.
-
- TRY.
- CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE').
- ASSIGN lr_data->* TO .
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAMC not supported' ).
- ENDTRY.
-
- get_data(
- IMPORTING
- p_data = ).
-
- ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
-
- rv_user = .
+ r_data_class_name = 'CL_AMC_APPLICATION_OBJ_DATA'.
ENDMETHOD.
- METHOD lif_object~get_metadata.
- rs_metadata = get_metadata( ).
- rs_metadata-delete_tadir = abap_true.
- ENDMETHOD. "lif_object~get_metadata.
+ METHOD get_data_structure_name.
- METHOD lif_object~exists.
-
- DATA: ls_tadir TYPE tadir.
-
- ls_tadir = lcl_tadir=>read_single(
- iv_object = ms_item-obj_type
- iv_obj_name = ms_item-obj_name ).
- IF ls_tadir IS INITIAL.
- RETURN.
- ENDIF.
-
- TRY.
- get_data_object( ).
-
- CATCH lcx_exception.
- RETURN.
- ENDTRY.
-
- rv_bool = abap_true.
-
- ENDMETHOD. "lif_object~exists
-
- METHOD lif_object~serialize.
-
- DATA: lr_data TYPE REF TO data.
-
- FIELD-SYMBOLS: TYPE any,
- TYPE any,
- TYPE any.
-
- TRY.
- CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE').
- ASSIGN lr_data->* TO .
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAMC not supported' ).
- ENDTRY.
-
- get_data(
- IMPORTING
- p_data = ).
-
- ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
-
- ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- io_xml->add( iv_name = 'SAMC'
- ig_data = ).
-
- ENDMETHOD. "serialize
-
- METHOD lif_object~deserialize.
-
- DATA: li_appl_obj_data TYPE REF TO if_wb_object_data_model,
- lr_data TYPE REF TO data.
-
- FIELD-SYMBOLS: TYPE any.
-
- TRY.
- CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE').
- ASSIGN lr_data->* TO .
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAMC not supported' ).
- ENDTRY.
-
- io_xml->read(
- EXPORTING
- iv_name = 'SAMC'
- CHANGING
- cg_data = ).
-
- IF lif_object~exists( ) = abap_true.
- lif_object~delete( ).
- ENDIF.
-
- li_appl_obj_data = get_data_object( ).
-
- TRY.
- lock( ).
-
- CALL FUNCTION 'RS_CORR_INSERT'
- EXPORTING
- object = ms_item-obj_name
- object_class = 'SAMC'
- mode = 'I'
- global_lock = abap_true
- devclass = iv_package
- master_language = mv_language
- EXCEPTIONS
- cancelled = 1
- permission_failure = 2
- unknown_objectclass = 3
- OTHERS = 4.
-
- IF sy-subrc <> 0.
- lcx_exception=>raise( 'Error occured while creating SAMC' ).
- ENDIF.
-
- li_appl_obj_data->set_data( ).
-
- get_persistence( )->save( p_object_data = li_appl_obj_data ).
-
- unlock( ).
-
- CATCH cx_swb_exception.
- lcx_exception=>raise( 'Error occured while creating SAMC' ).
- ENDTRY.
-
- ENDMETHOD. "deserialize
-
- METHOD lif_object~delete.
-
- DATA: object_key TYPE seu_objkey.
-
- object_key = ms_item-obj_name.
-
- TRY.
- lock( ).
-
- get_persistence( )->delete( p_object_key = object_key ).
-
- unlock( ).
-
- CATCH cx_swb_exception.
- lcx_exception=>raise( 'Error occured while deleting SAMC' ).
- ENDTRY.
-
- ENDMETHOD. "delete
-
- METHOD lif_object~jump.
-
- CALL FUNCTION 'RS_TOOL_ACCESS'
- EXPORTING
- operation = 'SHOW'
- object_name = ms_item-obj_name
- object_type = ms_item-obj_type.
-
- ENDMETHOD. "jump
-
- METHOD lif_object~compare_to_remote_version.
- CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
- ENDMETHOD.
-
- METHOD get_data_object.
-
- IF mo_amc_appl_obj_data IS NOT BOUND.
-
- TRY.
- CREATE OBJECT mo_amc_appl_obj_data TYPE ('CL_AMC_APPLICATION_OBJ_DATA').
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAMC not supported' ).
- ENDTRY.
-
- ENDIF.
-
- ro_amc_appl_obj_data = mo_amc_appl_obj_data.
+ r_data_structure_name = 'AMC_APPLICATION_COMPLETE'.
ENDMETHOD.
+ METHOD get_persistence_class_name.
- METHOD get_persistence.
-
- IF mo_persistence IS NOT BOUND.
-
- TRY.
- CREATE OBJECT mo_persistence TYPE ('CL_AMC_APPLICATION_OBJ_PERS').
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAMC not supported' ).
- ENDTRY.
-
- ENDIF.
-
- ro_persistence = mo_persistence.
+ r_persistence_class_name = 'CL_AMC_APPLICATION_OBJ_PERS'.
ENDMETHOD.
-
- METHOD lock.
-
- DATA: objname TYPE trobj_name,
- object_key TYPE seu_objkey,
- objtype TYPE trobjtype.
-
- objname = ms_item-obj_name.
- object_key = ms_item-obj_name.
- objtype = ms_item-obj_type.
-
- get_persistence( )->lock(
- EXPORTING
- p_objname_tr = objname
- p_object_key = object_key
- p_objtype_tr = objtype
- EXCEPTIONS
- foreign_lock = 1
- error_occurred = 2
- OTHERS = 3 ).
-
- IF sy-subrc <> 0.
- lcx_exception=>raise( `Error occured while locking SAMC ` && objname ).
- ENDIF.
-
- ENDMETHOD.
-
- METHOD unlock.
-
- DATA: objname TYPE trobj_name,
- object_key TYPE seu_objkey,
- objtype TYPE trobjtype.
-
- objname = ms_item-obj_name.
- object_key = ms_item-obj_name.
- objtype = ms_item-obj_type.
-
- get_persistence( )->unlock( p_objname_tr = objname
- p_object_key = object_key
- p_objtype_tr = objtype ).
-
- ENDMETHOD.
-
- METHOD get_data.
-
- DATA: object_key TYPE seu_objkey.
-
- object_key = ms_item-obj_name.
-
- TRY.
- get_persistence( )->get(
- EXPORTING
- p_object_key = object_key
- p_version = 'A'
- CHANGING
- p_object_data = mo_amc_appl_obj_data ).
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAMC error' ).
- ENDTRY.
-
- mo_amc_appl_obj_data->get_data(
- IMPORTING
- p_data = p_data ).
-
- ENDMETHOD.
-
-
ENDCLASS. "lcl_object_samc IMPLEMENTATION
diff --git a/src/zabapgit_object_sapc.prog.abap b/src/zabapgit_object_sapc.prog.abap
index f05010fa7..ea9b6053b 100644
--- a/src/zabapgit_object_sapc.prog.abap
+++ b/src/zabapgit_object_sapc.prog.abap
@@ -2,41 +2,13 @@
*& Include ZABAPGIT_OBJECT_SAPC
*&---------------------------------------------------------------------*
-CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_super FINAL.
-
- PUBLIC SECTION.
- INTERFACES lif_object.
-
- PRIVATE SECTION.
- DATA: mo_persistence TYPE REF TO if_wb_object_persist,
- mo_apc_appl_obj_data TYPE REF TO if_wb_object_data_model.
+CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_saxx_super FINAL.
+ PROTECTED SECTION.
METHODS:
- get_data_object
- RETURNING
- VALUE(ro_apc_appl_obj_data) TYPE REF TO if_wb_object_data_model
- RAISING
- lcx_exception,
-
- get_persistence
- RETURNING
- VALUE(ro_persistence) TYPE REF TO if_wb_object_persist
- RAISING
- lcx_exception,
-
- get_data
- EXPORTING
- p_data TYPE any
- RAISING
- lcx_exception,
-
- lock
- RAISING
- lcx_exception,
-
- unlock
- RAISING
- lcx_exception.
+ get_persistence_class_name REDEFINITION,
+ get_data_class_name REDEFINITION,
+ get_data_structure_name REDEFINITION.
ENDCLASS. "lcl_object_sAPC DEFINITION
@@ -47,319 +19,22 @@ ENDCLASS. "lcl_object_sAPC DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_object_sapc IMPLEMENTATION.
- METHOD lif_object~has_changed_since.
- rv_changed = abap_true.
- ENDMETHOD. "lif_object~has_changed_since
+ METHOD get_data_class_name.
- METHOD lif_object~changed_by.
-
- DATA: lr_data TYPE REF TO data.
- FIELD-SYMBOLS: TYPE any,
- TYPE any,
- TYPE any.
-
- TRY.
- CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE').
- ASSIGN lr_data->* TO .
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAPC not supported' ).
- ENDTRY.
-
- get_data(
- IMPORTING
- p_data = ).
-
- ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
-
- rv_user = .
+ r_data_class_name = 'CL_APC_APPLICATION_OBJ_DATA'.
ENDMETHOD.
- METHOD lif_object~get_metadata.
- rs_metadata = get_metadata( ).
- rs_metadata-delete_tadir = abap_true.
- ENDMETHOD. "lif_object~get_metadata.
+ METHOD get_data_structure_name.
- METHOD lif_object~exists.
-
- DATA: ls_tadir TYPE tadir.
-
- ls_tadir = lcl_tadir=>read_single(
- iv_object = ms_item-obj_type
- iv_obj_name = ms_item-obj_name ).
- IF ls_tadir IS INITIAL.
- RETURN.
- ENDIF.
-
- TRY.
- get_data_object( ).
-
- CATCH lcx_exception.
- RETURN.
- ENDTRY.
-
- rv_bool = abap_true.
-
- ENDMETHOD. "lif_object~exists
-
- METHOD lif_object~serialize.
-
- DATA: lr_data TYPE REF TO data.
-
- FIELD-SYMBOLS: TYPE any,
- TYPE any,
- TYPE any.
-
- TRY.
- CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE').
- ASSIGN lr_data->* TO .
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAPC not supported' ).
- ENDTRY.
-
- get_data(
- IMPORTING
- p_data = ).
-
- ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
-
- ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE TO .
- ASSERT sy-subrc = 0.
- CLEAR .
-
- io_xml->add( iv_name = 'SAPC'
- ig_data = ).
-
- ENDMETHOD. "serialize
-
- METHOD lif_object~deserialize.
-
- DATA: appl_obj_data TYPE REF TO if_wb_object_data_model,
- lr_data TYPE REF TO data.
-
- FIELD-SYMBOLS: TYPE any.
-
- TRY.
- CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE').
- ASSIGN lr_data->* TO .
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAPC not supported' ).
- ENDTRY.
-
- io_xml->read(
- EXPORTING
- iv_name = 'SAPC'
- CHANGING
- cg_data = ).
-
- IF lif_object~exists( ) = abap_true.
- lif_object~delete( ).
- ENDIF.
-
- appl_obj_data = get_data_object( ).
-
- TRY.
- lock( ).
-
- CALL FUNCTION 'RS_CORR_INSERT'
- EXPORTING
- object = ms_item-obj_name
- object_class = 'SAPC'
- mode = 'I'
- global_lock = abap_true
- devclass = iv_package
- master_language = mv_language
- EXCEPTIONS
- cancelled = 1
- permission_failure = 2
- unknown_objectclass = 3
- OTHERS = 4.
-
- IF sy-subrc <> 0.
- lcx_exception=>raise( 'Error occured while creating SAPC' ).
- ENDIF.
-
- appl_obj_data->set_data( ).
-
- get_persistence( )->save( p_object_data = appl_obj_data ).
-
- unlock( ).
-
- CATCH cx_swb_exception.
- lcx_exception=>raise( 'Error occured while creating SAPC' ).
- ENDTRY.
-
- ENDMETHOD. "deserialize
-
- METHOD lif_object~delete.
-
- DATA: object_key TYPE seu_objkey.
-
- object_key = ms_item-obj_name.
-
- TRY.
- lock( ).
-
- get_persistence( )->delete( p_object_key = object_key ).
-
- unlock( ).
-
- CATCH cx_swb_exception.
- lcx_exception=>raise( 'Error occured while deleting SAPC' ).
- ENDTRY.
-
- ENDMETHOD. "delete
-
- METHOD lif_object~jump.
-
- CALL FUNCTION 'RS_TOOL_ACCESS'
- EXPORTING
- operation = 'SHOW'
- object_name = ms_item-obj_name
- object_type = ms_item-obj_type.
-
- ENDMETHOD. "jump
-
- METHOD lif_object~compare_to_remote_version.
- CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
- ENDMETHOD.
-
- METHOD get_data_object.
-
- IF mo_apc_appl_obj_data IS NOT BOUND.
-
- TRY.
- CREATE OBJECT mo_apc_appl_obj_data TYPE ('CL_APC_APPLICATION_OBJ_DATA').
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAPC not supported' ).
- ENDTRY.
-
- ENDIF.
-
- ro_apc_appl_obj_data = mo_apc_appl_obj_data.
+ r_data_structure_name = 'APC_APPLICATION_COMPLETE'.
ENDMETHOD.
+ METHOD get_persistence_class_name.
- METHOD get_persistence.
-
- IF mo_persistence IS NOT BOUND.
-
- TRY.
- CREATE OBJECT mo_persistence TYPE ('CL_APC_APPLICATION_OBJ_PERS').
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAPC not supported' ).
- ENDTRY.
-
- ENDIF.
-
- ro_persistence = mo_persistence.
+ r_persistence_class_name = 'CL_APC_APPLICATION_OBJ_PERS'.
ENDMETHOD.
-
- METHOD lock.
-
- DATA: objname TYPE trobj_name,
- object_key TYPE seu_objkey,
- objtype TYPE trobjtype.
-
- objname = ms_item-obj_name.
- object_key = ms_item-obj_name.
- objtype = ms_item-obj_type.
-
- get_persistence( )->lock(
- EXPORTING
- p_objname_tr = objname
- p_object_key = object_key
- p_objtype_tr = objtype
- EXCEPTIONS
- foreign_lock = 1
- error_occurred = 2
- OTHERS = 3 ).
-
- IF sy-subrc <> 0.
- lcx_exception=>raise( `Error occured while locking SAPC ` && objname ).
- ENDIF.
-
- ENDMETHOD.
-
- METHOD unlock.
-
- DATA: objname TYPE trobj_name,
- object_key TYPE seu_objkey,
- objtype TYPE trobjtype.
-
- objname = ms_item-obj_name.
- object_key = ms_item-obj_name.
- objtype = ms_item-obj_type.
-
- get_persistence( )->unlock( p_objname_tr = objname
- p_object_key = object_key
- p_objtype_tr = objtype ).
-
- ENDMETHOD.
-
- METHOD get_data.
-
- DATA: object_key TYPE seu_objkey.
-
- object_key = ms_item-obj_name.
-
- TRY.
- get_persistence( )->get(
- EXPORTING
- p_object_key = object_key
- p_version = 'A'
- CHANGING
- p_object_data = mo_apc_appl_obj_data ).
-
- CATCH cx_root.
- lcx_exception=>raise( 'SAPC error' ).
- ENDTRY.
-
- mo_apc_appl_obj_data->get_data(
- IMPORTING
- p_data = p_data ).
-
- ENDMETHOD.
-
-
ENDCLASS. "lcl_object_sAPC IMPLEMENTATION
diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap
index 786367e50..b1bbe3978 100644
--- a/src/zabapgit_object_serializing.prog.abap
+++ b/src/zabapgit_object_serializing.prog.abap
@@ -8,8 +8,11 @@ INCLUDE zabapgit_object_acid.
INCLUDE zabapgit_object_auth.
INCLUDE zabapgit_object_oo_functions.
INCLUDE zabapgit_object_clas.
+INCLUDE zabapgit_object_clas_new.
+INCLUDE zabapgit_object_cmpt.
INCLUDE zabapgit_object_dcls.
INCLUDE zabapgit_object_ddls.
+INCLUDE zabapgit_object_dial.
INCLUDE zabapgit_object_doct.
INCLUDE zabapgit_object_docv.
INCLUDE zabapgit_object_doma.
@@ -23,11 +26,13 @@ INCLUDE zabapgit_object_fugr.
INCLUDE zabapgit_object_iarp.
INCLUDE zabapgit_object_iasp.
INCLUDE zabapgit_object_iatu.
+INCLUDE zabapgit_object_jobd.
INCLUDE zabapgit_object_intf.
INCLUDE zabapgit_object_msag.
INCLUDE zabapgit_object_nrob.
INCLUDE zabapgit_object_para.
INCLUDE zabapgit_object_pinf.
+INCLUDE zabapgit_object_prag.
INCLUDE zabapgit_object_prog.
INCLUDE zabapgit_object_samc.
INCLUDE zabapgit_object_sapc.
@@ -38,6 +43,7 @@ INCLUDE zabapgit_object_sfpi.
INCLUDE zabapgit_object_sfsw.
INCLUDE zabapgit_object_shi3.
INCLUDE zabapgit_object_shlp.
+INCLUDE zabapgit_object_shma.
INCLUDE zabapgit_object_sicf.
INCLUDE zabapgit_object_smim.
INCLUDE zabapgit_object_splo.
diff --git a/src/zabapgit_object_sfpf.prog.abap b/src/zabapgit_object_sfpf.prog.abap
index b8da5dc5b..f99691927 100644
--- a/src/zabapgit_object_sfpf.prog.abap
+++ b/src/zabapgit_object_sfpf.prog.abap
@@ -74,7 +74,13 @@ CLASS lcl_object_sfpf IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, SFPF jump' ).
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type.
+
ENDMETHOD. "jump
METHOD lif_object~delete.
diff --git a/src/zabapgit_object_sfpi.prog.abap b/src/zabapgit_object_sfpi.prog.abap
index 9ba05f810..d4f441775 100644
--- a/src/zabapgit_object_sfpi.prog.abap
+++ b/src/zabapgit_object_sfpi.prog.abap
@@ -70,7 +70,13 @@ CLASS lcl_object_sfpi IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, SFPI jump' ).
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type.
+
ENDMETHOD. "jump
METHOD lif_object~delete.
diff --git a/src/zabapgit_object_shlp.prog.abap b/src/zabapgit_object_shlp.prog.abap
index 3373ada0a..8e1198c70 100644
--- a/src/zabapgit_object_shlp.prog.abap
+++ b/src/zabapgit_object_shlp.prog.abap
@@ -30,7 +30,7 @@ CLASS lcl_object_shlp IMPLEMENTATION.
SELECT SINGLE as4date as4time FROM dd30l
INTO (lv_date, lv_time)
WHERE shlpname = ms_item-obj_name
- AND as4local = 'A'.
+ AND as4local = 'A'. "#EC CI_GENBUFF
rv_changed = check_timestamp(
iv_timestamp = iv_timestamp
diff --git a/src/zabapgit_object_shma.prog.abap b/src/zabapgit_object_shma.prog.abap
new file mode 100644
index 000000000..a35a90b4c
--- /dev/null
+++ b/src/zabapgit_object_shma.prog.abap
@@ -0,0 +1,273 @@
+*&---------------------------------------------------------------------*
+*& Include zabapgit_object_shma
+*&---------------------------------------------------------------------*
+
+CLASS lcl_object_shma DEFINITION INHERITING FROM lcl_objects_super FINAL.
+
+ PUBLIC SECTION.
+ INTERFACES lif_object.
+
+ENDCLASS.
+
+CLASS lcl_object_shma IMPLEMENTATION.
+
+ METHOD lif_object~has_changed_since.
+
+ rv_changed = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~changed_by.
+
+ rv_user = c_user_unknown.
+
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+
+ rs_metadata = get_metadata( ).
+
+ ENDMETHOD.
+
+ METHOD lif_object~exists.
+
+ DATA: lv_area_name TYPE shm_area_name.
+
+ SELECT SINGLE area_name
+ FROM shma_attributes
+ INTO lv_area_name
+ WHERE area_name = ms_item-obj_name.
+
+ rv_bool = boolc( sy-subrc = 0 ).
+
+ ENDMETHOD.
+
+ METHOD lif_object~serialize.
+
+ DATA: lv_area_name TYPE shm_area_name,
+ ls_area_attributes TYPE shma_attributes.
+
+ lv_area_name = ms_item-obj_name.
+
+ TRY.
+ CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('READ_AREA_ATTRIBUTES_ALL')
+ EXPORTING
+ area_name = lv_area_name
+ IMPORTING
+ area_attributes = ls_area_attributes.
+
+ CLEAR: ls_area_attributes-chg_user,
+ ls_area_attributes-chg_date,
+ ls_area_attributes-chg_time,
+ ls_area_attributes-cls_gen_user ,
+ ls_area_attributes-cls_gen_date ,
+ ls_area_attributes-cls_gen_time.
+
+ io_xml->add( iv_name = 'AREA_ATTRIBUTES'
+ ig_data = ls_area_attributes ).
+
+ CATCH cx_root.
+ lcx_exception=>raise( |Error serializing SHMA { ms_item-obj_name }| ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~deserialize.
+
+ DATA: lv_area_name TYPE shm_area_name,
+ ls_area_attributes TYPE shma_attributes.
+
+ lv_area_name = ms_item-obj_name.
+
+ io_xml->read(
+ EXPORTING
+ iv_name = 'AREA_ATTRIBUTES'
+ CHANGING
+ cg_data = ls_area_attributes ).
+
+ TRY.
+ CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('INSERT_AREA')
+ EXPORTING
+ area_name = lv_area_name
+ attributes = ls_area_attributes
+ force_overwrite = abap_true
+ no_class_generation = abap_true
+ silent_mode = abap_true.
+
+ CATCH cx_root.
+ lcx_exception=>raise( |Error serializing SHMA { ms_item-obj_name }| ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~delete.
+
+ " We can't use FM SHMA_DELETE_AREA because it depends
+ " on the corresponding class, but in abapGit it has its own
+ " lifecycle. Therefore we have to reimplement most of the
+ " FMs logic
+
+ CONSTANTS: lc_request_delete TYPE i VALUE '4'.
+
+ DATA: lv_request TYPE i,
+ lv_area_name TYPE shm_area_name,
+ lv_order TYPE e070-trkorr,
+ lv_korrnum TYPE tadir-korrnum,
+ lv_objname TYPE tadir-obj_name,
+ lv_task TYPE e070-trkorr,
+ lv_append TYPE abap_bool,
+ ls_tadir TYPE tadir,
+ ls_tdevc TYPE tdevc,
+ lo_cts_if TYPE REF TO object.
+
+ lv_area_name = ms_item-obj_name.
+
+ TRY.
+ CALL FUNCTION 'ENQUEUE_E_SHM_AREA'
+ EXPORTING
+ mode_shma_attributes = 'E'
+ area_name = lv_area_name
+ x_area_name = ' '
+ _scope = '2'
+ _wait = ' '
+ _collect = ' '
+ EXCEPTIONS
+ foreign_lock = 1
+ system_failure = 2
+ OTHERS = 3.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ).
+ ENDIF.
+
+ CALL METHOD ('\PROGRAM=SAPMSHM_MONITOR\CLASS=LCL_SHMM')=>('FREE_AREA_BY_NAME')
+ EXPORTING
+ area_name = lv_area_name
+ affect_server = cl_shm_area=>affect_all_servers.
+
+ CREATE OBJECT lo_cts_if TYPE ('\FUNCTION-POOL=SHMA\CLASS=LCL_CTS_INTERFACE')
+ EXPORTING
+ area = lv_area_name.
+
+ CALL METHOD lo_cts_if->('CHECK_AREA')
+ EXPORTING
+ request = lc_request_delete
+ IMPORTING
+ access_mode = lv_request
+ appendable = lv_append.
+
+ IF lv_request <> lc_request_delete.
+ lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ).
+ ENDIF.
+
+ CALL METHOD lo_cts_if->('INSERT_AREA')
+ EXPORTING
+ request = lc_request_delete
+ IMPORTING
+ order = lv_order
+ task = lv_task.
+
+ DELETE FROM shma_attributes WHERE area_name = lv_area_name.
+ DELETE FROM shma_start WHERE area_name = lv_area_name.
+
+ lv_korrnum = lv_order.
+ lv_objname = lv_area_name.
+
+ CALL FUNCTION 'TR_TADIR_INTERFACE'
+ EXPORTING
+ wi_read_only = abap_true
+ wi_tadir_pgmid = 'R3TR'
+ wi_tadir_object = 'SHMA'
+ wi_tadir_obj_name = lv_objname
+ IMPORTING
+ new_tadir_entry = ls_tadir
+ EXCEPTIONS
+ OTHERS = 0.
+
+ CALL FUNCTION 'TR_DEVCLASS_GET'
+ EXPORTING
+ iv_devclass = ls_tadir-devclass
+ IMPORTING
+ es_tdevc = ls_tdevc
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc = 0 AND ls_tdevc-korrflag IS INITIAL.
+
+ " TADIR entries for local objects must be deleted 'by hand'
+
+ CALL FUNCTION 'TR_TADIR_INTERFACE'
+ EXPORTING
+ wi_test_modus = abap_false
+ wi_delete_tadir_entry = abap_true
+ wi_tadir_pgmid = 'R3TR'
+ wi_tadir_object = 'SHMA'
+ wi_tadir_obj_name = lv_objname
+ wi_tadir_korrnum = lv_korrnum
+ EXCEPTIONS
+ OTHERS = 0.
+
+ ENDIF.
+
+ CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('DELETE_RUNTIME_SETTINGS')
+ EXPORTING
+ area_name = lv_area_name.
+
+ CALL FUNCTION 'DEQUEUE_E_SHM_AREA'
+ EXPORTING
+ mode_shma_attributes = 'E'
+ area_name = lv_area_name
+ x_area_name = ' '
+ _scope = '3'
+ _synchron = ' '
+ _collect = ' '.
+
+ CATCH cx_root.
+ lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ).
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_object~jump.
+
+ DATA: ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ ls_bcdata-program = 'SAPLSHMA'.
+ ls_bcdata-dynpro = '0100'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'SHMA_ATTRIBUTES-AREA_NAME'.
+ ls_bcdata-fval = ms_item-obj_name.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=SHOW'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ STARTING NEW TASK 'GIT'
+ EXPORTING
+ tcode = 'SHMA'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SHMA' ).
+ ENDIF.
+
+ ENDMETHOD.
+
+ METHOD lif_object~compare_to_remote_version.
+
+ CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/zabapgit_object_shma.prog.xml b/src/zabapgit_object_shma.prog.xml
new file mode 100644
index 000000000..aa960866e
--- /dev/null
+++ b/src/zabapgit_object_shma.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_SHMA
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ ZABAPGIT_OBJECT_SHMA
+ 20
+
+
+
+
+
diff --git a/src/zabapgit_object_sicf.prog.abap b/src/zabapgit_object_sicf.prog.abap
index 8fa11f59f..fc4fd2a78 100644
--- a/src/zabapgit_object_sicf.prog.abap
+++ b/src/zabapgit_object_sicf.prog.abap
@@ -77,6 +77,10 @@ CLASS lcl_object_sicf IMPLEMENTATION.
rv_user = ls_icfservice-icf_muser.
+ IF rv_user IS INITIAL.
+ rv_user = c_user_unknown.
+ ENDIF.
+
ENDMETHOD.
METHOD lif_object~get_metadata.
@@ -85,11 +89,20 @@ CLASS lcl_object_sicf IMPLEMENTATION.
METHOD lif_object~exists.
- DATA: ls_icfservice TYPE icfservice.
+ DATA: ls_tadir TYPE tadir,
+ ls_key TYPE ty_sicf_key.
+ ls_tadir = lcl_tadir=>read_single_sicf( ms_item-obj_name ).
- read( IMPORTING es_icfservice = ls_icfservice ).
- rv_bool = boolc( NOT ls_icfservice IS INITIAL ).
+ rv_bool = boolc( NOT ls_tadir IS INITIAL ).
+
+ IF rv_bool = abap_true.
+ ls_key = ls_tadir-obj_name.
+ SELECT SINGLE icfaltnme FROM icfservice INTO ls_key-icf_name
+ WHERE icf_name = ls_key-icf_name
+ AND icfparguid = ls_key-icfparguid.
+ rv_bool = boolc( sy-subrc = 0 ).
+ ENDIF.
ENDMETHOD. "lif_object~exists
@@ -140,17 +153,7 @@ CLASS lcl_object_sicf IMPLEMENTATION.
CLEAR et_icfhandler.
CLEAR ev_url.
- ls_key = ms_item-obj_name.
- IF ls_key-icfparguid IS INITIAL.
-* limitation: name must be unique
- SELECT SINGLE icfparguid FROM icfservice
- INTO ls_key-icfparguid
- WHERE icf_name = ls_key-icf_name
- AND icf_cuser <> 'SAP' ##warn_ok.
- IF sy-subrc <> 0.
- RETURN.
- ENDIF.
- ENDIF.
+ ls_key = lcl_tadir=>read_single_sicf( ms_item-obj_name )-obj_name.
cl_icf_tree=>if_icf_tree~get_info_from_serv(
EXPORTING
@@ -198,6 +201,7 @@ CLASS lcl_object_sicf IMPLEMENTATION.
ls_read TYPE icfservice,
ls_icfdocu TYPE icfdocu,
lv_url TYPE string,
+ lv_exists TYPE abap_bool,
lt_icfhandler TYPE TABLE OF icfhandler.
@@ -210,14 +214,16 @@ CLASS lcl_object_sicf IMPLEMENTATION.
io_xml->read( EXPORTING iv_name = 'ICFHANDLER_TABLE'
CHANGING cg_data = lt_icfhandler ).
- read( IMPORTING es_icfservice = ls_read ).
- IF ls_read IS INITIAL.
+
+ lv_exists = lif_object~exists( ).
+ IF lv_exists = abap_false.
insert_sicf( is_icfservice = ls_icfservice
is_icfdocu = ls_icfdocu
it_icfhandler = lt_icfhandler
iv_package = iv_package
iv_url = lv_url ).
ELSE.
+ read( IMPORTING es_icfservice = ls_read ).
change_sicf( is_icfservice = ls_icfservice
is_icfdocu = ls_icfdocu
it_icfhandler = lt_icfhandler
@@ -391,9 +397,21 @@ CLASS lcl_object_sicf IMPLEMENTATION.
DATA: ls_icfservice TYPE icfservice.
-
read( IMPORTING es_icfservice = ls_icfservice ).
+ IF ls_icfservice IS INITIAL.
+ " It seems that the ICF service doesn't exist anymore.
+ " But that's ok, because some objects like SAPC manage
+ " the lifecycle of its ICF service by itself and already
+ " deleted the service.
+ RETURN.
+ ENDIF.
+
+ IF ls_icfservice-icfparguid CO '0'.
+* not supported by the SAP standard API
+ lcx_exception=>raise( 'SICF - cannot delete root node, delete node manually' ).
+ ENDIF.
+
cl_icf_tree=>if_icf_tree~delete_node(
EXPORTING
icfparguid = ls_icfservice-icfparguid
@@ -419,7 +437,39 @@ CLASS lcl_object_sicf IMPLEMENTATION.
ENDMETHOD. "delete
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, SICF, jump' ).
+
+ DATA: ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ ls_bcdata-program = 'RSICFTREE'.
+ ls_bcdata-dynpro = '1000'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ ls_bcdata-dynpro = space.
+ ls_bcdata-dynbegin = space.
+ ls_bcdata-fnam = 'ICF_SERV'.
+ ls_bcdata-fval = ms_item-obj_name.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=ONLI'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ STARTING NEW TASK 'GIT'
+ EXPORTING
+ tcode = 'SICF'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SICF' ).
+ ENDIF.
+
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
diff --git a/src/zabapgit_object_smim.prog.abap b/src/zabapgit_object_smim.prog.abap
index 4f13dda9e..82b0f89ec 100644
--- a/src/zabapgit_object_smim.prog.abap
+++ b/src/zabapgit_object_smim.prog.abap
@@ -67,14 +67,16 @@ CLASS lcl_object_smim IMPLEMENTATION.
METHOD lif_object~exists.
- TRY.
- get_url_for_io( ).
- rv_bool = abap_true.
- CATCH lcx_not_found.
- rv_bool = abap_false.
- ENDTRY.
+ DATA: lv_loio TYPE sdok_docid.
- ENDMETHOD. "lif_object~exists
+
+ lv_loio = ms_item-obj_name.
+
+ SELECT SINGLE loio_id FROM smimloio INTO lv_loio
+ WHERE loio_id = lv_loio. "#EC CI_GENBUFF
+ rv_bool = boolc( sy-subrc = 0 ).
+
+ ENDMETHOD.
METHOD get_url_for_io.
@@ -206,7 +208,8 @@ CLASS lcl_object_smim IMPLEMENTATION.
ls_file-data = lv_content.
mo_files->add( ls_file ).
- SELECT SINGLE lo_class FROM smimloio INTO lv_class WHERE loio_id = lv_loio.
+ SELECT SINGLE lo_class FROM smimloio INTO lv_class
+ WHERE loio_id = lv_loio. "#EC CI_GENBUFF
ENDIF.
io_xml->add( iv_name = 'URL'
@@ -328,7 +331,13 @@ CLASS lcl_object_smim IMPLEMENTATION.
ENDMETHOD. "delete
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, SMIM, jump' ).
+
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = ms_item-obj_type.
+
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
diff --git a/src/zabapgit_object_ssfo.prog.abap b/src/zabapgit_object_ssfo.prog.abap
index dfdd4aa39..c61e4cd04 100644
--- a/src/zabapgit_object_ssfo.prog.abap
+++ b/src/zabapgit_object_ssfo.prog.abap
@@ -13,6 +13,9 @@ CLASS lcl_object_ssfo DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
+ PRIVATE SECTION.
+ METHODS: fix_ids IMPORTING ii_xml_doc TYPE REF TO if_ixml_document.
+
ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------*
@@ -163,16 +166,11 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
li_node->set_value( 'DUMMY' ).
ENDIF.
-* remove IDs it seems that they are not used for anything
-* the IDs are "random" so it caused diff files
- IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
- li_attr = li_node->get_attributes( ).
- li_attr->remove_named_item( 'ID' ).
- ENDIF.
-
li_node = li_iterator->get_next( ).
ENDWHILE.
+ fix_ids( li_xml_doc ).
+
li_element = li_xml_doc->get_root_element( ).
li_element->set_attribute(
name = 'sf'
@@ -186,6 +184,54 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
ENDMETHOD. "serialize
+ METHOD fix_ids.
+* makes sure ID and IDREF values are the same values for each serialization run
+* the standard code has a counter that keeps increasing values
+
+ DATA: lv_name TYPE string,
+ li_idref TYPE REF TO if_ixml_node,
+ li_node TYPE REF TO if_ixml_node,
+ li_attr TYPE REF TO if_ixml_named_node_map,
+ li_iterator TYPE REF TO if_ixml_node_iterator,
+ lt_idref TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+
+
+ li_iterator = ii_xml_doc->create_iterator( ).
+ li_node = li_iterator->get_next( ).
+ WHILE NOT li_node IS INITIAL.
+ lv_name = li_node->get_name( ).
+ IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
+ li_idref = li_node->get_attributes( )->get_named_item( 'IDREF' ).
+ IF li_idref IS BOUND.
+ APPEND li_idref->get_value( ) TO lt_idref.
+ li_idref->set_value( |{ sy-tabix }| ).
+ ENDIF.
+ ENDIF.
+ li_node = li_iterator->get_next( ).
+ ENDWHILE.
+
+ li_iterator = ii_xml_doc->create_iterator( ).
+ li_node = li_iterator->get_next( ).
+ WHILE NOT li_node IS INITIAL.
+ lv_name = li_node->get_name( ).
+ IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
+ li_idref = li_node->get_attributes( )->get_named_item( 'ID' ).
+ IF li_idref IS BOUND.
+ lv_name = li_idref->get_value( ).
+ READ TABLE lt_idref WITH KEY table_line = lv_name TRANSPORTING NO FIELDS.
+ IF sy-subrc = 0.
+ li_idref->set_value( |{ sy-tabix }| ).
+ ELSE.
+ li_attr = li_node->get_attributes( ).
+ li_attr->remove_named_item( 'ID' ).
+ ENDIF.
+ ENDIF.
+ ENDIF.
+ li_node = li_iterator->get_next( ).
+ ENDWHILE.
+
+ ENDMETHOD.
+
METHOD lif_object~deserialize.
* see function module FB_UPLOAD_FORM
diff --git a/src/zabapgit_object_ssst.prog.abap b/src/zabapgit_object_ssst.prog.abap
index 70bb33c9e..e6de02a32 100644
--- a/src/zabapgit_object_ssst.prog.abap
+++ b/src/zabapgit_object_ssst.prog.abap
@@ -12,6 +12,7 @@ CLASS lcl_object_ssst DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
+ CONSTANTS: c_style_active TYPE tdactivate VALUE 'A'.
PRIVATE SECTION.
METHODS validate_font
@@ -50,9 +51,11 @@ CLASS lcl_object_ssst IMPLEMENTATION.
DATA: lv_stylename TYPE stxsadm-stylename.
-
- SELECT SINGLE stylename FROM stxsadm INTO lv_stylename
- WHERE stylename = ms_item-obj_name.
+ SELECT SINGLE stylename
+ FROM stxshead INTO lv_stylename
+ WHERE active = c_style_active
+ AND stylename = ms_item-obj_name
+ AND vari = ''.
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD. "lif_object~exists
@@ -85,7 +88,7 @@ CLASS lcl_object_ssst IMPLEMENTATION.
CALL FUNCTION 'SSF_READ_STYLE'
EXPORTING
i_style_name = lv_style_name
- i_style_active_flag = 'A'
+ i_style_active_flag = c_style_active
i_style_variant = '%MAIN'
i_style_language = mv_language
IMPORTING
@@ -133,10 +136,11 @@ CLASS lcl_object_ssst IMPLEMENTATION.
* see fm SSF_UPLOAD_STYLE
DATA: ls_header TYPE ssfcats,
+ ls_new_header TYPE ssfcats,
lt_paragraphs TYPE TABLE OF ssfparas,
lt_strings TYPE TABLE OF ssfstrings,
lt_tabstops TYPE TABLE OF stxstab.
-
+ FIELD-SYMBOLS: TYPE spras.
io_xml->read( EXPORTING iv_name = 'HEADER'
CHANGING cg_data = ls_header ).
@@ -149,26 +153,47 @@ CLASS lcl_object_ssst IMPLEMENTATION.
validate_font( ls_header-tdfamily ).
+ CALL FUNCTION 'SSF_READ_STYLE' "Just load FG
+ EXPORTING
+ i_style_name = ls_header-stylename
+ i_style_active_flag = 'A'
+ EXCEPTIONS
+ OTHERS = 0.
+ IF sy-subrc <> 0.
+ ENDIF.
+
+ SET PARAMETER ID 'EUK' FIELD iv_package.
+ ASSIGN ('(SAPLSTXBS)MASTER_LANGUAGE') TO .
+ IF sy-subrc = 0.
+ = ls_header-masterlang.
+ ENDIF.
+
CALL FUNCTION 'SSF_SAVE_STYLE'
EXPORTING
i_header = ls_header
+ IMPORTING
+ e_header = ls_new_header
TABLES
i_paragraphs = lt_paragraphs
i_strings = lt_strings
i_tabstops = lt_tabstops.
- CALL FUNCTION 'SSF_ACTIVATE_STYLE'
- EXPORTING
- i_stylename = ls_header-stylename
- EXCEPTIONS
- no_name = 1
- no_style = 2
- cancelled = 3
- no_access_permission = 4
- illegal_language = 5
- OTHERS = 6.
- IF sy-subrc <> 0.
- lcx_exception=>raise( 'error from SSF_ACTIVATE_STYLE' ).
+ IF ls_new_header IS NOT INITIAL.
+
+ CALL FUNCTION 'SSF_ACTIVATE_STYLE'
+ EXPORTING
+ i_stylename = ls_header-stylename
+ EXCEPTIONS
+ no_name = 1
+ no_style = 2
+ cancelled = 3
+ no_access_permission = 4
+ illegal_language = 5
+ OTHERS = 6.
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from SSF_ACTIVATE_STYLE' ).
+ ENDIF.
+
ENDIF.
ENDMETHOD. "deserialize
@@ -200,7 +225,39 @@ CLASS lcl_object_ssst IMPLEMENTATION.
ENDMETHOD. "delete
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo' ).
+
+ DATA: ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ ls_bcdata-program = 'SAPMSSFS'.
+ ls_bcdata-dynpro = '0100'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'SSFSCREENS-SNAME'.
+ ls_bcdata-fval = ms_item-obj_name.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=DISPLAY'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ STARTING NEW TASK 'GIT'
+ EXPORTING
+ tcode = 'SMARTSTYLES'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SSST' ).
+ ENDIF.
+
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
diff --git a/src/zabapgit_object_styl.prog.abap b/src/zabapgit_object_styl.prog.abap
index 3e6537cb8..b8f9c78ce 100644
--- a/src/zabapgit_object_styl.prog.abap
+++ b/src/zabapgit_object_styl.prog.abap
@@ -86,7 +86,47 @@ CLASS lcl_object_styl IMPLEMENTATION.
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, STYL jump' ).
+ DATA: ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ ls_bcdata-program = 'SAPMSSCS'.
+ ls_bcdata-dynpro = '1100'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'RSSCS-TDSTYLE'.
+ ls_bcdata-fval = ms_item-obj_name.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'RSSCS-TDSPRAS'.
+ ls_bcdata-fval = sy-langu.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'RSSCS-TDHEADEROB'.
+ ls_bcdata-fval = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=SHOW'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ STARTING NEW TASK 'GIT'
+ EXPORTING
+ tcode = 'SE72'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, STYL' ).
+ ENDIF.
ENDMETHOD. "jump
diff --git a/src/zabapgit_object_tabl.prog.abap b/src/zabapgit_object_tabl.prog.abap
index a8d4a2ab5..4f0e423cd 100644
--- a/src/zabapgit_object_tabl.prog.abap
+++ b/src/zabapgit_object_tabl.prog.abap
@@ -79,14 +79,27 @@ CLASS lcl_object_tabl IMPLEMENTATION.
METHOD lif_object~changed_by.
- SELECT SINGLE as4user FROM dd02l INTO rv_user
+ DATA: lv_as4date TYPE dd02l-as4date,
+ lv_as4time TYPE dd02l-as4time.
+
+
+ SELECT SINGLE as4user as4date as4time
+ FROM dd02l INTO (rv_user, lv_as4date, lv_as4time)
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
IF sy-subrc <> 0.
rv_user = c_user_unknown.
+ RETURN.
ENDIF.
+ SELECT SINGLE as4user INTO rv_user
+ FROM dd09l
+ WHERE tabname = ms_item-obj_name
+ AND as4local = 'A'
+ AND as4vers = '0000'
+ AND ( as4date > lv_as4date OR ( as4date = lv_as4date AND as4time > lv_as4time ) ).
+
ENDMETHOD.
METHOD lif_object~get_metadata.
diff --git a/src/zabapgit_object_tobj.prog.abap b/src/zabapgit_object_tobj.prog.abap
index 3e1f83f49..abf4a341d 100644
--- a/src/zabapgit_object_tobj.prog.abap
+++ b/src/zabapgit_object_tobj.prog.abap
@@ -13,6 +13,19 @@ CLASS lcl_object_tobj DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
+ PRIVATE SECTION.
+ TYPES: BEGIN OF ty_tobj,
+ tddat TYPE tddat,
+ tvdir TYPE tvdir,
+ tvimf TYPE STANDARD TABLE OF tvimf WITH DEFAULT KEY,
+ END OF ty_tobj.
+
+ METHODS:
+ read_extra IMPORTING iv_tabname TYPE vim_name
+ RETURNING VALUE(rs_tobj) TYPE ty_tobj,
+ update_extra IMPORTING is_tobj TYPE ty_tobj,
+ delete_extra IMPORTING iv_tabname TYPE vim_name.
+
ENDCLASS. "lcl_object_tobj DEFINITION
*----------------------------------------------------------------------*
@@ -22,6 +35,32 @@ ENDCLASS. "lcl_object_tobj DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_object_tobj IMPLEMENTATION.
+ METHOD read_extra.
+
+ SELECT SINGLE * FROM tddat INTO rs_tobj-tddat WHERE tabname = iv_tabname.
+
+ SELECT SINGLE * FROM tvdir INTO rs_tobj-tvdir WHERE tabname = iv_tabname.
+
+ SELECT * FROM tvimf INTO TABLE rs_tobj-tvimf WHERE tabname = iv_tabname.
+
+ ENDMETHOD.
+
+ METHOD update_extra.
+
+ MODIFY tddat FROM is_tobj-tddat.
+ MODIFY tvdir FROM is_tobj-tvdir.
+ MODIFY tvimf FROM TABLE is_tobj-tvimf.
+
+ ENDMETHOD.
+
+ METHOD delete_extra.
+
+ DELETE FROM tddat WHERE tabname = iv_tabname.
+ DELETE FROM tvdir WHERE tabname = iv_tabname.
+ DELETE FROM tvimf WHERE tabname = iv_tabname.
+
+ ENDMETHOD.
+
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
@@ -67,6 +106,7 @@ CLASS lcl_object_tobj IMPLEMENTATION.
lt_objs TYPE tt_objs,
lt_objsl TYPE tt_objsl,
lt_objm TYPE tt_objm,
+ ls_tobj TYPE ty_tobj,
lv_type_pos TYPE i.
lv_type_pos = strlen( ms_item-obj_name ) - 1.
@@ -113,6 +153,11 @@ CLASS lcl_object_tobj IMPLEMENTATION.
io_xml->add( iv_name = 'OBJM'
ig_data = lt_objm ).
+ ls_tobj = read_extra( ls_objh-objectname ).
+
+ io_xml->add( iv_name = 'TOBJ'
+ ig_data = ls_tobj ).
+
ENDMETHOD. "serialize
METHOD lif_object~deserialize.
@@ -121,7 +166,8 @@ CLASS lcl_object_tobj IMPLEMENTATION.
ls_objt TYPE objt,
lt_objs TYPE tt_objs,
lt_objsl TYPE tt_objsl,
- lt_objm TYPE tt_objm.
+ lt_objm TYPE tt_objm,
+ ls_tobj TYPE ty_tobj.
io_xml->read( EXPORTING iv_name = 'OBJH'
@@ -160,6 +206,11 @@ CLASS lcl_object_tobj IMPLEMENTATION.
lcx_exception=>raise( 'error from OBJ_GENERATE' ).
ENDIF.
+ io_xml->read( EXPORTING iv_name = 'TOBJ'
+ CHANGING cg_data = ls_tobj ).
+
+ update_extra( ls_tobj ).
+
ENDMETHOD. "deserialize
METHOD lif_object~delete.
@@ -188,10 +239,50 @@ CLASS lcl_object_tobj IMPLEMENTATION.
lcx_exception=>raise( 'error from OBJ_GENERATE' ).
ENDIF.
+ delete_extra( ls_objh-objectname ).
+
ENDMETHOD. "delete
METHOD lif_object~jump.
- lcx_exception=>raise( 'todo, TOBJ jump' ).
+
+ DATA: ls_bcdata TYPE bdcdata,
+ lt_bcdata TYPE STANDARD TABLE OF bdcdata.
+
+ ls_bcdata-program = 'SAPMSVIM'.
+ ls_bcdata-dynpro = '0050'.
+ ls_bcdata-dynbegin = 'X'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'VIMDYNFLDS-VIEWNAME'.
+ ls_bcdata-fval = substring( val = ms_item-obj_name
+ len = strlen( ms_item-obj_name ) - 1 ).
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'VIMDYNFLDS-ELEM_GEN'.
+ ls_bcdata-fval = abap_true.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CLEAR ls_bcdata.
+ ls_bcdata-fnam = 'BDC_OKCODE'.
+ ls_bcdata-fval = '=SHOW'.
+ APPEND ls_bcdata TO lt_bcdata.
+
+ CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+ STARTING NEW TASK 'GIT'
+ EXPORTING
+ tcode = 'SE54'
+ mode_val = 'E'
+ TABLES
+ using_tab = lt_bcdata
+ EXCEPTIONS
+ OTHERS = 1.
+
+ IF sy-subrc <> 0.
+ lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, TOBJ' ).
+ ENDIF.
+
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
diff --git a/src/zabapgit_object_tran.prog.abap b/src/zabapgit_object_tran.prog.abap
index 6e742dd2d..4af431ff9 100644
--- a/src/zabapgit_object_tran.prog.abap
+++ b/src/zabapgit_object_tran.prog.abap
@@ -41,11 +41,11 @@ CLASS lcl_object_tran DEFINITION INHERITING FROM lcl_objects_super FINAL.
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
- RAISING lcx_exception,
+ RAISING lcx_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
- RAISING lcx_exception.
+ RAISING lcx_exception.
ENDCLASS. "lcl_object_TRAN DEFINITION
@@ -443,7 +443,7 @@ CLASS lcl_object_tran IMPLEMENTATION.
INTO CORRESPONDING FIELDS OF TABLE lt_tpool_i18n
FROM tstct
WHERE sprsl <> mv_language
- AND tcode = ms_item-obj_name.
+ AND tcode = ms_item-obj_name. "#EC CI_GENBUFF
IF lines( lt_tpool_i18n ) > 0.
SORT lt_tpool_i18n BY sprsl ASCENDING.
diff --git a/src/zabapgit_object_type.prog.abap b/src/zabapgit_object_type.prog.abap
index 562b057d7..0612a2e13 100644
--- a/src/zabapgit_object_type.prog.abap
+++ b/src/zabapgit_object_type.prog.abap
@@ -14,6 +14,8 @@ CLASS lcl_object_type DEFINITION INHERITING FROM lcl_objects_super FINAL.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
+ CONSTANTS: c_prefix TYPE c LENGTH 3 VALUE '%_C'.
+
METHODS read
EXPORTING ev_ddtext TYPE ddtypet-ddtext
et_source TYPE abaptxt255_tab
@@ -122,10 +124,6 @@ CLASS lcl_object_type IMPLEMENTATION.
lv_typegroup = ms_item-obj_name.
- IF lif_object~exists( ) = abap_true.
- lif_object~delete( ).
- ENDIF.
-
CALL FUNCTION 'RS_DD_TYGR_INSERT_SOURCES'
EXPORTING
typegroupname = lv_typegroup
@@ -145,7 +143,7 @@ CLASS lcl_object_type IMPLEMENTATION.
lcx_exception=>raise( 'error from RS_DD_TYGR_INSERT_SOURCES' ).
ENDIF.
- CONCATENATE '%_C' lv_typegroup INTO lv_progname.
+ CONCATENATE c_prefix lv_typegroup INTO lv_progname.
UPDATE progdir SET uccheck = abap_true
WHERE name = lv_progname.
IF sy-subrc <> 0.
@@ -156,8 +154,13 @@ CLASS lcl_object_type IMPLEMENTATION.
METHOD lif_object~deserialize.
- DATA: lv_ddtext TYPE ddtypet-ddtext,
- lt_source TYPE abaptxt255_tab.
+ DATA: lv_ddtext TYPE ddtypet-ddtext,
+ lt_source TYPE abaptxt255_tab,
+ lv_progname TYPE reposrc-progname,
+ lv_typegroup TYPE rsedd0-typegroup.
+
+
+ lv_typegroup = ms_item-obj_name.
io_xml->read( EXPORTING iv_name = 'DDTEXT'
@@ -165,9 +168,14 @@ CLASS lcl_object_type IMPLEMENTATION.
lt_source = mo_files->read_abap( ).
- create( iv_ddtext = lv_ddtext
- it_source = lt_source
- iv_devclass = iv_package ).
+ IF lif_object~exists( ) = abap_false.
+ create( iv_ddtext = lv_ddtext
+ it_source = lt_source
+ iv_devclass = iv_package ).
+ ELSE.
+ CONCATENATE c_prefix lv_typegroup INTO lv_progname.
+ INSERT REPORT lv_progname FROM lt_source STATE 'I'.
+ ENDIF.
lcl_objects_activation=>add_item( ms_item ).
diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap
index 8b2907a56..68e2c60e7 100644
--- a/src/zabapgit_objects.prog.abap
+++ b/src/zabapgit_objects.prog.abap
@@ -449,13 +449,7 @@ CLASS lcl_objects_files IMPLEMENTATION.
DATA: lv_obj_name TYPE string.
- IF ms_item-obj_type = 'SICF'.
-* multiple SICF nodes with same name cannot be added to repository
- lv_obj_name = ms_item-obj_name(15).
- ELSE.
- lv_obj_name = ms_item-obj_name.
- ENDIF.
-
+ lv_obj_name = ms_item-obj_name.
IF iv_extra IS INITIAL.
CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_ext
@@ -1668,7 +1662,7 @@ CLASS lcl_objects_super IMPLEMENTATION.
li_object TYPE REF TO cl_wb_object,
li_adt TYPE REF TO object,
li_adt_uri_mapper TYPE REF TO object,
- li_adt_objref TYPE REF TO object.
+ li_adt_objref TYPE REF TO object ##needed.
FIELD-SYMBOLS: TYPE string.
@@ -1797,22 +1791,10 @@ CLASS lcl_objects_super IMPLEMENTATION.
METHOD is_adt_jump_possible.
- DATA: li_wb_manager TYPE REF TO if_wb_manager,
- li_wb_request TYPE REF TO cl_wb_request,
+ DATA: li_wb_request TYPE REF TO cl_wb_request,
li_adt_uri_mapper_vit TYPE REF TO object,
is_vit_wb_request TYPE abap_bool.
- cl_wb_manager=>get_instance(
- IMPORTING
- p_instance = li_wb_manager
- EXCEPTIONS
- no_instance = 1
- OTHERS = 2 ).
-
- IF sy-subrc <> 0.
- lcx_exception=>raise( 'ADT Jump Error' ).
- ENDIF.
-
cl_wb_request=>create_from_object_ref(
EXPORTING
p_wb_object = io_object
@@ -1852,6 +1834,381 @@ CLASS lcl_objects_super IMPLEMENTATION.
ENDCLASS. "lcl_objects_super IMPLEMENTATION
+CLASS lcl_objects_saxx_super DEFINITION ABSTRACT
+ INHERITING FROM lcl_objects_super.
+* common class for SAPC and SAMC objects
+
+ PUBLIC SECTION.
+ INTERFACES:
+ lif_object.
+
+ PROTECTED SECTION.
+ METHODS:
+ get_persistence_class_name ABSTRACT
+ RETURNING
+ VALUE(r_persistence_class_name) TYPE seoclsname,
+
+ get_data_class_name ABSTRACT
+ RETURNING
+ VALUE(r_data_class_name) TYPE seoclsname,
+
+ get_data_structure_name ABSTRACT
+ RETURNING
+ VALUE(r_data_structure_name) TYPE string.
+
+ PRIVATE SECTION.
+ DATA: mo_persistence TYPE REF TO if_wb_object_persist,
+ mo_appl_obj_data TYPE REF TO if_wb_object_data_model,
+ mv_data_structure_name TYPE string,
+ mv_appl_obj_cls_name TYPE seoclsname,
+ mv_persistence_cls_name TYPE seoclsname.
+
+ METHODS:
+ create_channel_objects
+ RAISING
+ lcx_exception,
+
+ get_data
+ EXPORTING
+ p_data TYPE any
+ RAISING
+ lcx_exception,
+
+ lock
+ RAISING
+ lcx_exception,
+
+ unlock
+ RAISING
+ lcx_exception,
+
+ get_names.
+
+ENDCLASS.
+
+CLASS lcl_objects_saxx_super IMPLEMENTATION.
+
+ METHOD lif_object~has_changed_since.
+ rv_changed = abap_true.
+ ENDMETHOD.
+
+ METHOD lif_object~changed_by.
+
+ DATA: lr_data TYPE REF TO data.
+
+ FIELD-SYMBOLS: TYPE any,
+ TYPE any,
+ TYPE any.
+
+ create_channel_objects( ).
+
+ TRY.
+ CREATE DATA lr_data TYPE (mv_data_structure_name).
+ ASSIGN lr_data->* TO .
+
+ CATCH cx_root.
+ lcx_exception=>raise( |{ ms_item-obj_name } not supported| ).
+ ENDTRY.
+
+ get_data(
+ IMPORTING
+ p_data = ).
+
+ ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO .
+ ASSERT sy-subrc = 0.
+ ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO .
+ ASSERT sy-subrc = 0.
+
+ rv_user = .
+
+ ENDMETHOD.
+
+ METHOD lif_object~get_metadata.
+ rs_metadata = get_metadata( ).
+ rs_metadata-delete_tadir = abap_true.
+ ENDMETHOD.
+
+ METHOD lif_object~exists.
+
+ DATA: object_key TYPE seu_objkey.
+
+ create_channel_objects( ).
+
+ object_key = ms_item-obj_name.
+
+ TRY.
+ mo_persistence->get( p_object_key = object_key
+ p_version = 'A'
+ p_existence_check_only = abap_true ).
+
+ CATCH cx_swb_object_does_not_exist cx_swb_exception.
+ rv_bool = abap_false.
+ RETURN.
+ ENDTRY.
+
+ rv_bool = abap_true.
+
+ ENDMETHOD.
+
+ METHOD lif_object~serialize.
+
+ DATA: lr_data TYPE REF TO data.
+
+ FIELD-SYMBOLS: TYPE any,
+ TYPE any,
+ TYPE any.
+
+ create_channel_objects( ).
+
+ TRY.
+ CREATE DATA lr_data TYPE (mv_data_structure_name).
+ ASSIGN lr_data->* TO .
+
+ CATCH cx_root.
+ lcx_exception=>raise( |{ ms_item-obj_type } not supported| ).
+ ENDTRY.
+
+ get_data(
+ IMPORTING
+ p_data = ).
+
+ ASSIGN COMPONENT 'HEADER' OF STRUCTURE TO .
+ ASSERT sy-subrc = 0.
+
+ ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE TO .
+ ASSERT sy-subrc = 0.
+ CLEAR .
+
+ ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE TO .
+ ASSERT sy-subrc = 0.
+ CLEAR .
+
+ ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE TO