diff --git a/src/zabapgit_review.msag.xml b/src/zabapgit_review.msag.xml
new file mode 100644
index 0000000..97235c5
--- /dev/null
+++ b/src/zabapgit_review.msag.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ ZABAPGIT_REVIEW
+ E
+ abapGit Review
+
+
+
+ E
+ ZABAPGIT_REVIEW
+ 000
+ Cannot read merge requests from abapGitServer.
+
+
+
+
+
diff --git a/src/zagr_ags_merge_req.tabl.xml b/src/zagr_ags_merge_req.tabl.xml
new file mode 100644
index 0000000..6516768
--- /dev/null
+++ b/src/zagr_ags_merge_req.tabl.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+ ZAGR_AGS_MERGE_REQ
+ E
+ INTTAB
+ abapGitServer merge requests
+ 3
+
+
+
+ ID
+ 0
+ X
+ 000004
+ INT4
+ 000010
+ INT4
+ Id
+
+
+
+
+
diff --git a/src/zagr_ags_merge_req_tt.ttyp.xml b/src/zagr_ags_merge_req_tt.ttyp.xml
new file mode 100644
index 0000000..bcb7bf8
--- /dev/null
+++ b/src/zagr_ags_merge_req_tt.ttyp.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ ZAGR_AGS_MERGE_REQ_TT
+ E
+ ZAGR_AGS_MERGE_REQ
+ S
+ STRU
+ T
+ D
+ N
+ abapGitServer merge requests
+
+
+
+
diff --git a/src/zcl_abapgit_review.clas.abap b/src/zcl_abapgit_review.clas.abap
index ab4d2dc..0e9997e 100644
--- a/src/zcl_abapgit_review.clas.abap
+++ b/src/zcl_abapgit_review.clas.abap
@@ -4,12 +4,27 @@ CLASS zcl_abapgit_review DEFINITION
CREATE PUBLIC .
PUBLIC SECTION.
+ TYPES: BEGIN OF ty_pull_url,
+ package TYPE devclass,
+ url TYPE string,
+ END OF ty_pull_url.
+ TYPES: tt_pull_urls TYPE STANDARD TABLE OF ty_pull_url WITH NON-UNIQUE KEY package.
+ TYPES: tt_repos TYPE STANDARD TABLE OF REF TO zcl_abapgit_repo.
+ TYPES: tt_packages TYPE STANDARD TABLE OF devclass.
METHODS release
IMPORTING
!iv_trkorr TYPE trkorr
RAISING
cx_static_check .
+ METHODS find_pull_request_urls
+ IMPORTING
+ !iv_trkorr TYPE trkorr
+ EXPORTING
+ et_pull_requests TYPE tt_pull_urls
+ et_packages TYPE tt_packages
+ RAISING
+ cx_static_check.
PROTECTED SECTION.
TYPES:
@@ -20,6 +35,11 @@ CLASS zcl_abapgit_review DEFINITION
END OF ty_tadir .
TYPES:
ty_tadir_tt TYPE STANDARD TABLE OF ty_tadir WITH EMPTY KEY .
+ TYPES:
+ BEGIN OF ty_repo,
+ package TYPE devclass,
+ repo TYPE REF TO zcl_abapgit_repo,
+ END OF ty_repo.
CONSTANTS gc_workbench TYPE e070-trfunction VALUE 'K' ##NO_TEXT.
CONSTANTS gc_development TYPE e070-trfunction VALUE 'S' ##NO_TEXT.
@@ -57,6 +77,35 @@ CLASS zcl_abapgit_review DEFINITION
VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_online
RAISING
cx_static_check .
+ METHODS find_abapgit_repos
+ IMPORTING
+ !iv_trkorr TYPE trkorr
+ EXPORTING
+ et_repos TYPE tt_repos
+ RAISING
+ cx_static_check.
+ METHODS find_pull_requests
+ IMPORTING
+ it_repos TYPE tt_repos
+ iv_branch_name TYPE string
+ RETURNING VALUE(rt_result) TYPE tt_pull_urls
+ RAISING cx_static_check.
+ METHODS find_ags_merge_requests
+ IMPORTING
+ io_repo TYPE REF TO zcl_abapgit_repo_online
+ iv_branch_name TYPE string
+ CHANGING
+ ct_result TYPE tt_pull_urls
+ RAISING
+ zcx_abapgit_review.
+ METHODS find_github_pull_requests
+ IMPORTING
+ io_repo TYPE REF TO zcl_abapgit_repo_online
+ iv_branch_name TYPE string
+ CHANGING
+ ct_result TYPE tt_pull_urls
+ RAISING
+ cx_static_check.
METHODS list_objects
IMPORTING
!iv_request TYPE trkorr
@@ -194,7 +243,7 @@ CLASS ZCL_ABAPGIT_REVIEW IMPLEMENTATION.
FOR ALL ENTRIES IN @it_tadir
WHERE pgmid = @it_tadir-pgmid
AND object = @it_tadir-object
- AND obj_name = @it_tadir-obj_name. "#EC CI_SUBRC
+ AND obj_name = @it_tadir-obj_name. "#EC CI_SUBRC
DATA(lt_repos) = zcl_abapgit_repo_srv=>get_instance( )->list( ).
LOOP AT lt_packages INTO DATA(lv_package).
@@ -219,6 +268,136 @@ CLASS ZCL_ABAPGIT_REVIEW IMPLEMENTATION.
ENDMETHOD.
+ METHOD find_abapgit_repos.
+ DATA: lt_repos TYPE HASHED TABLE OF ty_repo WITH UNIQUE KEY package.
+
+ DATA(lt_objects) = list_objects( iv_trkorr ).
+ IF lt_objects IS INITIAL.
+ RETURN.
+ ENDIF.
+
+ SELECT DISTINCT devclass FROM tadir INTO TABLE @DATA(lt_packages)
+ FOR ALL ENTRIES IN @lt_objects
+ WHERE pgmid = @lt_objects-pgmid
+ AND object = @lt_objects-object
+ AND obj_name = @lt_objects-obj_name. "#EC CI_SUBRC
+
+ DATA(lt_abapgit_repos) = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+ LOOP AT lt_packages INTO DATA(lv_package).
+ DATA(lt_supers) = zcl_abapgit_factory=>get_sap_package( lv_package-devclass )->list_superpackages( ).
+ LOOP AT lt_supers INTO DATA(lv_super).
+ LOOP AT lt_abapgit_repos INTO DATA(lo_abapgit_repo).
+ IF lo_abapgit_repo->is_offline( ) = abap_true.
+ CONTINUE.
+ ELSEIF lo_abapgit_repo->get_package( ) = lv_super.
+ INSERT VALUE #(
+ package = lo_abapgit_repo->get_package( )
+ repo = lo_abapgit_repo ) INTO TABLE lt_repos.
+ ENDIF.
+ ENDLOOP.
+ ENDLOOP.
+ ENDLOOP.
+
+ et_repos = VALUE #( FOR ls_repo IN lt_repos ( ls_repo-repo ) ).
+
+ ENDMETHOD.
+
+
+ METHOD find_ags_merge_requests.
+ DATA: lv_query_url TYPE string,
+ lt_merge_requests TYPE zagr_ags_merge_req_tt.
+
+ FIND REGEX '(http|https):\/\/([\.\d\w]+)\/sap\/zabapgitserver\/git\/([-\d\w]+)(\.git)?'
+ IN io_repo->get_url( ) SUBMATCHES DATA(lv_protocol) DATA(lv_host) DATA(lv_repo_name).
+ IF sy-subrc <> 0.
+ RETURN.
+ ENDIF.
+
+ lv_query_url = |{ lv_protocol }://{ lv_host }/sap/zabapgitserver/rest/| &&
+ |find_merge_requests/{ lv_repo_name }/{ iv_branch_name }|.
+ TRY.
+ cl_http_client=>create_by_url( EXPORTING url = lv_query_url
+ IMPORTING client = DATA(lo_http_client) ).
+ DATA(lo_http_rest_client) = NEW cl_rest_http_client( lo_http_client ).
+ lo_http_rest_client->if_rest_resource~get( ).
+ DATA(lv_response) = lo_http_rest_client->if_rest_client~get_response_entity( )->get_binary_data( ).
+ CALL TRANSFORMATION id
+ SOURCE XML lv_response
+ RESULT data = lt_merge_requests.
+
+ LOOP AT lt_merge_requests REFERENCE INTO DATA(lr_merge_req).
+ DATA(lv_merge_request_url) = |{ lv_protocol }://{ lv_host }/sap/zabapgitserver/| &&
+ |{ lv_repo_name }/merge_request/{ lr_merge_req->*-id }|.
+ INSERT VALUE #( package = io_repo->get_package( ) url = lv_merge_request_url )
+ INTO TABLE ct_result.
+ ENDLOOP.
+ CATCH cx_transformation_error INTO DATA(lo_transformation_error).
+ RAISE EXCEPTION TYPE zcx_abapgit_review
+ EXPORTING
+ textid = zcx_abapgit_review=>read_ags_merge_request
+ previous = lo_transformation_error.
+ CATCH cx_rest_client_exception INTO DATA(lo_http_exception).
+ RAISE EXCEPTION TYPE zcx_abapgit_review
+ EXPORTING
+ textid = zcx_abapgit_review=>read_ags_merge_request
+ previous = lo_http_exception.
+ ENDTRY.
+
+ ENDMETHOD.
+
+
+ METHOD find_github_pull_requests.
+
+ FIND REGEX 'https:\/\/github\.com\/([-\d\w]+)\/([-\d\w]+)(\.git)?'
+ IN io_repo->get_url( ) SUBMATCHES DATA(lv_owner) DATA(lv_repo).
+ IF sy-subrc <> 0.
+ RETURN.
+ ENDIF.
+
+ DATA(li_github) = CAST zif_githubcom( NEW zcl_githubcom( create_http_client( ) ) ).
+ DATA(lt_pr) = li_github->pulls_list(
+ owner = lv_owner
+ repo = lv_repo
+ head = |{ lv_owner }:{ iv_branch_name }| ).
+ LOOP AT lt_pr REFERENCE INTO DATA(lr_pr).
+ INSERT VALUE #( package = io_repo->get_package( ) url = lr_pr->*-html_url )
+ INTO TABLE ct_result.
+ ENDLOOP.
+
+ ENDMETHOD.
+
+
+ METHOD find_pull_requests.
+
+ LOOP AT it_repos INTO DATA(lo_repo).
+ find_github_pull_requests( EXPORTING
+ io_repo = CAST zcl_abapgit_repo_online( lo_repo )
+ iv_branch_name = iv_branch_name
+ CHANGING ct_result = rt_result ).
+ find_ags_merge_requests( EXPORTING
+ io_repo = CAST zcl_abapgit_repo_online( lo_repo )
+ iv_branch_name = iv_branch_name
+ CHANGING ct_result = rt_result ).
+ ENDLOOP.
+
+ ENDMETHOD.
+
+
+ METHOD find_pull_request_urls.
+
+ find_abapgit_repos(
+ EXPORTING
+ iv_trkorr = iv_trkorr
+ IMPORTING
+ et_repos = DATA(lt_repos) ).
+ et_pull_requests = find_pull_requests(
+ it_repos = lt_repos
+ iv_branch_name = CONV string( iv_trkorr ) ).
+ et_packages = VALUE #( FOR lo_repo IN lt_repos ( lo_repo->get_package( ) ) ).
+
+ ENDMETHOD.
+
+
METHOD list_objects.
SELECT trkorr FROM e070
@@ -232,7 +411,7 @@ CLASS ZCL_ABAPGIT_REVIEW IMPLEMENTATION.
SELECT pgmid, object, obj_name FROM e071
INTO TABLE @DATA(lt_e071)
FOR ALL ENTRIES IN @lt_e070
- WHERE trkorr = @lt_e070-trkorr. "#EC CI_SUBRC
+ WHERE trkorr = @lt_e070-trkorr. "#EC CI_SUBRC
SORT lt_e071 BY pgmid object obj_name.
DELETE ADJACENT DUPLICATES FROM lt_e071 COMPARING pgmid object obj_name.
diff --git a/src/zcx_abapgit_review.clas.abap b/src/zcx_abapgit_review.clas.abap
new file mode 100644
index 0000000..ef8ac82
--- /dev/null
+++ b/src/zcx_abapgit_review.clas.abap
@@ -0,0 +1,46 @@
+CLASS zcx_abapgit_review DEFINITION
+ PUBLIC
+ INHERITING FROM cx_static_check
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ INTERFACES if_t100_message .
+
+ CONSTANTS:
+ BEGIN OF read_ags_merge_request,
+ msgid TYPE symsgid VALUE 'ZABAPGIT_REVIEW',
+ msgno TYPE symsgno VALUE '000',
+ attr1 TYPE scx_attrname VALUE '',
+ attr2 TYPE scx_attrname VALUE '',
+ attr3 TYPE scx_attrname VALUE '',
+ attr4 TYPE scx_attrname VALUE '',
+ END OF read_ags_merge_request .
+
+ METHODS constructor
+ IMPORTING
+ !textid LIKE if_t100_message=>t100key OPTIONAL
+ !previous LIKE previous OPTIONAL .
+PROTECTED SECTION.
+PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZCX_ABAPGIT_REVIEW IMPLEMENTATION.
+
+
+ method CONSTRUCTOR.
+CALL METHOD SUPER->CONSTRUCTOR
+EXPORTING
+PREVIOUS = PREVIOUS
+.
+clear me->textid.
+if textid is initial.
+ IF_T100_MESSAGE~T100KEY = IF_T100_MESSAGE=>DEFAULT_TEXTID.
+else.
+ IF_T100_MESSAGE~T100KEY = TEXTID.
+endif.
+ endmethod.
+ENDCLASS.
diff --git a/src/zcx_abapgit_review.clas.xml b/src/zcx_abapgit_review.clas.xml
new file mode 100644
index 0000000..0faf6c5
--- /dev/null
+++ b/src/zcx_abapgit_review.clas.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ ZCX_ABAPGIT_REVIEW
+ E
+ abapGit Review
+ 40
+ 1
+ X
+ X
+ X
+
+
+
+