abapgit-agent 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +2 -0
  2. package/abap/guidelines/00_index.md +35 -0
  3. package/abap/guidelines/01_sql.md +72 -0
  4. package/abap/guidelines/02_exceptions.md +108 -0
  5. package/abap/guidelines/03_testing.md +252 -0
  6. package/abap/guidelines/04_cds.md +120 -0
  7. package/abap/guidelines/05_classes.md +50 -0
  8. package/abap/guidelines/06_objects.md +103 -0
  9. package/abap/guidelines/07_json.md +22 -0
  10. package/abap/guidelines/08_abapgit.md +193 -0
  11. package/bin/abapgit-agent +597 -44
  12. package/bin/abgagt +24 -0
  13. package/package.json +11 -3
  14. package/src/abap-client.js +65 -2
  15. package/src/agent.js +58 -4
  16. package/src/config.js +9 -2
  17. package/src/ref-search.js +989 -0
  18. package/.abapGitAgent.example +0 -11
  19. package/.github/workflows/release.yml +0 -57
  20. package/API.md +0 -710
  21. package/CLAUDE.md +0 -1031
  22. package/CLAUDE_MEM.md +0 -88
  23. package/ERROR_HANDLING.md +0 -30
  24. package/INSTALL.md +0 -155
  25. package/RELEASE_NOTES.md +0 -143
  26. package/abap/CLAUDE.md +0 -898
  27. package/abap/copilot-instructions.md +0 -79
  28. package/abap/package.devc.xml +0 -10
  29. package/abap/zcl_abgagt_agent.clas.abap +0 -420
  30. package/abap/zcl_abgagt_agent.clas.xml +0 -15
  31. package/abap/zcl_abgagt_cmd_factory.clas.abap +0 -48
  32. package/abap/zcl_abgagt_cmd_factory.clas.xml +0 -15
  33. package/abap/zcl_abgagt_command_create.clas.abap +0 -95
  34. package/abap/zcl_abgagt_command_create.clas.xml +0 -15
  35. package/abap/zcl_abgagt_command_import.clas.abap +0 -138
  36. package/abap/zcl_abgagt_command_import.clas.xml +0 -15
  37. package/abap/zcl_abgagt_command_inspect.clas.abap +0 -411
  38. package/abap/zcl_abgagt_command_inspect.clas.testclasses.abap +0 -121
  39. package/abap/zcl_abgagt_command_inspect.clas.xml +0 -16
  40. package/abap/zcl_abgagt_command_preview.clas.abap +0 -386
  41. package/abap/zcl_abgagt_command_preview.clas.xml +0 -15
  42. package/abap/zcl_abgagt_command_pull.clas.abap +0 -80
  43. package/abap/zcl_abgagt_command_pull.clas.testclasses.abap +0 -87
  44. package/abap/zcl_abgagt_command_pull.clas.xml +0 -16
  45. package/abap/zcl_abgagt_command_tree.clas.abap +0 -237
  46. package/abap/zcl_abgagt_command_tree.clas.xml +0 -15
  47. package/abap/zcl_abgagt_command_unit.clas.abap +0 -297
  48. package/abap/zcl_abgagt_command_unit.clas.xml +0 -15
  49. package/abap/zcl_abgagt_command_view.clas.abap +0 -240
  50. package/abap/zcl_abgagt_command_view.clas.xml +0 -15
  51. package/abap/zcl_abgagt_resource_create.clas.abap +0 -71
  52. package/abap/zcl_abgagt_resource_create.clas.xml +0 -15
  53. package/abap/zcl_abgagt_resource_health.clas.abap +0 -25
  54. package/abap/zcl_abgagt_resource_health.clas.xml +0 -15
  55. package/abap/zcl_abgagt_resource_import.clas.abap +0 -66
  56. package/abap/zcl_abgagt_resource_import.clas.xml +0 -15
  57. package/abap/zcl_abgagt_resource_inspect.clas.abap +0 -62
  58. package/abap/zcl_abgagt_resource_inspect.clas.xml +0 -15
  59. package/abap/zcl_abgagt_resource_preview.clas.abap +0 -67
  60. package/abap/zcl_abgagt_resource_preview.clas.xml +0 -15
  61. package/abap/zcl_abgagt_resource_pull.clas.abap +0 -71
  62. package/abap/zcl_abgagt_resource_pull.clas.xml +0 -15
  63. package/abap/zcl_abgagt_resource_tree.clas.abap +0 -70
  64. package/abap/zcl_abgagt_resource_tree.clas.xml +0 -15
  65. package/abap/zcl_abgagt_resource_unit.clas.abap +0 -64
  66. package/abap/zcl_abgagt_resource_unit.clas.xml +0 -15
  67. package/abap/zcl_abgagt_resource_view.clas.abap +0 -68
  68. package/abap/zcl_abgagt_resource_view.clas.xml +0 -15
  69. package/abap/zcl_abgagt_rest_handler.clas.abap +0 -32
  70. package/abap/zcl_abgagt_rest_handler.clas.xml +0 -15
  71. package/abap/zcl_abgagt_util.clas.abap +0 -93
  72. package/abap/zcl_abgagt_util.clas.testclasses.abap +0 -84
  73. package/abap/zcl_abgagt_util.clas.xml +0 -16
  74. package/abap/zcl_abgagt_viewer_clas.clas.abap +0 -58
  75. package/abap/zcl_abgagt_viewer_clas.clas.xml +0 -15
  76. package/abap/zcl_abgagt_viewer_ddls.clas.abap +0 -83
  77. package/abap/zcl_abgagt_viewer_ddls.clas.xml +0 -15
  78. package/abap/zcl_abgagt_viewer_dtel.clas.abap +0 -98
  79. package/abap/zcl_abgagt_viewer_dtel.clas.xml +0 -15
  80. package/abap/zcl_abgagt_viewer_factory.clas.abap +0 -41
  81. package/abap/zcl_abgagt_viewer_factory.clas.xml +0 -15
  82. package/abap/zcl_abgagt_viewer_intf.clas.abap +0 -58
  83. package/abap/zcl_abgagt_viewer_intf.clas.xml +0 -15
  84. package/abap/zcl_abgagt_viewer_stru.clas.abap +0 -59
  85. package/abap/zcl_abgagt_viewer_stru.clas.xml +0 -15
  86. package/abap/zcl_abgagt_viewer_tabl.clas.abap +0 -59
  87. package/abap/zcl_abgagt_viewer_tabl.clas.xml +0 -15
  88. package/abap/zcl_abgagt_viewer_ttyp.clas.abap +0 -93
  89. package/abap/zcl_abgagt_viewer_ttyp.clas.xml +0 -15
  90. package/abap/zif_abgagt_agent.intf.abap +0 -53
  91. package/abap/zif_abgagt_agent.intf.xml +0 -15
  92. package/abap/zif_abgagt_cmd_factory.intf.abap +0 -7
  93. package/abap/zif_abgagt_cmd_factory.intf.xml +0 -15
  94. package/abap/zif_abgagt_command.intf.abap +0 -26
  95. package/abap/zif_abgagt_command.intf.xml +0 -15
  96. package/abap/zif_abgagt_util.intf.abap +0 -28
  97. package/abap/zif_abgagt_util.intf.xml +0 -15
  98. package/abap/zif_abgagt_viewer.intf.abap +0 -12
  99. package/abap/zif_abgagt_viewer.intf.xml +0 -15
  100. package/docs/commands.md +0 -142
  101. package/docs/create-command.md +0 -129
  102. package/docs/health-command.md +0 -89
  103. package/docs/import-command.md +0 -195
  104. package/docs/init-command.md +0 -189
  105. package/docs/inspect-command.md +0 -158
  106. package/docs/preview-command.md +0 -528
  107. package/docs/pull-command.md +0 -188
  108. package/docs/status-command.md +0 -68
  109. package/docs/tree-command.md +0 -303
  110. package/docs/unit-command.md +0 -167
  111. package/docs/view-command.md +0 -501
  112. package/img/claude.png +0 -0
  113. package/scripts/claude-integration.js +0 -351
  114. package/scripts/release.sh +0 -60
  115. package/scripts/test-integration.js +0 -139
@@ -1,79 +0,0 @@
1
- # ABAP Development with abapGit
2
-
3
- You are working on an ABAP project using abapGit for version control.
4
-
5
- ## Commands
6
-
7
- | Command | Description |
8
- |---------|-------------|
9
- | `abapgit-agent pull` | Pull and activate all ABAP objects |
10
- | `abapgit-agent pull --files <file>` | Pull and activate specific file only |
11
- | `abapgit-agent inspect --files <file>` | Syntax check ABAP source |
12
- | `abapgit-agent unit --files <file>` | Run AUnit tests |
13
- | `abapgit-agent tree --package <package>` | Display package hierarchy |
14
- | `abapgit-agent view --objects <name>` | View object definitions |
15
-
16
- ## Explore Unknown Objects
17
-
18
- **Before working with unfamiliar objects, use `view` command:**
19
-
20
- ```bash
21
- # Check table structure
22
- abapgit-agent view --objects ZMY_TABLE --type TABL
23
-
24
- # Check class definition
25
- abapgit-agent view --objects ZCL_UNKNOWN_CLASS
26
-
27
- # Check interface
28
- abapgit-agent view --objects ZIF_UNKNOWN_INTERFACE
29
-
30
- # Check data element
31
- abapgit-agent view --objects ZMY_DTEL --type DTEL
32
- ```
33
-
34
- ## When to Use View Command
35
-
36
- AI assistant SHOULD call `view` command when:
37
- - User asks to "check", "look up", or "explore" an unfamiliar object
38
- - Working with a table/structure and you don't know the fields
39
- - Calling a class/interface method and you don't know the parameters
40
- - You need to verify an object exists before using it
41
-
42
- ## Key ABAP Rules
43
-
44
- 1. **Global classes MUST use `PUBLIC`**:
45
- ```abap
46
- CLASS zcl_my_class DEFINITION PUBLIC. " <- REQUIRED
47
- ```
48
-
49
- 2. **Use `/ui2/cl_json` for JSON**:
50
- ```abap
51
- DATA ls_data TYPE ty_request.
52
- ls_data = /ui2/cl_json=>deserialize( json = lv_json ).
53
- lv_json = /ui2/cl_json=>serialize( data = ls_response ).
54
- ```
55
-
56
- 3. **Test class name max 30 chars**: `ltcl_util` (not `ltcl_abgagt_util_test`)
57
-
58
- 4. **Interface method implementation**: Use prefix `zif_interface~method_name`
59
-
60
- 5. **abapGit files need XML metadata**: `.clas.xml`, `.intf.xml` alongside `.clas.abap`, `.intf.abap`
61
-
62
- ## Workflow
63
-
64
- 1. Edit ABAP file in `/abap/`
65
- 2. `git add <file> && git commit -m "..." && git push`
66
- 3. `abapgit-agent pull --files <file>` (seconds, not minutes)
67
-
68
- ## Error Handling
69
-
70
- - Activation fails with "Error updating where-used list" = **syntax error**
71
- - Use `abapgit-agent inspect --files <file>` for detailed error messages
72
-
73
- ## Object Naming
74
-
75
- | Pattern | Type |
76
- |---------|------|
77
- | `ZCL_*` | Class |
78
- | `ZIF_*` | Interface |
79
- | `Z*` | Other objects |
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
3
- <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
- <asx:values>
5
- <DEVC>
6
- <CTEXT>ABAP AI Bridge - Package for git pull and activate agent</CTEXT>
7
- </DEVC>
8
- </asx:values>
9
- </asx:abap>
10
- </abapGit>
@@ -1,420 +0,0 @@
1
- " TODO: Implement detailed syntax error parsing
2
- " When a syntax error occurs, the log shows the affected object name
3
- " but not the specific line/column. For better error reporting:
4
- " - Parse the error message to extract object info
5
- " - For syntax errors, query SEPSA or TRINT_OBJECT_LOG for details
6
- " - Return structured error with line numbers and fix suggestions
7
-
8
- CLASS zcl_abgagt_agent DEFINITION PUBLIC FINAL CREATE PUBLIC.
9
-
10
- PUBLIC SECTION.
11
- INTERFACES: zif_abgagt_agent.
12
-
13
- METHODS: get_version RETURNING VALUE(rv_version) TYPE string.
14
- METHODS: parse_file_to_object
15
- IMPORTING
16
- iv_file TYPE string
17
- EXPORTING
18
- ev_obj_type TYPE string
19
- ev_obj_name TYPE string.
20
-
21
- PROTECTED SECTION.
22
-
23
- " Local type for item signature (matches abapGit structure)
24
- TYPES: BEGIN OF ty_item_signature,
25
- obj_type TYPE tadir-object,
26
- obj_name TYPE tadir-obj_name,
27
- devclass TYPE devclass,
28
- END OF ty_item_signature.
29
-
30
- DATA: mo_repo TYPE REF TO zif_abapgit_repo.
31
-
32
- METHODS configure_credentials
33
- IMPORTING
34
- iv_url TYPE string
35
- iv_username TYPE string
36
- iv_password TYPE string
37
- RAISING zcx_abapgit_exception.
38
-
39
- METHODS prepare_deserialize_checks
40
- IMPORTING
41
- it_files TYPE string_table OPTIONAL
42
- iv_transport_request TYPE string OPTIONAL
43
- RETURNING
44
- VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks
45
- RAISING zcx_abapgit_exception.
46
-
47
- METHODS check_log_for_errors
48
- RETURNING
49
- VALUE(rv_has_error) TYPE abap_bool.
50
-
51
- METHODS get_log_detail
52
- RETURNING
53
- VALUE(rv_detail) TYPE string.
54
-
55
- METHODS get_object_lists
56
- RETURNING
57
- VALUE(rs_result) TYPE zif_abgagt_agent=>ty_result.
58
-
59
- METHODS handle_exception
60
- IMPORTING
61
- ix_exception TYPE REF TO cx_root
62
- RETURNING
63
- VALUE(rs_result) TYPE zif_abgagt_agent=>ty_result.
64
-
65
- ENDCLASS.
66
-
67
- CLASS zcl_abgagt_agent IMPLEMENTATION.
68
-
69
- METHOD zif_abgagt_agent~pull.
70
- DATA: lv_job_id TYPE string.
71
- lv_job_id = |{ sy-uname }{ sy-datum }{ sy-uzeit }|.
72
- rs_result-job_id = lv_job_id.
73
- rs_result-success = abap_false.
74
- rs_result-transport_request = iv_transport_request.
75
- GET TIME STAMP FIELD rs_result-started_at.
76
-
77
- IF iv_url IS INITIAL.
78
- rs_result-message = 'URL is required'.
79
- RETURN.
80
- ENDIF.
81
-
82
- TRY.
83
- IF iv_username IS NOT INITIAL AND iv_password IS NOT INITIAL.
84
- configure_credentials(
85
- iv_url = iv_url
86
- iv_username = iv_username
87
- iv_password = iv_password ).
88
- ENDIF.
89
-
90
- DATA: li_repo TYPE REF TO zif_abapgit_repo.
91
- zcl_abapgit_repo_srv=>get_instance( )->get_repo_from_url(
92
- EXPORTING iv_url = iv_url
93
- IMPORTING ei_repo = li_repo ).
94
- mo_repo = li_repo.
95
-
96
- IF mo_repo IS BOUND.
97
- mo_repo->refresh( ).
98
-
99
- DATA(ls_checks) = prepare_deserialize_checks(
100
- it_files = it_files
101
- iv_transport_request = iv_transport_request ).
102
-
103
- mo_repo->create_new_log( ).
104
-
105
- mo_repo->deserialize(
106
- is_checks = ls_checks
107
- ii_log = mo_repo->get_log( ) ).
108
-
109
- " Check the abapGit log for errors and extract object lists
110
- DATA(lv_has_error) = check_log_for_errors( ).
111
- DATA(lv_error_detail) = get_log_detail( ).
112
-
113
- " Extract activated and failed objects from the log
114
- DATA(ls_obj_result) = get_object_lists( ).
115
-
116
- rs_result-log_messages = ls_obj_result-log_messages.
117
- rs_result-activated_objects = ls_obj_result-activated_objects.
118
- rs_result-failed_objects = ls_obj_result-failed_objects.
119
-
120
- " Count objects
121
- rs_result-activated_count = lines( rs_result-activated_objects ).
122
- rs_result-failed_count = lines( rs_result-failed_objects ).
123
-
124
- GET TIME STAMP FIELD rs_result-finished_at.
125
-
126
- IF lv_has_error = abap_true.
127
- rs_result-message = 'Pull completed with errors'.
128
- rs_result-error_detail = lv_error_detail.
129
- ELSE.
130
- rs_result-success = abap_true.
131
- rs_result-message = 'Pull completed successfully'.
132
- ENDIF.
133
- ELSE.
134
- rs_result-message = |Repository not found: { iv_url }|.
135
- GET TIME STAMP FIELD rs_result-finished_at.
136
- ENDIF.
137
-
138
- CATCH zcx_abapgit_exception INTO DATA(lx_git).
139
- rs_result = handle_exception( ix_exception = lx_git ).
140
- GET TIME STAMP FIELD rs_result-finished_at.
141
- CATCH cx_root INTO DATA(lx_error).
142
- rs_result = handle_exception( ix_exception = lx_error ).
143
- GET TIME STAMP FIELD rs_result-finished_at.
144
- ENDTRY.
145
-
146
- ENDMETHOD.
147
-
148
- METHOD zif_abgagt_agent~get_repo_status.
149
- DATA: li_repo TYPE REF TO zif_abapgit_repo.
150
- TRY.
151
- zcl_abapgit_repo_srv=>get_instance( )->get_repo_from_url(
152
- EXPORTING iv_url = iv_url
153
- IMPORTING ei_repo = li_repo ).
154
- CATCH zcx_abapgit_exception.
155
- rv_status = 'Not found'.
156
- RETURN.
157
- ENDTRY.
158
-
159
- IF li_repo IS BOUND.
160
- rv_status = 'Found'.
161
- ELSE.
162
- rv_status = 'Not found'.
163
- ENDIF.
164
- ENDMETHOD.
165
-
166
- METHOD configure_credentials.
167
- zcl_abapgit_persist_factory=>get_user( )->set_repo_git_user_name(
168
- iv_url = iv_url iv_username = iv_username ).
169
- zcl_abapgit_persist_factory=>get_user( )->set_repo_login(
170
- iv_url = iv_url iv_login = iv_username ).
171
- zcl_abapgit_login_manager=>set_basic(
172
- iv_uri = iv_url
173
- iv_username = iv_username
174
- iv_password = iv_password ).
175
- ENDMETHOD.
176
-
177
- METHOD parse_file_to_object.
178
- " Parse file path to extract obj_type and obj_name
179
- " Example: "zcl_my_class.clas.abap" -> CLAS, ZCL_MY_CLASS
180
- " Example: "src/zcl_my_class.clas.abap" -> CLAS, ZCL_MY_CLASS
181
-
182
- DATA lv_upper TYPE string.
183
- lv_upper = iv_file.
184
- TRANSLATE lv_upper TO UPPER CASE.
185
-
186
- " Split filename by '.' to get parts
187
- DATA lt_parts TYPE TABLE OF string.
188
- SPLIT lv_upper AT '.' INTO TABLE lt_parts.
189
- DATA lv_part_count TYPE i.
190
- lv_part_count = lines( lt_parts ).
191
-
192
- IF lv_part_count < 3.
193
- RETURN.
194
- ENDIF.
195
-
196
- " Last part should be 'ABAP' for verification
197
- READ TABLE lt_parts INDEX lv_part_count INTO DATA(lv_last).
198
- IF lv_last <> 'ABAP'.
199
- RETURN.
200
- ENDIF.
201
-
202
- " First part is obj_name (may contain path), second part is obj_type
203
- DATA lv_obj_name TYPE string.
204
- DATA lv_obj_type_raw TYPE string.
205
- READ TABLE lt_parts INDEX 1 INTO lv_obj_name.
206
- READ TABLE lt_parts INDEX 2 INTO lv_obj_type_raw.
207
-
208
- " Convert file extension to object type
209
- IF lv_obj_type_raw = 'CLASS'.
210
- ev_obj_type = 'CLAS'.
211
- ELSE.
212
- ev_obj_type = lv_obj_type_raw.
213
- ENDIF.
214
-
215
- " Extract file name from obj_name (remove path prefix)
216
- DATA lv_len TYPE i.
217
- lv_len = strlen( lv_obj_name ).
218
- DATA lv_offs TYPE i.
219
- lv_offs = find( val = reverse( lv_obj_name ) sub = '/' ).
220
- IF lv_offs > 0.
221
- lv_offs = lv_len - lv_offs - 1.
222
- lv_obj_name = lv_obj_name+lv_offs.
223
- ENDIF.
224
-
225
- " Remove leading '/' if present
226
- IF lv_obj_name(1) = '/'.
227
- lv_obj_name = lv_obj_name+1.
228
- ENDIF.
229
-
230
- ev_obj_name = lv_obj_name.
231
- ENDMETHOD.
232
-
233
- METHOD prepare_deserialize_checks.
234
- rs_checks = mo_repo->deserialize_checks( ).
235
-
236
- " Set transport request if provided
237
- IF iv_transport_request IS NOT INITIAL.
238
- rs_checks-transport-transport = iv_transport_request.
239
- ENDIF.
240
-
241
- " If specific files requested, build lookup table of (obj_type, obj_name)
242
- DATA lt_valid_files TYPE HASHED TABLE OF zif_abapgit_definitions=>ty_item_signature
243
- WITH UNIQUE KEY obj_type obj_name.
244
- IF it_files IS SUPPLIED AND lines( it_files ) > 0.
245
- LOOP AT it_files INTO DATA(lv_file).
246
- DATA lv_obj_type TYPE string.
247
- DATA lv_obj_name TYPE string.
248
- parse_file_to_object(
249
- EXPORTING iv_file = lv_file
250
- IMPORTING ev_obj_type = lv_obj_type
251
- ev_obj_name = lv_obj_name ).
252
-
253
- IF lv_obj_type IS NOT INITIAL AND lv_obj_name IS NOT INITIAL.
254
- DATA ls_sig TYPE zif_abapgit_definitions=>ty_item_signature.
255
- ls_sig-obj_type = lv_obj_type.
256
- ls_sig-obj_name = lv_obj_name.
257
- INSERT ls_sig INTO TABLE lt_valid_files.
258
- ENDIF.
259
- ENDLOOP.
260
- ENDIF.
261
-
262
- " Set decision for each file
263
- LOOP AT rs_checks-overwrite INTO DATA(ls_overwrite).
264
- IF it_files IS SUPPLIED AND lines( it_files ) > 0.
265
- " Check if file is in valid files list
266
- READ TABLE lt_valid_files WITH TABLE KEY obj_type = ls_overwrite-obj_type
267
- obj_name = ls_overwrite-obj_name
268
- TRANSPORTING NO FIELDS.
269
- IF sy-subrc = 0.
270
- ls_overwrite-decision = zif_abapgit_definitions=>c_yes.
271
- ELSE.
272
- ls_overwrite-decision = zif_abapgit_definitions=>c_no.
273
- ENDIF.
274
- ELSE.
275
- " No files specified - deserialize all
276
- ls_overwrite-decision = zif_abapgit_definitions=>c_yes.
277
- ENDIF.
278
- MODIFY rs_checks-overwrite FROM ls_overwrite.
279
- ENDLOOP.
280
-
281
- DATA: lo_settings TYPE REF TO zcl_abapgit_settings.
282
- lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
283
- lo_settings->set_activate_wo_popup( abap_true ).
284
- ENDMETHOD.
285
-
286
- METHOD check_log_for_errors.
287
- DATA: lo_log TYPE REF TO zif_abapgit_log.
288
-
289
- rv_has_error = abap_false.
290
-
291
- lo_log = mo_repo->get_log( ).
292
- IF lo_log IS BOUND.
293
- DATA(lv_status) = lo_log->get_status( ).
294
- IF lv_status = zif_abapgit_log=>c_status-error.
295
- rv_has_error = abap_true.
296
- ENDIF.
297
- ENDIF.
298
- ENDMETHOD.
299
-
300
- METHOD get_log_detail.
301
- " Extract detailed log messages including type, id, number, text, obj_type, obj_name, exception
302
- DATA: lo_log TYPE REF TO zif_abapgit_log.
303
-
304
- rv_detail = ''.
305
-
306
- lo_log = mo_repo->get_log( ).
307
- IF lo_log IS BOUND.
308
- DATA: lt_messages TYPE zif_abapgit_log=>ty_log_outs.
309
- DATA: ls_msg TYPE zif_abapgit_log=>ty_log_out.
310
- lt_messages = lo_log->get_messages( ).
311
-
312
- DATA lv_first TYPE abap_bool VALUE abap_false.
313
-
314
- LOOP AT lt_messages INTO ls_msg.
315
- IF ls_msg-type = 'E' OR ls_msg-type = 'A' OR ls_msg-type = 'W'.
316
- DATA: lv_msg TYPE string.
317
- IF ls_msg-obj_type IS NOT INITIAL AND ls_msg-obj_name IS NOT INITIAL.
318
- lv_msg = |{ ls_msg-obj_type } { ls_msg-obj_name }: { ls_msg-text }|.
319
- ELSE.
320
- lv_msg = ls_msg-text.
321
- ENDIF.
322
- " Add exception text if available
323
- IF ls_msg-exception IS BOUND.
324
- lv_msg = |{ lv_msg }\nException: { ls_msg-exception->get_text( ) }|.
325
- ENDIF.
326
- IF lv_first = abap_false.
327
- rv_detail = lv_msg.
328
- lv_first = abap_true.
329
- ELSE.
330
- rv_detail = |{ rv_detail }&&&{ lv_msg }|.
331
- ENDIF.
332
- ENDIF.
333
- ENDLOOP.
334
-
335
- " Replace marker with newline for display
336
- IF rv_detail IS NOT INITIAL.
337
- rv_detail = replace( val = rv_detail sub = '&&&' with = cl_abap_char_utilities=>newline ).
338
- rv_detail = |Error Details:{ cl_abap_char_utilities=>newline }{ rv_detail }|.
339
- ENDIF.
340
- ENDIF.
341
- ENDMETHOD.
342
-
343
- METHOD get_object_lists.
344
- " Extract activated and failed objects from the log with full details
345
- DATA: lo_log TYPE REF TO zif_abapgit_log.
346
- DATA: lv_key TYPE string.
347
-
348
- CLEAR: rs_result-log_messages, rs_result-activated_objects, rs_result-failed_objects.
349
-
350
- lo_log = mo_repo->get_log( ).
351
- IF lo_log IS BOUND.
352
- DATA: lt_messages TYPE zif_abapgit_log=>ty_log_outs.
353
- DATA: ls_msg TYPE zif_abapgit_log=>ty_log_out.
354
- lt_messages = lo_log->get_messages( ).
355
-
356
- LOOP AT lt_messages INTO ls_msg.
357
- DATA: ls_object TYPE zif_abgagt_agent=>ty_object.
358
- ls_object-type = ls_msg-type.
359
- ls_object-id = ls_msg-id.
360
- ls_object-number = ls_msg-number.
361
- ls_object-text = ls_msg-text.
362
- ls_object-obj_type = ls_msg-obj_type.
363
- ls_object-obj_name = ls_msg-obj_name.
364
-
365
- " Exception is a REF, need to convert to string
366
- " Also append exception text to the message for better error reporting
367
- IF ls_msg-exception IS BOUND.
368
- DATA: lv_exc_text TYPE string.
369
- lv_exc_text = ls_msg-exception->get_text( ).
370
- ls_object-exception = lv_exc_text.
371
- " Append exception text to the main text if it's not already there
372
- IF lv_exc_text IS NOT INITIAL AND ls_msg-text NA lv_exc_text.
373
- ls_object-text = |{ ls_msg-text }\nException: { lv_exc_text }|.
374
- ENDIF.
375
- ENDIF.
376
-
377
- " Add all messages to log_messages table
378
- APPEND ls_object TO rs_result-log_messages.
379
-
380
- " Success messages (type 'S') - add to activated objects if unique
381
- IF ls_msg-type = 'S' AND ls_msg-obj_type IS NOT INITIAL AND ls_msg-obj_name IS NOT INITIAL.
382
- " Check for duplicates
383
- lv_key = |{ ls_msg-obj_type }{ ls_msg-obj_name }|.
384
- READ TABLE rs_result-activated_objects WITH KEY obj_type = ls_msg-obj_type
385
- obj_name = ls_msg-obj_name
386
- TRANSPORTING NO FIELDS.
387
- IF sy-subrc <> 0.
388
- APPEND ls_object TO rs_result-activated_objects.
389
- ENDIF.
390
- ENDIF.
391
-
392
- " Error/Abort messages - add to failed objects (warnings are not failures)
393
- IF ls_msg-type = 'E' OR ls_msg-type = 'A'.
394
- APPEND ls_object TO rs_result-failed_objects.
395
- ENDIF.
396
- ENDLOOP.
397
- ENDIF.
398
- ENDMETHOD.
399
-
400
- METHOD handle_exception.
401
- rs_result-success = abap_false.
402
- rs_result-message = ix_exception->get_text( ).
403
-
404
- DATA: lx_prev TYPE REF TO cx_root.
405
- lx_prev = ix_exception->previous.
406
- WHILE lx_prev IS BOUND.
407
- DATA: lv_msg TYPE string.
408
- lv_msg = lx_prev->get_text( ).
409
- IF lv_msg IS NOT INITIAL.
410
- rs_result-error_detail = rs_result-error_detail && '\n -> ' && lv_msg.
411
- ENDIF.
412
- lx_prev = lx_prev->previous.
413
- ENDWHILE.
414
- ENDMETHOD.
415
-
416
- METHOD get_version.
417
- rv_version = '1.0.0'.
418
- ENDMETHOD.
419
-
420
- ENDCLASS.
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3
- <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
- <asx:values>
5
- <VSEOCLASS>
6
- <CLSNAME>ZCL_ABGAGT_AGENT</CLSNAME>
7
- <LANGU>E</LANGU>
8
- <DESCRIPT>ABAP Git Agent - Main Agent API</DESCRIPT>
9
- <EXPOSURE>2</EXPOSURE>
10
- <STATE>1</STATE>
11
- <UNICODE>X</UNICODE>
12
- </VSEOCLASS>
13
- </asx:values>
14
- </asx:abap>
15
- </abapGit>
@@ -1,48 +0,0 @@
1
- CLASS zcl_abgagt_cmd_factory DEFINITION PUBLIC CREATE PRIVATE.
2
- PUBLIC SECTION.
3
- INTERFACES zif_abgagt_cmd_factory.
4
- CLASS-METHODS get_instance
5
- RETURNING VALUE(ro_factory) TYPE REF TO zif_abgagt_cmd_factory.
6
- PRIVATE SECTION.
7
- METHODS constructor.
8
- TYPES: BEGIN OF ty_command_map,
9
- command TYPE string,
10
- class_name TYPE string,
11
- END OF ty_command_map.
12
- DATA mt_command_map TYPE TABLE OF ty_command_map.
13
- ENDCLASS.
14
-
15
- CLASS zcl_abgagt_cmd_factory IMPLEMENTATION.
16
- METHOD get_instance.
17
- DATA lo_factory TYPE REF TO zcl_abgagt_cmd_factory.
18
- CREATE OBJECT lo_factory.
19
- ro_factory = lo_factory.
20
- ENDMETHOD.
21
-
22
- METHOD constructor.
23
- " Build command to class name mapping
24
- mt_command_map = VALUE #(
25
- ( command = zif_abgagt_command=>gc_pull class_name = 'ZCL_ABGAGT_COMMAND_PULL' )
26
- ( command = zif_abgagt_command=>gc_inspect class_name = 'ZCL_ABGAGT_COMMAND_INSPECT' )
27
- ( command = zif_abgagt_command=>gc_unit class_name = 'ZCL_ABGAGT_COMMAND_UNIT' )
28
- ( command = zif_abgagt_command=>gc_create class_name = 'ZCL_ABGAGT_COMMAND_CREATE' )
29
- ( command = zif_abgagt_command=>gc_import class_name = 'ZCL_ABGAGT_COMMAND_IMPORT' )
30
- ( command = zif_abgagt_command=>gc_tree class_name = 'ZCL_ABGAGT_COMMAND_TREE' )
31
- ( command = zif_abgagt_command=>gc_view class_name = 'ZCL_ABGAGT_COMMAND_VIEW' )
32
- ( command = zif_abgagt_command=>gc_preview class_name = 'ZCL_ABGAGT_COMMAND_PREVIEW' )
33
- ).
34
- ENDMETHOD.
35
-
36
- METHOD zif_abgagt_cmd_factory~get_command.
37
- " Find class name for command
38
- READ TABLE mt_command_map WITH KEY command = iv_command
39
- ASSIGNING FIELD-SYMBOL(<ls_map>).
40
- IF sy-subrc <> 0.
41
- RETURN.
42
- ENDIF.
43
-
44
- " Create command instance dynamically
45
- CREATE OBJECT ro_command TYPE (<ls_map>-class_name).
46
- ENDMETHOD.
47
-
48
- ENDCLASS.
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3
- <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4
- <asx:values>
5
- <VSEOCLASS>
6
- <CLSNAME>ZCL_ABGAGT_CMD_FACTORY</CLSNAME>
7
- <LANGU>E</LANGU>
8
- <DESCRIPT>Command Factory for ABAP Git Agent</DESCRIPT>
9
- <EXPOSURE>2</EXPOSURE>
10
- <STATE>1</STATE>
11
- <UNICODE>X</UNICODE>
12
- </VSEOCLASS>
13
- </asx:values>
14
- </asx:abap>
15
- </abapGit>
@@ -1,95 +0,0 @@
1
- *"*"use source
2
- *"*"Local Interface:
3
- *"**********************************************************************
4
- CLASS zcl_abgagt_command_create DEFINITION PUBLIC FINAL CREATE PUBLIC.
5
-
6
- PUBLIC SECTION.
7
- INTERFACES zif_abgagt_command.
8
-
9
- TYPES: BEGIN OF ty_create_params,
10
- url TYPE string,
11
- branch TYPE string,
12
- package TYPE string,
13
- display_name TYPE string,
14
- name TYPE string,
15
- folder_logic TYPE string,
16
- folder TYPE string,
17
- username TYPE string,
18
- password TYPE string,
19
- END OF ty_create_params.
20
-
21
- ENDCLASS.
22
-
23
- CLASS zcl_abgagt_command_create IMPLEMENTATION.
24
-
25
- METHOD zif_abgagt_command~get_name.
26
- rv_name = 'CREATE'.
27
- ENDMETHOD.
28
-
29
- METHOD zif_abgagt_command~execute.
30
- DATA: ls_params TYPE ty_create_params,
31
- lv_package TYPE devclass,
32
- li_repo TYPE REF TO zif_abapgit_repo.
33
-
34
- IF is_param IS SUPPLIED.
35
- ls_params = CORRESPONDING #( is_param ).
36
- ENDIF.
37
-
38
- IF ls_params-folder_logic IS INITIAL.
39
- ls_params-folder_logic = 'PREFIX'.
40
- ENDIF.
41
-
42
- IF ls_params-url IS INITIAL.
43
- rv_result = '{"success":"","error":"URL is required"}'.
44
- RETURN.
45
- ENDIF.
46
-
47
- IF ls_params-package IS INITIAL.
48
- rv_result = '{"success":"","error":"Package is required"}'.
49
- RETURN.
50
- ENDIF.
51
-
52
- lv_package = ls_params-package.
53
-
54
- IF ls_params-username IS NOT INITIAL AND ls_params-password IS NOT INITIAL.
55
- zcl_abapgit_persist_factory=>get_user( )->set_repo_git_user_name(
56
- iv_url = ls_params-url iv_username = ls_params-username ).
57
- zcl_abapgit_persist_factory=>get_user( )->set_repo_login(
58
- iv_url = ls_params-url iv_login = ls_params-username ).
59
- zcl_abapgit_login_manager=>set_basic(
60
- iv_uri = ls_params-url
61
- iv_username = ls_params-username
62
- iv_password = ls_params-password ).
63
- ENDIF.
64
-
65
- TRY.
66
- li_repo = zcl_abapgit_repo_srv=>get_instance( )->new_online(
67
- iv_url = ls_params-url
68
- iv_branch_name = ls_params-branch
69
- iv_display_name = ls_params-display_name
70
- iv_name = ls_params-name
71
- iv_package = lv_package
72
- iv_folder_logic = ls_params-folder_logic ).
73
- CATCH zcx_abapgit_exception INTO DATA(lx_error).
74
- rv_result = '{"success":"","error":"' && lx_error->get_text( ) && '"}'.
75
- RETURN.
76
- ENDTRY.
77
-
78
- " Set starting folder if provided
79
- IF ls_params-folder IS NOT INITIAL.
80
- DATA(lo_dot) = li_repo->get_dot_abapgit( ).
81
- lo_dot->set_starting_folder( ls_params-folder ).
82
- li_repo->set_dot_abapgit( lo_dot ).
83
- COMMIT WORK AND WAIT.
84
- ENDIF.
85
-
86
- DATA lv_response TYPE string.
87
- lv_response = '{"success":"X",'.
88
- lv_response = lv_response && '"repo_key":"' && li_repo->get_key( ) && '",'.
89
- lv_response = lv_response && '"repo_name":"' && li_repo->get_name( ) && '",'.
90
- lv_response = lv_response && '"message":"Repository created successfully"}'.
91
-
92
- rv_result = lv_response.
93
- ENDMETHOD.
94
-
95
- ENDCLASS.