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" ![](img/offline1.png) 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: