├── 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 | --------------------------------------------------------------------------------