abapgit-agent 1.5.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.
- package/README.md +1 -0
- package/abap/guidelines/00_index.md +35 -0
- package/abap/guidelines/01_sql.md +72 -0
- package/abap/guidelines/02_exceptions.md +108 -0
- package/abap/guidelines/03_testing.md +252 -0
- package/abap/guidelines/04_cds.md +120 -0
- package/abap/guidelines/05_classes.md +50 -0
- package/abap/guidelines/06_objects.md +103 -0
- package/abap/guidelines/07_json.md +22 -0
- package/abap/guidelines/08_abapgit.md +193 -0
- package/bin/abapgit-agent +467 -30
- package/bin/abgagt +24 -0
- package/package.json +8 -2
- package/src/abap-client.js +65 -2
- package/src/agent.js +57 -3
- package/src/ref-search.js +989 -0
- package/.abapGitAgent.example +0 -11
- package/.github/workflows/release.yml +0 -60
- package/API.md +0 -710
- package/CLAUDE.md +0 -1058
- package/CLAUDE_MEM.md +0 -88
- package/ERROR_HANDLING.md +0 -30
- package/INSTALL.md +0 -155
- package/RELEASE_NOTES.md +0 -143
- package/abap/CLAUDE.md +0 -1010
- package/abap/copilot-instructions.md +0 -79
- package/abap/package.devc.xml +0 -10
- package/abap/zcl_abgagt_agent.clas.abap +0 -420
- package/abap/zcl_abgagt_agent.clas.xml +0 -15
- package/abap/zcl_abgagt_cmd_factory.clas.abap +0 -48
- package/abap/zcl_abgagt_cmd_factory.clas.xml +0 -15
- package/abap/zcl_abgagt_command_create.clas.abap +0 -95
- package/abap/zcl_abgagt_command_create.clas.xml +0 -15
- package/abap/zcl_abgagt_command_import.clas.abap +0 -138
- package/abap/zcl_abgagt_command_import.clas.xml +0 -15
- package/abap/zcl_abgagt_command_inspect.clas.abap +0 -456
- package/abap/zcl_abgagt_command_inspect.clas.testclasses.abap +0 -121
- package/abap/zcl_abgagt_command_inspect.clas.xml +0 -16
- package/abap/zcl_abgagt_command_preview.clas.abap +0 -386
- package/abap/zcl_abgagt_command_preview.clas.xml +0 -15
- package/abap/zcl_abgagt_command_pull.clas.abap +0 -80
- package/abap/zcl_abgagt_command_pull.clas.testclasses.abap +0 -87
- package/abap/zcl_abgagt_command_pull.clas.xml +0 -16
- package/abap/zcl_abgagt_command_tree.clas.abap +0 -237
- package/abap/zcl_abgagt_command_tree.clas.xml +0 -15
- package/abap/zcl_abgagt_command_unit.clas.abap +0 -297
- package/abap/zcl_abgagt_command_unit.clas.xml +0 -15
- package/abap/zcl_abgagt_command_view.clas.abap +0 -240
- package/abap/zcl_abgagt_command_view.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_create.clas.abap +0 -71
- package/abap/zcl_abgagt_resource_create.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_health.clas.abap +0 -25
- package/abap/zcl_abgagt_resource_health.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_import.clas.abap +0 -66
- package/abap/zcl_abgagt_resource_import.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_inspect.clas.abap +0 -63
- package/abap/zcl_abgagt_resource_inspect.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_preview.clas.abap +0 -67
- package/abap/zcl_abgagt_resource_preview.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_pull.clas.abap +0 -71
- package/abap/zcl_abgagt_resource_pull.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_tree.clas.abap +0 -70
- package/abap/zcl_abgagt_resource_tree.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_unit.clas.abap +0 -64
- package/abap/zcl_abgagt_resource_unit.clas.xml +0 -15
- package/abap/zcl_abgagt_resource_view.clas.abap +0 -68
- package/abap/zcl_abgagt_resource_view.clas.xml +0 -15
- package/abap/zcl_abgagt_rest_handler.clas.abap +0 -32
- package/abap/zcl_abgagt_rest_handler.clas.xml +0 -15
- package/abap/zcl_abgagt_util.clas.abap +0 -93
- package/abap/zcl_abgagt_util.clas.testclasses.abap +0 -84
- package/abap/zcl_abgagt_util.clas.xml +0 -16
- package/abap/zcl_abgagt_viewer_clas.clas.abap +0 -58
- package/abap/zcl_abgagt_viewer_clas.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_ddls.clas.abap +0 -83
- package/abap/zcl_abgagt_viewer_ddls.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_dtel.clas.abap +0 -98
- package/abap/zcl_abgagt_viewer_dtel.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_factory.clas.abap +0 -41
- package/abap/zcl_abgagt_viewer_factory.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_intf.clas.abap +0 -58
- package/abap/zcl_abgagt_viewer_intf.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_stru.clas.abap +0 -59
- package/abap/zcl_abgagt_viewer_stru.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_tabl.clas.abap +0 -59
- package/abap/zcl_abgagt_viewer_tabl.clas.xml +0 -15
- package/abap/zcl_abgagt_viewer_ttyp.clas.abap +0 -93
- package/abap/zcl_abgagt_viewer_ttyp.clas.xml +0 -15
- package/abap/zif_abgagt_agent.intf.abap +0 -53
- package/abap/zif_abgagt_agent.intf.xml +0 -15
- package/abap/zif_abgagt_cmd_factory.intf.abap +0 -7
- package/abap/zif_abgagt_cmd_factory.intf.xml +0 -15
- package/abap/zif_abgagt_command.intf.abap +0 -26
- package/abap/zif_abgagt_command.intf.xml +0 -15
- package/abap/zif_abgagt_util.intf.abap +0 -28
- package/abap/zif_abgagt_util.intf.xml +0 -15
- package/abap/zif_abgagt_viewer.intf.abap +0 -12
- package/abap/zif_abgagt_viewer.intf.xml +0 -15
- package/docs/commands.md +0 -142
- package/docs/create-command.md +0 -129
- package/docs/health-command.md +0 -89
- package/docs/import-command.md +0 -195
- package/docs/init-command.md +0 -189
- package/docs/inspect-command.md +0 -169
- package/docs/list-command.md +0 -289
- package/docs/preview-command.md +0 -528
- package/docs/pull-command.md +0 -202
- package/docs/status-command.md +0 -68
- package/docs/tree-command.md +0 -303
- package/docs/unit-command.md +0 -167
- package/docs/view-command.md +0 -501
- package/img/claude.png +0 -0
- package/scripts/claude-integration.js +0 -351
- package/scripts/release.js +0 -298
- package/scripts/release.sh +0 -60
- package/scripts/test-integration.js +0 -139
- package/scripts/unrelease.js +0 -277
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"*"Local Interface:
|
|
3
|
-
*"**********************************************************************
|
|
4
|
-
CLASS zcl_abgagt_resource_pull DEFINITION PUBLIC FINAL
|
|
5
|
-
INHERITING FROM cl_rest_resource
|
|
6
|
-
CREATE PUBLIC.
|
|
7
|
-
|
|
8
|
-
PUBLIC SECTION.
|
|
9
|
-
METHODS if_rest_resource~post REDEFINITION.
|
|
10
|
-
|
|
11
|
-
ENDCLASS.
|
|
12
|
-
|
|
13
|
-
CLASS zcl_abgagt_resource_pull IMPLEMENTATION.
|
|
14
|
-
|
|
15
|
-
METHOD if_rest_resource~post.
|
|
16
|
-
DATA lv_json TYPE string.
|
|
17
|
-
lv_json = mo_request->get_entity( )->get_string_data( ).
|
|
18
|
-
|
|
19
|
-
" Parse JSON using /ui2/cl_json
|
|
20
|
-
DATA: BEGIN OF ls_request,
|
|
21
|
-
url TYPE string,
|
|
22
|
-
branch TYPE string,
|
|
23
|
-
username TYPE string,
|
|
24
|
-
password TYPE string,
|
|
25
|
-
transport_request TYPE string,
|
|
26
|
-
files TYPE string_table,
|
|
27
|
-
END OF ls_request.
|
|
28
|
-
|
|
29
|
-
/ui2/cl_json=>deserialize(
|
|
30
|
-
EXPORTING
|
|
31
|
-
json = lv_json
|
|
32
|
-
CHANGING
|
|
33
|
-
data = ls_request ).
|
|
34
|
-
|
|
35
|
-
IF ls_request-branch IS INITIAL.
|
|
36
|
-
ls_request-branch = 'main'.
|
|
37
|
-
ENDIF.
|
|
38
|
-
|
|
39
|
-
DATA lv_json_resp TYPE string.
|
|
40
|
-
IF ls_request-url IS INITIAL.
|
|
41
|
-
lv_json_resp = '{"success":"","job_id":"","error":"URL is required"}'.
|
|
42
|
-
DATA(lo_entity) = mo_response->create_entity( ).
|
|
43
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
44
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
45
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
46
|
-
RETURN.
|
|
47
|
-
ENDIF.
|
|
48
|
-
|
|
49
|
-
" Get command from factory
|
|
50
|
-
DATA(lo_factory) = zcl_abgagt_cmd_factory=>get_instance( ).
|
|
51
|
-
DATA(lo_command) = lo_factory->get_command( zif_abgagt_command=>gc_pull ).
|
|
52
|
-
|
|
53
|
-
IF lo_command IS NOT BOUND.
|
|
54
|
-
lv_json_resp = '{"success":"","error":"PULL command not found"}'.
|
|
55
|
-
lo_entity = mo_response->create_entity( ).
|
|
56
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
57
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
58
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
59
|
-
RETURN.
|
|
60
|
-
ENDIF.
|
|
61
|
-
|
|
62
|
-
" Execute command with is_param
|
|
63
|
-
DATA(lv_result) = lo_command->execute( is_param = ls_request ).
|
|
64
|
-
|
|
65
|
-
lo_entity = mo_response->create_entity( ).
|
|
66
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
67
|
-
lo_entity->set_string_data( lv_result ).
|
|
68
|
-
mo_response->set_status( cl_rest_status_code=>gc_success_ok ).
|
|
69
|
-
ENDMETHOD.
|
|
70
|
-
|
|
71
|
-
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_RESOURCE_PULL</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>ABAP Git Agent - Pull Resource</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
</VSEOCLASS>
|
|
13
|
-
</asx:values>
|
|
14
|
-
</asx:abap>
|
|
15
|
-
</abapGit>
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"*"Local Interface:
|
|
3
|
-
*"**********************************************************************
|
|
4
|
-
CLASS zcl_abgagt_resource_tree DEFINITION PUBLIC FINAL
|
|
5
|
-
INHERITING FROM cl_rest_resource
|
|
6
|
-
CREATE PUBLIC.
|
|
7
|
-
|
|
8
|
-
PUBLIC SECTION.
|
|
9
|
-
METHODS if_rest_resource~post REDEFINITION.
|
|
10
|
-
|
|
11
|
-
ENDCLASS.
|
|
12
|
-
|
|
13
|
-
CLASS zcl_abgagt_resource_tree IMPLEMENTATION.
|
|
14
|
-
|
|
15
|
-
METHOD if_rest_resource~post.
|
|
16
|
-
DATA lv_json TYPE string.
|
|
17
|
-
lv_json = mo_request->get_entity( )->get_string_data( ).
|
|
18
|
-
|
|
19
|
-
" Parse JSON using /ui2/cl_json
|
|
20
|
-
DATA: BEGIN OF ls_request,
|
|
21
|
-
package TYPE string,
|
|
22
|
-
depth TYPE i,
|
|
23
|
-
include_objects TYPE abap_bool,
|
|
24
|
-
END OF ls_request.
|
|
25
|
-
|
|
26
|
-
/ui2/cl_json=>deserialize(
|
|
27
|
-
EXPORTING
|
|
28
|
-
json = lv_json
|
|
29
|
-
CHANGING
|
|
30
|
-
data = ls_request ).
|
|
31
|
-
|
|
32
|
-
DATA lv_json_resp TYPE string.
|
|
33
|
-
|
|
34
|
-
IF ls_request-package IS INITIAL.
|
|
35
|
-
lv_json_resp = '{"success":"","command":"TREE","error":"Package is required"}'.
|
|
36
|
-
DATA(lo_entity) = mo_response->create_entity( ).
|
|
37
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
38
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
39
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
40
|
-
RETURN.
|
|
41
|
-
ENDIF.
|
|
42
|
-
|
|
43
|
-
" Get command from factory
|
|
44
|
-
DATA(lo_factory) = zcl_abgagt_cmd_factory=>get_instance( ).
|
|
45
|
-
DATA(lo_command) = lo_factory->get_command( zif_abgagt_command=>gc_tree ).
|
|
46
|
-
|
|
47
|
-
IF lo_command IS NOT BOUND.
|
|
48
|
-
lv_json_resp = '{"success":"","command":"TREE","error":"TREE command not found"}'.
|
|
49
|
-
lo_entity = mo_response->create_entity( ).
|
|
50
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
51
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
52
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
53
|
-
RETURN.
|
|
54
|
-
ENDIF.
|
|
55
|
-
|
|
56
|
-
" Execute command with is_param
|
|
57
|
-
DATA ls_params TYPE zcl_abgagt_command_tree=>ty_tree_params.
|
|
58
|
-
ls_params-package = ls_request-package.
|
|
59
|
-
ls_params-depth = ls_request-depth.
|
|
60
|
-
ls_params-include_objects = ls_request-include_objects.
|
|
61
|
-
|
|
62
|
-
DATA(lv_result) = lo_command->execute( is_param = ls_params ).
|
|
63
|
-
|
|
64
|
-
lo_entity = mo_response->create_entity( ).
|
|
65
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
66
|
-
lo_entity->set_string_data( lv_result ).
|
|
67
|
-
mo_response->set_status( cl_rest_status_code=>gc_success_ok ).
|
|
68
|
-
ENDMETHOD.
|
|
69
|
-
|
|
70
|
-
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_RESOURCE_TREE</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>ABAP Git Agent - Tree Resource</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
</VSEOCLASS>
|
|
13
|
-
</asx:values>
|
|
14
|
-
</asx:abap>
|
|
15
|
-
</abapGit>
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"*"Local Interface:
|
|
3
|
-
*"**********************************************************************
|
|
4
|
-
CLASS zcl_abgagt_resource_unit DEFINITION PUBLIC FINAL
|
|
5
|
-
INHERITING FROM cl_rest_resource
|
|
6
|
-
CREATE PUBLIC.
|
|
7
|
-
|
|
8
|
-
PUBLIC SECTION.
|
|
9
|
-
METHODS if_rest_resource~post REDEFINITION.
|
|
10
|
-
|
|
11
|
-
ENDCLASS.
|
|
12
|
-
|
|
13
|
-
CLASS zcl_abgagt_resource_unit IMPLEMENTATION.
|
|
14
|
-
|
|
15
|
-
METHOD if_rest_resource~post.
|
|
16
|
-
DATA lv_json TYPE string.
|
|
17
|
-
lv_json = mo_request->get_entity( )->get_string_data( ).
|
|
18
|
-
|
|
19
|
-
" Parse JSON using /ui2/cl_json
|
|
20
|
-
DATA: BEGIN OF ls_request,
|
|
21
|
-
package TYPE string,
|
|
22
|
-
files TYPE string_table,
|
|
23
|
-
END OF ls_request.
|
|
24
|
-
|
|
25
|
-
/ui2/cl_json=>deserialize(
|
|
26
|
-
EXPORTING
|
|
27
|
-
json = lv_json
|
|
28
|
-
CHANGING
|
|
29
|
-
data = ls_request ).
|
|
30
|
-
|
|
31
|
-
DATA lv_json_resp TYPE string.
|
|
32
|
-
|
|
33
|
-
IF ls_request-package IS INITIAL AND ( ls_request-files IS INITIAL OR lines( ls_request-files ) = 0 ).
|
|
34
|
-
lv_json_resp = '{"success":"","message":"Package or files required"}'.
|
|
35
|
-
DATA(lo_entity) = mo_response->create_entity( ).
|
|
36
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
37
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
38
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
39
|
-
RETURN.
|
|
40
|
-
ENDIF.
|
|
41
|
-
|
|
42
|
-
" Get command from factory
|
|
43
|
-
DATA(lo_factory) = zcl_abgagt_cmd_factory=>get_instance( ).
|
|
44
|
-
DATA(lo_command) = lo_factory->get_command( zif_abgagt_command=>gc_unit ).
|
|
45
|
-
|
|
46
|
-
IF lo_command IS NOT BOUND.
|
|
47
|
-
lv_json_resp = '{"success":"","error":"UNIT command not found"}'.
|
|
48
|
-
lo_entity = mo_response->create_entity( ).
|
|
49
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
50
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
51
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
52
|
-
RETURN.
|
|
53
|
-
ENDIF.
|
|
54
|
-
|
|
55
|
-
" Execute command with is_param
|
|
56
|
-
DATA(lv_result) = lo_command->execute( is_param = ls_request ).
|
|
57
|
-
|
|
58
|
-
lo_entity = mo_response->create_entity( ).
|
|
59
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
60
|
-
lo_entity->set_string_data( lv_result ).
|
|
61
|
-
mo_response->set_status( cl_rest_status_code=>gc_success_ok ).
|
|
62
|
-
ENDMETHOD.
|
|
63
|
-
|
|
64
|
-
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_RESOURCE_UNIT</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>ABAP Git Agent - Unit Test Resource</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
</VSEOCLASS>
|
|
13
|
-
</asx:values>
|
|
14
|
-
</asx:abap>
|
|
15
|
-
</abapGit>
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"*"Local Interface:
|
|
3
|
-
*"**********************************************************************
|
|
4
|
-
CLASS zcl_abgagt_resource_view DEFINITION PUBLIC FINAL
|
|
5
|
-
INHERITING FROM cl_rest_resource
|
|
6
|
-
CREATE PUBLIC.
|
|
7
|
-
|
|
8
|
-
PUBLIC SECTION.
|
|
9
|
-
METHODS if_rest_resource~post REDEFINITION.
|
|
10
|
-
|
|
11
|
-
ENDCLASS.
|
|
12
|
-
|
|
13
|
-
CLASS zcl_abgagt_resource_view IMPLEMENTATION.
|
|
14
|
-
|
|
15
|
-
METHOD if_rest_resource~post.
|
|
16
|
-
DATA lv_json TYPE string.
|
|
17
|
-
lv_json = mo_request->get_entity( )->get_string_data( ).
|
|
18
|
-
|
|
19
|
-
" Parse JSON using /ui2/cl_json
|
|
20
|
-
DATA: BEGIN OF ls_request,
|
|
21
|
-
objects TYPE string_table,
|
|
22
|
-
type TYPE string,
|
|
23
|
-
END OF ls_request.
|
|
24
|
-
|
|
25
|
-
/ui2/cl_json=>deserialize(
|
|
26
|
-
EXPORTING
|
|
27
|
-
json = lv_json
|
|
28
|
-
CHANGING
|
|
29
|
-
data = ls_request ).
|
|
30
|
-
|
|
31
|
-
DATA lv_json_resp TYPE string.
|
|
32
|
-
|
|
33
|
-
IF ls_request-objects IS INITIAL.
|
|
34
|
-
lv_json_resp = '{"success":false,"command":"VIEW","error":"Objects parameter is required"}'.
|
|
35
|
-
DATA(lo_entity) = mo_response->create_entity( ).
|
|
36
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
37
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
38
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
39
|
-
RETURN.
|
|
40
|
-
ENDIF.
|
|
41
|
-
|
|
42
|
-
" Get command from factory
|
|
43
|
-
DATA(lo_factory) = zcl_abgagt_cmd_factory=>get_instance( ).
|
|
44
|
-
DATA(lo_command) = lo_factory->get_command( zif_abgagt_command=>gc_view ).
|
|
45
|
-
|
|
46
|
-
IF lo_command IS NOT BOUND.
|
|
47
|
-
lv_json_resp = '{"success":false,"command":"VIEW","error":"VIEW command not found"}'.
|
|
48
|
-
lo_entity = mo_response->create_entity( ).
|
|
49
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
50
|
-
lo_entity->set_string_data( lv_json_resp ).
|
|
51
|
-
mo_response->set_status( cl_rest_status_code=>gc_client_error_bad_request ).
|
|
52
|
-
RETURN.
|
|
53
|
-
ENDIF.
|
|
54
|
-
|
|
55
|
-
" Execute command with is_param
|
|
56
|
-
DATA ls_params TYPE zcl_abgagt_command_view=>ty_view_params.
|
|
57
|
-
ls_params-objects = ls_request-objects.
|
|
58
|
-
ls_params-type = ls_request-type.
|
|
59
|
-
|
|
60
|
-
DATA(lv_result) = lo_command->execute( is_param = ls_params ).
|
|
61
|
-
|
|
62
|
-
lo_entity = mo_response->create_entity( ).
|
|
63
|
-
lo_entity->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
|
|
64
|
-
lo_entity->set_string_data( lv_result ).
|
|
65
|
-
mo_response->set_status( cl_rest_status_code=>gc_success_ok ).
|
|
66
|
-
ENDMETHOD.
|
|
67
|
-
|
|
68
|
-
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_RESOURCE_VIEW</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>VIEW command REST resource handler</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
</VSEOCLASS>
|
|
13
|
-
</asx:values>
|
|
14
|
-
</asx:abap>
|
|
15
|
-
</abapGit>
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"* Local Interface:
|
|
3
|
-
*"----------------------------------------------------------------------
|
|
4
|
-
CLASS zcl_abgagt_rest_handler DEFINITION PUBLIC INHERITING FROM cl_rest_http_handler CREATE PUBLIC.
|
|
5
|
-
|
|
6
|
-
PUBLIC SECTION.
|
|
7
|
-
METHODS: if_rest_application~get_root_handler REDEFINITION.
|
|
8
|
-
|
|
9
|
-
PRIVATE SECTION.
|
|
10
|
-
|
|
11
|
-
ENDCLASS.
|
|
12
|
-
|
|
13
|
-
CLASS zcl_abgagt_rest_handler IMPLEMENTATION.
|
|
14
|
-
|
|
15
|
-
METHOD if_rest_application~get_root_handler.
|
|
16
|
-
DATA lo_router TYPE REF TO cl_rest_router.
|
|
17
|
-
CREATE OBJECT lo_router.
|
|
18
|
-
|
|
19
|
-
lo_router->attach( iv_template = '/pull' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_PULL' ).
|
|
20
|
-
lo_router->attach( iv_template = '/health' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_HEALTH' ).
|
|
21
|
-
lo_router->attach( iv_template = '/inspect' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_INSPECT' ).
|
|
22
|
-
lo_router->attach( iv_template = '/unit' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_UNIT' ).
|
|
23
|
-
lo_router->attach( iv_template = '/create' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_CREATE' ).
|
|
24
|
-
lo_router->attach( iv_template = '/import' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_IMPORT' ).
|
|
25
|
-
lo_router->attach( iv_template = '/tree' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_TREE' ).
|
|
26
|
-
lo_router->attach( iv_template = '/view' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_VIEW' ).
|
|
27
|
-
lo_router->attach( iv_template = '/preview' iv_handler_class = 'ZCL_ABGAGT_RESOURCE_PREVIEW' ).
|
|
28
|
-
|
|
29
|
-
ro_root_handler = lo_router.
|
|
30
|
-
ENDMETHOD.
|
|
31
|
-
|
|
32
|
-
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_REST_HANDLER</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>ABAP Git Agent - REST Handler</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
</VSEOCLASS>
|
|
13
|
-
</asx:values>
|
|
14
|
-
</asx:abap>
|
|
15
|
-
</abapGit>
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"* Use this source text module for the class definition
|
|
2
|
-
CLASS zcl_abgagt_util DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
3
|
-
PUBLIC SECTION.
|
|
4
|
-
INTERFACES zif_abgagt_util.
|
|
5
|
-
CLASS-METHODS get_instance
|
|
6
|
-
RETURNING VALUE(ro_util) TYPE REF TO zcl_abgagt_util.
|
|
7
|
-
PRIVATE SECTION.
|
|
8
|
-
DATA mv_log TYPE string.
|
|
9
|
-
DATA mv_has_error TYPE abap_bool.
|
|
10
|
-
ENDCLASS.
|
|
11
|
-
|
|
12
|
-
CLASS zcl_abgagt_util IMPLEMENTATION.
|
|
13
|
-
METHOD get_instance.
|
|
14
|
-
DATA lo_util TYPE REF TO zcl_abgagt_util.
|
|
15
|
-
CREATE OBJECT lo_util.
|
|
16
|
-
ro_util = lo_util.
|
|
17
|
-
ENDMETHOD.
|
|
18
|
-
|
|
19
|
-
METHOD zif_abgagt_util~parse_file_to_object.
|
|
20
|
-
" Parse file path to extract obj_type and obj_name
|
|
21
|
-
" Example: "zcl_my_class.clas.abap" -> CLAS, ZCL_MY_CLASS
|
|
22
|
-
" Example: "src/zcl_my_class.clas.abap" -> CLAS, ZCL_MY_CLASS
|
|
23
|
-
|
|
24
|
-
DATA lv_upper TYPE string.
|
|
25
|
-
lv_upper = iv_file.
|
|
26
|
-
TRANSLATE lv_upper TO UPPER CASE.
|
|
27
|
-
|
|
28
|
-
" Split filename by '.' to get parts
|
|
29
|
-
DATA lt_parts TYPE TABLE OF string.
|
|
30
|
-
SPLIT lv_upper AT '.' INTO TABLE lt_parts.
|
|
31
|
-
DATA lv_part_count TYPE i.
|
|
32
|
-
lv_part_count = lines( lt_parts ).
|
|
33
|
-
|
|
34
|
-
IF lv_part_count < 3.
|
|
35
|
-
RETURN.
|
|
36
|
-
ENDIF.
|
|
37
|
-
|
|
38
|
-
" Last part should be 'ABAP' or 'ASDDLS' for verification
|
|
39
|
-
READ TABLE lt_parts INDEX lv_part_count INTO DATA(lv_last).
|
|
40
|
-
IF lv_last <> 'ABAP' AND lv_last <> 'ASDDLS'.
|
|
41
|
-
RETURN.
|
|
42
|
-
ENDIF.
|
|
43
|
-
|
|
44
|
-
" First part is obj_name (may contain path), second part is obj_type
|
|
45
|
-
DATA lv_obj_name TYPE string.
|
|
46
|
-
DATA lv_obj_type_raw TYPE string.
|
|
47
|
-
READ TABLE lt_parts INDEX 1 INTO lv_obj_name.
|
|
48
|
-
READ TABLE lt_parts INDEX 2 INTO lv_obj_type_raw.
|
|
49
|
-
|
|
50
|
-
" Convert file extension to object type
|
|
51
|
-
CASE lv_obj_type_raw.
|
|
52
|
-
WHEN 'CLAS' OR 'CLASS'.
|
|
53
|
-
ev_obj_type = 'CLAS'.
|
|
54
|
-
WHEN 'INTF' OR 'INTERFACE'.
|
|
55
|
-
ev_obj_type = 'INTF'.
|
|
56
|
-
WHEN 'PROG' OR 'PROGRAM'.
|
|
57
|
-
ev_obj_type = 'PROG'.
|
|
58
|
-
WHEN 'FUGR' OR 'FUGROUP'.
|
|
59
|
-
ev_obj_type = 'FUGR'.
|
|
60
|
-
WHEN 'TABL' OR 'TABLE'.
|
|
61
|
-
ev_obj_type = 'TABL'.
|
|
62
|
-
WHEN 'DDLS'.
|
|
63
|
-
ev_obj_type = 'DDLS'.
|
|
64
|
-
WHEN OTHERS.
|
|
65
|
-
ev_obj_type = lv_obj_type_raw.
|
|
66
|
-
ENDCASE.
|
|
67
|
-
|
|
68
|
-
" Extract file name from obj_name (remove path prefix)
|
|
69
|
-
DATA lv_len TYPE i.
|
|
70
|
-
lv_len = strlen( lv_obj_name ).
|
|
71
|
-
DATA lv_offs TYPE i.
|
|
72
|
-
lv_offs = find( val = reverse( lv_obj_name ) sub = '/' ).
|
|
73
|
-
IF lv_offs > 0.
|
|
74
|
-
lv_offs = lv_len - lv_offs - 1.
|
|
75
|
-
lv_obj_name = lv_obj_name+lv_offs.
|
|
76
|
-
ENDIF.
|
|
77
|
-
|
|
78
|
-
" Remove leading '/' if present
|
|
79
|
-
IF lv_obj_name(1) = '/'.
|
|
80
|
-
lv_obj_name = lv_obj_name+1.
|
|
81
|
-
ENDIF.
|
|
82
|
-
|
|
83
|
-
ev_obj_name = lv_obj_name.
|
|
84
|
-
ENDMETHOD.
|
|
85
|
-
|
|
86
|
-
METHOD zif_abgagt_util~check_log_for_errors.
|
|
87
|
-
rv_has_error = mv_has_error.
|
|
88
|
-
ENDMETHOD.
|
|
89
|
-
|
|
90
|
-
METHOD zif_abgagt_util~get_log_detail.
|
|
91
|
-
rv_detail = mv_log.
|
|
92
|
-
ENDMETHOD.
|
|
93
|
-
ENDCLASS.
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
*"* use this source file for your test class implementation
|
|
2
|
-
*"* local test class
|
|
3
|
-
CLASS ltcl_zcl_abgagt_util DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
4
|
-
PRIVATE SECTION.
|
|
5
|
-
DATA mo_util TYPE REF TO zcl_abgagt_util.
|
|
6
|
-
|
|
7
|
-
METHODS setup.
|
|
8
|
-
METHODS test_parse_clas FOR TESTING.
|
|
9
|
-
METHODS test_parse_intf FOR TESTING.
|
|
10
|
-
METHODS test_parse_with_path FOR TESTING.
|
|
11
|
-
METHODS test_parse_invalid FOR TESTING.
|
|
12
|
-
ENDCLASS.
|
|
13
|
-
|
|
14
|
-
CLASS ltcl_zcl_abgagt_util IMPLEMENTATION.
|
|
15
|
-
|
|
16
|
-
METHOD setup.
|
|
17
|
-
mo_util = zcl_abgagt_util=>get_instance( ).
|
|
18
|
-
ENDMETHOD.
|
|
19
|
-
|
|
20
|
-
METHOD test_parse_clas.
|
|
21
|
-
" Test parsing CLAS file
|
|
22
|
-
DATA lv_obj_type TYPE string.
|
|
23
|
-
DATA lv_obj_name TYPE string.
|
|
24
|
-
|
|
25
|
-
mo_util->zif_abgagt_util~parse_file_to_object(
|
|
26
|
-
EXPORTING iv_file = 'zcl_my_class.clas.abap'
|
|
27
|
-
IMPORTING ev_obj_type = lv_obj_type
|
|
28
|
-
ev_obj_name = lv_obj_name ).
|
|
29
|
-
|
|
30
|
-
cl_abap_unit_assert=>assert_equals(
|
|
31
|
-
act = lv_obj_type exp = 'CLAS' msg = 'Object type should be CLAS' ).
|
|
32
|
-
cl_abap_unit_assert=>assert_equals(
|
|
33
|
-
act = lv_obj_name exp = 'ZCL_MY_CLASS' msg = 'Object name mismatch' ).
|
|
34
|
-
ENDMETHOD.
|
|
35
|
-
|
|
36
|
-
METHOD test_parse_intf.
|
|
37
|
-
" Test parsing INTF file
|
|
38
|
-
DATA lv_obj_type TYPE string.
|
|
39
|
-
DATA lv_obj_name TYPE string.
|
|
40
|
-
|
|
41
|
-
mo_util->zif_abgagt_util~parse_file_to_object(
|
|
42
|
-
EXPORTING iv_file = 'zif_my_intf.intf.abap'
|
|
43
|
-
IMPORTING ev_obj_type = lv_obj_type
|
|
44
|
-
ev_obj_name = lv_obj_name ).
|
|
45
|
-
|
|
46
|
-
cl_abap_unit_assert=>assert_equals(
|
|
47
|
-
act = lv_obj_type exp = 'INTF' msg = 'Object type should be INTF' ).
|
|
48
|
-
cl_abap_unit_assert=>assert_equals(
|
|
49
|
-
act = lv_obj_name exp = 'ZIF_MY_INTF' msg = 'Object name mismatch' ).
|
|
50
|
-
ENDMETHOD.
|
|
51
|
-
|
|
52
|
-
METHOD test_parse_with_path.
|
|
53
|
-
" Test parsing file with path
|
|
54
|
-
DATA lv_obj_type TYPE string.
|
|
55
|
-
DATA lv_obj_name TYPE string.
|
|
56
|
-
|
|
57
|
-
mo_util->zif_abgagt_util~parse_file_to_object(
|
|
58
|
-
EXPORTING iv_file = 'src/zcl_my_class.clas.abap'
|
|
59
|
-
IMPORTING ev_obj_type = lv_obj_type
|
|
60
|
-
ev_obj_name = lv_obj_name ).
|
|
61
|
-
|
|
62
|
-
cl_abap_unit_assert=>assert_equals(
|
|
63
|
-
act = lv_obj_type exp = 'CLAS' msg = 'Object type should be CLAS' ).
|
|
64
|
-
cl_abap_unit_assert=>assert_equals(
|
|
65
|
-
act = lv_obj_name exp = 'ZCL_MY_CLASS' msg = 'Path should be stripped' ).
|
|
66
|
-
ENDMETHOD.
|
|
67
|
-
|
|
68
|
-
METHOD test_parse_invalid.
|
|
69
|
-
" Test parsing invalid file (should return empty)
|
|
70
|
-
DATA lv_obj_type TYPE string.
|
|
71
|
-
DATA lv_obj_name TYPE string.
|
|
72
|
-
|
|
73
|
-
mo_util->zif_abgagt_util~parse_file_to_object(
|
|
74
|
-
EXPORTING iv_file = 'invalid_file.txt'
|
|
75
|
-
IMPORTING ev_obj_type = lv_obj_type
|
|
76
|
-
ev_obj_name = lv_obj_name ).
|
|
77
|
-
|
|
78
|
-
cl_abap_unit_assert=>assert_initial(
|
|
79
|
-
act = lv_obj_type msg = 'Invalid file should return empty type' ).
|
|
80
|
-
cl_abap_unit_assert=>assert_initial(
|
|
81
|
-
act = lv_obj_name msg = 'Invalid file should return empty name' ).
|
|
82
|
-
ENDMETHOD.
|
|
83
|
-
|
|
84
|
-
ENDCLASS.
|
|
@@ -1,16 +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_UTIL</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>Utility Class for ABAP Git Agent</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
|
13
|
-
</VSEOCLASS>
|
|
14
|
-
</asx:values>
|
|
15
|
-
</asx:abap>
|
|
16
|
-
</abapGit>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
*"*"use source
|
|
2
|
-
*"*"Local Interface:
|
|
3
|
-
*"**********************************************************************
|
|
4
|
-
CLASS zcl_abgagt_viewer_clas DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
5
|
-
|
|
6
|
-
PUBLIC SECTION.
|
|
7
|
-
INTERFACES zif_abgagt_viewer.
|
|
8
|
-
|
|
9
|
-
ENDCLASS.
|
|
10
|
-
|
|
11
|
-
CLASS zcl_abgagt_viewer_clas IMPLEMENTATION.
|
|
12
|
-
|
|
13
|
-
METHOD zif_abgagt_viewer~get_info.
|
|
14
|
-
DATA: lv_obj_name TYPE tadir-obj_name,
|
|
15
|
-
lv_devclass TYPE tadir-devclass,
|
|
16
|
-
lv_prog TYPE program,
|
|
17
|
-
lt_source TYPE TABLE OF string,
|
|
18
|
-
lv_line TYPE string.
|
|
19
|
-
|
|
20
|
-
SELECT SINGLE obj_name devclass FROM tadir
|
|
21
|
-
INTO (lv_obj_name, lv_devclass)
|
|
22
|
-
WHERE obj_name = iv_name
|
|
23
|
-
AND object = 'CLAS'.
|
|
24
|
-
IF sy-subrc = 0.
|
|
25
|
-
rs_info-name = iv_name.
|
|
26
|
-
rs_info-type = 'CLAS'.
|
|
27
|
-
rs_info-type_text = 'Class'.
|
|
28
|
-
rs_info-description = |Class { iv_name } in { lv_devclass }|.
|
|
29
|
-
ELSE.
|
|
30
|
-
rs_info-name = iv_name.
|
|
31
|
-
rs_info-type = 'CLAS'.
|
|
32
|
-
rs_info-type_text = 'Class'.
|
|
33
|
-
rs_info-not_found = abap_true.
|
|
34
|
-
ENDIF.
|
|
35
|
-
|
|
36
|
-
" Get class public section program name using CL_OO_CLASSNAME_SERVICE
|
|
37
|
-
DATA lv_clsname TYPE seoclsname.
|
|
38
|
-
lv_clsname = iv_name.
|
|
39
|
-
CALL METHOD cl_oo_classname_service=>get_pubsec_name
|
|
40
|
-
EXPORTING
|
|
41
|
-
clsname = lv_clsname
|
|
42
|
-
RECEIVING
|
|
43
|
-
result = lv_prog.
|
|
44
|
-
|
|
45
|
-
" Read source from program
|
|
46
|
-
READ REPORT lv_prog INTO lt_source.
|
|
47
|
-
IF sy-subrc = 0.
|
|
48
|
-
LOOP AT lt_source INTO lv_line.
|
|
49
|
-
IF rs_info-source IS INITIAL.
|
|
50
|
-
rs_info-source = lv_line.
|
|
51
|
-
ELSE.
|
|
52
|
-
rs_info-source = rs_info-source && |\n| && lv_line.
|
|
53
|
-
ENDIF.
|
|
54
|
-
ENDLOOP.
|
|
55
|
-
ENDIF.
|
|
56
|
-
ENDMETHOD.
|
|
57
|
-
|
|
58
|
-
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_VIEWER_CLAS</CLSNAME>
|
|
7
|
-
<LANGU>E</LANGU>
|
|
8
|
-
<DESCRIPT>Viewer for ABAP Classes</DESCRIPT>
|
|
9
|
-
<EXPOSURE>2</EXPOSURE>
|
|
10
|
-
<STATE>1</STATE>
|
|
11
|
-
<UNICODE>X</UNICODE>
|
|
12
|
-
</VSEOCLASS>
|
|
13
|
-
</asx:values>
|
|
14
|
-
</asx:abap>
|
|
15
|
-
</abapGit>
|