abapGit/src/http/zcl_abapgit_pr_enumerator.clas.abap
Alexander Tsybulsky a4e6c87985
Switching to PRs (#3695)
* string map: public entries (read only)

* port http agent

* draft wip

* drafting

* fix SSL

* port ajson

* integrate ajson and http_agent

* agent global headers

* github enumerator

* update ajson

* draft wip

* enumerator factory

* http_agent via factory

* proxy

* repo->switch_origin draft

* refactor enum factory

* Revert "refactor enum factory"

This reverts commit bcfef40b38991adfe5f73677919db6bd0c652f7c.

* page wiring draft

* scripts draft

* "let it work!"

* repo setings page draft

* linter

* linter

* linter

* linter

* linter

* better settings page

* finetune page

* cleanups

* change hotkey

* fix ajson_error

* Update src/zcl_abapgit_repo_online.clas.abap

Co-authored-by: Lars Hvam <larshp@hotmail.com>

* abaplint nesting 6

* remove description

* back to good old popups

* linter

* move commands to branches dropdown

* auth helpers

* move json to separate package

Co-authored-by: Lars Hvam <larshp@hotmail.com>
2020-08-27 07:47:27 +02:00

131 lines
2.7 KiB
ABAP

CLASS zcl_abapgit_pr_enumerator DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS constructor
IMPORTING
io_repo TYPE REF TO zcl_abapgit_repo
RAISING
zcx_abapgit_exception.
METHODS has_pulls
RETURNING
VALUE(rv_yes) TYPE abap_bool
RAISING
zcx_abapgit_exception.
METHODS get_pulls
RETURNING
VALUE(rt_pulls) TYPE zif_abapgit_pr_enum_provider=>tty_pulls
RAISING
zcx_abapgit_exception.
CLASS-METHODS new
IMPORTING
io_repo TYPE REF TO zcl_abapgit_repo
RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_pr_enumerator
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mv_repo_url TYPE string.
DATA mi_enum_provider TYPE REF TO zif_abapgit_pr_enum_provider.
CLASS-METHODS create_provider
IMPORTING
iv_repo_url TYPE string
RETURNING
VALUE(ri_provider) TYPE REF TO zif_abapgit_pr_enum_provider
RAISING
zcx_abapgit_exception.
ENDCLASS.
CLASS ZCL_ABAPGIT_PR_ENUMERATOR IMPLEMENTATION.
METHOD constructor.
DATA lo_repo_online TYPE REF TO zcl_abapgit_repo_online.
IF io_repo IS NOT BOUND OR io_repo->is_offline( ) = abap_true.
RETURN.
ENDIF.
lo_repo_online ?= io_repo.
mv_repo_url = to_lower( lo_repo_online->get_url( ) ).
TRY.
mi_enum_provider = create_provider( mv_repo_url ).
CATCH zcx_abapgit_exception.
ENDTRY.
ENDMETHOD.
METHOD create_provider.
DATA li_agent TYPE REF TO zif_abapgit_http_agent.
DATA lv_user TYPE string.
DATA lv_repo TYPE string.
li_agent = zcl_abapgit_factory=>get_http_agent( ).
FIND ALL OCCURRENCES OF REGEX 'github\.com\/([^\/]+)\/([^\/]+)'
IN iv_repo_url
SUBMATCHES lv_user lv_repo.
IF sy-subrc = 0.
lv_repo = replace(
val = lv_repo
regex = '\.git$'
with = '' ).
CREATE OBJECT ri_provider TYPE zcl_abapgit_pr_enum_github
EXPORTING
iv_user_and_repo = |{ lv_user }/{ lv_repo }|
ii_http_agent = li_agent.
ELSE.
zcx_abapgit_exception=>raise( |PR enumeration is not supported for { iv_repo_url }| ).
ENDIF.
" TODO somewhen more providers
ENDMETHOD.
METHOD get_pulls.
IF mi_enum_provider IS NOT BOUND.
RETURN.
ENDIF.
rt_pulls = mi_enum_provider->list_pull_requests( ).
" TODO caching ?
ENDMETHOD.
METHOD has_pulls.
IF mi_enum_provider IS NOT BOUND.
RETURN. " false
ENDIF.
IF get_pulls( ) IS NOT INITIAL.
rv_yes = abap_true.
ENDIF.
ENDMETHOD.
METHOD new.
CREATE OBJECT ro_instance EXPORTING io_repo = io_repo.
ENDMETHOD.
ENDCLASS.