├── src
├── frontend
│ ├── 42b8957792091ee6bf845dbe6b03cfce.smim.swagger.png
│ ├── zags_cache_delete.prog.abap
│ ├── zags_repo_delete.prog.abap
│ ├── package.devc.xml
│ ├── 02b1f55747191ee589f800ccf877dd67.smim.xml
│ ├── 02b363142b451ed68df0b5608910d699.smim.xml
│ ├── 02c1f55747191ed58ab0401507578067.smim.xml
│ ├── 42b8957792091ed6bf842f345fc548b7.smim.xml
│ ├── 42b8957792091ee6bf845dbe6b03cfce.smim.xml
│ ├── 0050569ac5931edba68607caa2e000da.smim.xml
│ ├── zags_migration_03.prog.xml
│ ├── zags_start.prog.xml
│ ├── zags_migration_02.prog.xml
│ ├── zabapgitserver.tran.xml
│ ├── zags_cache_delete.prog.xml
│ ├── zags_cache_rebuild.prog.xml
│ ├── zags_migration_01.prog.xml
│ ├── zags_start.prog.abap
│ ├── zags_repo_delete.prog.xml
│ ├── zags_cache_rebuild.prog.abap
│ ├── zags_migration_03.prog.abap
│ ├── 0050569ac5931edba68607caa2e000da.smim.merge-worker.js
│ ├── zags_migration_02.prog.abap
│ └── zags_migration_01.prog.abap
├── backend
│ ├── zags_merge_requests.fugr.lzags_merge_requeststop.abap
│ ├── package.devc.xml
│ ├── zif_ags_constants.intf.abap
│ ├── zif_ags_object.intf.xml
│ ├── zags_merge_requests.fugr.lzags_merge_requeststop.xml
│ ├── zif_ags_constants.intf.xml
│ ├── zcl_ags_branch.clas.xml
│ ├── zags_merge_requests.fugr.saplzags_merge_requests.xml
│ ├── zcl_ags_obj_blob.clas.xml
│ ├── zcx_ags_error.clas.xml
│ ├── zcl_ags_pack.clas.xml
│ ├── zcl_ags_util.clas.xml
│ ├── zcl_ags_cache.clas.xml
│ ├── zcl_ags_repo.clas.xml
│ ├── zcl_ags_obj_tree.clas.xml
│ ├── zcl_ags_length.clas.xml
│ ├── zcl_ags_obj_commit.clas.xml
│ ├── zcl_ags_xstream.clas.xml
│ ├── zcl_ags_merge_requests.clas.xml
│ ├── zcl_ags_file_operations.clas.xml
│ ├── zcx_ags_merge_req_exc.clas.xml
│ ├── zif_ags_object.intf.abap
│ ├── zags_merge_requests.fugr.saplzags_merge_requests.abap
│ ├── zags_merge_req_htt.ttyp.xml
│ ├── zcl_ags_obj_tree.clas.testclasses.abap
│ ├── zcl_ags_repo.clas.testclasses.abap
│ ├── zcl_ags_util.clas.testclasses.abap
│ ├── zcl_ags_length.clas.abap
│ ├── zcx_ags_merge_req_exc.clas.abap
│ ├── zags_merge_requests.fugr.zags_handle_merge_requests.abap
│ ├── zcl_ags_xstream.clas.testclasses.abap
│ ├── zags_merge_requests.fugr.xml
│ ├── zcl_ags_length.clas.testclasses.abap
│ ├── zcl_ags_xstream.clas.abap
│ ├── zabapgitserver.msag.xml
│ ├── zcl_ags_merge_requests.clas.testclasses.abap
│ ├── zcl_ags_branch.clas.abap
│ ├── zcl_ags_merge_requests.clas.abap
│ ├── zcl_ags_util.clas.abap
│ ├── zcl_ags_pack.clas.testclasses.abap
│ ├── zcl_ags_obj_blob.clas.abap
│ ├── zcx_ags_error.clas.abap
│ ├── zcl_ags_obj_tree.clas.abap
│ ├── zcl_ags_pack.clas.abap
│ ├── zcl_ags_file_operations.clas.testclasses.abap
│ ├── zcl_ags_obj_commit.clas.testclasses.abap
│ └── zcl_ags_repo.clas.abap
├── service
│ ├── zif_ags_service.intf.abap
│ ├── package.devc.xml
│ ├── zif_ags_service.intf.xml
│ ├── zcl_ags_sicf.clas.xml
│ ├── zcl_ags_service_static.clas.xml
│ ├── zcl_ags_service_git.clas.xml
│ ├── zabapgitserver 9def6c78d0beedf8d5b04ba6c.sicf.xml
│ ├── zcl_ags_service_git.clas.testclasses.abap
│ ├── zcl_ags_sicf.clas.abap
│ ├── zags_test_performance.prog.xml
│ ├── zags_test_performance.prog.abap
│ ├── zcl_ags_service_rest.clas.xml
│ ├── zcl_ags_service_static.clas.abap
│ └── zcl_ags_service_rest.clas.testclasses.abap
├── package.devc.xml
├── ddic
│ ├── package.devc.xml
│ ├── zags_sha1.doma.xml
│ ├── zags_type.doma.xml
│ ├── zags_branch_name.doma.xml
│ ├── zags_repo_name.doma.xml
│ ├── zags_sha1_tt.ttyp.xml
│ ├── zags_sha1.dtel.xml
│ ├── zags_type.dtel.xml
│ ├── zags_branch.dtel.xml
│ ├── zags_hex4.dtel.xml
│ ├── zags_repo.dtel.xml
│ ├── zags_sstring.dtel.xml
│ ├── zags_chmod.dtel.xml
│ ├── zags_branch_name.dtel.xml
│ ├── zags_repo_name.dtel.xml
│ ├── zags_unix_time.dtel.xml
│ ├── zags_merge_request_title.dtel.xml
│ ├── zags_adler32.dtel.xml
│ ├── zags_merge_request_id.dtel.xml
│ ├── zags_repos_tt.ttyp.xml
│ ├── zags_objects_tt.ttyp.xml
│ ├── zags_branches_tt.ttyp.xml
│ ├── zags_tree_cache_key.tabl.xml
│ ├── zags_merge_req_s.tabl.xml
│ ├── zags_tree_cache_tt.ttyp.xml
│ ├── zags_tree_cache_data_tt.ttyp.xml
│ ├── zags_tree_cache_data.tabl.xml
│ ├── zags_tree_cache.tabl.xml
│ ├── ezags_merge_req.enqu.xml
│ ├── zags_merge_req.tabl.xml
│ ├── zags_repos.tabl.xml
│ ├── zags_branches.tabl.xml
│ └── zags_objects.tabl.xml
└── database
│ ├── package.devc.xml
│ ├── zcl_ags_db_repos.clas.xml
│ ├── zcl_ags_db_objects.clas.xml
│ ├── zcl_ags_db_branches.clas.xml
│ ├── zcl_ags_db_merge_requests.clas.xml
│ ├── zcl_ags_db_tree_cache.clas.xml
│ ├── zcl_ags_db.clas.xml
│ ├── zags_merge_req_tt.ttyp.xml
│ ├── zags_merge_request_merged.dtel.xml
│ ├── zcl_ags_db.clas.testclasses.abap
│ ├── zcl_ags_db.clas.abap
│ ├── zcl_ags_db_repos.clas.abap
│ ├── zcl_ags_db_branches.clas.abap
│ ├── zcl_ags_db_objects.clas.abap
│ ├── zcl_ags_db_tree_cache.clas.abap
│ └── zcl_ags_db_merge_requests.clas.abap
├── .abapgit.xml
├── LICENSE
└── README.md
/src/frontend/42b8957792091ee6bf845dbe6b03cfce.smim.swagger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/larshp/abapGitServer/HEAD/src/frontend/42b8957792091ee6bf845dbe6b03cfce.smim.swagger.png
--------------------------------------------------------------------------------
/src/backend/zags_merge_requests.fugr.lzags_merge_requeststop.abap:
--------------------------------------------------------------------------------
1 | FUNCTION-POOL zags_merge_requests. "MESSAGE-ID ..
2 |
3 | * INCLUDE LZAGS_MERGE_REQUESTSD... " Local class definition
4 |
--------------------------------------------------------------------------------
/src/service/zif_ags_service.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_ags_service
2 | PUBLIC.
3 |
4 |
5 | METHODS run
6 | IMPORTING
7 | !ii_server TYPE REF TO if_http_server
8 | RAISING
9 | zcx_ags_error.
10 | ENDINTERFACE.
11 |
--------------------------------------------------------------------------------
/src/frontend/zags_cache_delete.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_cache_delete.
2 |
3 | START-OF-SELECTION.
4 | PERFORM run.
5 |
6 | FORM run.
7 |
8 | zcl_ags_db=>get_tree_cache( )->delete_all( ).
9 |
10 | WRITE: / 'Done'(001).
11 |
12 | ENDFORM.
13 |
--------------------------------------------------------------------------------
/src/frontend/zags_repo_delete.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_repo_delete.
2 |
3 | PARAMETERS: p_name TYPE zags_repos-name OBLIGATORY.
4 |
5 | START-OF-SELECTION.
6 | PERFORM run.
7 |
8 | FORM run RAISING zcx_ags_error.
9 |
10 | zcl_ags_repo=>get_instance( p_name )->delete( ).
11 |
12 | WRITE: / 'Done'(001).
13 |
14 | ENDFORM.
15 |
--------------------------------------------------------------------------------
/src/package.devc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | abapGitServer
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/ddic/package.devc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | $AGS_DDIC
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/backend/package.devc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | $AGS_BACKEND
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/database/package.devc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | $AGS_DATABASE
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/frontend/package.devc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | $AGS_FRONTEND
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/service/package.devc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | $AGS_SERVICE
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/backend/zif_ags_constants.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_ags_constants
2 | PUBLIC.
3 |
4 | CONSTANTS: BEGIN OF c_type,
5 | blob TYPE zags_type VALUE 'blob' ##NO_TEXT,
6 | commit TYPE zags_type VALUE 'commit' ##NO_TEXT,
7 | tree TYPE zags_type VALUE 'tree' ##NO_TEXT,
8 | END OF c_type.
9 |
10 | ENDINTERFACE.
11 |
--------------------------------------------------------------------------------
/src/frontend/02b1f55747191ee589f800ccf877dd67.smim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /SAP/PUBLIC/zgit
6 | X
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/frontend/02b363142b451ed68df0b5608910d699.smim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /SAP/PUBLIC/zgit/script.js
6 | M_APP_L
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/frontend/02c1f55747191ed58ab0401507578067.smim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /SAP/PUBLIC/zgit/index.html
6 | M_TEXT_L
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/frontend/42b8957792091ed6bf842f345fc548b7.smim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /SAP/PUBLIC/zgit/logo.svg
6 | M_APP_L
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/frontend/42b8957792091ee6bf845dbe6b03cfce.smim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /SAP/PUBLIC/zgit/swagger.png
6 | M_APP_L
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/frontend/0050569ac5931edba68607caa2e000da.smim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /SAP/PUBLIC/zgit/merge-worker.js
6 | M_TEXT_L
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/backend/zif_ags_object.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_AGS_OBJECT
7 | E
8 | Object
9 | 2
10 | 1
11 | X
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/backend/zags_merge_requests.fugr.lzags_merge_requeststop.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | LZAGS_MERGE_REQUESTSTOP
7 | S
8 | D$
9 | I
10 | S
11 | X
12 | D$S
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/service/zif_ags_service.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_AGS_SERVICE
7 | E
8 | Service
9 | 2
10 | 1
11 | X
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/backend/zif_ags_constants.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_AGS_CONSTANTS
7 | E
8 | Constants
9 | 2
10 | 1
11 | X
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_branch.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_BRANCH
7 | E
8 | Branch
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/backend/zags_merge_requests.fugr.saplzags_merge_requests.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | SAPLZAGS_MERGE_REQUESTS
7 | S
8 | D$
9 | F
10 | S
11 | E
12 | X
13 | D$S
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_obj_blob.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_OBJ_BLOB
7 | E
8 | Blob
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/ddic/zags_sha1.doma.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_SHA1
7 | E
8 | CHAR
9 | 000040
10 | 000040
11 | X
12 | SHA1
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/ddic/zags_type.doma.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TYPE
7 | E
8 | CHAR
9 | 000006
10 | 000006
11 | X
12 | Type
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_sicf.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_SICF
7 | E
8 | SICF handler
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/.abapgit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | E
6 | /src/
7 | PREFIX
8 |
9 | - /.gitignore
10 | - /LICENSE
11 | - /README.md
12 | - /package.json
13 | - /.travis.yml
14 | - /abaplint.json
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_repos.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_DB_REPOS
7 | E
8 | Database - Repo
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_service_static.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_SERVICE_STATIC
7 | E
8 | Static
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_objects.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_DB_OBJECTS
7 | E
8 | Database - Objects
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_branches.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_DB_BRANCHES
7 | E
8 | Database - Branches
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/ddic/zags_branch_name.doma.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_BRANCH_NAME
7 | E
8 | CHAR
9 | 000050
10 | 000050
11 | X
12 | Branch name
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/ddic/zags_repo_name.doma.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_REPO_NAME
7 | E
8 | CHAR
9 | 000020
10 | 000020
11 | X
12 | Repository name
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/backend/zcx_ags_error.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_AGS_ERROR
7 | E
8 | Error
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_merge_requests.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_DB_MERGE_REQUESTS
7 | E
8 | Merge requests
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_tree_cache.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_DB_TREE_CACHE
7 | E
8 | Database - Tree Cache
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_pack.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_PACK
7 | E
8 | Pack
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_util.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_UTIL
7 | E
8 | Utils
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_cache.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_CACHE
7 | E
8 | Cache
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_repo.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_REPO
7 | E
8 | Repository
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_obj_tree.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_OBJ_TREE
7 | E
8 | Tree
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_length.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_LENGTH
7 | E
8 | Length encoding
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_obj_commit.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_OBJ_COMMIT
7 | E
8 | Commit
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_xstream.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_XSTREAM
7 | E
8 | xString Stream
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_service_git.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_SERVICE_GIT
7 | E
8 | Git
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_DB
7 | E
8 | Database Access, Factory
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_merge_requests.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_MERGE_REQUESTS
7 | E
8 | Merge requests
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_file_operations.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_FILE_OPERATIONS
7 | E
8 | Simple file operations
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/backend/zcx_ags_merge_req_exc.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_AGS_MERGE_REQ_EXC
7 | E
8 | abapgitServer Merge request exceptions
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/database/zags_merge_req_tt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MERGE_REQ_TT
7 | E
8 | ZAGS_MERGE_REQ
9 | S
10 | STRU
11 | T
12 | D
13 | N
14 | Merge requests
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/frontend/zags_migration_03.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MIGRATION_03
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | abapGitServer - Migrate branches
16 | 32
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/frontend/zags_start.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_START
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | abapGitServer - Call abapGitServer in browser window
16 | 52
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/ddic/zags_sha1_tt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_SHA1_TT
7 | E
8 | ZAGS_SHA1
9 | E
10 | CHAR
11 | 000040
12 | T
13 | D
14 | N
15 | SHA1 Table Type
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/frontend/zags_migration_02.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MIGRATION_02
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | abapGitServer - Migration, fill ADLER32 in ZAGS_OBJECTS
16 | 55
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/frontend/zabapgitserver.tran.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZABAPGITSERVER
7 | ZAGS_START
8 | 1000
9 | gA==
10 |
11 |
12 | ZABAPGITSERVER
13 | 1
14 | X
15 | X
16 |
17 |
18 | E
19 | ZABAPGITSERVER
20 | abapGitServer
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/frontend/zags_cache_delete.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_CACHE_DELETE
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | I
15 | 001
16 | Done
17 | 14
18 |
19 | -
20 | R
21 | abapGitServer - Delete Cache
22 | 28
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/ddic/zags_sha1.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_SHA1
7 | E
8 | ZAGS_SHA1
9 | 04
10 | 04
11 | 04
12 | 04
13 | SHA1
14 | SHA1
15 | SHA1
16 | SHA1
17 | SHA1
18 | E
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/ddic/zags_type.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TYPE
7 | E
8 | ZAGS_TYPE
9 | 20
10 | 10
11 | 20
12 | 40
13 | Type
14 | Type
15 | Type
16 | Type
17 | Type
18 | E
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/frontend/zags_cache_rebuild.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_CACHE_REBUILD
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | I
15 | 001
16 | Done
17 | 14
18 |
19 | -
20 | R
21 | abapGitServer - Rebuild Cache
22 | 29
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/backend/zif_ags_object.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_ags_object PUBLIC.
2 |
3 | METHODS deserialize
4 | IMPORTING
5 | !iv_data TYPE xstring
6 | !iv_adler32 TYPE zags_adler32 OPTIONAL
7 | RAISING
8 | zcx_ags_error .
9 | METHODS get_adler32
10 | RETURNING
11 | VALUE(rv_adler32) TYPE zags_adler32
12 | RAISING
13 | zcx_ags_error .
14 | METHODS get_sha1
15 | RETURNING
16 | VALUE(rv_sha1) TYPE zags_sha1
17 | RAISING
18 | zcx_ags_error .
19 | METHODS get_type
20 | RETURNING
21 | VALUE(rv_type) TYPE zags_type .
22 | METHODS save
23 | RAISING
24 | zcx_ags_error .
25 | METHODS serialize
26 | RETURNING
27 | VALUE(rv_data) TYPE xstring
28 | RAISING
29 | zcx_ags_error .
30 |
31 | ENDINTERFACE.
32 |
--------------------------------------------------------------------------------
/src/ddic/zags_branch.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_BRANCH
7 | E
8 | SYSUUID_C22
9 | 22
10 | 10
11 | 20
12 | 40
13 | Branch
14 | Branch
15 | Branch
16 | Branch
17 | Branch
18 | E
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/frontend/zags_migration_01.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MIGRATION_01
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | I
15 | 001
16 | Done
17 | 14
18 |
19 | -
20 | R
21 | abapGitServer - Migration, add REPO key in ZAGS_OBJECTS
22 | 55
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/ddic/zags_hex4.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_HEX4
7 | E
8 | 03
9 | 03
10 | 03
11 | 03
12 | Hex
13 | Hex
14 | Hex
15 | Hex
16 | Hex
17 | E
18 | RAW
19 | 000004
20 | 000008
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/ddic/zags_repo.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_REPO
7 | E
8 | SYSUUID_C22
9 | 22
10 | 10
11 | 20
12 | 40
13 | Repository
14 | Repository
15 | Repository
16 | Repository
17 | Repository
18 | E
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/ddic/zags_sstring.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_SSTRING
7 | E
8 | 55
9 | 10
10 | 20
11 | 40
12 | Short String
13 | Short String
14 | Short Stri
15 | Short String
16 | Short String
17 | E
18 | SSTR
19 | 001333
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/ddic/zags_chmod.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_CHMOD
7 | E
8 | 06
9 | 10
10 | 20
11 | 40
12 | CHMOD
13 | CHMOD
14 | CHMOD
15 | CHMOD
16 | CHMOD
17 | E
18 | CHAR
19 | 000006
20 | 000006
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/ddic/zags_branch_name.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_BRANCH_NAME
7 | E
8 | ZAGS_BRANCH_NAME
9 | 20
10 | 10
11 | 20
12 | 40
13 | Branch name
14 | Branch name
15 | Branch nam
16 | Branch name
17 | Branch name
18 | E
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/ddic/zags_repo_name.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_REPO_NAME
7 | E
8 | ZAGS_REPO_NAME
9 | 20
10 | 10
11 | 20
12 | 40
13 | Repository name
14 | Repository name
15 | Repository
16 | Repository name
17 | Repository name
18 | E
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/ddic/zags_unix_time.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_UNIX_TIME
7 | E
8 | 11
9 | 10
10 | 20
11 | 40
12 | Unix Time
13 | Unix Time
14 | Unix Time
15 | Unix Time
16 | Unix Time
17 | E
18 | INT4
19 | 000010
20 | 000011
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/ddic/zags_merge_request_title.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MERGE_REQUEST_TITLE
7 | E
8 | 55
9 | 10
10 | 20
11 | 40
12 | Title merge request
13 | Title
14 | Title
15 | Title
16 | Title
17 | E
18 | CHAR
19 | 000200
20 | 000200
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/database/zags_merge_request_merged.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MERGE_REQUEST_MERGED
7 | E
8 | SAP_BOOL
9 | 55
10 | 10
11 | 20
12 | 40
13 | Merge request merged
14 | Merge request merged
15 | Merged
16 | Merged
17 | Merge request merged
18 | E
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/ddic/zags_adler32.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_ADLER32
7 | E
8 | 55
9 | 10
10 | 20
11 | 40
12 | Adler32 checksum
13 | Adler32 checksum
14 | Adler32 ch
15 | Adler32 checksum
16 | Adler32 checksum
17 | E
18 | RAW
19 | 000004
20 | 000008
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/ddic/zags_merge_request_id.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MERGE_REQUEST_ID
7 | E
8 | 55
9 | 10
10 | 20
11 | 40
12 | Merge request ID
13 | Merge request ID
14 | MR ID
15 | Merge request ID
16 | Merge request ID
17 | E
18 | INT4
19 | 000010
20 | 000011
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/frontend/zags_start.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_start.
2 |
3 | START-OF-SELECTION.
4 | PERFORM run.
5 |
6 | FORM run.
7 |
8 | DATA: lv_url TYPE string,
9 | lv_urlc TYPE c LENGTH 2048,
10 | lo_viewer TYPE REF TO cl_gui_html_viewer,
11 | lo_empty TYPE REF TO cl_gui_container.
12 |
13 |
14 | * misuse the BSP runtime to construct SICF url
15 | cl_bsp_runtime=>construct_bsp_url(
16 | EXPORTING
17 | in_application = 'foobar'
18 | IMPORTING
19 | out_abs_url = lv_url ).
20 |
21 | REPLACE FIRST OCCURRENCE OF 'sap/bc/bsp/sap/foobar'
22 | IN lv_url
23 | WITH 'sap/zabapgitserver'.
24 |
25 | CREATE OBJECT lo_viewer
26 | EXPORTING
27 | parent = lo_empty.
28 |
29 | lv_urlc = lv_url.
30 | lo_viewer->enable_sapsso( abap_true ).
31 | lo_viewer->detach_url_in_browser( lv_urlc ).
32 | cl_gui_cfw=>flush( ).
33 |
34 | ENDFORM.
35 |
--------------------------------------------------------------------------------
/src/ddic/zags_repos_tt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_REPOS_TT
7 | E
8 | ZAGS_REPOS
9 | S
10 | STRU
11 | S
12 | K
13 | U
14 | 0001
15 | ZAGS_REPOS Table Type
16 |
17 |
18 |
19 | ZAGS_REPOS_TT
20 | 0001
21 | 0002
22 | REPO
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/service/zabapgitserver 9def6c78d0beedf8d5b04ba6c.sicf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /sap/zabapgitserver/
6 |
7 | ZABAPGITSERVER
8 | X
9 | zabapgitserver
10 |
11 |
12 | ZABAPGITSERVER
13 | E
14 | abapGitServer
15 |
16 |
17 |
18 | ZABAPGITSERVER
19 | 01
20 | A
21 | ZCL_AGS_SICF
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_service_git.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 | CLASS ltcl_test DEFINITION DEFERRED.
3 | CLASS zcl_ags_service_git DEFINITION LOCAL FRIENDS ltcl_test.
4 |
5 | CLASS ltcl_test DEFINITION FOR TESTING
6 | DURATION SHORT
7 | RISK LEVEL HARMLESS FINAL.
8 |
9 | PRIVATE SECTION.
10 | METHODS: unpack_ok FOR TESTING.
11 |
12 | ENDCLASS. "ltcl_Test
13 |
14 |
15 | CLASS ltcl_test IMPLEMENTATION.
16 |
17 | METHOD unpack_ok.
18 |
19 | DATA: lv_result TYPE xstring,
20 | lo_git TYPE REF TO zcl_ags_service_git.
21 |
22 |
23 | CREATE OBJECT lo_git.
24 |
25 | lv_result = lo_git->unpack_ok( 'refs/heads/master' ).
26 |
27 | cl_abap_unit_assert=>assert_equals(
28 | act = lv_result
29 | exp = '303031330130303065756E7061636B206F6B0A3030316501303031396' &&
30 | 'F6B20726566732F68656164732F6D61737465720A30303039013030303030303030' ).
31 |
32 | ENDMETHOD.
33 |
34 | ENDCLASS.
35 |
--------------------------------------------------------------------------------
/src/frontend/zags_repo_delete.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_REPO_DELETE
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | I
15 | 001
16 | Done
17 | 14
18 |
19 | -
20 | R
21 | abapGitServer - Delete Repository
22 | 33
23 |
24 | -
25 | S
26 | P_NAME
27 | .
28 | 9
29 | D
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/frontend/zags_cache_rebuild.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_cache_rebuild.
2 |
3 | START-OF-SELECTION.
4 | PERFORM run.
5 |
6 | FORM run RAISING zcx_ags_error.
7 |
8 | PERFORM delete.
9 | PERFORM build.
10 |
11 | COMMIT WORK.
12 |
13 | WRITE: / 'Done'(001).
14 |
15 | ENDFORM.
16 |
17 | FORM delete.
18 |
19 | zcl_ags_db=>get_tree_cache( )->delete_all( ).
20 |
21 | ENDFORM.
22 |
23 | FORM build RAISING zcx_ags_error.
24 |
25 | DATA: lt_repos TYPE zags_repos_tt,
26 | lt_branches TYPE zcl_ags_repo=>ty_branches_tt,
27 | lo_branch LIKE LINE OF lt_branches.
28 |
29 | FIELD-SYMBOLS: LIKE LINE OF lt_repos.
30 |
31 |
32 | lt_repos = zcl_ags_repo=>list( ).
33 | LOOP AT lt_repos ASSIGNING .
34 | lt_branches = zcl_ags_repo=>get_instance( -name )->list_branches( ).
35 | LOOP AT lt_branches INTO lo_branch.
36 | lo_branch->get_cache( )->build( abap_true ).
37 | ENDLOOP.
38 | ENDLOOP.
39 |
40 | ENDFORM.
41 |
--------------------------------------------------------------------------------
/src/backend/zags_merge_requests.fugr.saplzags_merge_requests.abap:
--------------------------------------------------------------------------------
1 | *******************************************************************
2 | * System-defined Include-files. *
3 | *******************************************************************
4 | INCLUDE lzags_merge_requeststop. " Global Data
5 | INCLUDE lzags_merge_requestsuxx. " Function Modules
6 |
7 | *******************************************************************
8 | * User-defined Include-files (if necessary). *
9 | *******************************************************************
10 | * INCLUDE LZAGS_MERGE_REQUESTSF... " Subroutines
11 | * INCLUDE LZAGS_MERGE_REQUESTSO... " PBO-Modules
12 | * INCLUDE LZAGS_MERGE_REQUESTSI... " PAI-Modules
13 | * INCLUDE LZAGS_MERGE_REQUESTSE... " Events
14 | * INCLUDE LZAGS_MERGE_REQUESTSP... " Local class implement.
15 | * INCLUDE LZAGS_MERGE_REQUESTST99. " ABAP Unit tests
16 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 | CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
3 |
4 | PRIVATE SECTION.
5 | METHODS:
6 | setup,
7 | simple FOR TESTING
8 | RAISING zcx_ags_error.
9 |
10 | ENDCLASS. "ltcl_Test
11 |
12 | CLASS ltcl_test IMPLEMENTATION.
13 |
14 | METHOD setup.
15 |
16 | zcl_ags_db=>set_fake( ).
17 |
18 | ENDMETHOD.
19 |
20 | METHOD simple.
21 |
22 | CONSTANTS: lc_name TYPE zags_repos-name VALUE 'TESTBLAH'.
23 |
24 | DATA: lv_repo TYPE zags_repo ##NEEDED.
25 |
26 |
27 | zcl_ags_repo=>create(
28 | iv_name = lc_name
29 | iv_description = 'testblah' ).
30 |
31 | * nothing should hit the database
32 | SELECT SINGLE repo FROM zags_repos INTO lv_repo
33 | WHERE name = lc_name ##WARN_OK. "#EC CI_SUBRC
34 | cl_abap_unit_assert=>assert_subrc( exp = 4 ).
35 |
36 | * but it should still be accessible via memory
37 | zcl_ags_repo=>get_instance( lc_name ).
38 |
39 | ENDMETHOD.
40 |
41 | ENDCLASS.
42 |
--------------------------------------------------------------------------------
/src/ddic/zags_objects_tt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_OBJECTS_TT
7 | E
8 | ZAGS_OBJECTS
9 | S
10 | STRU
11 | S
12 | K
13 | U
14 | 0002
15 | ZAGS_OBJECTS Table Type
16 |
17 |
18 |
19 | ZAGS_OBJECTS_TT
20 | 0001
21 | 0002
22 | REPO
23 |
24 |
25 | ZAGS_OBJECTS_TT
26 | 0002
27 | 0003
28 | SHA1
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/backend/zags_merge_req_htt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MERGE_REQ_HTT
7 | E
8 | ZAGS_MERGE_REQ
9 | S
10 | STRU
11 | H
12 | K
13 | U
14 | 0002
15 | Merge requests
16 |
17 |
18 |
19 | ZAGS_MERGE_REQ_HTT
20 | 0001
21 | 0002
22 | REPO
23 |
24 |
25 | ZAGS_MERGE_REQ_HTT
26 | 0002
27 | 0003
28 | ID
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/ddic/zags_branches_tt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_BRANCHES_TT
7 | E
8 | ZAGS_BRANCHES
9 | S
10 | STRU
11 | S
12 | K
13 | U
14 | 0002
15 | ZAGS_BRANCHES Table Type
16 |
17 |
18 |
19 | ZAGS_BRANCHES_TT
20 | 0001
21 | 0002
22 | REPO
23 |
24 |
25 | ZAGS_BRANCHES_TT
26 | 0002
27 | 0003
28 | BRANCH
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/ddic/zags_tree_cache_key.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TREE_CACHE_KEY
7 | E
8 | INTTAB
9 | ZAGS_TREE_CACHE Key
10 | 1
11 |
12 |
13 |
14 | REPO
15 | ZAGS_REPO
16 | 0
17 | E
18 |
19 |
20 | COMMIT_SHA1
21 | ZAGS_SHA1
22 | 0
23 | E
24 |
25 |
26 | COUNTER
27 | INTEGER
28 | 0
29 | E
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_obj_tree.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 | CLASS ltcl_test DEFINITION FOR TESTING
3 | DURATION SHORT
4 | RISK LEVEL HARMLESS
5 | FINAL.
6 |
7 | PRIVATE SECTION.
8 | CONSTANTS: c_sha1 TYPE zags_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
9 |
10 | METHODS: serialize FOR TESTING
11 | RAISING zcx_ags_error.
12 |
13 | ENDCLASS. "ltcl_Test
14 |
15 | CLASS ltcl_test IMPLEMENTATION.
16 |
17 | METHOD serialize.
18 |
19 | DATA: lo_old TYPE REF TO zcl_ags_obj_tree,
20 | lo_new TYPE REF TO zcl_ags_obj_tree,
21 | lv_xstr TYPE xstring.
22 |
23 |
24 | lo_old = zcl_ags_obj_tree=>new( 'test' ).
25 | lo_old->add_file(
26 | iv_chmod = zcl_ags_obj_tree=>c_chmod-file
27 | iv_name = 'foobar.txt'
28 | iv_sha1 = c_sha1 ).
29 |
30 | lv_xstr = lo_old->zif_ags_object~serialize( ).
31 |
32 | lo_new = zcl_ags_obj_tree=>new( 'test' ).
33 | lo_new->zif_ags_object~deserialize( lv_xstr ).
34 |
35 | cl_abap_unit_assert=>assert_equals(
36 | act = lines( lo_new->get_files( ) )
37 | exp = 1 ).
38 |
39 | ENDMETHOD.
40 |
41 | ENDCLASS.
42 |
--------------------------------------------------------------------------------
/src/frontend/zags_migration_03.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_migration_03.
2 |
3 | START-OF-SELECTION.
4 | PERFORM run.
5 |
6 | FORM run.
7 |
8 | DATA: lt_branches TYPE STANDARD TABLE OF zags_branches WITH DEFAULT KEY,
9 | ls_branch LIKE LINE OF lt_branches,
10 | lt_repos TYPE STANDARD TABLE OF zags_repos WITH DEFAULT KEY,
11 | ls_repo LIKE LINE OF lt_repos,
12 | lv_name TYPE zags_branches-name.
13 |
14 |
15 | SELECT * FROM zags_branches INTO TABLE lt_branches.
16 | LOOP AT lt_branches INTO ls_branch WHERE NOT name CA '/'.
17 | CONCATENATE 'refs/heads/' ls_branch-name INTO lv_name.
18 | UPDATE zags_branches SET name = lv_name
19 | WHERE repo = ls_branch-repo
20 | AND branch = ls_branch-branch.
21 | ASSERT sy-subrc = 0.
22 | ENDLOOP.
23 |
24 | SELECT * FROM zags_repos INTO TABLE lt_repos.
25 | LOOP AT lt_repos INTO ls_repo WHERE NOT head CA '/'.
26 | CONCATENATE 'refs/heads/' ls_repo-head INTO lv_name.
27 | UPDATE zags_repos SET head = lv_name
28 | WHERE repo = ls_repo-repo.
29 | ASSERT sy-subrc = 0.
30 | ENDLOOP.
31 |
32 | WRITE: / 'Done'.
33 |
34 | ENDFORM.
35 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Lars Hvam
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_repo.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 | CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
3 |
4 | PRIVATE SECTION.
5 | METHODS:
6 | setup,
7 | test FOR TESTING RAISING zcx_ags_error.
8 |
9 | ENDCLASS. "ltcl_Test
10 |
11 | CLASS ltcl_test IMPLEMENTATION.
12 |
13 | METHOD setup.
14 | zcl_ags_db=>set_fake( ).
15 | ENDMETHOD.
16 |
17 | METHOD test.
18 |
19 | CONSTANTS: lc_name TYPE zags_repos-name VALUE 'UNIT_TEST_NAME'.
20 |
21 | DATA: lt_list TYPE zags_repos_tt,
22 | lo_repo TYPE REF TO zcl_ags_repo.
23 |
24 |
25 | lo_repo = zcl_ags_repo=>create(
26 | iv_name = lc_name
27 | iv_description = 'DESCRIPTION' ).
28 |
29 | lt_list = zcl_ags_repo=>list( ).
30 | READ TABLE lt_list WITH KEY name = lc_name TRANSPORTING NO FIELDS. "#EC CI_SORTSEQ
31 | cl_abap_unit_assert=>assert_subrc( ).
32 |
33 | lo_repo->delete( ).
34 |
35 | lt_list = zcl_ags_repo=>list( ).
36 | READ TABLE lt_list WITH KEY name = lc_name TRANSPORTING NO FIELDS. "#EC CI_SORTSEQ
37 | cl_abap_unit_assert=>assert_subrc( exp = 4 ).
38 |
39 | ENDMETHOD.
40 |
41 | ENDCLASS.
42 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_util.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 |
3 | CLASS ltcl_get_time DEFINITION FOR TESTING
4 | DURATION SHORT
5 | RISK LEVEL HARMLESS
6 | FINAL.
7 |
8 | PRIVATE SECTION.
9 | METHODS: get_time FOR TESTING.
10 | ENDCLASS.
11 |
12 | CLASS ltcl_get_time IMPLEMENTATION.
13 |
14 | METHOD get_time.
15 |
16 | DATA: lv_time TYPE string.
17 |
18 | lv_time = zcl_ags_util=>get_time( ).
19 |
20 | cl_abap_unit_assert=>assert_not_initial( lv_time ).
21 |
22 | ENDMETHOD.
23 |
24 | ENDCLASS.
25 |
26 |
27 | CLASS ltcl_sha1 DEFINITION FOR TESTING
28 | DURATION SHORT
29 | RISK LEVEL HARMLESS
30 | FINAL.
31 |
32 | PRIVATE SECTION.
33 | METHODS:
34 | get_sha1_for_hello FOR TESTING RAISING cx_static_check.
35 | ENDCLASS.
36 |
37 | CLASS ltcl_sha1 IMPLEMENTATION.
38 |
39 | METHOD get_sha1_for_hello.
40 |
41 | DATA: lv_sha1 TYPE zags_sha1.
42 |
43 | lv_sha1 = zcl_ags_util=>sha1(
44 | iv_type = zif_ags_constants=>c_type-blob
45 | iv_data = zcl_ags_util=>string_to_xstring_utf8( 'hello' ) ).
46 |
47 | cl_abap_unit_assert=>assert_equals(
48 | act = lv_sha1
49 | exp = 'b6fc4c620b67d95f953a5c1c1230aaab5db5a1b0' ).
50 |
51 | ENDMETHOD.
52 |
53 | ENDCLASS.
54 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_length.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_length DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 | CLASS-METHODS:
7 | encode
8 | IMPORTING iv_length TYPE i
9 | RETURNING VALUE(rv_hex) TYPE zags_hex4,
10 | decode
11 | IMPORTING iv_data TYPE string
12 | RETURNING VALUE(rv_length) TYPE i.
13 |
14 | PROTECTED SECTION.
15 | PRIVATE SECTION.
16 | ENDCLASS.
17 |
18 |
19 |
20 | CLASS ZCL_AGS_LENGTH IMPLEMENTATION.
21 |
22 |
23 | METHOD decode.
24 |
25 | DATA: lv_x TYPE x LENGTH 1.
26 |
27 |
28 | ASSERT strlen( iv_data ) >= 4.
29 |
30 | * todo, extend implementation
31 | ASSERT iv_data(2) = '00'.
32 |
33 | lv_x = to_upper( iv_data+2 ).
34 |
35 | rv_length = lv_x.
36 |
37 | ENDMETHOD. "decode
38 |
39 |
40 | METHOD encode.
41 |
42 | DATA: lv_char TYPE string,
43 | lv_xstring TYPE xstring,
44 | lv_x TYPE x LENGTH 2.
45 |
46 |
47 | lv_x = iv_length.
48 | lv_char = lv_x.
49 | lv_xstring = zcl_ags_util=>string_to_xstring_utf8( to_lower( lv_char ) ).
50 | rv_hex = lv_xstring.
51 |
52 | ENDMETHOD. "encode
53 | ENDCLASS.
54 |
--------------------------------------------------------------------------------
/src/ddic/zags_merge_req_s.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MERGE_REQ_S
7 | E
8 | INTTAB
9 | X
10 | Merge request
11 | 3
12 |
13 |
14 |
15 | .INCLUDE
16 | 0
17 | ZAGS_MERGE_REQ
18 | S
19 | Merge requests
20 | S
21 |
22 |
23 | TARGET_BRANCH_NAME
24 | ZAGS_BRANCH_NAME
25 | 0
26 | E
27 |
28 |
29 | SOURCE_BRANCH_NAME
30 | ZAGS_BRANCH_NAME
31 | 0
32 | E
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/src/ddic/zags_tree_cache_tt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TREE_CACHE_TT
7 | E
8 | ZAGS_TREE_CACHE
9 | S
10 | STRU
11 | S
12 | K
13 | U
14 | 0003
15 | ZAGS_TREE_CACHE Table Type
16 |
17 |
18 |
19 | ZAGS_TREE_CACHE_TT
20 | 0001
21 | 0002
22 | REPO
23 |
24 |
25 | ZAGS_TREE_CACHE_TT
26 | 0002
27 | 0003
28 | COMMIT_SHA1
29 |
30 |
31 | ZAGS_TREE_CACHE_TT
32 | 0003
33 | 0004
34 | COUNTER
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/src/ddic/zags_tree_cache_data_tt.ttyp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TREE_CACHE_DATA_TT
7 | E
8 | ZAGS_TREE_CACHE_DATA
9 | S
10 | STRU
11 | S
12 | K
13 | U
14 | 0003
15 | ZAGS_TREE_CACHE_DATA Table Type
16 |
17 |
18 |
19 | ZAGS_TREE_CACHE_DATA_TT
20 | 0001
21 | 0001
22 | FILENAME
23 |
24 |
25 | ZAGS_TREE_CACHE_DATA_TT
26 | 0002
27 | 0002
28 | PATH
29 |
30 |
31 | ZAGS_TREE_CACHE_DATA_TT
32 | 0003
33 | 0003
34 | CHMOD
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_sicf.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_sicf DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC.
4 |
5 | PUBLIC SECTION.
6 |
7 | INTERFACES if_http_extension.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 | ENDCLASS.
11 |
12 |
13 |
14 | CLASS ZCL_AGS_SICF IMPLEMENTATION.
15 |
16 |
17 | METHOD if_http_extension~handle_request.
18 |
19 | DATA: lv_path TYPE string,
20 | lx_error TYPE REF TO zcx_ags_error,
21 | li_service TYPE REF TO zif_ags_service.
22 |
23 |
24 | lv_path = server->request->get_header_field( '~path' ).
25 |
26 | TRY.
27 | IF lv_path CP '/sap/zabapgitserver/git/*'.
28 | CREATE OBJECT li_service TYPE zcl_ags_service_git.
29 | ELSEIF lv_path CP '/sap/zabapgitserver/rest/*'.
30 | CREATE OBJECT li_service TYPE zcl_ags_service_rest.
31 | ELSE.
32 | CREATE OBJECT li_service TYPE zcl_ags_service_static.
33 | ENDIF.
34 |
35 | li_service->run( server ).
36 |
37 | COMMIT WORK.
38 | CATCH zcx_ags_error INTO lx_error.
39 | ROLLBACK WORK. "#EC CI_ROLLBACK
40 | server->response->set_status( code = 500
41 | reason = 'Error' ) ##no_text.
42 | server->response->set_cdata( lx_error->if_message~get_text( ) ).
43 | ENDTRY.
44 |
45 | ENDMETHOD.
46 | ENDCLASS.
47 |
--------------------------------------------------------------------------------
/src/backend/zcx_ags_merge_req_exc.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcx_ags_merge_req_exc DEFINITION
2 | PUBLIC
3 | INHERITING FROM zcx_ags_error
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 |
8 | CONSTANTS: BEGIN OF duplicate,
9 | msgid TYPE symsgid VALUE 'ZABAPGITSERVER',
10 | msgno TYPE symsgno VALUE '015',
11 | attr1 TYPE scx_attrname VALUE 'ID',
12 | attr2 TYPE scx_attrname VALUE '',
13 | attr3 TYPE scx_attrname VALUE '',
14 | attr4 TYPE scx_attrname VALUE '',
15 | END OF duplicate.
16 |
17 | METHODS constructor
18 | IMPORTING
19 | !textid LIKE if_t100_message=>t100key OPTIONAL
20 | !previous LIKE previous OPTIONAL
21 | !sha1 TYPE zags_sha1 OPTIONAL
22 | !string TYPE string OPTIONAL
23 | !repo_name TYPE zags_repo_name OPTIONAL
24 | !id TYPE zags_merge_request_id OPTIONAL .
25 | protected section.
26 | private section.
27 | ENDCLASS.
28 |
29 |
30 |
31 | CLASS ZCX_AGS_MERGE_REQ_EXC IMPLEMENTATION.
32 |
33 |
34 | method CONSTRUCTOR.
35 | CALL METHOD SUPER->CONSTRUCTOR
36 | EXPORTING
37 | PREVIOUS = PREVIOUS
38 | SHA1 = SHA1
39 | STRING = STRING
40 | REPO_NAME = REPO_NAME
41 | ID = ID
42 | .
43 | clear me->textid.
44 | if textid is initial.
45 | IF_T100_MESSAGE~T100KEY = IF_T100_MESSAGE=>DEFAULT_TEXTID.
46 | else.
47 | IF_T100_MESSAGE~T100KEY = TEXTID.
48 | endif.
49 | endmethod.
50 | ENDCLASS.
51 |
--------------------------------------------------------------------------------
/src/frontend/0050569ac5931edba68607caa2e000da.smim.merge-worker.js:
--------------------------------------------------------------------------------
1 | var Module = {
2 | locateFile: s => `https://unpkg.com/wasm-git@0.0.4/${s}`
3 | }
4 |
5 | importScripts('https://unpkg.com/wasm-git@0.0.4/lg2.js');
6 |
7 | Module.onRuntimeInitialized = () => {
8 | const lg = Module;
9 | FS.mkdir('/working');
10 | FS.mount(MEMFS, { }, '/working');
11 |
12 | const printError = err;
13 | let processStep;
14 | let terminate;
15 | err = obj => {
16 | printError(obj);
17 | terminate = true;
18 | postMessage({state: 'terminated', error: obj, processStep});
19 | };
20 | onmessage = (event) => {
21 | FS.writeFile('/home/web_user/.gitconfig', '[user]\n' +
22 | `name = ${event.data.name}\n` +
23 | `email = ${event.data.email}`);
24 |
25 | processStep = 'clone'
26 | lg.callMain([processStep, event.data.url, event.data.repo]);
27 | if (terminate)
28 | return;
29 | FS.chdir(event.data.repo);
30 |
31 | processStep = 'checkout';
32 | lg.callMain([processStep, event.data.sourceBranch]);
33 | if (terminate)
34 | return;
35 | processStep = 'checkout';
36 | lg.callMain([processStep, event.data.targetBranch]);
37 | if (terminate)
38 | return;
39 | processStep = 'merge';
40 | lg.callMain([processStep, event.data.sourceBranch]);
41 | if (terminate)
42 | return;
43 | processStep = 'push';
44 | lg.callMain([processStep]);
45 | if (terminate)
46 | return;
47 | postMessage({state: 'merged'});
48 | };
49 | postMessage({state: 'ready'});
50 | }
51 |
--------------------------------------------------------------------------------
/src/ddic/zags_tree_cache_data.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TREE_CACHE_DATA
7 | E
8 | INTTAB
9 | ZAGS_TREE_CACHE Data
10 | 1
11 |
12 |
13 |
14 | FILENAME
15 | ZAGS_SSTRING
16 | 0
17 | E
18 |
19 |
20 | PATH
21 | ZAGS_SSTRING
22 | 0
23 | E
24 |
25 |
26 | CHMOD
27 | ZAGS_CHMOD
28 | 0
29 | E
30 |
31 |
32 | BLOB_SHA1
33 | ZAGS_SHA1
34 | 0
35 | E
36 |
37 |
38 | LAST_COMMIT_SHA1
39 | ZAGS_SHA1
40 | 0
41 | E
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/frontend/zags_migration_02.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_migration_02.
2 | * Migration, fill ADLER32 in ZAGS_OBJECTS
3 |
4 | START-OF-SELECTION.
5 | PERFORM run.
6 |
7 | FORM run RAISING zcx_ags_error.
8 |
9 | TYPES: BEGIN OF ty_object,
10 | repo TYPE zags_objects-repo,
11 | sha1 TYPE zags_objects-sha1,
12 | type TYPE zags_objects-type,
13 | END OF ty_object.
14 |
15 | DATA: lt_objects TYPE STANDARD TABLE OF ty_object,
16 | lv_adler32 TYPE zags_objects-adler32,
17 | ls_data TYPE zags_objects,
18 | li_progress TYPE REF TO zif_abapgit_progress.
19 |
20 | FIELD-SYMBOLS: LIKE LINE OF lt_objects.
21 |
22 |
23 | SELECT * FROM zags_objects INTO CORRESPONDING FIELDS OF
24 | TABLE lt_objects WHERE adler32 IS NULL.
25 | WRITE: / sy-dbcnt.
26 |
27 | zcl_abapgit_progress=>get_instance( lines( lt_objects ) ).
28 |
29 | LOOP AT lt_objects ASSIGNING .
30 | li_progress->show(
31 | iv_current = sy-tabix
32 | iv_text = |Adler32, { sy-tabix } of { lines( lt_objects ) }| ).
33 |
34 | ls_data = zcl_ags_db=>get_objects( )->single(
35 | iv_repo = -repo
36 | iv_sha1 = -sha1 ).
37 |
38 | lv_adler32 = zcl_abapgit_hash=>adler32( ls_data-data_raw ).
39 |
40 | UPDATE zags_objects SET adler32 = lv_adler32
41 | WHERE repo = -repo
42 | AND sha1 = -sha1.
43 | ASSERT sy-subrc = 0.
44 | ASSERT sy-dbcnt = 1.
45 |
46 | COMMIT WORK.
47 | ENDLOOP.
48 |
49 | ENDFORM.
50 |
--------------------------------------------------------------------------------
/src/service/zags_test_performance.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TEST_PERFORMANCE
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | I
15 | 001
16 | Done
17 | 14
18 |
19 | -
20 | R
21 | abapGitServer - Test performance
22 | 32
23 |
24 | -
25 | S
26 | P_BRANCH
27 | .
28 | 19
29 | D
30 |
31 | -
32 | S
33 | P_COMMIT
34 | Commit
35 | 14
36 |
37 | -
38 | S
39 | P_NAME
40 | .
41 | 23
42 | D
43 |
44 | -
45 | S
46 | P_PACK
47 | Pack
48 | 12
49 |
50 | -
51 | S
52 | P_SHA1
53 | .
54 | 12
55 | D
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/src/backend/zags_merge_requests.fugr.zags_handle_merge_requests.abap:
--------------------------------------------------------------------------------
1 | FUNCTION zags_handle_merge_requests.
2 | *"----------------------------------------------------------------------
3 | *"*"Verbuchungsfunktionsbaustein:
4 | *"
5 | *"*"Lokale Schnittstelle:
6 | *" IMPORTING
7 | *" VALUE(IV_REPO) TYPE ZAGS_REPO
8 | *" VALUE(IV_TARGET_BRANCH) TYPE ZAGS_BRANCH
9 | *" VALUE(IV_SHA1_COMMIT_NEW) TYPE ZAGS_SHA1
10 | *" VALUE(IV_SHA1_COMMIT_OLD) TYPE ZAGS_SHA1
11 | *"----------------------------------------------------------------------
12 |
13 | DATA: lt_merge_requests TYPE zags_merge_req_htt.
14 | FIELD-SYMBOLS: TYPE zags_merge_req.
15 | TRY.
16 | lt_merge_requests = zcl_ags_merge_requests=>find_merged_merge_requests(
17 | iv_repo = iv_repo iv_target_branch = iv_target_branch
18 | iv_sha1_commit_new = iv_sha1_commit_new iv_sha1_commit_old = iv_sha1_commit_old ).
19 | LOOP AT lt_merge_requests ASSIGNING .
20 | CALL FUNCTION 'ENQUEUE_EZAGS_MERGE_REQ'
21 | EXPORTING
22 | repo = iv_repo
23 | id = -id
24 | _wait = abap_true
25 | EXCEPTIONS
26 | foreign_lock = 2.
27 | IF sy-subrc <> 0.
28 | DELETE TABLE lt_merge_requests FROM .
29 | CONTINUE.
30 | ENDIF.
31 | -merged = abap_true.
32 | ENDLOOP.
33 | UPDATE zags_merge_req FROM TABLE lt_merge_requests.
34 | CATCH zcx_ags_error.
35 | ASSERT 1 = 0.
36 | ENDTRY.
37 |
38 | ENDFUNCTION.
39 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_xstream.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 | CLASS ltcl_test DEFINITION FOR TESTING
3 | DURATION SHORT
4 | RISK LEVEL HARMLESS FINAL.
5 |
6 | PRIVATE SECTION.
7 | DATA: mo_stream TYPE REF TO zcl_ags_xstream.
8 |
9 | METHODS:
10 | setup,
11 | append_and_clear FOR TESTING,
12 | band01 FOR TESTING,
13 | band02 FOR TESTING,
14 | length FOR TESTING.
15 |
16 | ENDCLASS. "ltcl_Test
17 |
18 |
19 | CLASS ltcl_test IMPLEMENTATION.
20 |
21 | METHOD setup.
22 | CREATE OBJECT mo_stream.
23 | ENDMETHOD.
24 |
25 | METHOD append_and_clear.
26 |
27 | CONSTANTS: lc_value TYPE xstring VALUE '00FF'.
28 |
29 | mo_stream->append( lc_value ).
30 |
31 | cl_abap_unit_assert=>assert_equals(
32 | act = mo_stream->get( )
33 | exp = lc_value ).
34 |
35 | mo_stream->clear( ).
36 |
37 | cl_abap_unit_assert=>assert_initial( mo_stream->get( ) ).
38 |
39 | ENDMETHOD.
40 |
41 | METHOD band01.
42 |
43 | mo_stream->append_band01( '0011223344' ).
44 |
45 | cl_abap_unit_assert=>assert_equals(
46 | act = mo_stream->get( )
47 | exp = '30303061010011223344' ).
48 |
49 | ENDMETHOD.
50 |
51 | METHOD band02.
52 |
53 | mo_stream->append_band02( '0011223344' ).
54 |
55 | cl_abap_unit_assert=>assert_equals(
56 | act = mo_stream->get( )
57 | exp = '30303061020011223344' ).
58 |
59 | ENDMETHOD.
60 |
61 | METHOD length.
62 |
63 | mo_stream->append_length( '0011223344' ).
64 |
65 | cl_abap_unit_assert=>assert_equals(
66 | act = mo_stream->get( )
67 | exp = '303030390011223344' ).
68 |
69 | ENDMETHOD.
70 |
71 | ENDCLASS.
72 |
--------------------------------------------------------------------------------
/src/ddic/zags_tree_cache.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_TREE_CACHE
7 | E
8 | TRANSP
9 | X
10 | X
11 | Tree Cache
12 | A
13 | 1
14 |
15 |
16 | ZAGS_TREE_CACHE
17 | A
18 | 5
19 | APPL1
20 | N
21 |
22 |
23 |
24 | CLIENT
25 | X
26 | MANDT
27 | 0
28 | X
29 | E
30 |
31 |
32 | .INCLUDE
33 | X
34 | 0
35 | ZAGS_TREE_CACHE_KEY
36 | X
37 | S
38 | ZAGS_TREE_CACHE Key
39 | S
40 |
41 |
42 | .INCLUDE
43 | 0
44 | ZAGS_TREE_CACHE_DATA
45 | S
46 | ZAGS_TREE_CACHE Data
47 | S
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/ddic/ezags_merge_req.enqu.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | EZAGS_MERGE_REQ
7 | E
8 | E
9 | ZAGS_MERGE_REQ
10 | Merge request
11 |
12 |
13 |
14 | EZAGS_MERGE_REQ
15 | ZAGS_MERGE_REQ
16 | 0001
17 | ZAGS_MERGE_REQ
18 | E
19 |
20 |
21 |
22 |
23 | EZAGS_MERGE_REQ
24 | 0001
25 | CLIENT
26 | ZAGS_MERGE_REQ
27 | CLIENT
28 | X
29 | E
30 |
31 |
32 | EZAGS_MERGE_REQ
33 | 0002
34 | REPO
35 | ZAGS_MERGE_REQ
36 | REPO
37 | X
38 | E
39 | X
40 |
41 |
42 | EZAGS_MERGE_REQ
43 | 0003
44 | ID
45 | ZAGS_MERGE_REQ
46 | ID
47 | X
48 | E
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/src/service/zags_test_performance.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_test_performance.
2 | * enables easy performance trace via SE30
3 |
4 | PARAMETERS: p_name TYPE zags_repo_name OBLIGATORY,
5 | p_branch TYPE zags_branch_name OBLIGATORY DEFAULT 'master',
6 | p_sha1 TYPE zags_sha1.
7 |
8 | PARAMETERS: p_pack TYPE c RADIOBUTTON GROUP g1 DEFAULT 'X',
9 | p_commit TYPE c RADIOBUTTON GROUP g1.
10 |
11 | START-OF-SELECTION.
12 | PERFORM run.
13 |
14 | FORM run RAISING zcx_ags_error.
15 | CASE abap_true.
16 | WHEN p_pack.
17 | PERFORM pack.
18 | WHEN p_commit.
19 | PERFORM read_commit.
20 | WHEN OTHERS.
21 | ASSERT 0 = 1.
22 | ENDCASE.
23 |
24 | WRITE: / 'Done'(001).
25 | ENDFORM.
26 |
27 | FORM read_commit RAISING zcx_ags_error.
28 |
29 | DATA: lo_rest TYPE REF TO zcl_ags_service_rest.
30 |
31 | ASSERT NOT p_sha1 IS INITIAL.
32 |
33 | CREATE OBJECT lo_rest.
34 |
35 | lo_rest->read_commit(
36 | iv_repo = p_name
37 | iv_commit = p_sha1 ).
38 |
39 | ENDFORM.
40 |
41 | FORM pack RAISING zcx_ags_error.
42 |
43 | DATA: lo_commit TYPE REF TO zcl_ags_obj_commit,
44 | lo_repo TYPE REF TO zcl_ags_repo,
45 | lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
46 | lv_branch TYPE zags_sha1,
47 | lv_repo TYPE zags_repos-repo.
48 |
49 | lo_repo = zcl_ags_repo=>get_instance( p_name ).
50 | lv_repo = lo_repo->get_data( )-repo.
51 | lv_branch = lo_repo->get_branch( p_branch )->get_data( )-sha1.
52 |
53 | lo_commit = zcl_ags_obj_commit=>load(
54 | iv_repo = lv_repo
55 | iv_sha1 = lv_branch ).
56 |
57 | APPEND LINES OF zcl_ags_pack=>explode(
58 | iv_repo = lv_repo
59 | ii_object = lo_commit
60 | iv_deepen = 1 ) TO lt_objects.
61 |
62 | zcl_ags_pack=>encode( lt_objects ).
63 |
64 | ENDFORM.
65 |
--------------------------------------------------------------------------------
/src/backend/zags_merge_requests.fugr.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Merge requests
6 |
7 | LZAGS_MERGE_REQUESTSTOP
8 | SAPLZAGS_MERGE_REQUESTS
9 |
10 |
11 | -
12 | ZAGS_HANDLE_MERGE_REQUESTS
13 | 1
14 | Handle associated merge requests
15 |
16 |
17 | IV_REPO
18 | ZAGS_REPO
19 |
20 |
21 | IV_TARGET_BRANCH
22 | ZAGS_BRANCH
23 |
24 |
25 | IV_SHA1_COMMIT_NEW
26 | ZAGS_SHA1
27 |
28 |
29 | IV_SHA1_COMMIT_OLD
30 | ZAGS_SHA1
31 |
32 |
33 |
34 |
35 | IV_REPO
36 | P
37 | Repository
38 |
39 |
40 | IV_TARGET_BRANCH
41 | P
42 | Branch
43 |
44 |
45 | IV_SHA1_COMMIT_NEW
46 | P
47 | SHA1 new commit
48 |
49 |
50 | IV_SHA1_COMMIT_OLD
51 | P
52 | SHA1 old commit
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_service_rest.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_AGS_SERVICE_REST
7 | E
8 | REST
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 | -
17 | I
18 | 001
19 | List Repositories
20 | 27
21 |
22 | -
23 | I
24 | 002
25 | List Branches
26 | 23
27 |
28 | -
29 | I
30 | 003
31 | Create repository
32 | 27
33 |
34 | -
35 | I
36 | 004
37 | List files
38 | 20
39 |
40 | -
41 | I
42 | 005
43 | Read blob
44 | 19
45 |
46 | -
47 | I
48 | 006
49 | Read commit
50 | 21
51 |
52 | -
53 | I
54 | 007
55 | List commits
56 | 22
57 |
58 | -
59 | I
60 | 011
61 | Edit repository description
62 | 54
63 |
64 | -
65 | I
66 | 012
67 | Read blob via SHA1
68 | 28
69 |
70 | -
71 | I
72 | 013
73 | Read history
74 | 22
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_length.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 | *----------------------------------------------------------------------*
3 | * CLASS ltcl_length DEFINITION
4 | *----------------------------------------------------------------------*
5 | *
6 | *----------------------------------------------------------------------*
7 | CLASS ltcl_length DEFINITION FOR TESTING
8 | DURATION SHORT
9 | RISK LEVEL HARMLESS
10 | FINAL.
11 |
12 | PRIVATE SECTION.
13 | METHODS:
14 | encode_length1 FOR TESTING,
15 | encode_length2 FOR TESTING,
16 | decode_length1 FOR TESTING,
17 | decode_length2 FOR TESTING.
18 |
19 | ENDCLASS. "ltcl_Encode_Length
20 |
21 | *----------------------------------------------------------------------*
22 | * CLASS ltcl_length IMPLEMENTATION
23 | *----------------------------------------------------------------------*
24 | *
25 | *----------------------------------------------------------------------*
26 | CLASS ltcl_length IMPLEMENTATION.
27 |
28 | METHOD encode_length1.
29 |
30 | DATA: lv_encoded TYPE zags_hex4.
31 |
32 |
33 | lv_encoded = zcl_ags_length=>encode( 100 ).
34 |
35 | cl_abap_unit_assert=>assert_equals(
36 | act = lv_encoded
37 | exp = '30303634' ).
38 |
39 | ENDMETHOD. "encode_length
40 |
41 | METHOD encode_length2.
42 |
43 | DATA: lv_encoded TYPE xstring.
44 |
45 |
46 | lv_encoded = zcl_ags_length=>encode( 159 ).
47 |
48 | cl_abap_unit_assert=>assert_equals(
49 | act = zcl_ags_util=>xstring_to_string_utf8( lv_encoded )
50 | exp = '009f' ).
51 |
52 | ENDMETHOD.
53 |
54 | METHOD decode_length1.
55 |
56 | DATA: lv_length TYPE i.
57 |
58 |
59 | lv_length = zcl_ags_length=>decode( '0091' ).
60 |
61 | cl_abap_unit_assert=>assert_equals(
62 | act = lv_length
63 | exp = 145 ).
64 |
65 | ENDMETHOD. "decode_length
66 |
67 | METHOD decode_length2.
68 |
69 | DATA: lv_length TYPE i.
70 |
71 |
72 | lv_length = zcl_ags_length=>decode( '009f' ).
73 |
74 | cl_abap_unit_assert=>assert_equals(
75 | act = lv_length
76 | exp = 159 ).
77 |
78 | ENDMETHOD.
79 |
80 | ENDCLASS. "ltcl_length IMPLEMENTATION
81 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_db DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 |
7 | CLASS-METHODS get_branches
8 | RETURNING
9 | VALUE(ro_branches) TYPE REF TO zcl_ags_db_branches .
10 | CLASS-METHODS get_objects
11 | RETURNING
12 | VALUE(ro_objects) TYPE REF TO zcl_ags_db_objects .
13 | CLASS-METHODS get_repos
14 | RETURNING
15 | VALUE(ro_repos) TYPE REF TO zcl_ags_db_repos .
16 | CLASS-METHODS get_tree_cache
17 | RETURNING
18 | VALUE(ro_cache) TYPE REF TO zcl_ags_db_tree_cache .
19 | CLASS-METHODS set_fake .
20 | PROTECTED SECTION.
21 | PRIVATE SECTION.
22 |
23 | CLASS-DATA go_branches TYPE REF TO zcl_ags_db_branches .
24 | CLASS-DATA go_objects TYPE REF TO zcl_ags_db_objects .
25 | CLASS-DATA go_repos TYPE REF TO zcl_ags_db_repos .
26 | CLASS-DATA go_tree_cache TYPE REF TO zcl_ags_db_tree_cache .
27 | CLASS-DATA gv_fake TYPE abap_bool .
28 | ENDCLASS.
29 |
30 |
31 |
32 | CLASS ZCL_AGS_DB IMPLEMENTATION.
33 |
34 |
35 | METHOD get_branches.
36 |
37 | IF go_branches IS INITIAL.
38 | CREATE OBJECT go_branches.
39 | IF gv_fake = abap_true.
40 | go_branches->set_fake( ).
41 | ENDIF.
42 | ENDIF.
43 |
44 | ro_branches = go_branches.
45 |
46 | ENDMETHOD.
47 |
48 |
49 | METHOD get_objects.
50 |
51 | IF go_objects IS INITIAL.
52 | CREATE OBJECT go_objects.
53 | IF gv_fake = abap_true.
54 | go_objects->set_fake( ).
55 | ENDIF.
56 | ENDIF.
57 |
58 | ro_objects = go_objects.
59 |
60 | ENDMETHOD.
61 |
62 |
63 | METHOD get_repos.
64 |
65 | IF go_repos IS INITIAL.
66 | CREATE OBJECT go_repos.
67 | IF gv_fake = abap_true.
68 | go_repos->set_fake( ).
69 | ENDIF.
70 | ENDIF.
71 |
72 | ro_repos = go_repos.
73 |
74 | ENDMETHOD.
75 |
76 |
77 | METHOD get_tree_cache.
78 |
79 | IF go_tree_cache IS INITIAL.
80 | CREATE OBJECT go_tree_cache.
81 | IF gv_fake = abap_true.
82 | go_tree_cache->set_fake( ).
83 | ENDIF.
84 | ENDIF.
85 |
86 | ro_cache = go_tree_cache.
87 |
88 | ENDMETHOD.
89 |
90 |
91 | METHOD set_fake.
92 |
93 | CLEAR go_repos.
94 | CLEAR go_branches.
95 | CLEAR go_objects.
96 |
97 | gv_fake = abap_true.
98 |
99 | ENDMETHOD.
100 | ENDCLASS.
101 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_xstream.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_xstream DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 |
7 | METHODS append
8 | IMPORTING
9 | !iv_value TYPE xsequence .
10 | METHODS append_band01
11 | IMPORTING
12 | !iv_value TYPE xsequence .
13 | METHODS append_band02
14 | IMPORTING
15 | !iv_value TYPE xsequence .
16 | METHODS append_length
17 | IMPORTING
18 | !iv_value TYPE xsequence
19 | RETURNING
20 | VALUE(ro_stream) TYPE REF TO zcl_ags_xstream .
21 | METHODS clear .
22 | METHODS get
23 | RETURNING
24 | VALUE(rv_xstr) TYPE xstring .
25 | CLASS-METHODS create
26 | RETURNING
27 | VALUE(ro_stream) TYPE REF TO zcl_ags_xstream .
28 | PROTECTED SECTION.
29 | PRIVATE SECTION.
30 |
31 | DATA mv_xstr TYPE xstring .
32 | ENDCLASS.
33 |
34 |
35 |
36 | CLASS ZCL_AGS_XSTREAM IMPLEMENTATION.
37 |
38 |
39 | METHOD append.
40 |
41 | CONCATENATE mv_xstr iv_value INTO mv_xstr IN BYTE MODE.
42 |
43 | ENDMETHOD.
44 |
45 |
46 | METHOD append_band01.
47 |
48 | CONSTANTS: lc_band01 TYPE x VALUE '01'.
49 |
50 | DATA: lv_length TYPE xstring.
51 |
52 | * make sure to include the length encoding itself and band identifier in the length
53 | lv_length = zcl_ags_length=>encode( xstrlen( iv_value ) + 5 ).
54 | append( lv_length ).
55 | append( lc_band01 ).
56 | append( iv_value ).
57 |
58 | ENDMETHOD.
59 |
60 |
61 | METHOD append_band02.
62 |
63 | CONSTANTS: lc_band02 TYPE x VALUE '02'.
64 |
65 | DATA: lv_length TYPE xstring.
66 |
67 | * make sure to include the length encoding itself and band identifier in the length
68 | lv_length = zcl_ags_length=>encode( xstrlen( iv_value ) + 5 ).
69 | append( lv_length ).
70 | append( lc_band02 ).
71 | append( iv_value ).
72 |
73 | ENDMETHOD.
74 |
75 |
76 | METHOD append_length.
77 |
78 | DATA: lv_length TYPE xstring.
79 |
80 | lv_length = zcl_ags_length=>encode( xstrlen( iv_value ) + 4 ).
81 | append( lv_length ).
82 | append( iv_value ).
83 |
84 | ro_stream = me.
85 |
86 | ENDMETHOD.
87 |
88 |
89 | METHOD clear.
90 |
91 | CLEAR mv_xstr.
92 |
93 | ENDMETHOD.
94 |
95 |
96 | METHOD create.
97 |
98 | CREATE OBJECT ro_stream.
99 |
100 | ENDMETHOD.
101 |
102 |
103 | METHOD get.
104 | rv_xstr = mv_xstr.
105 | ENDMETHOD.
106 | ENDCLASS.
107 |
--------------------------------------------------------------------------------
/src/ddic/zags_merge_req.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_MERGE_REQ
7 | E
8 | TRANSP
9 | X
10 | Merge requests
11 | X
12 | A
13 | 3
14 |
15 |
16 | ZAGS_MERGE_REQ
17 | A
18 | 2
19 | APPL1
20 | P
21 | X
22 |
23 |
24 |
25 | CLIENT
26 | X
27 | MANDT
28 | 0
29 | X
30 | E
31 |
32 |
33 | REPO
34 | X
35 | ZAGS_REPO
36 | 0
37 | X
38 | E
39 |
40 |
41 | ID
42 | X
43 | ZAGS_MERGE_REQUEST_ID
44 | 0
45 | X
46 | E
47 |
48 |
49 | TITLE
50 | ZAGS_MERGE_REQUEST_TITLE
51 | 0
52 | E
53 |
54 |
55 | TARGET_BRANCH
56 | ZAGS_BRANCH
57 | 0
58 | E
59 |
60 |
61 | SOURCE_BRANCH
62 | ZAGS_BRANCH
63 | 0
64 | E
65 |
66 |
67 | MERGED
68 | ZAGS_MERGE_REQUEST_MERGED
69 | 0
70 | X
71 | F
72 | E
73 |
74 |
75 | CREATED_BY
76 | SYUNAME
77 | 0
78 | E
79 |
80 |
81 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/src/backend/zabapgitserver.msag.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZABAPGITSERVER
7 | E
8 | abapGitServer
9 |
10 |
11 |
12 | E
13 | ZABAPGITSERVER
14 | 000
15 | Error
16 |
17 |
18 | E
19 | ZABAPGITSERVER
20 | 001
21 | Repository already exists
22 |
23 |
24 | E
25 | ZABAPGITSERVER
26 | 002
27 | Repository not found
28 |
29 |
30 | E
31 | ZABAPGITSERVER
32 | 003
33 | Service not supplied
34 |
35 |
36 | E
37 | ZABAPGITSERVER
38 | 004
39 | Error while calculating SHA1
40 |
41 |
42 | E
43 | ZABAPGITSERVER
44 | 005
45 | Object not found, &1
46 |
47 |
48 | E
49 | ZABAPGITSERVER
50 | 008
51 | Unable to determine service
52 |
53 |
54 | E
55 | ZABAPGITSERVER
56 | 009
57 | Unknown object type
58 |
59 |
60 | E
61 | ZABAPGITSERVER
62 | 011
63 | File not found
64 |
65 |
66 | E
67 | ZABAPGITSERVER
68 | 012
69 | Commit, bad field format
70 |
71 |
72 | E
73 | ZABAPGITSERVER
74 | 013
75 | Merge request &1 Repository &2 not found
76 |
77 |
78 | E
79 | ZABAPGITSERVER
80 | 014
81 | Can't retrieve id for merge request. Table is locked (Transaction SM12)
82 |
83 |
84 | E
85 | ZABAPGITSERVER
86 | 015
87 | Open merge request &1 already exists for this combination.
88 |
89 |
90 | E
91 | ZABAPGITSERVER
92 | 016
93 | Branch &1 already merged into &2.
94 |
95 |
96 |
97 |
98 |
99 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_merge_requests.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | CLASS ltcl_merge_requests DEFINITION FOR TESTING
2 | DURATION SHORT RISK LEVEL HARMLESS FINAL.
3 |
4 | PRIVATE SECTION.
5 |
6 | METHODS setup
7 | RAISING cx_static_check.
8 |
9 | METHODS fast_forward_merge FOR TESTING
10 | RAISING zcx_ags_error.
11 |
12 | METHODS normal_merge FOR TESTING
13 | RAISING zcx_ags_error.
14 |
15 | METHODS normal_commit FOR TESTING
16 | RAISING zcx_ags_error.
17 |
18 | METHODS branch_merged FOR TESTING
19 | RAISING zcx_ags_error.
20 |
21 | METHODS branch_not_merged FOR TESTING
22 | RAISING zcx_ags_error.
23 |
24 | ENDCLASS.
25 |
26 | CLASS ltcl_merge_requests IMPLEMENTATION.
27 |
28 | METHOD setup.
29 |
30 | CALL FUNCTION 'ZIMPORT_BUNDLE_FROM_TDC'
31 | EXPORTING
32 | tdc = 'ZAGS_REPO_SNAPSHOT'
33 | tdc_version = 1
34 | variant = 'MERGE'
35 | do_commit = abap_false
36 | content_handler = 'REPLACE_CONTENT_ALL_TABLES'.
37 |
38 | ENDMETHOD.
39 |
40 | METHOD fast_forward_merge.
41 |
42 | DATA(lt_act_merge_requests) = zcl_ags_merge_requests=>find_merged_merge_requests(
43 | iv_repo = '051MciMJ7jkcyI0Qk}G0sW' iv_target_branch = '051MciMJ7jkcyI0Qk}GWsW'
44 | iv_sha1_commit_old = '915fb79a4ca60160a1bb83d2587c50224f388655'
45 | iv_sha1_commit_new = '1a51f4108bbb2befa991f5c4b65b0413fd8744c8' ).
46 |
47 | cl_abap_unit_assert=>assert_equals( exp = 1
48 | act = lines( lt_act_merge_requests ) ).
49 |
50 | ENDMETHOD.
51 |
52 | METHOD normal_merge.
53 |
54 | DATA(lt_act_merge_requests) = zcl_ags_merge_requests=>find_merged_merge_requests(
55 | iv_repo = '051MciMJ7jkcybs}nEaWsW' iv_target_branch = '051MciMJ7jkcybs}nEb0sW'
56 | iv_sha1_commit_old = '2291f2d6320fe84a650b87c47b5c91b70911c021'
57 | iv_sha1_commit_new = '466d9a59e9ffb337d388cfc83825e98fd2746cde' ).
58 |
59 | cl_abap_unit_assert=>assert_equals( exp = 1
60 | act = lines( lt_act_merge_requests ) ).
61 |
62 | ENDMETHOD.
63 |
64 | METHOD normal_commit.
65 |
66 | DATA(lt_act_merge_requests) = zcl_ags_merge_requests=>find_merged_merge_requests(
67 | iv_repo = '051MciMJ7jkcykFf16X0sW' iv_target_branch = '051MciMJ7jkcykFf16XWsW'
68 | iv_sha1_commit_old = 'cd20cbd60ce772edb54f7620eeb7552d2c0e04b0'
69 | iv_sha1_commit_new = '7b8030cc56e41da96ee99c13b4c97f5223168397' ).
70 |
71 | cl_abap_unit_assert=>assert_initial( act = lt_act_merge_requests ).
72 |
73 | ENDMETHOD.
74 |
75 | METHOD branch_merged.
76 |
77 | cl_abap_unit_assert=>assert_true( act = zcl_ags_merge_requests=>is_branch_merged(
78 | iv_repo_name = 'ags_ci2' iv_target_branch = 'refs/heads/master'
79 | iv_source_branch = 'refs/heads/f2' ) ).
80 |
81 | ENDMETHOD.
82 |
83 | METHOD branch_not_merged.
84 |
85 | cl_abap_unit_assert=>assert_false( act = zcl_ags_merge_requests=>is_branch_merged(
86 | iv_repo_name = 'ags_ci4' iv_target_branch = 'refs/heads/master'
87 | iv_source_branch = 'refs/heads/f1' ) ).
88 |
89 | ENDMETHOD.
90 |
91 | ENDCLASS.
92 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_repos.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_db_repos DEFINITION
2 | PUBLIC
3 | CREATE PRIVATE
4 | GLOBAL FRIENDS zcl_ags_db .
5 |
6 | PUBLIC SECTION.
7 |
8 | METHODS single
9 | IMPORTING
10 | !iv_name TYPE zags_repos-name
11 | RETURNING
12 | VALUE(rs_repo) TYPE zags_repos
13 | RAISING
14 | zcx_ags_error .
15 | METHODS list
16 | RETURNING
17 | VALUE(rt_list) TYPE zags_repos_tt .
18 | METHODS delete
19 | IMPORTING
20 | !iv_name TYPE zags_repos-name .
21 | METHODS update_description
22 | IMPORTING
23 | !iv_repo TYPE zags_repos-repo
24 | !iv_description TYPE zags_repos-description .
25 | METHODS insert
26 | IMPORTING
27 | !is_repo TYPE zags_repos .
28 | PROTECTED SECTION.
29 | PRIVATE SECTION.
30 |
31 | DATA mt_repos TYPE zags_repos_tt .
32 | DATA mv_fake TYPE abap_bool .
33 |
34 | METHODS set_fake .
35 | ENDCLASS.
36 |
37 |
38 |
39 | CLASS ZCL_AGS_DB_REPOS IMPLEMENTATION.
40 |
41 |
42 | METHOD delete.
43 |
44 | IF mv_fake = abap_true.
45 | DELETE mt_repos WHERE name = iv_name. "#EC CI_SORTSEQ
46 | ELSE.
47 | DELETE FROM zags_repos WHERE name = iv_name. "#EC CI_SUBRC
48 | ENDIF.
49 | ASSERT sy-subrc = 0.
50 |
51 | ENDMETHOD.
52 |
53 |
54 | METHOD insert.
55 |
56 | IF mv_fake = abap_true.
57 | INSERT is_repo INTO TABLE mt_repos.
58 | ELSE.
59 | INSERT zags_repos FROM is_repo. "#EC CI_SUBRC
60 | ENDIF.
61 | ASSERT sy-subrc = 0.
62 |
63 | ENDMETHOD.
64 |
65 |
66 | METHOD list.
67 |
68 | IF mv_fake = abap_true.
69 | rt_list = mt_repos.
70 | ELSE.
71 | SELECT * FROM zags_repos
72 | INTO TABLE rt_list. "#EC CI_NOWHERE "#EC CI_SUBRC
73 | ENDIF.
74 |
75 | ENDMETHOD.
76 |
77 |
78 | METHOD set_fake.
79 |
80 | mv_fake = abap_true.
81 |
82 | ENDMETHOD.
83 |
84 |
85 | METHOD single.
86 |
87 | IF mv_fake = abap_true.
88 | READ TABLE mt_repos INTO rs_repo
89 | WITH KEY name = iv_name. "#EC CI_SUBRC "#EC CI_SORTSEQ
90 | ELSE.
91 | SELECT SINGLE * FROM zags_repos
92 | INTO rs_repo
93 | WHERE name = iv_name.
94 | ENDIF.
95 | IF sy-subrc <> 0.
96 | RAISE EXCEPTION TYPE zcx_ags_error
97 | EXPORTING
98 | textid = zcx_ags_error=>m002.
99 | ENDIF.
100 |
101 | ENDMETHOD.
102 |
103 |
104 | METHOD update_description.
105 |
106 | FIELD-SYMBOLS: LIKE LINE OF mt_repos.
107 |
108 |
109 | IF mv_fake = abap_true.
110 | READ TABLE mt_repos WITH KEY repo = iv_repo ASSIGNING .
111 | ASSERT sy-subrc = 0.
112 | -description = iv_description.
113 | ELSE.
114 | UPDATE zags_repos
115 | SET description = iv_description
116 | WHERE repo = iv_repo. "#EC CI_SUBRC
117 | ASSERT sy-subrc = 0.
118 | ENDIF.
119 |
120 | ENDMETHOD.
121 | ENDCLASS.
122 |
--------------------------------------------------------------------------------
/src/ddic/zags_repos.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_REPOS
7 | E
8 | TRANSP
9 | X
10 | Repositories
11 | A
12 | 1
13 |
14 |
15 | ZAGS_REPOS
16 | A
17 | 0
18 | APPL1
19 | N
20 |
21 |
22 |
23 | CLIENT
24 | X
25 | MANDT
26 | T000
27 | 0
28 | X
29 | P
30 | E
31 |
32 |
33 | REPO
34 | X
35 | ZAGS_REPO
36 | 0
37 | X
38 | E
39 |
40 |
41 | NAME
42 | ZAGS_REPO_NAME
43 | 0
44 | E
45 |
46 |
47 | HEAD
48 | ZAGS_BRANCH_NAME
49 | 0
50 | E
51 |
52 |
53 | DESCRIPTION
54 | TEXT50
55 | 0
56 | E
57 |
58 |
59 |
60 |
61 | CLIENT
62 | ZAGS_REPOS
63 | CLIENT
64 | T000
65 | MANDT
66 | 0001
67 | MANDT
68 | CLNT
69 |
70 |
71 |
72 |
73 | CLIENT
74 | T000
75 |
76 |
77 |
78 |
79 | ZAGS_REPOS
80 | Z10
81 | A
82 | E
83 | X
84 | CLIENT, NAME
85 |
86 |
87 |
88 |
89 | ZAGS_REPOS
90 | Z10
91 | 0001
92 | A
93 | CLIENT
94 |
95 |
96 | ZAGS_REPOS
97 | Z10
98 | 0002
99 | A
100 | NAME
101 |
102 |
103 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_branch.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_branch DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 |
7 | METHODS constructor
8 | IMPORTING
9 | !io_repo TYPE REF TO zcl_ags_repo
10 | !iv_name TYPE zags_branches-name
11 | RAISING
12 | zcx_ags_error .
13 | METHODS delete .
14 | METHODS get_cache
15 | RETURNING
16 | VALUE(ro_cache) TYPE REF TO zcl_ags_cache .
17 | METHODS get_data
18 | RETURNING
19 | VALUE(rs_data) TYPE zags_branches .
20 | METHODS push
21 | IMPORTING
22 | !iv_new TYPE zags_sha1
23 | !iv_old TYPE zags_sha1
24 | !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
25 | RAISING
26 | zcx_ags_error .
27 | METHODS get_files
28 | RETURNING
29 | VALUE(ro_files) TYPE REF TO zcl_ags_file_operations .
30 | METHODS is_tag
31 | RETURNING
32 | VALUE(rv_bool) TYPE abap_bool .
33 | PROTECTED SECTION.
34 | PRIVATE SECTION.
35 |
36 | DATA ms_data TYPE zags_branches .
37 |
38 | METHODS update_sha1
39 | IMPORTING
40 | !iv_sha1 TYPE zags_sha1 .
41 | ENDCLASS.
42 |
43 |
44 |
45 | CLASS ZCL_AGS_BRANCH IMPLEMENTATION.
46 |
47 |
48 | METHOD constructor.
49 |
50 | DATA: lv_repo TYPE zags_repos-repo.
51 |
52 |
53 | lv_repo = io_repo->get_data( )-repo.
54 |
55 | ms_data = zcl_ags_db=>get_branches( )->single(
56 | iv_repo = lv_repo
57 | iv_name = iv_name ).
58 |
59 | ENDMETHOD.
60 |
61 |
62 | METHOD delete.
63 |
64 | zcl_ags_db=>get_branches( )->delete(
65 | iv_repo = ms_data-repo
66 | iv_name = ms_data-name ).
67 |
68 | * todo, unreferenced objects stay in the database
69 | * see https://github.com/larshp/abapGitServer/issues/41
70 |
71 | ENDMETHOD.
72 |
73 |
74 | METHOD get_cache.
75 |
76 | CREATE OBJECT ro_cache
77 | EXPORTING
78 | iv_repo = ms_data-repo
79 | iv_commit = ms_data-sha1.
80 |
81 | ENDMETHOD.
82 |
83 |
84 | METHOD get_data.
85 |
86 | rs_data = ms_data.
87 |
88 | ENDMETHOD.
89 |
90 |
91 | METHOD get_files.
92 |
93 | CREATE OBJECT ro_files
94 | EXPORTING
95 | io_branch = me.
96 |
97 | ENDMETHOD.
98 |
99 |
100 | METHOD is_tag.
101 |
102 | rv_bool = xsdbool( ms_data-name CP 'refs/tags/*' ).
103 |
104 | ENDMETHOD.
105 |
106 |
107 | METHOD push.
108 |
109 | ASSERT NOT iv_new IS INITIAL.
110 | ASSERT NOT iv_old IS INITIAL.
111 | ASSERT ms_data-sha1 = iv_old.
112 |
113 | * todo, add object validations?
114 | zcl_ags_pack=>save(
115 | iv_repo = ms_data-repo
116 | it_objects = it_objects ).
117 | update_sha1( iv_new ).
118 |
119 | CALL FUNCTION 'ZAGS_HANDLE_MERGE_REQUESTS'
120 | IN UPDATE TASK
121 | EXPORTING
122 | iv_repo = ms_data-repo
123 | iv_target_branch = ms_data-branch
124 | iv_sha1_commit_new = iv_new
125 | iv_sha1_commit_old = iv_old.
126 | COMMIT WORK.
127 |
128 | ENDMETHOD.
129 |
130 |
131 | METHOD update_sha1.
132 |
133 | ASSERT NOT iv_sha1 IS INITIAL.
134 |
135 | ms_data-sha1 = iv_sha1.
136 |
137 | zcl_ags_db=>get_branches( )->update_sha1(
138 | iv_sha1 = iv_sha1
139 | iv_repo = ms_data-repo
140 | iv_branch = ms_data-branch ).
141 |
142 | ENDMETHOD.
143 | ENDCLASS.
144 |
--------------------------------------------------------------------------------
/src/ddic/zags_branches.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_BRANCHES
7 | E
8 | TRANSP
9 | X
10 | Branches
11 | A
12 | 1
13 |
14 |
15 | ZAGS_BRANCHES
16 | A
17 | 0
18 | APPL1
19 | N
20 |
21 |
22 |
23 | CLIENT
24 | X
25 | MANDT
26 | T000
27 | 0
28 | X
29 | P
30 | E
31 |
32 |
33 | REPO
34 | X
35 | ZAGS_REPO
36 | 0
37 | X
38 | E
39 |
40 |
41 | BRANCH
42 | X
43 | ZAGS_BRANCH
44 | 0
45 | X
46 | E
47 |
48 |
49 | SHA1
50 | ZAGS_SHA1
51 | 0
52 | E
53 |
54 |
55 | NAME
56 | ZAGS_BRANCH_NAME
57 | 0
58 | E
59 |
60 |
61 |
62 |
63 | CLIENT
64 | ZAGS_BRANCHES
65 | CLIENT
66 | T000
67 | MANDT
68 | 0001
69 | MANDT
70 | CLNT
71 |
72 |
73 |
74 |
75 | CLIENT
76 | T000
77 |
78 |
79 |
80 |
81 | ZAGS_BRANCHES
82 | Z10
83 | A
84 | E
85 | X
86 | CLIENT, REPO, NAME
87 |
88 |
89 |
90 |
91 | ZAGS_BRANCHES
92 | Z10
93 | 0001
94 | A
95 | CLIENT
96 |
97 |
98 | ZAGS_BRANCHES
99 | Z10
100 | 0002
101 | A
102 | REPO
103 |
104 |
105 | ZAGS_BRANCHES
106 | Z10
107 | 0003
108 | A
109 | NAME
110 |
111 |
112 |
113 |
114 |
115 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_branches.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_db_branches DEFINITION
2 | PUBLIC
3 | CREATE PRIVATE
4 | GLOBAL FRIENDS zcl_ags_db .
5 |
6 | PUBLIC SECTION.
7 |
8 | METHODS update_sha1
9 | IMPORTING
10 | !iv_repo TYPE zags_branches-repo
11 | !iv_branch TYPE zags_branches-branch
12 | !iv_sha1 TYPE zags_branches-sha1 .
13 | METHODS single
14 | IMPORTING
15 | !iv_repo TYPE zags_branches-repo
16 | !iv_name TYPE zags_branches-name
17 | RETURNING
18 | VALUE(rs_data) TYPE zags_branches
19 | RAISING
20 | zcx_ags_error .
21 | METHODS list
22 | IMPORTING
23 | !iv_repo TYPE zags_branches-repo
24 | RETURNING
25 | VALUE(rt_list) TYPE zags_branches_tt .
26 | METHODS delete
27 | IMPORTING
28 | !iv_repo TYPE zags_branches-repo
29 | !iv_name TYPE zags_branches-name .
30 | METHODS insert
31 | IMPORTING
32 | !is_branch TYPE zags_branches .
33 | PROTECTED SECTION.
34 | PRIVATE SECTION.
35 |
36 | DATA mt_branches TYPE zags_branches_tt .
37 | DATA mv_fake TYPE abap_bool .
38 |
39 | METHODS set_fake ##RELAX.
40 | ENDCLASS.
41 |
42 |
43 |
44 | CLASS ZCL_AGS_DB_BRANCHES IMPLEMENTATION.
45 |
46 |
47 | METHOD delete.
48 |
49 | IF mv_fake = abap_true.
50 | DELETE mt_branches
51 | WHERE repo = iv_repo AND name = iv_name.
52 | ELSE.
53 | DELETE FROM zags_branches
54 | WHERE repo = iv_repo AND name = iv_name. "#EC CI_SUBRC
55 | ENDIF.
56 | ASSERT sy-subrc = 0.
57 |
58 | ENDMETHOD.
59 |
60 |
61 | METHOD insert.
62 |
63 | IF mv_fake = abap_true.
64 | INSERT is_branch INTO TABLE mt_branches.
65 | ELSE.
66 | INSERT zags_branches FROM is_branch. "#EC CI_SUBRC
67 | ENDIF.
68 | ASSERT sy-subrc = 0.
69 |
70 | ENDMETHOD.
71 |
72 |
73 | METHOD list.
74 |
75 | IF mv_fake = abap_true.
76 | rt_list = mt_branches.
77 | DELETE rt_list WHERE repo <> iv_repo. "#EC CI_SORTSEQ
78 | ELSE.
79 | SELECT * FROM zags_branches
80 | INTO TABLE rt_list
81 | WHERE repo = iv_repo
82 | ORDER BY name ASCENDING. "#EC CI_NOWHERE "#EC CI_SUBRC
83 | ENDIF.
84 |
85 | ENDMETHOD.
86 |
87 |
88 | METHOD set_fake.
89 |
90 | mv_fake = abap_true.
91 |
92 | ENDMETHOD.
93 |
94 |
95 | METHOD single.
96 |
97 | IF mv_fake = abap_true.
98 | READ TABLE mt_branches INTO rs_data
99 | WITH KEY name = iv_name repo = iv_repo. "#EC CI_SUBRC
100 | ELSE.
101 | SELECT SINGLE * FROM zags_branches INTO rs_data
102 | WHERE name = iv_name
103 | AND repo = iv_repo ##WARN_OK.
104 | ENDIF.
105 | IF sy-subrc <> 0.
106 | RAISE EXCEPTION TYPE zcx_ags_error
107 | EXPORTING
108 | textid = zcx_ags_error=>m002.
109 | ENDIF.
110 |
111 | ENDMETHOD.
112 |
113 |
114 | METHOD update_sha1.
115 |
116 | FIELD-SYMBOLS: LIKE LINE OF mt_branches.
117 |
118 |
119 | IF mv_fake = abap_true.
120 | READ TABLE mt_branches ASSIGNING
121 | WITH KEY repo = iv_repo branch = iv_branch.
122 | ASSERT sy-subrc = 0.
123 | -sha1 = iv_sha1.
124 | ELSE.
125 | UPDATE zags_branches
126 | SET sha1 = iv_sha1
127 | WHERE repo = iv_repo
128 | AND branch = iv_branch. "#EC CI_SUBRC
129 | ASSERT sy-subrc = 0.
130 | ENDIF.
131 |
132 | ENDMETHOD.
133 | ENDCLASS.
134 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # abapGitServer
2 | Git server implemented in ABAP
3 |
4 | ## Install
5 |
6 | via [abapGit](https://www.abapgit.org)
7 |
8 | ## Setup
9 |
10 | by activating the ServiceName ZABAPGITSERVER in transaction SICF
11 |
12 | ## Start
13 |
14 | to use it via the web frontend by running transaction ZABAPGITSERVER (or right click on the SICF service ZABAPGITSERVER and choose Test Service)
15 |
16 | ## Merge requests
17 | abapGitServer supports merge requests between two branches of the same repo.
18 |
19 | ### Creating branches
20 | After creating a new branch, push it directly to `abapGitServer` before committing any changes:
21 | ```
22 | git branch
23 | git push origin
24 | ```
25 | After this operation you can make your changes and commit them to the new branch.
26 | When you push a new branch with new commits, the operation will fail.
27 |
28 | ### News
29 | 2018-02-25: Support for tags added, use conversion program ZAGS_MIGRATION_03 to convert old repositories
30 |
31 | 2018-01-21: Field ADLER32 added in database table ZAGS_OBJECTS, use conversion program ZAGS_MIGRATION_02 to convert old repositories
32 |
33 | 2018-01-13: Make sure you have the latest development version of abapGit installed
34 |
35 | 2017-03-12: Key field REPO added in database table ZAGS_OBJECTS, use conversion program ZAGS_MIGRATION_01 to convert old repositories
36 |
37 | ### Requirements
38 | - https://github.com/larshp/ABAP-Swagger
39 | - https://github.com/larshp/abapGit (the full repository version >= 1.102.0 is needed, not only the latest build on https://raw.githubusercontent.com/abapGit/build/master/zabapgit.abap)
40 |
41 | #### Testing
42 | - https://github.com/bunysae/abap_db_preparator
43 |
44 | ### Version requirement
45 | see https://github.com/larshp/ABAP-Swagger
46 |
47 | ### Scope
48 | - Web interface: browse/create repository
49 | - No tags, no submodules, no blame
50 | - Primarily tested with abapGit as client
51 |
52 | ### Use cases
53 | - Automatic backup of objects
54 | - Increased visibility over changes in system
55 |
56 | Works with 'git pull' from command line, so all objects can be exported to a different git server if needed, [guide](https://help.github.com/articles/importing-a-git-repository-using-the-command-line/)
57 |
58 | ### Use with abapGit
59 | abapGit is your git client and the abapGitServer our server. We first have to setup the [ssl connection](https://docs.abapgit.org/guide-ssl-setup.html) with the root certificate of the sap system the abapGitServer is running on.
60 | After that the abapGitServer can be used like every other git server.
61 |
62 | ### External libraries
63 |
64 | Library | Version | License
65 | :------------ | :------------ | :------------
66 | [spinkit](https://github.com/tobiasahlin/SpinKit) | 1.2.5 | MIT
67 | [react](https://github.com/facebook/react) | 15.2.1 | Facebook BSD + Patents
68 | [babel-standalone](https://github.com/babel/babel-standalone) | 6.23.1 | MIT
69 | [babel-polyfill](https://github.com/babel/babel/tree/master/packages/babel-polyfill) | 6.23.0 | MIT
70 | [react-router](https://github.com/ReactTraining/react-router) | 2.5.2 | MIT
71 | [history](https://github.com/ReactTraining/history) | 2.1.2 | MIT
72 | [prism](https://github.com/PrismJS/prism) | 1.6.0 | MIT
73 | [octicons](https://github.com/primer/octicons/) | 3.5.0 | MIT
74 | [jsdiff](https://github.com/kpdecker/jsdiff) | 2.2.3 | BSD-3-Clause
75 | [jquery](https://github.com/jquery/jquery) | 2.2.3 | MIT
76 | [diff2html](https://github.com/rtfpessoa/diff2html) | 2.3.0 | MIT
77 | [wasm-git](https://github.com/petersalomonsen/wasm-git) | 0.0.4 | GPL with linking exception
78 |
79 | ### Screenshots
80 | [See wiki](https://github.com/larshp/abapGitServer/wiki/Screenshots)
81 |
--------------------------------------------------------------------------------
/src/ddic/zags_objects.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZAGS_OBJECTS
7 | E
8 | TRANSP
9 | X
10 | Objects
11 | A
12 | 1
13 |
14 |
15 | ZAGS_OBJECTS
16 | A
17 | 0
18 | APPL1
19 | N
20 |
21 |
22 |
23 | CLIENT
24 | X
25 | MANDT
26 | T000
27 | 0
28 | X
29 | P
30 | E
31 |
32 |
33 | REPO
34 | X
35 | ZAGS_REPO
36 | 0
37 | X
38 | E
39 |
40 |
41 | SHA1
42 | X
43 | ZAGS_SHA1
44 | 0
45 | X
46 | E
47 |
48 |
49 | TYPE
50 | ZAGS_TYPE
51 | 0
52 | E
53 |
54 |
55 | ADLER32
56 | ZAGS_ADLER32
57 | 0
58 | E
59 |
60 |
61 | DATA_RAW
62 | 0
63 | y
64 | 000008
65 | RSTR
66 | RSTR
67 |
68 |
69 |
70 |
71 | CLIENT
72 | ZAGS_OBJECTS
73 | CLIENT
74 | T000
75 | MANDT
76 | 0001
77 | MANDT
78 | CLNT
79 |
80 |
81 |
82 |
83 | CLIENT
84 | T000
85 |
86 |
87 |
88 |
89 | ZAGS_OBJECTS
90 | Z10
91 | A
92 | E
93 | CLIENT + REPO + TYPE
94 |
95 |
96 |
97 |
98 | ZAGS_OBJECTS
99 | Z10
100 | 0001
101 | A
102 | CLIENT
103 |
104 |
105 | ZAGS_OBJECTS
106 | Z10
107 | 0002
108 | A
109 | REPO
110 |
111 |
112 | ZAGS_OBJECTS
113 | Z10
114 | 0003
115 | A
116 | TYPE
117 |
118 |
119 |
120 |
121 |
122 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_service_static.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_service_static DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC.
4 |
5 | PUBLIC SECTION.
6 |
7 | INTERFACES zif_ags_service.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 |
11 | DATA mi_server TYPE REF TO if_http_server.
12 |
13 | METHODS script_changed
14 | RETURNING
15 | VALUE(rv_changed) TYPE string.
16 | METHODS read_mime
17 | IMPORTING
18 | !iv_url TYPE string.
19 | ENDCLASS.
20 |
21 |
22 |
23 | CLASS ZCL_AGS_SERVICE_STATIC IMPLEMENTATION.
24 |
25 |
26 | METHOD read_mime.
27 |
28 | DATA: li_api TYPE REF TO if_mr_api,
29 | lv_data TYPE xstring,
30 | lv_changed TYPE smimphio-chng_time,
31 | lv_timestamp TYPE char14,
32 | lv_modified TYPE string,
33 | lv_mime TYPE string,
34 | lv_url TYPE string.
35 |
36 |
37 | CONCATENATE '/SAP/PUBLIC/zgit/' iv_url INTO lv_url.
38 |
39 | li_api = cl_mime_repository_api=>if_mr_api~get_api( ).
40 |
41 | li_api->get(
42 | EXPORTING
43 | i_url = lv_url
44 | IMPORTING
45 | e_content = lv_data
46 | e_mime_type = lv_mime
47 | e_content_last_changed = lv_changed
48 | EXCEPTIONS
49 | not_found = 1 ).
50 | IF sy-subrc = 1.
51 | mi_server->response->set_cdata( '404' ).
52 | mi_server->response->set_status( code = 404 reason = '404' ).
53 | RETURN.
54 | ENDIF.
55 |
56 | lv_timestamp = lv_changed.
57 | lv_modified = cl_bsp_utility=>date_to_string_http( lv_timestamp ).
58 |
59 | IF iv_url = 'index.html'.
60 | mi_server->response->set_cookie(
61 | name = 'jsmodified'
62 | value = script_changed( ) ) ##NO_TEXT.
63 | ENDIF.
64 |
65 | IF lv_modified = mi_server->request->get_header_field( 'If-Modified-Since' ) ##NO_TEXT.
66 | mi_server->response->set_status( code = 304 reason = '' ).
67 | RETURN.
68 | ENDIF.
69 |
70 | mi_server->response->set_header_field(
71 | name = 'Cache-Control'
72 | value = 'max-age=86400' ) ##NO_TEXT.
73 |
74 | mi_server->response->set_header_field(
75 | name = 'Last-Modified'
76 | value = lv_modified ) ##NO_TEXT.
77 |
78 | mi_server->response->set_compression( ).
79 | mi_server->response->set_content_type( lv_mime ).
80 | mi_server->response->set_data( lv_data ).
81 |
82 | ENDMETHOD.
83 |
84 |
85 | METHOD script_changed.
86 |
87 | DATA: lv_url TYPE string,
88 | li_api TYPE REF TO if_mr_api,
89 | lv_changed TYPE smimphio-chng_time.
90 |
91 |
92 | CONCATENATE '/SAP/PUBLIC/zgit/' 'script.js' INTO lv_url ##NO_TEXT.
93 |
94 | li_api = cl_mime_repository_api=>if_mr_api~get_api( ).
95 |
96 | li_api->get(
97 | EXPORTING
98 | i_url = lv_url
99 | IMPORTING
100 | e_content_last_changed = lv_changed
101 | EXCEPTIONS
102 | not_found = 1 ). "#EC CI_SUBRC
103 | ASSERT sy-subrc = 0.
104 |
105 | rv_changed = lv_changed.
106 |
107 | ENDMETHOD.
108 |
109 |
110 | METHOD zif_ags_service~run.
111 |
112 | DATA: lv_name TYPE string,
113 | lv_path TYPE string.
114 |
115 |
116 | mi_server = ii_server.
117 |
118 | lv_path = mi_server->request->get_header_field( '~path' ).
119 |
120 | FIND REGEX '/sap/zabapgitserver/static/(.*)'
121 | IN lv_path
122 | SUBMATCHES lv_name ##NO_TEXT.
123 |
124 | IF lv_name IS INITIAL.
125 | lv_name = 'index.html' ##NO_TEXT.
126 | ENDIF.
127 |
128 | read_mime( lv_name ).
129 |
130 | ENDMETHOD.
131 | ENDCLASS.
132 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_merge_requests.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_merge_requests DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 |
8 | "! Associated merge requests, that are merged with the new commits
9 | CLASS-METHODS find_merged_merge_requests
10 | IMPORTING
11 | !iv_repo TYPE zags_repo
12 | !iv_target_branch TYPE zags_branch
13 | !iv_sha1_commit_new TYPE zags_sha1
14 | !iv_sha1_commit_old TYPE zags_sha1
15 | RETURNING
16 | VALUE(rt_merge_requests) TYPE zags_merge_req_htt
17 | RAISING
18 | zcx_ags_error .
19 |
20 | CLASS-METHODS is_branch_merged
21 | IMPORTING
22 | !iv_repo_name TYPE zags_repo_name
23 | !iv_source_branch TYPE zags_branch_name
24 | !iv_target_branch TYPE zags_branch_name
25 | RETURNING
26 | VALUE(rv_merged) TYPE abap_bool
27 | RAISING
28 | zcx_ags_error.
29 |
30 | PROTECTED SECTION.
31 | PRIVATE SECTION.
32 |
33 | CLASS-METHODS find_source_branch
34 | IMPORTING
35 | iv_repo TYPE zags_repo
36 | iv_sha1_commit_latest TYPE zags_sha1
37 | iv_sha1_commit_old TYPE zags_sha1
38 | iv_target_branch TYPE zags_branch
39 | RETURNING VALUE(rv_branch) TYPE zags_branch
40 | RAISING zcx_ags_error.
41 |
42 | ENDCLASS.
43 |
44 |
45 |
46 | CLASS ZCL_AGS_MERGE_REQUESTS IMPLEMENTATION.
47 |
48 |
49 | METHOD find_merged_merge_requests.
50 |
51 | DATA(lo_ags_cache) = NEW zcl_ags_cache( iv_repo = iv_repo iv_commit = iv_sha1_commit_new ).
52 | DATA(lt_commits) = lo_ags_cache->list_commits( ).
53 |
54 | LOOP AT lt_commits REFERENCE INTO DATA(lr_commit).
55 | IF lr_commit->*-sha1 = iv_sha1_commit_old.
56 | EXIT.
57 | ENDIF.
58 | DATA(lv_source_branch) = find_source_branch( iv_repo = iv_repo
59 | iv_sha1_commit_latest =
60 | COND zags_sha1( WHEN lr_commit->*-parent2 IS NOT INITIAL THEN lr_commit->*-parent2 ELSE lr_commit->*-sha1 )
61 | iv_sha1_commit_old = iv_sha1_commit_old
62 | iv_target_branch = iv_target_branch ).
63 | IF lv_source_branch IS NOT INITIAL.
64 |
65 | SELECT * FROM zags_merge_req INTO @DATA(ls_merge_request)
66 | WHERE repo = @iv_repo AND target_branch = @iv_target_branch
67 | AND source_branch = @lv_source_branch.
68 | INSERT ls_merge_request INTO TABLE rt_merge_requests.
69 | ENDSELECT.
70 |
71 | ENDIF.
72 |
73 | ENDLOOP.
74 |
75 | ENDMETHOD.
76 |
77 |
78 | METHOD find_source_branch.
79 |
80 | DATA(lo_ags_cache) = NEW zcl_ags_cache( iv_repo = iv_repo iv_commit = iv_sha1_commit_latest ).
81 | DATA(lt_commits) = lo_ags_cache->list_commits( ).
82 |
83 | LOOP AT lt_commits REFERENCE INTO DATA(lr_commit).
84 | ##WARN_OK
85 | SELECT SINGLE branch FROM zags_branches INTO rv_branch
86 | WHERE repo = iv_repo AND sha1 = lr_commit->*-sha1
87 | AND branch <> iv_target_branch.
88 | IF sy-subrc = 0.
89 | RETURN.
90 | ENDIF.
91 | IF lr_commit->*-sha1 = iv_sha1_commit_old.
92 | EXIT.
93 | ENDIF.
94 | ENDLOOP.
95 |
96 | ENDMETHOD.
97 |
98 |
99 | METHOD is_branch_merged.
100 |
101 | DATA(lo_target_branch) = zcl_ags_repo=>get_instance( iv_repo_name )->get_branch( iv_target_branch ).
102 | DATA(lt_commits) = lo_target_branch->get_cache( )->list_commits( ).
103 |
104 | DATA(lo_source_branch) = zcl_ags_repo=>get_instance( iv_repo_name )->get_branch( iv_source_branch ).
105 |
106 | LOOP AT lt_commits REFERENCE INTO DATA(lr_commit).
107 | IF lr_commit->*-parent2 = lo_source_branch->get_data( )-sha1
108 | OR lr_commit->*-parent = lo_source_branch->get_data( )-sha1.
109 | rv_merged = abap_true.
110 | RETURN.
111 | ENDIF.
112 | ENDLOOP.
113 |
114 | ENDMETHOD.
115 | ENDCLASS.
116 |
--------------------------------------------------------------------------------
/src/frontend/zags_migration_01.prog.abap:
--------------------------------------------------------------------------------
1 | REPORT zags_migration_01.
2 | * Migration, add REPO key in ZAGS_OBJECTS, old data is not deleted
3 |
4 | DATA: gt_objects TYPE zags_objects_tt.
5 |
6 |
7 | START-OF-SELECTION.
8 | PERFORM run.
9 |
10 | CLASS lcl_visitor DEFINITION FINAL.
11 |
12 | PUBLIC SECTION.
13 | CLASS-METHODS: visit
14 | IMPORTING it_sha1 TYPE zags_sha1_tt
15 | RETURNING VALUE(rt_sha1) TYPE zags_sha1_tt
16 | RAISING zcx_abapgit_exception.
17 |
18 | ENDCLASS.
19 |
20 | CLASS lcl_visitor IMPLEMENTATION.
21 |
22 | METHOD visit.
23 |
24 | DATA: ls_commit TYPE zcl_ags_obj_commit=>ty_commit,
25 | lt_tree TYPE zcl_ags_obj_tree=>ty_tree_tt.
26 |
27 | FIELD-SYMBOLS: LIKE LINE OF it_sha1,
28 | LIKE LINE OF lt_tree,
29 | LIKE LINE OF gt_objects.
30 |
31 |
32 | rt_sha1 = it_sha1.
33 |
34 | LOOP AT rt_sha1 ASSIGNING .
35 | READ TABLE gt_objects WITH KEY
36 | repo = '' sha1 =
37 | ASSIGNING .
38 | IF sy-subrc <> 0.
39 | CONTINUE.
40 | ENDIF.
41 |
42 | CASE -type.
43 | WHEN zif_ags_constants=>c_type-tree.
44 | lt_tree = zcl_abapgit_git_pack=>decode_tree( -data_raw ).
45 | LOOP AT lt_tree ASSIGNING .
46 | APPEND -sha1 TO rt_sha1.
47 | ENDLOOP.
48 | WHEN zif_ags_constants=>c_type-commit.
49 | ls_commit = zcl_abapgit_git_pack=>decode_commit( -data_raw ).
50 | IF NOT ls_commit-parent IS INITIAL.
51 | APPEND ls_commit-parent TO rt_sha1.
52 | ENDIF.
53 | IF NOT ls_commit-parent2 IS INITIAL.
54 | APPEND ls_commit-parent2 TO rt_sha1.
55 | ENDIF.
56 | APPEND ls_commit-tree TO rt_sha1.
57 | WHEN zif_ags_constants=>c_type-blob.
58 | CONTINUE.
59 | WHEN OTHERS.
60 | ASSERT 0 = 1.
61 | ENDCASE.
62 |
63 | ENDLOOP.
64 |
65 | ENDMETHOD.
66 |
67 | ENDCLASS.
68 |
69 | FORM run RAISING zcx_ags_error zcx_abapgit_exception.
70 |
71 | DATA: lt_repos TYPE zags_repos_tt,
72 | lt_sha1 TYPE zags_sha1_tt,
73 | lt_result TYPE zags_sha1_tt,
74 | lt_branches TYPE zcl_ags_repo=>ty_branches_tt.
75 |
76 | FIELD-SYMBOLS: LIKE LINE OF lt_repos,
77 | LIKE LINE OF lt_branches.
78 |
79 |
80 | gt_objects = zcl_ags_db=>get_objects( )->list( ).
81 |
82 | lt_repos = zcl_ags_repo=>list( ).
83 |
84 | LOOP AT lt_repos ASSIGNING .
85 | CLEAR lt_sha1.
86 |
87 | lt_branches = zcl_ags_repo=>get_instance( -name )->list_branches( ).
88 | LOOP AT lt_branches ASSIGNING .
89 | APPEND ->get_data( )-sha1 TO lt_sha1.
90 | ENDLOOP.
91 |
92 | CLEAR lt_result.
93 | lt_result = lcl_visitor=>visit( lt_sha1 ).
94 | PERFORM save USING -repo lt_result.
95 | ENDLOOP.
96 |
97 | WRITE: / 'Done'(001).
98 |
99 | ENDFORM.
100 |
101 | FORM save USING pv_repo TYPE zags_repos-repo
102 | pt_sha1 TYPE zags_sha1_tt.
103 |
104 | DATA: ls_object TYPE zags_objects.
105 |
106 | FIELD-SYMBOLS: LIKE LINE OF pt_sha1,
107 | LIKE LINE OF gt_objects.
108 |
109 |
110 | SORT pt_sha1 ASCENDING.
111 | DELETE ADJACENT DUPLICATES FROM pt_sha1.
112 |
113 | ASSERT NOT pv_repo IS INITIAL.
114 |
115 | LOOP AT pt_sha1 ASSIGNING .
116 | READ TABLE gt_objects ASSIGNING
117 | WITH KEY repo = '' sha1 = .
118 | IF sy-subrc <> 0.
119 | CONTINUE.
120 | ENDIF.
121 |
122 | * note that in the old setup an object could be shared between repos
123 | CLEAR ls_object.
124 | ls_object = .
125 | ls_object-repo = pv_repo.
126 |
127 | zcl_ags_db=>get_objects( )->modify( ls_object ).
128 | ENDLOOP.
129 |
130 | ENDFORM.
131 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_objects.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_db_objects DEFINITION
2 | PUBLIC
3 | CREATE PRIVATE
4 | GLOBAL FRIENDS zcl_ags_db .
5 |
6 | PUBLIC SECTION.
7 |
8 | METHODS mass
9 | IMPORTING
10 | !iv_repo TYPE zags_objects-repo
11 | !it_sha1 TYPE zags_sha1_tt
12 | RETURNING
13 | VALUE(rt_list) TYPE zags_objects_tt .
14 | METHODS list
15 | RETURNING
16 | VALUE(rt_objects) TYPE zags_objects_tt .
17 | METHODS list_by_type
18 | IMPORTING
19 | !iv_repo TYPE zags_objects-repo
20 | !iv_type TYPE zags_objects-type
21 | RETURNING
22 | VALUE(rt_objects) TYPE zags_objects_tt .
23 | METHODS modify
24 | IMPORTING
25 | VALUE(is_data) TYPE zags_objects .
26 | METHODS single
27 | IMPORTING
28 | !iv_repo TYPE zags_objects-repo
29 | !iv_sha1 TYPE zags_objects-sha1
30 | RETURNING
31 | VALUE(rs_data) TYPE zags_objects
32 | RAISING
33 | zcx_ags_error .
34 | PROTECTED SECTION.
35 | PRIVATE SECTION.
36 |
37 | DATA mt_objects TYPE zags_objects_tt .
38 | DATA mv_fake TYPE abap_bool .
39 |
40 | METHODS set_fake .
41 | ENDCLASS.
42 |
43 |
44 |
45 | CLASS zcl_ags_db_objects IMPLEMENTATION.
46 |
47 |
48 | METHOD list.
49 | * used in migration program, see https://github.com/larshp/abapGitServer/issues/41
50 |
51 | IF mv_fake = abap_true.
52 | rt_objects = mt_objects.
53 | ELSE.
54 | SELECT * FROM zags_objects
55 | INTO CORRESPONDING FIELDS OF TABLE rt_objects. "#EC CI_SUBRC "#EC CI_NOWHERE
56 | ENDIF.
57 |
58 | ENDMETHOD.
59 |
60 |
61 | METHOD list_by_type.
62 |
63 | ASSERT NOT iv_repo IS INITIAL.
64 |
65 | IF mv_fake = abap_true.
66 | rt_objects = mt_objects.
67 | DELETE rt_objects
68 | WHERE repo <> iv_repo
69 | OR type <> iv_type. "#EC CI_SORTSEQ
70 | ELSE.
71 | SELECT * FROM zags_objects
72 | INTO CORRESPONDING FIELDS OF TABLE rt_objects
73 | WHERE repo = iv_repo
74 | AND type = iv_type. "#EC CI_SUBRC
75 | ENDIF.
76 |
77 | ENDMETHOD.
78 |
79 |
80 | METHOD mass.
81 |
82 | DATA: ls_data LIKE LINE OF rt_list,
83 | lv_sha1 LIKE LINE OF it_sha1.
84 |
85 | ASSERT NOT iv_repo IS INITIAL.
86 | ASSERT lines( it_sha1 ) > 0.
87 |
88 |
89 | IF mv_fake = abap_true.
90 | LOOP AT it_sha1 INTO lv_sha1.
91 | READ TABLE mt_objects INTO ls_data
92 | WITH KEY repo = iv_repo
93 | sha1 = lv_sha1.
94 | IF sy-subrc = 0.
95 | APPEND ls_data TO rt_list.
96 | ENDIF.
97 | ENDLOOP.
98 | ELSE.
99 | SELECT * FROM zags_objects
100 | INTO TABLE rt_list
101 | FOR ALL ENTRIES IN it_sha1
102 | WHERE repo = iv_repo
103 | AND sha1 = it_sha1-table_line ##SELECT_FAE_WITH_LOB[DATA_RAW].
104 | ENDIF.
105 |
106 | ENDMETHOD.
107 |
108 |
109 | METHOD modify.
110 |
111 | ASSERT NOT is_data-repo IS INITIAL.
112 | ASSERT NOT is_data-sha1 IS INITIAL.
113 |
114 | IF mv_fake = abap_true.
115 | DELETE mt_objects WHERE sha1 = is_data-sha1 AND repo = is_data-repo.
116 | INSERT is_data INTO TABLE mt_objects.
117 | ELSE.
118 | MODIFY zags_objects FROM is_data. "#EC CI_SUBRC
119 | ENDIF.
120 | ASSERT sy-subrc = 0.
121 |
122 | ENDMETHOD.
123 |
124 |
125 | METHOD set_fake.
126 |
127 | mv_fake = abap_true.
128 |
129 | ENDMETHOD.
130 |
131 |
132 | METHOD single.
133 |
134 | ASSERT NOT iv_repo IS INITIAL.
135 |
136 | IF mv_fake = abap_true.
137 | READ TABLE mt_objects INTO rs_data
138 | WITH KEY repo = iv_repo
139 | sha1 = iv_sha1. "#EC CI_SUBRC
140 | ELSE.
141 | SELECT SINGLE * FROM zags_objects
142 | INTO rs_data
143 | WHERE repo = iv_repo
144 | AND sha1 = iv_sha1.
145 | ENDIF.
146 | IF sy-subrc <> 0.
147 | RAISE EXCEPTION TYPE zcx_ags_error
148 | EXPORTING
149 | textid = zcx_ags_error=>m005
150 | sha1 = iv_sha1.
151 | ENDIF.
152 |
153 | ENDMETHOD.
154 | ENDCLASS.
155 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_util.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_util DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC.
4 |
5 | PUBLIC SECTION.
6 | CLASS-METHODS sha1_raw
7 | IMPORTING
8 | !iv_data TYPE xstring
9 | RETURNING
10 | VALUE(rv_sha1) TYPE zags_sha1
11 | RAISING
12 | zcx_ags_error.
13 | CLASS-METHODS sha1
14 | IMPORTING
15 | !iv_type TYPE zags_type
16 | !iv_data TYPE xstring
17 | RETURNING
18 | VALUE(rv_sha1) TYPE zags_sha1
19 | RAISING
20 | zcx_ags_error.
21 | CLASS-METHODS uuid
22 | RETURNING
23 | VALUE(rv_uuid) TYPE sysuuid_c22.
24 | CLASS-METHODS xstring_to_string_utf8
25 | IMPORTING
26 | !iv_data TYPE xstring
27 | RETURNING
28 | VALUE(rv_string) TYPE string.
29 | CLASS-METHODS string_to_xstring_utf8
30 | IMPORTING
31 | !iv_string TYPE string
32 | RETURNING
33 | VALUE(rv_xstring) TYPE xstring.
34 | CLASS-METHODS get_time
35 | RETURNING
36 | VALUE(rv_time) TYPE string.
37 | PROTECTED SECTION.
38 | PRIVATE SECTION.
39 | ENDCLASS.
40 |
41 |
42 |
43 | CLASS ZCL_AGS_UTIL IMPLEMENTATION.
44 |
45 |
46 | METHOD get_time.
47 |
48 | TRY.
49 |
50 | rv_time = zcl_abapgit_git_time=>get_unix( ).
51 | CATCH zcx_abapgit_exception.
52 | ASSERT 0 = 1.
53 | ENDTRY.
54 |
55 | ENDMETHOD.
56 |
57 |
58 | METHOD sha1.
59 |
60 | DATA: lv_len TYPE i,
61 | lv_char10 TYPE c LENGTH 10,
62 | lv_string TYPE string,
63 | lv_xstring TYPE xstring.
64 |
65 |
66 | lv_len = xstrlen( iv_data ).
67 | lv_char10 = lv_len.
68 | CONDENSE lv_char10.
69 | CONCATENATE iv_type lv_char10 INTO lv_string SEPARATED BY space.
70 | lv_xstring = string_to_xstring_utf8( lv_string ).
71 |
72 | lv_string = lv_xstring.
73 | CONCATENATE lv_string '00' INTO lv_string.
74 | lv_xstring = lv_string.
75 |
76 | CONCATENATE lv_xstring iv_data INTO lv_xstring IN BYTE MODE.
77 |
78 | rv_sha1 = sha1_raw( lv_xstring ).
79 |
80 | ENDMETHOD.
81 |
82 |
83 | METHOD sha1_raw.
84 |
85 | DATA: lv_hash TYPE hash160.
86 |
87 |
88 | CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
89 | EXPORTING
90 | data = iv_data
91 | IMPORTING
92 | hash = lv_hash
93 | EXCEPTIONS
94 | unknown_alg = 1
95 | param_error = 2
96 | internal_error = 3
97 | OTHERS = 4.
98 | IF sy-subrc <> 0.
99 | RAISE EXCEPTION TYPE zcx_ags_error
100 | EXPORTING
101 | textid = zcx_ags_error=>m004.
102 | ENDIF.
103 |
104 | rv_sha1 = lv_hash.
105 |
106 | TRANSLATE rv_sha1 TO LOWER CASE.
107 |
108 | ENDMETHOD.
109 |
110 |
111 | METHOD string_to_xstring_utf8.
112 |
113 | DATA: lo_obj TYPE REF TO cl_abap_conv_out_ce.
114 |
115 |
116 | TRY.
117 | lo_obj = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
118 |
119 | lo_obj->convert( EXPORTING data = iv_string
120 | IMPORTING buffer = rv_xstring ).
121 |
122 | CATCH cx_parameter_invalid_range
123 | cx_sy_codepage_converter_init
124 | cx_sy_conversion_codepage
125 | cx_parameter_invalid_type.
126 | ASSERT 1 = 2.
127 | ENDTRY.
128 |
129 | ENDMETHOD.
130 |
131 |
132 | METHOD uuid.
133 |
134 | TRY.
135 | rv_uuid = cl_system_uuid=>if_system_uuid_static~create_uuid_c22( ).
136 | CATCH cx_uuid_error.
137 | ASSERT 0 = 1.
138 | ENDTRY.
139 |
140 | ENDMETHOD.
141 |
142 |
143 | METHOD xstring_to_string_utf8.
144 |
145 | DATA: lv_len TYPE i,
146 | lo_obj TYPE REF TO cl_abap_conv_in_ce.
147 |
148 |
149 | TRY.
150 | lo_obj = cl_abap_conv_in_ce=>create(
151 | input = iv_data
152 | * ignore_cerr = abap_true
153 | encoding = 'UTF-8' ).
154 | lv_len = xstrlen( iv_data ).
155 |
156 | lo_obj->read( EXPORTING n = lv_len
157 | IMPORTING data = rv_string ).
158 |
159 | CATCH cx_parameter_invalid_range
160 | cx_sy_codepage_converter_init
161 | cx_sy_conversion_codepage
162 | cx_parameter_invalid_type.
163 | ASSERT 1 = 2.
164 | ENDTRY.
165 |
166 | ENDMETHOD.
167 | ENDCLASS.
168 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_tree_cache.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_db_tree_cache DEFINITION
2 | PUBLIC
3 | CREATE PRIVATE
4 | GLOBAL FRIENDS zcl_ags_db .
5 |
6 | PUBLIC SECTION.
7 |
8 | METHODS delete_all .
9 | METHODS insert
10 | IMPORTING
11 | !it_data TYPE zags_tree_cache_tt .
12 | METHODS select
13 | IMPORTING
14 | !iv_repo TYPE zags_tree_cache-repo
15 | !iv_commit_sha1 TYPE zags_tree_cache-commit_sha1
16 | !iv_max TYPE i DEFAULT 0
17 | RETURNING
18 | VALUE(rt_data) TYPE zags_tree_cache_tt
19 | RAISING
20 | zcx_ags_error .
21 | METHODS select_by_file
22 | IMPORTING
23 | !iv_repo TYPE zags_tree_cache-repo
24 | !iv_path TYPE zags_tree_cache-path
25 | !iv_filename TYPE zags_tree_cache-filename
26 | RETURNING
27 | VALUE(rt_data) TYPE zags_tree_cache_tt
28 | RAISING
29 | zcx_ags_error .
30 | METHODS select_by_path
31 | IMPORTING
32 | !iv_repo TYPE zags_tree_cache-repo
33 | !iv_commit_sha1 TYPE zags_tree_cache-commit_sha1
34 | !iv_path TYPE zags_tree_cache-path
35 | !iv_max TYPE i DEFAULT 0
36 | RETURNING
37 | VALUE(rt_data) TYPE zags_tree_cache_tt
38 | RAISING
39 | zcx_ags_error .
40 | PROTECTED SECTION.
41 | PRIVATE SECTION.
42 |
43 | DATA mt_cache TYPE zags_tree_cache_tt .
44 | DATA mv_fake TYPE abap_bool .
45 |
46 | METHODS set_fake .
47 | ENDCLASS.
48 |
49 |
50 |
51 | CLASS ZCL_AGS_DB_TREE_CACHE IMPLEMENTATION.
52 |
53 |
54 | METHOD delete_all.
55 |
56 | IF mv_fake = abap_true.
57 | CLEAR mt_cache.
58 | ELSE.
59 | DELETE FROM zags_tree_cache. "#EC CI_SUBRC "#EC CI_NOWHERE
60 | ENDIF.
61 |
62 | ENDMETHOD.
63 |
64 |
65 | METHOD insert.
66 |
67 | FIELD-SYMBOLS: LIKE LINE OF it_data.
68 |
69 | IF mv_fake = abap_true.
70 | LOOP AT it_data ASSIGNING .
71 | INSERT INTO TABLE mt_cache.
72 | ASSERT sy-subrc = 0.
73 | ENDLOOP.
74 | ELSE.
75 | INSERT zags_tree_cache FROM TABLE it_data. "#EC CI_SUBRC
76 | ENDIF.
77 | ASSERT sy-subrc = 0.
78 |
79 | ENDMETHOD.
80 |
81 |
82 | METHOD select.
83 |
84 | FIELD-SYMBOLS: LIKE LINE OF mt_cache.
85 |
86 |
87 | ASSERT NOT iv_repo IS INITIAL.
88 | ASSERT NOT iv_commit_sha1 IS INITIAL.
89 |
90 | IF mv_fake = abap_true.
91 | LOOP AT mt_cache ASSIGNING
92 | WHERE repo = iv_repo
93 | AND commit_sha1 = iv_commit_sha1.
94 | APPEND TO rt_data.
95 | IF iv_max <> 0 AND lines( rt_data ) = iv_max.
96 | RETURN.
97 | ENDIF.
98 | ENDLOOP.
99 | ELSE.
100 | SELECT * FROM zags_tree_cache
101 | INTO TABLE rt_data
102 | UP TO iv_max ROWS
103 | WHERE repo = iv_repo
104 | AND commit_sha1 = iv_commit_sha1. "#EC CI_SUBRC
105 | ENDIF.
106 |
107 | ENDMETHOD.
108 |
109 |
110 | METHOD select_by_file.
111 |
112 | FIELD-SYMBOLS: LIKE LINE OF mt_cache.
113 |
114 |
115 | ASSERT NOT iv_repo IS INITIAL.
116 | ASSERT NOT iv_path IS INITIAL.
117 | ASSERT NOT iv_filename IS INITIAL.
118 |
119 | IF mv_fake = abap_true.
120 | LOOP AT mt_cache ASSIGNING
121 | WHERE repo = iv_repo
122 | AND filename = iv_filename
123 | AND path = iv_path.
124 | APPEND TO rt_data.
125 | ENDLOOP.
126 | ELSE.
127 | SELECT * FROM zags_tree_cache
128 | INTO TABLE rt_data
129 | WHERE repo = iv_repo
130 | AND path = iv_path
131 | AND filename = iv_filename. "#EC CI_SUBRC
132 | ENDIF.
133 |
134 | ENDMETHOD.
135 |
136 |
137 | METHOD select_by_path.
138 |
139 | FIELD-SYMBOLS: LIKE LINE OF mt_cache.
140 |
141 |
142 | ASSERT NOT iv_repo IS INITIAL.
143 | ASSERT NOT iv_commit_sha1 IS INITIAL.
144 |
145 | IF mv_fake = abap_true.
146 | LOOP AT mt_cache ASSIGNING
147 | WHERE repo = iv_repo
148 | AND commit_sha1 = iv_commit_sha1
149 | AND path = iv_path.
150 | APPEND TO rt_data.
151 | IF iv_max <> 0 AND lines( rt_data ) = iv_max.
152 | RETURN.
153 | ENDIF.
154 | ENDLOOP.
155 | ELSE.
156 | SELECT * FROM zags_tree_cache
157 | INTO TABLE rt_data
158 | UP TO iv_max ROWS
159 | WHERE repo = iv_repo
160 | AND path = iv_path
161 | AND commit_sha1 = iv_commit_sha1. "#EC CI_SUBRC
162 | ENDIF.
163 |
164 | ENDMETHOD.
165 |
166 |
167 | METHOD set_fake.
168 |
169 | mv_fake = abap_true.
170 |
171 | ENDMETHOD.
172 | ENDCLASS.
173 |
--------------------------------------------------------------------------------
/src/database/zcl_ags_db_merge_requests.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_db_merge_requests DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 |
8 | CLASS-METHODS create
9 | IMPORTING
10 | !iv_repo_name TYPE zags_repo_name
11 | !iv_target_branch TYPE zags_branch_name
12 | !iv_source_branch TYPE zags_branch_name
13 | !iv_title TYPE zags_merge_request_title
14 | RETURNING
15 | VALUE(rv_req) TYPE zags_merge_req
16 | RAISING
17 | zcx_ags_error .
18 | CLASS-METHODS list_open
19 | IMPORTING
20 | !iv_repo_name TYPE zags_repo_name
21 | RETURNING
22 | VALUE(rt_requests) TYPE zags_merge_req_tt
23 | RAISING
24 | zcx_ags_error .
25 | CLASS-METHODS delete
26 | IMPORTING
27 | !iv_repo_name TYPE zags_repo_name
28 | !iv_id TYPE zags_merge_request_id
29 | RAISING
30 | zcx_ags_error .
31 | CLASS-METHODS single
32 | IMPORTING
33 | !iv_repo_name TYPE zags_repo_name
34 | !iv_id TYPE zags_merge_request_id
35 | RETURNING
36 | VALUE(rs_request) TYPE zags_merge_req_s
37 | RAISING
38 | zcx_ags_error .
39 | PROTECTED SECTION.
40 | PRIVATE SECTION.
41 |
42 | CLASS-METHODS get_next_id
43 | IMPORTING
44 | is_repo TYPE zags_repos
45 | RETURNING VALUE(rv_id) TYPE zags_merge_request_id
46 | RAISING
47 | zcx_ags_error.
48 |
49 | ENDCLASS.
50 |
51 |
52 |
53 | CLASS ZCL_AGS_DB_MERGE_REQUESTS IMPLEMENTATION.
54 |
55 |
56 | METHOD create.
57 |
58 | DATA(ls_repo) = zcl_ags_db=>get_repos( )->single( iv_repo_name ).
59 |
60 | DATA(ls_target_branch) = zcl_ags_db=>get_branches( )->single(
61 | iv_repo = ls_repo-repo iv_name = iv_target_branch ).
62 | DATA(ls_source_branch) = zcl_ags_db=>get_branches( )->single(
63 | iv_repo = ls_repo-repo iv_name = iv_source_branch ).
64 |
65 | ##WARN_OK
66 | SELECT SINGLE id FROM zags_merge_req INTO @DATA(lv_existing_id)
67 | WHERE repo = @ls_repo-repo AND target_branch = @ls_target_branch-branch
68 | AND source_branch = @ls_source_branch-branch AND merged = @abap_false.
69 | IF sy-subrc = 0.
70 | RAISE EXCEPTION TYPE zcx_ags_merge_req_exc
71 | EXPORTING
72 | textid = zcx_ags_merge_req_exc=>duplicate
73 | id = lv_existing_id.
74 | ENDIF.
75 | rv_req = VALUE #(
76 | repo = ls_repo-repo id = get_next_id( ls_repo )
77 | target_branch = ls_target_branch-branch
78 | source_branch = ls_source_branch-branch title = iv_title
79 | created_by = sy-uname ).
80 | INSERT zags_merge_req FROM rv_req.
81 |
82 | ENDMETHOD.
83 |
84 |
85 | METHOD delete.
86 |
87 | DATA(ls_repo) = zcl_ags_db=>get_repos( )->single( iv_repo_name ).
88 | DELETE FROM zags_merge_req WHERE repo = ls_repo-repo
89 | AND id = iv_id.
90 | IF sy-subrc <> 0.
91 | RAISE EXCEPTION TYPE zcx_ags_error
92 | EXPORTING
93 | textid = zcx_ags_error=>m013
94 | repo_name = iv_repo_name
95 | id = iv_id.
96 | ENDIF.
97 |
98 | ENDMETHOD.
99 |
100 |
101 | METHOD get_next_id.
102 |
103 | CALL FUNCTION 'ENQUEUE_EZAGS_MERGE_REQ'
104 | EXPORTING
105 | repo = is_repo-repo
106 | _wait = abap_true
107 | x_id = abap_true
108 | EXCEPTIONS
109 | foreign_lock = 2.
110 | IF sy-subrc <> 0.
111 | RAISE EXCEPTION TYPE zcx_ags_error
112 | EXPORTING
113 | textid = zcx_ags_error=>m014.
114 | ENDIF.
115 |
116 | SELECT id FROM zags_merge_req
117 | UP TO 1 ROWS
118 | INTO @rv_id
119 | WHERE repo = @is_repo-repo
120 | ORDER BY id DESCENDING.
121 | ENDSELECT.
122 | rv_id = rv_id + 1.
123 |
124 | ENDMETHOD.
125 |
126 |
127 | METHOD list_open.
128 |
129 | DATA(ls_repo) = zcl_ags_db=>get_repos( )->single( iv_repo_name ).
130 | SELECT * FROM zags_merge_req INTO TABLE rt_requests
131 | WHERE repo = ls_repo-repo AND merged = abap_false.
132 |
133 | ENDMETHOD.
134 |
135 |
136 | METHOD single.
137 |
138 | DATA(ls_repo) = zcl_ags_db=>get_repos( )->single( iv_repo_name ).
139 | ##TOO_MANY_ITAB_FIELDS
140 | SELECT SINGLE * FROM zags_merge_req INTO rs_request
141 | WHERE repo = ls_repo-repo AND id = iv_id.
142 | IF sy-subrc <> 0.
143 | RAISE EXCEPTION TYPE zcx_ags_error
144 | EXPORTING
145 | textid = zcx_ags_error=>m013
146 | repo_name = iv_repo_name
147 | id = iv_id.
148 | ENDIF.
149 |
150 | SELECT SINGLE name FROM zags_branches INTO rs_request-target_branch_name
151 | WHERE repo = ls_repo-repo AND branch = rs_request-target_branch.
152 | SELECT SINGLE name FROM zags_branches INTO rs_request-source_branch_name
153 | WHERE repo = ls_repo-repo AND branch = rs_request-source_branch.
154 |
155 | ENDMETHOD.
156 | ENDCLASS.
157 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_pack.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 |
2 | *----------------------------------------------------------------------*
3 | * CLASS ltcl_encode DEFINITION
4 | *----------------------------------------------------------------------*
5 | *
6 | *----------------------------------------------------------------------*
7 | CLASS ltcl_encode DEFINITION FOR TESTING
8 | DURATION SHORT
9 | RISK LEVEL HARMLESS
10 | FINAL.
11 |
12 | PRIVATE SECTION.
13 | METHODS: test1 FOR TESTING
14 | RAISING zcx_ags_error.
15 |
16 | ENDCLASS. "ltcl_Encode
17 |
18 | *----------------------------------------------------------------------*
19 | * CLASS ltcl_encode IMPLEMENTATION
20 | *----------------------------------------------------------------------*
21 | *
22 | *----------------------------------------------------------------------*
23 | CLASS ltcl_encode IMPLEMENTATION.
24 |
25 | METHOD test1.
26 |
27 | CONSTANTS: lc_data TYPE xstring VALUE '12345'.
28 |
29 | DATA: lo_blob TYPE REF TO zcl_ags_obj_blob,
30 | lv_raw TYPE xstring,
31 | lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
32 | lt_result TYPE zif_abapgit_definitions=>ty_objects_tt.
33 |
34 |
35 | lo_blob = zcl_ags_obj_blob=>new( 'test' ).
36 | lo_blob->set_data( lc_data ).
37 |
38 | lt_objects = zcl_ags_pack=>explode( iv_repo = 'test' ii_object = lo_blob ).
39 |
40 | lv_raw = zcl_ags_pack=>encode( lt_objects ).
41 | lt_result = zcl_ags_pack=>decode( lv_raw ).
42 |
43 | cl_abap_unit_assert=>assert_not_initial( lv_raw ).
44 |
45 | cl_abap_unit_assert=>assert_not_initial( lt_objects ).
46 |
47 | cl_abap_unit_assert=>assert_equals(
48 | act = lt_result
49 | exp = lt_objects ).
50 |
51 | ENDMETHOD. "test1
52 |
53 | ENDCLASS. "ltcl_encode IMPLEMENTATION
54 |
55 | *----------------------------------------------------------------------*
56 | * CLASS ltcl_explode DEFINITION
57 | *----------------------------------------------------------------------*
58 | *
59 | *----------------------------------------------------------------------*
60 | CLASS ltcl_explode DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
61 |
62 | PRIVATE SECTION.
63 | METHODS:
64 | simple FOR TESTING
65 | RAISING zcx_ags_error.
66 |
67 | ENDCLASS. "ltcl_Encode
68 |
69 | *----------------------------------------------------------------------*
70 | * CLASS ltcl_explode IMPLEMENTATION
71 | *----------------------------------------------------------------------*
72 | *
73 | *----------------------------------------------------------------------*
74 | CLASS ltcl_explode IMPLEMENTATION.
75 |
76 | METHOD simple.
77 |
78 | DATA: lt_result TYPE zif_abapgit_definitions=>ty_objects_tt,
79 | lo_blob TYPE REF TO zcl_ags_obj_blob.
80 |
81 |
82 | lo_blob = zcl_ags_obj_blob=>new( 'test' ).
83 | lt_result = zcl_ags_pack=>explode( iv_repo = 'test' ii_object = lo_blob ).
84 |
85 | cl_abap_unit_assert=>assert_equals(
86 | act = lines( lt_result )
87 | exp = 1 ).
88 |
89 | ENDMETHOD. "test1
90 |
91 | ENDCLASS. "ltcl_explode IMPLEMENTATION
92 |
93 |
94 | CLASS ltcl_explode_repo DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
95 |
96 | PRIVATE SECTION.
97 |
98 | DATA: mo_commit TYPE REF TO zcl_ags_obj_commit,
99 | mv_repo TYPE zags_repos-repo.
100 |
101 | METHODS:
102 | setup RAISING zcx_ags_error,
103 | test FOR TESTING
104 | RAISING zcx_ags_error.
105 |
106 | ENDCLASS.
107 |
108 | CLASS ltcl_explode_repo IMPLEMENTATION.
109 |
110 | METHOD setup.
111 |
112 | DATA: lo_repo TYPE REF TO zcl_ags_repo.
113 |
114 | zcl_ags_db=>set_fake( ).
115 |
116 | lo_repo = zcl_ags_repo=>create(
117 | iv_name = 'UNITTEST'
118 | iv_description = 'FOOBAR' ).
119 |
120 | mv_repo = lo_repo->get_data( )-repo.
121 |
122 | mo_commit = zcl_ags_obj_commit=>load(
123 | iv_repo = mv_repo
124 | iv_sha1 = lo_repo->get_default_branch( )->get_data( )-sha1 ).
125 |
126 | ENDMETHOD.
127 |
128 | METHOD test.
129 |
130 | DATA: lt_result TYPE zif_abapgit_definitions=>ty_objects_tt.
131 |
132 | lt_result = zcl_ags_pack=>explode(
133 | iv_repo = mv_repo
134 | ii_object = mo_commit ).
135 |
136 | * expect: 1 commit + 1 tree + 1 blob
137 | cl_abap_unit_assert=>assert_equals(
138 | act = lines( lt_result )
139 | exp = 3 ).
140 | READ TABLE lt_result WITH KEY type COMPONENTS type = zif_ags_constants=>c_type-commit
141 | TRANSPORTING NO FIELDS.
142 | cl_abap_unit_assert=>assert_subrc( ).
143 | READ TABLE lt_result WITH KEY type COMPONENTS type = zif_ags_constants=>c_type-tree
144 | TRANSPORTING NO FIELDS.
145 | cl_abap_unit_assert=>assert_subrc( ).
146 | READ TABLE lt_result WITH KEY type COMPONENTS type = zif_ags_constants=>c_type-blob
147 | TRANSPORTING NO FIELDS.
148 | cl_abap_unit_assert=>assert_subrc( ).
149 |
150 | ENDMETHOD.
151 |
152 | ENDCLASS.
153 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_obj_blob.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_obj_blob DEFINITION
2 | PUBLIC
3 | CREATE PRIVATE .
4 |
5 | PUBLIC SECTION.
6 |
7 | INTERFACES zif_ags_object .
8 |
9 | ALIASES deserialize
10 | FOR zif_ags_object~deserialize .
11 | ALIASES get_adler32
12 | FOR zif_ags_object~get_adler32 .
13 | ALIASES get_sha1
14 | FOR zif_ags_object~get_sha1 .
15 | ALIASES get_type
16 | FOR zif_ags_object~get_type .
17 | ALIASES save
18 | FOR zif_ags_object~save .
19 | ALIASES serialize
20 | FOR zif_ags_object~serialize .
21 |
22 | TYPES:
23 | ty_list TYPE STANDARD TABLE OF REF TO zcl_ags_obj_blob WITH DEFAULT KEY .
24 |
25 | METHODS get_data
26 | RETURNING
27 | VALUE(rv_data) TYPE xstring .
28 | METHODS set_data
29 | IMPORTING
30 | !iv_data TYPE xstring .
31 | CLASS-METHODS new
32 | IMPORTING
33 | !iv_repo TYPE zags_objects-repo
34 | RETURNING
35 | VALUE(ro_blob) TYPE REF TO zcl_ags_obj_blob .
36 | CLASS-METHODS load
37 | IMPORTING
38 | !iv_repo TYPE zags_objects-repo
39 | !iv_sha1 TYPE zags_objects-sha1
40 | RETURNING
41 | VALUE(ro_blob) TYPE REF TO zcl_ags_obj_blob
42 | RAISING
43 | zcx_ags_error .
44 | CLASS-METHODS load_mass
45 | IMPORTING
46 | !iv_repo TYPE zags_objects-repo
47 | !it_sha1 TYPE zags_sha1_tt
48 | RETURNING
49 | VALUE(rt_list) TYPE ty_list
50 | RAISING
51 | zcx_ags_error .
52 | PROTECTED SECTION.
53 | PRIVATE SECTION.
54 |
55 | DATA mv_data TYPE xstring .
56 | DATA mv_new TYPE abap_bool .
57 | DATA mv_repo TYPE zags_objects-repo .
58 | DATA mv_sha1 TYPE zags_sha1 .
59 | DATA mv_adler32 TYPE zags_adler32 .
60 | ENDCLASS.
61 |
62 |
63 |
64 | CLASS ZCL_AGS_OBJ_BLOB IMPLEMENTATION.
65 |
66 |
67 | METHOD get_data.
68 |
69 | rv_data = mv_data.
70 |
71 | ENDMETHOD.
72 |
73 |
74 | METHOD load.
75 |
76 | DATA: ls_data TYPE zags_objects.
77 |
78 | CREATE OBJECT ro_blob.
79 | ro_blob->mv_new = abap_false.
80 | ro_blob->mv_sha1 = iv_sha1.
81 |
82 | ls_data = zcl_ags_db=>get_objects( )->single(
83 | iv_repo = iv_repo
84 | iv_sha1 = iv_sha1 ).
85 |
86 | ro_blob->deserialize(
87 | iv_data = ls_data-data_raw
88 | iv_adler32 = ls_data-adler32 ).
89 |
90 | ENDMETHOD.
91 |
92 |
93 | METHOD load_mass.
94 |
95 | DATA: lt_objects TYPE zags_objects_tt,
96 | lo_blob TYPE REF TO zcl_ags_obj_blob.
97 |
98 | FIELD-SYMBOLS: LIKE LINE OF lt_objects.
99 |
100 |
101 | ASSERT NOT iv_repo IS INITIAL.
102 |
103 | IF lines( it_sha1 ) = 0.
104 | RETURN.
105 | ENDIF.
106 |
107 | lt_objects = zcl_ags_db=>get_objects( )->mass(
108 | iv_repo = iv_repo
109 | it_sha1 = it_sha1 ).
110 |
111 | LOOP AT lt_objects ASSIGNING .
112 | ASSERT -type = zif_ags_constants=>c_type-blob.
113 |
114 | lo_blob = new( iv_repo ).
115 | lo_blob->mv_new = abap_false.
116 | lo_blob->mv_sha1 = -sha1.
117 | lo_blob->deserialize(
118 | iv_data = -data_raw
119 | iv_adler32 = -adler32 ).
120 | APPEND lo_blob TO rt_list.
121 |
122 | ENDLOOP.
123 |
124 | ENDMETHOD.
125 |
126 |
127 | METHOD new.
128 |
129 | ASSERT NOT iv_repo IS INITIAL.
130 |
131 | CREATE OBJECT ro_blob.
132 | ro_blob->mv_new = abap_true.
133 | ro_blob->mv_repo = iv_repo.
134 |
135 | ENDMETHOD.
136 |
137 |
138 | METHOD set_data.
139 |
140 | ASSERT mv_new = abap_true.
141 |
142 | mv_data = iv_data.
143 |
144 | ENDMETHOD.
145 |
146 |
147 | METHOD zif_ags_object~deserialize.
148 |
149 | mv_data = iv_data.
150 | mv_adler32 = iv_adler32.
151 |
152 | ENDMETHOD.
153 |
154 |
155 | METHOD zif_ags_object~get_adler32.
156 |
157 | IF mv_adler32 IS INITIAL.
158 | rv_adler32 = zcl_abapgit_hash=>adler32( serialize( ) ).
159 | ELSE.
160 | ASSERT NOT mv_adler32 IS INITIAL.
161 | rv_adler32 = mv_adler32.
162 | ENDIF.
163 |
164 | ENDMETHOD.
165 |
166 |
167 | METHOD zif_ags_object~get_sha1.
168 |
169 | IF mv_new = abap_true.
170 | rv_sha1 = zcl_ags_util=>sha1(
171 | iv_type = zif_ags_constants=>c_type-blob
172 | iv_data = serialize( ) ).
173 | ELSE.
174 | ASSERT NOT mv_sha1 IS INITIAL.
175 | rv_sha1 = mv_sha1.
176 | ENDIF.
177 |
178 | ENDMETHOD.
179 |
180 |
181 | METHOD zif_ags_object~get_type.
182 | rv_type = zif_ags_constants=>c_type-blob.
183 | ENDMETHOD.
184 |
185 |
186 | METHOD zif_ags_object~save.
187 |
188 | DATA: ls_object TYPE zags_objects.
189 |
190 |
191 | ASSERT mv_new = abap_true.
192 |
193 | ls_object-repo = mv_repo.
194 | ls_object-sha1 = get_sha1( ).
195 | ls_object-type = get_type( ).
196 | ls_object-data_raw = serialize( ).
197 | ls_object-adler32 = get_adler32( ).
198 |
199 | zcl_ags_db=>get_objects( )->modify( ls_object ).
200 |
201 | ENDMETHOD.
202 |
203 |
204 | METHOD zif_ags_object~serialize.
205 |
206 | rv_data = mv_data.
207 |
208 | ENDMETHOD.
209 | ENDCLASS.
210 |
--------------------------------------------------------------------------------
/src/backend/zcx_ags_error.clas.abap:
--------------------------------------------------------------------------------
1 | class ZCX_AGS_ERROR definition
2 | public
3 | inheriting from CX_STATIC_CHECK
4 | create public .
5 |
6 | public section.
7 |
8 | interfaces IF_T100_MESSAGE .
9 |
10 | constants:
11 | begin of ZCX_AGS_ERROR,
12 | msgid type symsgid value 'ZABAPGITSERVER',
13 | msgno type symsgno value '000',
14 | attr1 type scx_attrname value '',
15 | attr2 type scx_attrname value '',
16 | attr3 type scx_attrname value '',
17 | attr4 type scx_attrname value '',
18 | end of ZCX_AGS_ERROR .
19 | constants:
20 | begin of M001,
21 | msgid type symsgid value 'ZABAPGITSERVER',
22 | msgno type symsgno value '001',
23 | attr1 type scx_attrname value '',
24 | attr2 type scx_attrname value '',
25 | attr3 type scx_attrname value '',
26 | attr4 type scx_attrname value '',
27 | end of M001 .
28 | constants:
29 | begin of M002,
30 | msgid type symsgid value 'ZABAPGITSERVER',
31 | msgno type symsgno value '002',
32 | attr1 type scx_attrname value '',
33 | attr2 type scx_attrname value '',
34 | attr3 type scx_attrname value '',
35 | attr4 type scx_attrname value '',
36 | end of M002 .
37 | constants:
38 | begin of M004,
39 | msgid type symsgid value 'ZABAPGITSERVER',
40 | msgno type symsgno value '004',
41 | attr1 type scx_attrname value '',
42 | attr2 type scx_attrname value '',
43 | attr3 type scx_attrname value '',
44 | attr4 type scx_attrname value '',
45 | end of M004 .
46 | constants:
47 | begin of M005,
48 | msgid type symsgid value 'ZABAPGITSERVER',
49 | msgno type symsgno value '005',
50 | attr1 type scx_attrname value 'SHA1',
51 | attr2 type scx_attrname value '',
52 | attr3 type scx_attrname value '',
53 | attr4 type scx_attrname value '',
54 | end of M005 .
55 | constants:
56 | begin of M008,
57 | msgid type symsgid value 'ZABAPGITSERVER',
58 | msgno type symsgno value '008',
59 | attr1 type scx_attrname value '',
60 | attr2 type scx_attrname value '',
61 | attr3 type scx_attrname value '',
62 | attr4 type scx_attrname value '',
63 | end of M008 .
64 | constants:
65 | begin of M009,
66 | msgid type symsgid value 'ZABAPGITSERVER',
67 | msgno type symsgno value '009',
68 | attr1 type scx_attrname value '',
69 | attr2 type scx_attrname value '',
70 | attr3 type scx_attrname value '',
71 | attr4 type scx_attrname value '',
72 | end of M009 .
73 | constants:
74 | begin of M011,
75 | msgid type symsgid value 'ZABAPGITSERVER',
76 | msgno type symsgno value '011',
77 | attr1 type scx_attrname value '',
78 | attr2 type scx_attrname value '',
79 | attr3 type scx_attrname value '',
80 | attr4 type scx_attrname value '',
81 | end of M011 .
82 | constants:
83 | begin of M012,
84 | msgid type symsgid value 'ZABAPGITSERVER',
85 | msgno type symsgno value '012',
86 | attr1 type scx_attrname value '',
87 | attr2 type scx_attrname value '',
88 | attr3 type scx_attrname value '',
89 | attr4 type scx_attrname value '',
90 | end of M012 .
91 | constants:
92 | begin of M013,
93 | msgid type symsgid value 'ZABAPGITSERVER',
94 | msgno type symsgno value '013',
95 | attr1 type scx_attrname value 'REPO_NAME',
96 | attr2 type scx_attrname value 'ID',
97 | attr3 type scx_attrname value '',
98 | attr4 type scx_attrname value '',
99 | end of M013 .
100 | constants:
101 | begin of M014,
102 | msgid type symsgid value 'ZABAPGITSERVER',
103 | msgno type symsgno value '014',
104 | attr1 type scx_attrname value '',
105 | attr2 type scx_attrname value '',
106 | attr3 type scx_attrname value '',
107 | attr4 type scx_attrname value '',
108 | end of M014 .
109 | constants:
110 | begin of M003,
111 | msgid type symsgid value 'ZABAPGITSERVER',
112 | msgno type symsgno value '003',
113 | attr1 type scx_attrname value '',
114 | attr2 type scx_attrname value '',
115 | attr3 type scx_attrname value '',
116 | attr4 type scx_attrname value '',
117 | end of M003 .
118 | data SHA1 type ZAGS_SHA1 .
119 | data STRING type STRING .
120 | data REPO_NAME type ZAGS_REPO_NAME .
121 | data ID type ZAGS_MERGE_REQUEST_ID .
122 |
123 | methods CONSTRUCTOR
124 | importing
125 | !TEXTID like IF_T100_MESSAGE=>T100KEY optional
126 | !PREVIOUS like PREVIOUS optional
127 | !SHA1 type ZAGS_SHA1 optional
128 | !STRING type STRING optional
129 | !REPO_NAME type ZAGS_REPO_NAME optional
130 | !ID type ZAGS_MERGE_REQUEST_ID optional .
131 | protected section.
132 | private section.
133 | ENDCLASS.
134 |
135 |
136 |
137 | CLASS ZCX_AGS_ERROR IMPLEMENTATION.
138 |
139 |
140 | method CONSTRUCTOR ##ADT_SUPPRESS_GENERATION.
141 | CALL METHOD SUPER->CONSTRUCTOR
142 | EXPORTING
143 | PREVIOUS = PREVIOUS
144 | .
145 | me->SHA1 = SHA1 .
146 | me->STRING = STRING .
147 | me->REPO_NAME = REPO_NAME .
148 | me->ID = ID .
149 | clear me->textid.
150 | if textid is initial.
151 | IF_T100_MESSAGE~T100KEY = ZCX_AGS_ERROR .
152 | else.
153 | IF_T100_MESSAGE~T100KEY = TEXTID.
154 | endif.
155 | endmethod.
156 | ENDCLASS.
157 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_obj_tree.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_obj_tree DEFINITION
2 | PUBLIC
3 | CREATE PRIVATE .
4 |
5 | PUBLIC SECTION.
6 |
7 | INTERFACES zif_ags_object .
8 |
9 | ALIASES deserialize
10 | FOR zif_ags_object~deserialize .
11 | ALIASES get_adler32
12 | FOR zif_ags_object~get_adler32 .
13 | ALIASES get_sha1
14 | FOR zif_ags_object~get_sha1 .
15 | ALIASES get_type
16 | FOR zif_ags_object~get_type .
17 | ALIASES save
18 | FOR zif_ags_object~save .
19 | ALIASES serialize
20 | FOR zif_ags_object~serialize .
21 |
22 | TYPES:
23 | BEGIN OF ty_tree,
24 | chmod TYPE zags_chmod,
25 | name TYPE string,
26 | sha1 TYPE zags_sha1,
27 | END OF ty_tree .
28 | TYPES:
29 | ty_tree_tt TYPE STANDARD TABLE OF ty_tree WITH DEFAULT KEY .
30 |
31 | CONSTANTS:
32 | BEGIN OF c_chmod,
33 | file TYPE zags_chmod VALUE '100644',
34 | executable TYPE zags_chmod VALUE '100755',
35 | dir TYPE zags_chmod VALUE '40000',
36 | END OF c_chmod .
37 |
38 | CLASS-METHODS load
39 | IMPORTING
40 | !iv_repo TYPE zags_objects-repo
41 | !iv_sha1 TYPE zags_objects-sha1
42 | RETURNING
43 | VALUE(ro_tree) TYPE REF TO zcl_ags_obj_tree
44 | RAISING
45 | zcx_ags_error .
46 | METHODS add_file
47 | IMPORTING
48 | !iv_chmod TYPE zags_chmod
49 | !iv_name TYPE ty_tree-name
50 | !iv_sha1 TYPE ty_tree-sha1 .
51 | CLASS-METHODS new
52 | IMPORTING
53 | !iv_repo TYPE zags_objects-repo
54 | RETURNING
55 | VALUE(ro_tree) TYPE REF TO zcl_ags_obj_tree
56 | RAISING
57 | zcx_ags_error .
58 | METHODS get_files
59 | RETURNING
60 | VALUE(rt_files) TYPE ty_tree_tt .
61 | METHODS set_files
62 | IMPORTING
63 | VALUE(it_files) TYPE ty_tree_tt .
64 | PROTECTED SECTION.
65 | PRIVATE SECTION.
66 |
67 | DATA mt_data TYPE ty_tree_tt .
68 | DATA mv_new TYPE abap_bool .
69 | DATA mv_repo TYPE zags_objects-repo .
70 | DATA mv_sha1 TYPE zags_sha1 .
71 | DATA mv_adler32 TYPE zags_adler32 .
72 | ENDCLASS.
73 |
74 |
75 |
76 | CLASS zcl_ags_obj_tree IMPLEMENTATION.
77 |
78 |
79 | METHOD add_file.
80 | * todo, rename method to "ADD"? as it can also be used to add folders/directories
81 |
82 | FIELD-SYMBOLS: LIKE LINE OF mt_data.
83 |
84 | ASSERT mv_new = abap_true.
85 |
86 | READ TABLE mt_data WITH KEY
87 | chmod = iv_chmod
88 | name = iv_name
89 | sha1 = iv_sha1
90 | TRANSPORTING NO FIELDS.
91 | ASSERT sy-subrc <> 0.
92 |
93 | APPEND INITIAL LINE TO mt_data ASSIGNING .
94 | -chmod = iv_chmod.
95 | -name = iv_name.
96 | -sha1 = iv_sha1.
97 |
98 | ENDMETHOD.
99 |
100 |
101 | METHOD get_files.
102 |
103 | rt_files = mt_data.
104 |
105 | ENDMETHOD.
106 |
107 |
108 | METHOD load.
109 |
110 | DATA: ls_data TYPE zags_objects.
111 |
112 | CREATE OBJECT ro_tree.
113 | ro_tree->mv_new = abap_false.
114 | ro_tree->mv_sha1 = iv_sha1.
115 |
116 | ls_data = zcl_ags_db=>get_objects( )->single(
117 | iv_repo = iv_repo
118 | iv_sha1 = iv_sha1 ).
119 |
120 | ro_tree->deserialize(
121 | iv_data = ls_data-data_raw
122 | iv_adler32 = ls_data-adler32 ).
123 |
124 | ENDMETHOD.
125 |
126 |
127 | METHOD new.
128 |
129 | ASSERT NOT iv_repo IS INITIAL.
130 |
131 | CREATE OBJECT ro_tree.
132 | ro_tree->mv_new = abap_true.
133 | ro_tree->mv_repo = iv_repo.
134 |
135 | ENDMETHOD.
136 |
137 |
138 | METHOD set_files.
139 |
140 | ASSERT mv_new = abap_true.
141 | ASSERT lines( mt_data ) = 0. " do not overwrite existing data
142 |
143 | mt_data = it_files.
144 |
145 | ENDMETHOD.
146 |
147 |
148 | METHOD zif_ags_object~deserialize.
149 |
150 | TRY.
151 | mt_data = zcl_abapgit_git_pack=>decode_tree( iv_data ).
152 | CATCH zcx_abapgit_exception.
153 | ASSERT 0 = 1.
154 | ENDTRY.
155 |
156 | mv_adler32 = iv_adler32.
157 |
158 | ENDMETHOD.
159 |
160 |
161 | METHOD zif_ags_object~get_adler32.
162 |
163 | IF mv_adler32 IS INITIAL.
164 | rv_adler32 = zcl_abapgit_hash=>adler32( serialize( ) ).
165 | ELSE.
166 | ASSERT NOT mv_adler32 IS INITIAL.
167 | rv_adler32 = mv_adler32.
168 | ENDIF.
169 |
170 | ENDMETHOD.
171 |
172 |
173 | METHOD zif_ags_object~get_sha1.
174 |
175 | IF mv_new = abap_true.
176 | rv_sha1 = zcl_ags_util=>sha1(
177 | iv_type = zif_ags_constants=>c_type-tree
178 | iv_data = serialize( ) ).
179 | ELSE.
180 | ASSERT NOT mv_sha1 IS INITIAL.
181 | rv_sha1 = mv_sha1.
182 | ENDIF.
183 |
184 | ENDMETHOD.
185 |
186 |
187 | METHOD zif_ags_object~get_type.
188 | rv_type = zif_ags_constants=>c_type-tree.
189 | ENDMETHOD.
190 |
191 |
192 | METHOD zif_ags_object~save.
193 |
194 | DATA: ls_object TYPE zags_objects.
195 |
196 |
197 | ASSERT mv_new = abap_true.
198 |
199 | ls_object-repo = mv_repo.
200 | ls_object-sha1 = get_sha1( ).
201 | ls_object-type = get_type( ).
202 | ls_object-data_raw = serialize( ).
203 | ls_object-adler32 = get_adler32( ).
204 |
205 | zcl_ags_db=>get_objects( )->modify( ls_object ).
206 |
207 | ENDMETHOD.
208 |
209 |
210 | METHOD zif_ags_object~serialize.
211 |
212 | TRY.
213 | rv_data = zcl_abapgit_git_pack=>encode_tree( mt_data ).
214 | CATCH zcx_abapgit_exception.
215 | RAISE EXCEPTION TYPE zcx_ags_error.
216 | ENDTRY.
217 |
218 | ENDMETHOD.
219 | ENDCLASS.
220 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_pack.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_pack DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | CLASS-METHODS to_object
8 | IMPORTING
9 | !ii_object TYPE REF TO zif_ags_object
10 | RETURNING
11 | VALUE(rs_object) TYPE zif_abapgit_definitions=>ty_object
12 | RAISING
13 | zcx_ags_error .
14 | CLASS-METHODS encode
15 | IMPORTING
16 | !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
17 | RETURNING
18 | VALUE(rv_data) TYPE xstring .
19 | CLASS-METHODS decode
20 | IMPORTING
21 | !iv_data TYPE xstring
22 | RETURNING
23 | VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt .
24 | CLASS-METHODS save
25 | IMPORTING
26 | !iv_repo TYPE zags_repos-repo
27 | !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
28 | RAISING
29 | zcx_ags_error .
30 | CLASS-METHODS explode
31 | IMPORTING
32 | !iv_repo TYPE zags_repos-repo
33 | !ii_object TYPE REF TO zif_ags_object
34 | !iv_deepen TYPE i DEFAULT 0
35 | RETURNING
36 | VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt
37 | RAISING
38 | zcx_ags_error .
39 | PROTECTED SECTION.
40 | PRIVATE SECTION.
41 | ENDCLASS.
42 |
43 |
44 |
45 | CLASS ZCL_AGS_PACK IMPLEMENTATION.
46 |
47 |
48 | METHOD decode.
49 |
50 | TRY.
51 | rt_objects = zcl_abapgit_git_pack=>decode( iv_data ).
52 | CATCH zcx_abapgit_exception.
53 | ASSERT 0 = 1.
54 | ENDTRY.
55 |
56 | ENDMETHOD.
57 |
58 |
59 | METHOD encode.
60 |
61 | TRY.
62 | rv_data = zcl_abapgit_git_pack=>encode( it_objects ).
63 | CATCH zcx_abapgit_exception.
64 | ASSERT 0 = 1.
65 | ENDTRY.
66 |
67 | ENDMETHOD.
68 |
69 |
70 | METHOD explode.
71 |
72 | TYPES: BEGIN OF ty_visit,
73 | object TYPE REF TO zif_ags_object,
74 | deepen TYPE i,
75 | END OF ty_visit.
76 |
77 | DEFINE _visit_commit.
78 | lo_parent = zcl_ags_obj_commit=>load( iv_repo = iv_repo iv_sha1 = &1 ).
79 | APPEND INITIAL LINE TO lt_visit ASSIGNING .
80 | -object = lo_parent.
81 | -deepen = -deepen - 1.
82 | END-OF-DEFINITION.
83 |
84 | DEFINE _visit_tree.
85 | lo_sub = zcl_ags_obj_tree=>load( iv_repo = iv_repo iv_sha1 = &1 ).
86 | APPEND INITIAL LINE TO lt_visit ASSIGNING .
87 | -object = lo_sub.
88 | END-OF-DEFINITION.
89 |
90 | DEFINE _visit_blob.
91 | APPEND &1 TO lt_blobs_sha1.
92 | END-OF-DEFINITION.
93 |
94 | DATA: lo_tree TYPE REF TO zcl_ags_obj_tree,
95 | lt_files TYPE zcl_ags_obj_tree=>ty_tree_tt,
96 | lo_sub TYPE REF TO zcl_ags_obj_tree,
97 | lt_blobs_sha1 TYPE zags_sha1_tt,
98 | li_object TYPE REF TO zif_ags_object,
99 | lt_blobs TYPE zcl_ags_obj_blob=>ty_list,
100 | lo_parent TYPE REF TO zcl_ags_obj_commit,
101 | ls_commit TYPE zcl_ags_obj_commit=>ty_commit,
102 | lt_visit TYPE STANDARD TABLE OF ty_visit WITH DEFAULT KEY,
103 | lo_commit TYPE REF TO zcl_ags_obj_commit.
104 |
105 | FIELD-SYMBOLS: LIKE LINE OF lt_visit,
106 | LIKE LINE OF lt_visit,
107 | LIKE LINE OF lt_files.
108 |
109 |
110 | ASSERT NOT iv_repo IS INITIAL.
111 |
112 | APPEND INITIAL LINE TO lt_visit ASSIGNING .
113 | -object = ii_object.
114 | -deepen = iv_deepen.
115 |
116 | LOOP AT lt_visit ASSIGNING .
117 | APPEND to_object( -object ) TO rt_objects.
118 |
119 | IF -object->get_type( ) = zif_ags_constants=>c_type-commit.
120 | lo_commit ?= -object.
121 | ls_commit = lo_commit->get( ).
122 |
123 | _visit_tree ls_commit-tree.
124 |
125 | IF -deepen <> 1 AND NOT ls_commit-parent IS INITIAL.
126 | _visit_commit ls_commit-parent.
127 |
128 | IF NOT ls_commit-parent2 IS INITIAL.
129 | _visit_commit ls_commit-parent2.
130 | ENDIF.
131 | ENDIF.
132 | ELSEIF -object->get_type( ) = zif_ags_constants=>c_type-tree.
133 | lo_tree ?= -object.
134 | lt_files = lo_tree->get_files( ).
135 | LOOP AT lt_files ASSIGNING .
136 | IF -chmod = zcl_ags_obj_tree=>c_chmod-dir.
137 | _visit_tree -sha1.
138 | ELSE.
139 | _visit_blob -sha1.
140 | ENDIF.
141 | ENDLOOP.
142 | ENDIF.
143 | ENDLOOP.
144 |
145 | lt_blobs = zcl_ags_obj_blob=>load_mass(
146 | iv_repo = iv_repo
147 | it_sha1 = lt_blobs_sha1 ).
148 | LOOP AT lt_blobs INTO li_object.
149 | APPEND to_object( li_object ) TO rt_objects.
150 | ENDLOOP.
151 |
152 | ENDMETHOD.
153 |
154 |
155 | METHOD save.
156 |
157 | DATA: li_object TYPE REF TO zif_ags_object.
158 |
159 | FIELD-SYMBOLS: LIKE LINE OF it_objects.
160 |
161 |
162 | ASSERT NOT iv_repo IS INITIAL.
163 |
164 | LOOP AT it_objects ASSIGNING .
165 | CASE -type.
166 | WHEN zif_ags_constants=>c_type-blob.
167 | li_object = zcl_ags_obj_blob=>new( iv_repo ).
168 | WHEN zif_ags_constants=>c_type-tree.
169 | li_object = zcl_ags_obj_tree=>new( iv_repo ).
170 | WHEN zif_ags_constants=>c_type-commit.
171 | li_object = zcl_ags_obj_commit=>new( iv_repo ).
172 | WHEN OTHERS.
173 | RAISE EXCEPTION TYPE zcx_ags_error
174 | EXPORTING
175 | textid = zcx_ags_error=>m009.
176 | ENDCASE.
177 |
178 | li_object->deserialize( iv_data = -data
179 | iv_adler32 = -adler32 ).
180 |
181 | ASSERT li_object->get_sha1( ) = -sha1.
182 |
183 | li_object->save( ).
184 |
185 | ENDLOOP.
186 |
187 | ENDMETHOD.
188 |
189 |
190 | METHOD to_object.
191 |
192 | rs_object-sha1 = ii_object->get_sha1( ).
193 | rs_object-type = ii_object->get_type( ).
194 | rs_object-data = ii_object->serialize( ).
195 | rs_object-adler32 = ii_object->get_adler32( ).
196 |
197 | ENDMETHOD.
198 | ENDCLASS.
199 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_file_operations.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
2 |
3 | PRIVATE SECTION.
4 | DATA: mo_branch TYPE REF TO zcl_ags_branch.
5 |
6 | METHODS:
7 | setup RAISING zcx_ags_error,
8 | add FOR TESTING RAISING zcx_ags_error.
9 |
10 | ENDCLASS. "ltcl_Test
11 |
12 | CLASS ltcl_test IMPLEMENTATION.
13 |
14 | METHOD setup.
15 | zcl_ags_db=>set_fake( ).
16 |
17 | mo_branch = zcl_ags_repo=>create(
18 | iv_name = 'UNITTEST'
19 | iv_description = 'FOOBAR'
20 | )->get_default_branch( ).
21 | ENDMETHOD.
22 |
23 | METHOD add.
24 |
25 | CONSTANTS: lc_filename TYPE string VALUE 'NEW.TXT'.
26 |
27 | DATA: lt_before TYPE zcl_ags_cache=>ty_files_simple_tt,
28 | lt_after TYPE zcl_ags_cache=>ty_files_simple_tt.
29 |
30 |
31 | lt_before = mo_branch->get_cache( )->list_files_simple( ).
32 |
33 | mo_branch->get_files( )->add(
34 | iv_filename = lc_filename
35 | iv_path = '/'
36 | iv_file_contents = 'WELLO'
37 | iv_commit_message = 'BLAH' ).
38 |
39 | lt_after = mo_branch->get_cache( )->list_files_simple( ).
40 |
41 | cl_abap_unit_assert=>assert_equals(
42 | act = lines( lt_before ) + 1
43 | exp = lines( lt_after ) ).
44 |
45 | READ TABLE lt_after WITH KEY filename = lc_filename TRANSPORTING NO FIELDS.
46 | cl_abap_unit_assert=>assert_subrc( ).
47 |
48 | ENDMETHOD.
49 |
50 | ENDCLASS.
51 |
52 | CLASS ltcl_find_folders DEFINITION DEFERRED.
53 | CLASS zcl_ags_file_operations DEFINITION LOCAL FRIENDS ltcl_find_folders.
54 |
55 | CLASS ltcl_find_folders DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
56 |
57 | PRIVATE SECTION.
58 | CONSTANTS: c_root TYPE string VALUE '/'.
59 |
60 | DATA: mo_branch TYPE REF TO zcl_ags_branch.
61 |
62 | METHODS:
63 | setup RAISING zcx_ags_error,
64 | test01 FOR TESTING RAISING zcx_ags_error,
65 | test02 FOR TESTING RAISING zcx_ags_error,
66 | test03 FOR TESTING RAISING zcx_ags_error.
67 |
68 | ENDCLASS. "ltcl_Find_Folders
69 |
70 | CLASS ltcl_find_folders IMPLEMENTATION.
71 |
72 | METHOD setup.
73 | zcl_ags_db=>set_fake( ).
74 |
75 | mo_branch = zcl_ags_repo=>create(
76 | iv_name = 'UNITTEST'
77 | iv_description = 'FOOBAR'
78 | )->get_default_branch( ).
79 | ENDMETHOD.
80 |
81 | METHOD test01.
82 |
83 | DATA: lt_files TYPE zcl_ags_cache=>ty_files_simple_tt,
84 | lt_folders TYPE zcl_ags_file_operations=>ty_folders_tt.
85 |
86 | FIELD-SYMBOLS: LIKE LINE OF lt_files,
87 | LIKE LINE OF lt_folders.
88 |
89 |
90 | APPEND INITIAL LINE TO lt_files ASSIGNING .
91 | -filename = 'FOO.TXT'.
92 | -path = c_root.
93 | -blob_sha1 = '12345'.
94 | -chmod = zcl_ags_obj_tree=>c_chmod-file.
95 |
96 | lt_folders = mo_branch->get_files( )->find_folders( lt_files ).
97 |
98 | cl_abap_unit_assert=>assert_equals(
99 | act = lines( lt_folders )
100 | exp = 1 ).
101 |
102 | READ TABLE lt_folders INDEX 1 ASSIGNING .
103 | cl_abap_unit_assert=>assert_subrc( ).
104 |
105 | cl_abap_unit_assert=>assert_equals(
106 | act = -path
107 | exp = c_root ).
108 |
109 | ENDMETHOD.
110 |
111 | METHOD test02.
112 |
113 | DATA: lt_files TYPE zcl_ags_cache=>ty_files_simple_tt,
114 | lt_folders TYPE zcl_ags_file_operations=>ty_folders_tt.
115 |
116 | FIELD-SYMBOLS: LIKE LINE OF lt_files,
117 | LIKE LINE OF lt_folders.
118 |
119 |
120 | APPEND INITIAL LINE TO lt_files ASSIGNING .
121 | -filename = 'FOO.TXT'.
122 | -path = c_root.
123 | -blob_sha1 = '12345'.
124 | -chmod = zcl_ags_obj_tree=>c_chmod-file.
125 |
126 | APPEND INITIAL LINE TO lt_files ASSIGNING .
127 | -filename = 'BAR.TXT'.
128 | -path = c_root.
129 | -blob_sha1 = '12345'.
130 | -chmod = zcl_ags_obj_tree=>c_chmod-file.
131 |
132 | lt_folders = mo_branch->get_files( )->find_folders( lt_files ).
133 |
134 | cl_abap_unit_assert=>assert_equals(
135 | act = lines( lt_folders )
136 | exp = 1 ).
137 |
138 | READ TABLE lt_folders INDEX 1 ASSIGNING .
139 | cl_abap_unit_assert=>assert_subrc( ).
140 |
141 | cl_abap_unit_assert=>assert_equals(
142 | act = -path
143 | exp = c_root ).
144 |
145 | ENDMETHOD.
146 |
147 | METHOD test03.
148 |
149 | DATA: lt_files TYPE zcl_ags_cache=>ty_files_simple_tt,
150 | lt_folders TYPE zcl_ags_file_operations=>ty_folders_tt.
151 |
152 | FIELD-SYMBOLS: LIKE LINE OF lt_files.
153 |
154 |
155 | APPEND INITIAL LINE TO lt_files ASSIGNING .
156 | -filename = 'FOO.TXT'.
157 | -path = '/FOO/BAR/'.
158 | -blob_sha1 = '12345'.
159 | -chmod = zcl_ags_obj_tree=>c_chmod-file.
160 |
161 | lt_folders = mo_branch->get_files( )->find_folders( lt_files ).
162 |
163 | cl_abap_unit_assert=>assert_equals(
164 | act = lines( lt_folders )
165 | exp = 3 ).
166 |
167 | READ TABLE lt_folders WITH KEY path = '/' TRANSPORTING NO FIELDS.
168 | cl_abap_unit_assert=>assert_subrc( ).
169 | READ TABLE lt_folders WITH KEY path = '/FOO/' TRANSPORTING NO FIELDS.
170 | cl_abap_unit_assert=>assert_subrc( ).
171 | READ TABLE lt_folders WITH KEY path = '/FOO/BAR/' TRANSPORTING NO FIELDS.
172 | cl_abap_unit_assert=>assert_subrc( ).
173 |
174 | ENDMETHOD.
175 |
176 | ENDCLASS.
177 |
178 | CLASS ltcl_extract_folder_name DEFINITION DEFERRED.
179 | CLASS zcl_ags_file_operations DEFINITION LOCAL FRIENDS ltcl_extract_folder_name.
180 |
181 | CLASS ltcl_extract_folder_name DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
182 |
183 | PRIVATE SECTION.
184 | METHODS:
185 | test01 FOR TESTING,
186 | test02 FOR TESTING.
187 |
188 | ENDCLASS. "ltcl_Extract_Folder_Name
189 |
190 | CLASS ltcl_extract_folder_name IMPLEMENTATION.
191 |
192 | METHOD test01.
193 |
194 | DATA: lv_result TYPE string.
195 |
196 | lv_result = zcl_ags_file_operations=>extract_folder_name( '/foo/' ).
197 |
198 | cl_abap_unit_assert=>assert_equals(
199 | act = lv_result
200 | exp = 'foo' ).
201 |
202 | ENDMETHOD.
203 |
204 | METHOD test02.
205 |
206 | DATA: lv_result TYPE string.
207 |
208 | lv_result = zcl_ags_file_operations=>extract_folder_name( '/foo/bar/' ).
209 |
210 | cl_abap_unit_assert=>assert_equals(
211 | act = lv_result
212 | exp = 'bar' ).
213 |
214 | ENDMETHOD.
215 |
216 | ENDCLASS.
217 |
--------------------------------------------------------------------------------
/src/service/zcl_ags_service_rest.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | CLASS ltcl_rest DEFINITION DEFERRED.
2 | CLASS zcl_ags_service_rest DEFINITION LOCAL FRIENDS ltcl_rest.
3 |
4 | CLASS ltcl_rest DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
5 |
6 | PRIVATE SECTION.
7 | CONSTANTS:
8 | c_name TYPE zags_repos-name VALUE 'UNIT_TEST',
9 | c_description TYPE zags_repos-description VALUE 'DESCRIPTION, FOOBAR'.
10 |
11 | DATA: mo_rest TYPE REF TO zcl_ags_service_rest,
12 | mo_repo TYPE REF TO zcl_ags_repo.
13 |
14 | METHODS:
15 | setup RAISING zcx_ags_error,
16 | list_files FOR TESTING RAISING zcx_ags_error,
17 | list_branches FOR TESTING RAISING zcx_ags_error.
18 |
19 | ENDCLASS. "ltcl_List_Files
20 |
21 | CLASS ltcl_rest IMPLEMENTATION.
22 |
23 | METHOD setup.
24 |
25 | zcl_ags_db=>set_fake( ).
26 |
27 | CREATE OBJECT mo_rest.
28 |
29 | mo_repo = zcl_ags_repo=>create(
30 | iv_name = c_name
31 | iv_description = c_description ).
32 |
33 | ENDMETHOD.
34 |
35 | METHOD list_files.
36 |
37 | DATA: lt_files TYPE zcl_ags_cache=>ty_files_tt.
38 |
39 |
40 | lt_files = mo_rest->list_files(
41 | iv_repo = c_name
42 | iv_branch = mo_repo->get_data( )-head
43 | iv_path = '' ).
44 |
45 | cl_abap_unit_assert=>assert_not_initial( lt_files ).
46 |
47 | ENDMETHOD.
48 |
49 | METHOD list_branches.
50 |
51 | DATA: lt_branches TYPE zcl_ags_service_rest=>ty_branches_tt.
52 |
53 |
54 | lt_branches = mo_rest->list_branches( c_name ).
55 |
56 | cl_abap_unit_assert=>assert_not_initial( lt_branches ).
57 |
58 | ENDMETHOD.
59 |
60 | ENDCLASS.
61 |
62 | CLASS ltcl_merge_request DEFINITION FOR TESTING
63 | DURATION SHORT RISK LEVEL HARMLESS.
64 |
65 | PRIVATE SECTION.
66 |
67 | METHODS setup
68 | RAISING
69 | cx_static_check.
70 |
71 | " File added
72 | METHODS create_merge_request_af FOR TESTING
73 | RAISING
74 | cx_static_check.
75 |
76 | " File modified
77 | METHODS create_merge_request_mf FOR TESTING
78 | RAISING
79 | cx_static_check.
80 |
81 | " File deleted
82 | METHODS create_merge_request_df FOR TESTING
83 | RAISING
84 | cx_static_check.
85 |
86 | ENDCLASS.
87 |
88 | CLASS ltcl_merge_request IMPLEMENTATION.
89 |
90 | METHOD setup.
91 |
92 | CALL FUNCTION 'ZIMPORT_BUNDLE_FROM_TDC'
93 | EXPORTING
94 | tdc = 'ZAGS_REPO_SNAPSHOT'
95 | tdc_version = 1
96 | variant = 'ECATTDEFAULT'
97 | do_commit = abap_false
98 | content_handler = 'REPLACE_CONTENT_ALL_TABLES'.
99 |
100 | ENDMETHOD.
101 |
102 | METHOD create_merge_request_af.
103 |
104 | DATA(ls_act_merge_request) = NEW zcl_ags_service_rest( )->create_merge_request(
105 | VALUE #( reponame = 'ags_ci' targetbranch = 'refs/heads/master'
106 | sourcebranch = 'refs/heads/b1' ) ).
107 |
108 | DATA(ls_exp_merge_request) = VALUE zcl_ags_service_rest=>ty_merge_request(
109 | anchestor = '6013dd73f098a043e9d82fd84b80a7caf19f5fa8'
110 | source = '6a1552600ef051b03473e206b200855434728ef4'
111 | target = '6013dd73f098a043e9d82fd84b80a7caf19f5fa8'
112 | repo = '051MciMJ7jk0v6lyvLF0sW' id = 1
113 | target_branch = '051MciMJ7jk0v6lyvLFWsW'
114 | source_branch = '051MciMJ7jkQzS7GMQrWsW'
115 | source_branch_name = 'b1'
116 | target_branch_name = 'master'
117 | created_by = sy-uname
118 | changed_files = VALUE #(
119 | ( filename = 'MANIFEST.md'
120 | path = '/'
121 | new_blob = 'ff39d3ea3f50f7d711f970a8cb2293638777a2f2' ) ) ).
122 | cl_abap_unit_assert=>assert_equals( act = ls_act_merge_request
123 | exp = ls_exp_merge_request ).
124 | SELECT COUNT(*) FROM zags_merge_req
125 | WHERE repo = ls_exp_merge_request-repo AND id = ls_exp_merge_request-id
126 | AND target_branch = ls_exp_merge_request-target_branch
127 | AND source_branch = ls_exp_merge_request-source_branch.
128 | cl_abap_unit_assert=>assert_subrc( act = 0
129 | msg = 'Database entry for table zags_merge_req missing' ).
130 |
131 | ENDMETHOD.
132 |
133 | METHOD create_merge_request_mf.
134 |
135 | DATA(ls_act_merge_request) = NEW zcl_ags_service_rest( )->create_merge_request(
136 | VALUE #( reponame = 'ags_ci' targetbranch = 'refs/heads/master'
137 | sourcebranch = 'refs/heads/b2' ) ).
138 |
139 | DATA(ls_exp_merge_request) = VALUE zcl_ags_service_rest=>ty_merge_request(
140 | anchestor = '6013dd73f098a043e9d82fd84b80a7caf19f5fa8'
141 | source = 'd26ed200dfbdf3e79e92b2f9032c3ffcb5644a76'
142 | target = '6013dd73f098a043e9d82fd84b80a7caf19f5fa8'
143 | repo = '051MciMJ7jk0v6lyvLF0sW' id = 1
144 | target_branch = '051MciMJ7jk0v6lyvLFWsW'
145 | source_branch = '051MciMJ7jkVbzqd2dz0sW'
146 | source_branch_name = 'b2'
147 | target_branch_name = 'master'
148 | created_by = sy-uname
149 | changed_files = VALUE #(
150 | ( filename = 'README.md'
151 | path = '/'
152 | old_blob = 'bfc169314c32d7e9279cf018e4a1e290f561ac5e'
153 | new_blob = '8473c15d9db2aad97e5d39b4b8ed25e52b3dcf62' ) ) ).
154 | cl_abap_unit_assert=>assert_equals( act = ls_act_merge_request
155 | exp = ls_exp_merge_request ).
156 | SELECT COUNT(*) FROM zags_merge_req
157 | WHERE repo = ls_exp_merge_request-repo AND id = ls_exp_merge_request-id
158 | AND target_branch = ls_exp_merge_request-target_branch
159 | AND source_branch = ls_exp_merge_request-source_branch.
160 | cl_abap_unit_assert=>assert_subrc( act = 0
161 | msg = 'Database entry for table zags_merge_req missing' ).
162 |
163 | ENDMETHOD.
164 |
165 | METHOD create_merge_request_df.
166 |
167 | DATA(ls_act_merge_request) = NEW zcl_ags_service_rest( )->create_merge_request(
168 | VALUE #( reponame = 'ags_ci' targetbranch = 'refs/heads/master'
169 | sourcebranch = 'refs/heads/b3' ) ).
170 |
171 | DATA(ls_exp_merge_request) = VALUE zcl_ags_service_rest=>ty_merge_request(
172 | anchestor = '6013dd73f098a043e9d82fd84b80a7caf19f5fa8'
173 | source = 'faee7a29cceda981cf7dfde82687f004154a046f'
174 | target = '6013dd73f098a043e9d82fd84b80a7caf19f5fa8'
175 | repo = '051MciMJ7jk0v6lyvLF0sW' id = 1
176 | target_branch = '051MciMJ7jk0v6lyvLFWsW'
177 | source_branch = '051MciMJ7jkVc3yk9a{0sW'
178 | source_branch_name = 'b3'
179 | target_branch_name = 'master'
180 | created_by = sy-uname
181 | changed_files = VALUE #(
182 | ( filename = 'README.md'
183 | path = '/'
184 | old_blob = 'bfc169314c32d7e9279cf018e4a1e290f561ac5e'
185 | new_blob = '' ) ) ).
186 | cl_abap_unit_assert=>assert_equals( act = ls_act_merge_request
187 | exp = ls_exp_merge_request ).
188 | SELECT COUNT(*) FROM zags_merge_req
189 | WHERE repo = ls_exp_merge_request-repo AND id = ls_exp_merge_request-id
190 | AND target_branch = ls_exp_merge_request-target_branch
191 | AND source_branch = ls_exp_merge_request-source_branch.
192 | cl_abap_unit_assert=>assert_subrc( act = 0
193 | msg = 'Database entry for table zags_merge_req missing' ).
194 |
195 | ENDMETHOD.
196 |
197 | ENDCLASS.
198 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_obj_commit.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | *----------------------------------------------------------------------*
2 | * CLASS ltcl_test DEFINITION
3 | *----------------------------------------------------------------------*
4 | *
5 | *----------------------------------------------------------------------*
6 | CLASS ltcl_test DEFINITION FOR TESTING
7 | DURATION SHORT
8 | RISK LEVEL HARMLESS
9 | FINAL.
10 |
11 | PRIVATE SECTION.
12 | CONSTANTS: c_sha1 TYPE zags_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
13 |
14 | METHODS:
15 | serialize FOR TESTING
16 | RAISING zcx_ags_error.
17 |
18 | ENDCLASS. "ltcl_Test
19 |
20 |
21 | *----------------------------------------------------------------------*
22 | * CLASS ltcl_test IMPLEMENTATION
23 | *----------------------------------------------------------------------*
24 | *
25 | *----------------------------------------------------------------------*
26 | CLASS ltcl_test IMPLEMENTATION.
27 |
28 | METHOD serialize.
29 |
30 | CONSTANTS: lc_field TYPE string
31 | VALUE 'Foobar 1466596513 +0000' ##no_text.
32 |
33 | DATA: lo_old TYPE REF TO zcl_ags_obj_commit,
34 | lo_new TYPE REF TO zcl_ags_obj_commit,
35 | lv_xstr TYPE xstring.
36 |
37 |
38 | lo_old = zcl_ags_obj_commit=>new( 'test' ).
39 | lo_old->set_author( lc_field ).
40 | lo_old->set_body( 'body' ).
41 | lo_old->set_committer( lc_field ).
42 | lo_old->set_parent( c_sha1 ).
43 | lo_old->set_tree( c_sha1 ).
44 | lv_xstr = lo_old->zif_ags_object~serialize( ).
45 |
46 | lo_new = zcl_ags_obj_commit=>new( 'test' ).
47 | lo_new->zif_ags_object~deserialize( lv_xstr ).
48 |
49 | cl_abap_unit_assert=>assert_equals(
50 | act = lo_new->get( )-author
51 | exp = lo_old->get( )-author ).
52 |
53 | cl_abap_unit_assert=>assert_equals(
54 | act = lo_new->get( )-body
55 | exp = lo_old->get( )-body ).
56 |
57 | cl_abap_unit_assert=>assert_equals(
58 | act = lo_new->get( )-committer
59 | exp = lo_old->get( )-committer ).
60 |
61 | cl_abap_unit_assert=>assert_equals(
62 | act = lo_new->get( )-parent
63 | exp = lo_old->get( )-parent ).
64 |
65 | cl_abap_unit_assert=>assert_equals(
66 | act = lo_new->get( )-tree
67 | exp = lo_old->get( )-tree ).
68 |
69 | ENDMETHOD. "serialize
70 |
71 | ENDCLASS. "ltcl_test IMPLEMENTATION
72 |
73 | CLASS ltcl_userfield DEFINITION DEFERRED.
74 | CLASS zcl_ags_obj_commit DEFINITION LOCAL FRIENDS ltcl_userfield.
75 |
76 | *----------------------------------------------------------------------*
77 | * CLASS ltcl_userfield DEFINITION
78 | *----------------------------------------------------------------------*
79 | *
80 | *----------------------------------------------------------------------*
81 | CLASS ltcl_userfield DEFINITION FOR TESTING
82 | DURATION SHORT
83 | RISK LEVEL HARMLESS
84 | FINAL.
85 |
86 | PRIVATE SECTION.
87 | DATA: mo_commit TYPE REF TO zcl_ags_obj_commit.
88 |
89 | METHODS:
90 | setup
91 | RAISING zcx_ags_error,
92 | parse_userfield1 FOR TESTING
93 | RAISING zcx_ags_error,
94 | parse_userfield2 FOR TESTING
95 | RAISING zcx_ags_error,
96 | parse_userfield3 FOR TESTING
97 | RAISING zcx_ags_error,
98 | parse_userfield4 FOR TESTING
99 | RAISING zcx_ags_error,
100 | parse_userfield5 FOR TESTING
101 | RAISING zcx_ags_error,
102 | error FOR TESTING.
103 |
104 | ENDCLASS. "ltcl_Userfield
105 |
106 | *----------------------------------------------------------------------*
107 | * CLASS ltcl_userfield IMPLEMENTATION
108 | *----------------------------------------------------------------------*
109 | *
110 | *----------------------------------------------------------------------*
111 | CLASS ltcl_userfield IMPLEMENTATION.
112 |
113 | METHOD setup.
114 | mo_commit = zcl_ags_obj_commit=>new( 'test' ).
115 | ENDMETHOD. "setup
116 |
117 | METHOD parse_userfield1.
118 |
119 | CONSTANTS: lc_field TYPE string
120 | VALUE 'Foobar 1466596513 +0000' ##no_text.
121 |
122 | DATA: ls_field TYPE zcl_ags_obj_commit=>ty_userfield.
123 |
124 |
125 | ls_field = mo_commit->parse_userfield( lc_field ).
126 |
127 | cl_abap_unit_assert=>assert_not_initial( ls_field ).
128 |
129 | cl_abap_unit_assert=>assert_equals(
130 | act = ls_field-email
131 | exp = 'foo@bar.com' ).
132 |
133 | cl_abap_unit_assert=>assert_equals(
134 | act = ls_field-name
135 | exp = 'Foobar' ).
136 |
137 | ENDMETHOD. "parse_userfield
138 |
139 | METHOD parse_userfield2.
140 |
141 | CONSTANTS: lc_field TYPE string
142 | VALUE 'SAP* 1482397806 +0100' ##no_text.
143 |
144 | DATA: ls_field TYPE zcl_ags_obj_commit=>ty_userfield.
145 |
146 |
147 | ls_field = mo_commit->parse_userfield( lc_field ).
148 |
149 | cl_abap_unit_assert=>assert_not_initial( ls_field ).
150 |
151 | cl_abap_unit_assert=>assert_equals(
152 | act = ls_field-email
153 | exp = 'SAP*@localhost' ).
154 |
155 | cl_abap_unit_assert=>assert_equals(
156 | act = ls_field-name
157 | exp = 'SAP*' ).
158 |
159 | ENDMETHOD.
160 |
161 | METHOD parse_userfield3.
162 |
163 | * this is actually the UNAM saved in REPOSRC, bug in SAP standard?
164 | CONSTANTS: lc_field TYPE string
165 | VALUE 'SAP*........ 1484987134 +0100' ##no_text.
166 |
167 | DATA: ls_field TYPE zcl_ags_obj_commit=>ty_userfield.
168 |
169 |
170 | ls_field = mo_commit->parse_userfield( lc_field ).
171 |
172 | cl_abap_unit_assert=>assert_not_initial( ls_field ).
173 |
174 | cl_abap_unit_assert=>assert_equals(
175 | act = ls_field-name
176 | exp = 'SAP*........' ).
177 |
178 | ENDMETHOD.
179 |
180 | METHOD parse_userfield4.
181 |
182 | CONSTANTS: lc_field TYPE string
183 | VALUE 'Foo Barsen (FOOB) 1501224539 +0200'.
184 |
185 | DATA: ls_field TYPE zcl_ags_obj_commit=>ty_userfield.
186 |
187 |
188 | ls_field = mo_commit->parse_userfield( lc_field ).
189 |
190 | cl_abap_unit_assert=>assert_not_initial( ls_field ).
191 |
192 | cl_abap_unit_assert=>assert_equals(
193 | act = ls_field-name
194 | exp = 'Foo Barsen (FOOB)' ).
195 |
196 | ENDMETHOD.
197 |
198 | METHOD parse_userfield5.
199 |
200 | CONSTANTS: lc_field TYPE string
201 | VALUE 'J.DOE-E 1482397806 +0100' ##no_text.
202 |
203 | DATA: ls_field TYPE zcl_ags_obj_commit=>ty_userfield.
204 |
205 |
206 | ls_field = mo_commit->parse_userfield( lc_field ).
207 |
208 | cl_abap_unit_assert=>assert_not_initial( ls_field ).
209 |
210 | cl_abap_unit_assert=>assert_equals(
211 | act = ls_field-email
212 | exp = 'J.Doe-E@localhost' ).
213 |
214 | cl_abap_unit_assert=>assert_equals(
215 | act = ls_field-name
216 | exp = 'J.DOE-E' ).
217 |
218 | ENDMETHOD.
219 |
220 | METHOD error.
221 |
222 | TRY.
223 | mo_commit->parse_userfield( 'something' ).
224 | cl_abap_unit_assert=>fail( ).
225 | CATCH zcx_ags_error ##no_handler.
226 | ENDTRY.
227 |
228 | ENDMETHOD. "error
229 |
230 | ENDCLASS. "ltcl_userfield IMPLEMENTATION
231 |
--------------------------------------------------------------------------------
/src/backend/zcl_ags_repo.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_ags_repo DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 |
7 | TYPES:
8 | ty_branches_tt TYPE STANDARD TABLE OF REF TO zcl_ags_branch WITH DEFAULT KEY .
9 |
10 | CLASS-METHODS create
11 | IMPORTING
12 | !iv_name TYPE zags_repos-name
13 | !iv_description TYPE zags_repos-description
14 | RETURNING
15 | VALUE(ro_repo) TYPE REF TO zcl_ags_repo
16 | RAISING
17 | zcx_ags_error .
18 | CLASS-METHODS get_instance
19 | IMPORTING
20 | !iv_name TYPE zags_repos-name
21 | RETURNING
22 | VALUE(ro_repo) TYPE REF TO zcl_ags_repo
23 | RAISING
24 | zcx_ags_error .
25 | CLASS-METHODS list
26 | RETURNING
27 | VALUE(rt_list) TYPE zags_repos_tt .
28 | METHODS constructor
29 | IMPORTING
30 | !iv_name TYPE zags_repos-name
31 | RAISING
32 | zcx_ags_error .
33 | METHODS create_branch
34 | IMPORTING
35 | !iv_name TYPE zags_branches-name
36 | !iv_commit TYPE zags_sha1
37 | RETURNING
38 | VALUE(ro_branch) TYPE REF TO zcl_ags_branch
39 | RAISING
40 | zcx_ags_error .
41 | METHODS delete
42 | RAISING
43 | zcx_ags_error .
44 | METHODS get_branch
45 | IMPORTING
46 | !iv_branch_name TYPE zags_branch_name
47 | RETURNING
48 | VALUE(ro_branch) TYPE REF TO zcl_ags_branch
49 | RAISING
50 | zcx_ags_error .
51 | METHODS get_data
52 | RETURNING
53 | VALUE(rs_data) TYPE zags_repos .
54 | METHODS get_default_branch
55 | RETURNING
56 | VALUE(ro_branch) TYPE REF TO zcl_ags_branch
57 | RAISING
58 | zcx_ags_error .
59 | METHODS list_branches
60 | RETURNING
61 | VALUE(rt_list) TYPE ty_branches_tt
62 | RAISING
63 | zcx_ags_error .
64 | METHODS set_description
65 | IMPORTING
66 | !iv_description TYPE zags_repos-description
67 | RAISING
68 | zcx_ags_error .
69 | PROTECTED SECTION.
70 | PRIVATE SECTION.
71 |
72 | DATA ms_data TYPE zags_repos .
73 |
74 | CLASS-METHODS initial_commit
75 | IMPORTING
76 | !iv_repo TYPE zags_repos-repo
77 | !iv_name TYPE clike
78 | RETURNING
79 | VALUE(rv_commit) TYPE zags_sha1
80 | RAISING
81 | zcx_ags_error .
82 | ENDCLASS.
83 |
84 |
85 |
86 | CLASS ZCL_AGS_REPO IMPLEMENTATION.
87 |
88 |
89 | METHOD constructor.
90 |
91 | ms_data = zcl_ags_db=>get_repos( )->single( iv_name ).
92 |
93 | ENDMETHOD.
94 |
95 |
96 | METHOD create.
97 |
98 | DATA: ls_repo TYPE zags_repos.
99 |
100 |
101 | ASSERT NOT condense( iv_name ) CA '/\ '.
102 | ASSERT NOT iv_name IS INITIAL.
103 |
104 |
105 | TRY.
106 | zcl_ags_db=>get_repos( )->single( iv_name ).
107 | RAISE EXCEPTION TYPE zcx_ags_error
108 | EXPORTING
109 | textid = zcx_ags_error=>m001.
110 | CATCH zcx_ags_error ##NO_HANDLER.
111 | ENDTRY.
112 |
113 | ls_repo-repo = zcl_ags_util=>uuid( ).
114 | ls_repo-name = iv_name.
115 | ls_repo-description = iv_description.
116 | ls_repo-head = 'refs/heads/master' ##no_text.
117 |
118 | zcl_ags_db=>get_repos( )->insert( ls_repo ).
119 |
120 | ro_repo = get_instance( iv_name ).
121 |
122 | ro_repo->create_branch(
123 | iv_name = ls_repo-head
124 | iv_commit = initial_commit(
125 | iv_repo = ls_repo-repo
126 | iv_name = iv_name ) ).
127 |
128 | ENDMETHOD.
129 |
130 |
131 | METHOD create_branch.
132 |
133 | DATA: ls_branch TYPE zags_branches.
134 |
135 | * validate that iv_commit exists?
136 | zcl_ags_obj_commit=>load(
137 | iv_repo = ms_data-repo
138 | iv_sha1 = iv_commit ).
139 |
140 | ls_branch-repo = ms_data-repo.
141 | ls_branch-branch = zcl_ags_util=>uuid( ).
142 | ls_branch-name = iv_name.
143 | ls_branch-sha1 = iv_commit.
144 |
145 | zcl_ags_db=>get_branches( )->insert( ls_branch ).
146 |
147 | ro_branch = get_branch( iv_name ).
148 |
149 | ENDMETHOD.
150 |
151 |
152 | METHOD delete.
153 |
154 | DATA: lt_branches TYPE ty_branches_tt.
155 |
156 | FIELD-SYMBOLS: LIKE LINE OF lt_branches.
157 |
158 |
159 | lt_branches = list_branches( ).
160 | LOOP AT lt_branches ASSIGNING .
161 | ->delete( ).
162 | ENDLOOP.
163 |
164 | zcl_ags_db=>get_repos( )->delete( ms_data-name ).
165 |
166 | ENDMETHOD.
167 |
168 |
169 | METHOD get_branch.
170 |
171 | DATA: lt_branches TYPE ty_branches_tt.
172 |
173 |
174 | lt_branches = list_branches( ).
175 | LOOP AT lt_branches INTO ro_branch.
176 | IF ro_branch->get_data( )-name = iv_branch_name
177 | OR ro_branch->get_data( )-name = 'refs/heads/' && iv_branch_name.
178 | RETURN.
179 | ENDIF.
180 | ENDLOOP.
181 |
182 | ASSERT 0 = 1.
183 |
184 | ENDMETHOD.
185 |
186 |
187 | METHOD get_data.
188 |
189 | rs_data = ms_data.
190 |
191 | ENDMETHOD.
192 |
193 |
194 | METHOD get_default_branch.
195 |
196 | ro_branch = get_branch( ms_data-head ).
197 |
198 | ENDMETHOD.
199 |
200 |
201 | METHOD get_instance.
202 |
203 | CREATE OBJECT ro_repo
204 | EXPORTING
205 | iv_name = iv_name.
206 |
207 | ENDMETHOD.
208 |
209 |
210 | METHOD initial_commit.
211 |
212 | DATA: lo_blob TYPE REF TO zcl_ags_obj_blob,
213 | lo_commit TYPE REF TO zcl_ags_obj_commit,
214 | lo_tree TYPE REF TO zcl_ags_obj_tree,
215 | lv_str TYPE string,
216 | lv_user TYPE string.
217 |
218 |
219 | lo_blob = zcl_ags_obj_blob=>new( iv_repo ).
220 | lv_str = iv_name.
221 | lo_blob->set_data( zcl_ags_util=>string_to_xstring_utf8( lv_str ) ).
222 | lo_blob->save( ).
223 |
224 | lo_tree = zcl_ags_obj_tree=>new( iv_repo ).
225 | lo_tree->add_file( iv_chmod = zcl_ags_obj_tree=>c_chmod-file
226 | iv_name = 'README.md'
227 | iv_sha1 = lo_blob->get_sha1( ) ) ##no_text.
228 | lo_tree->save( ).
229 |
230 | lv_user = |initial { zcl_ags_util=>get_time( ) }|.
231 |
232 | lo_commit = zcl_ags_obj_commit=>new( iv_repo ).
233 | lo_commit->set_tree( lo_tree->get_sha1( ) ).
234 | lo_commit->set_author( lv_user ).
235 | lo_commit->set_committer( lv_user ).
236 | lo_commit->set_body( 'initial' ) ##no_text.
237 | lo_commit->save( ).
238 |
239 | rv_commit = lo_commit->get_sha1( ).
240 |
241 | ENDMETHOD.
242 |
243 |
244 | METHOD list.
245 |
246 | rt_list = zcl_ags_db=>get_repos( )->list( ).
247 |
248 | ENDMETHOD.
249 |
250 |
251 | METHOD list_branches.
252 |
253 | DATA: lt_list TYPE zags_branches_tt,
254 | lo_branch TYPE REF TO zcl_ags_branch.
255 |
256 | FIELD-SYMBOLS: LIKE LINE OF lt_list.
257 |
258 |
259 | lt_list = zcl_ags_db=>get_branches( )->list( ms_data-repo ).
260 |
261 | LOOP AT lt_list ASSIGNING .
262 | CREATE OBJECT lo_branch
263 | EXPORTING
264 | io_repo = me
265 | iv_name = -name.
266 |
267 | APPEND lo_branch TO rt_list.
268 | ENDLOOP.
269 |
270 | ENDMETHOD.
271 |
272 |
273 | METHOD set_description.
274 |
275 | zcl_ags_db=>get_repos( )->update_description(
276 | iv_repo = ms_data-repo
277 | iv_description = iv_description ).
278 |
279 | ms_data-description = iv_description.
280 |
281 | ENDMETHOD.
282 | ENDCLASS.
283 |
--------------------------------------------------------------------------------