Skip to content

List github pull requests and ags merge requests #51

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/zabapgit_review.msag.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_MSAG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<T100A>
<ARBGB>ZABAPGIT_REVIEW</ARBGB>
<MASTERLANG>E</MASTERLANG>
<STEXT>abapGit Review</STEXT>
</T100A>
<T100>
<T100>
<SPRSL>E</SPRSL>
<ARBGB>ZABAPGIT_REVIEW</ARBGB>
<MSGNR>000</MSGNR>
<TEXT>Cannot read merge requests from abapGitServer.</TEXT>
</T100>
</T100>
</asx:values>
</asx:abap>
</abapGit>
26 changes: 26 additions & 0 deletions src/zagr_ags_merge_req.tabl.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD02V>
<TABNAME>ZAGR_AGS_MERGE_REQ</TABNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<TABCLASS>INTTAB</TABCLASS>
<DDTEXT>abapGitServer merge requests</DDTEXT>
<EXCLASS>3</EXCLASS>
</DD02V>
<DD03P_TABLE>
<DD03P>
<FIELDNAME>ID</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>X</INTTYPE>
<INTLEN>000004</INTLEN>
<DATATYPE>INT4</DATATYPE>
<LENG>000010</LENG>
<MASK> INT4</MASK>
<DDTEXT>Id</DDTEXT>
</DD03P>
</DD03P_TABLE>
</asx:values>
</asx:abap>
</abapGit>
18 changes: 18 additions & 0 deletions src/zagr_ags_merge_req_tt.ttyp.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TTYP" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD40V>
<TYPENAME>ZAGR_AGS_MERGE_REQ_TT</TYPENAME>
<DDLANGUAGE>E</DDLANGUAGE>
<ROWTYPE>ZAGR_AGS_MERGE_REQ</ROWTYPE>
<ROWKIND>S</ROWKIND>
<DATATYPE>STRU</DATATYPE>
<ACCESSMODE>T</ACCESSMODE>
<KEYDEF>D</KEYDEF>
<KEYKIND>N</KEYKIND>
<DDTEXT>abapGitServer merge requests</DDTEXT>
</DD40V>
</asx:values>
</asx:abap>
</abapGit>
183 changes: 181 additions & 2 deletions src/zcl_abapgit_review.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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).
Expand All @@ -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
Expand All @@ -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.

Expand Down
46 changes: 46 additions & 0 deletions src/zcx_abapgit_review.clas.abap
Original file line number Diff line number Diff line change
@@ -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.
17 changes: 17 additions & 0 deletions src/zcx_abapgit_review.clas.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCX_ABAPGIT_REVIEW</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit Review</DESCRIPT>
<CATEGORY>40</CATEGORY>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>