lcl_http to global (#1199)

* lcl_http to global

* remove dependency lcl_git_transport -> repo

remove dependency lcl_git_transport -> lcl_repo_online

* lcl_git_transport to global

* indentation + cleanup includes
This commit is contained in:
Lars Hvam 2018-02-11 14:08:45 +01:00 committed by GitHub
parent 540ebe16e1
commit 3722c26019
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 450 additions and 591 deletions

View File

@ -0,0 +1,283 @@
CLASS zcl_abapgit_git_transport DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
* remote to local
CLASS-METHODS upload_pack
IMPORTING iv_url TYPE string
iv_branch_name TYPE string
iv_deepen TYPE abap_bool DEFAULT abap_true
it_branches TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt OPTIONAL
EXPORTING et_objects TYPE zif_abapgit_definitions=>ty_objects_tt
ev_branch TYPE zif_abapgit_definitions=>ty_sha1
RAISING zcx_abapgit_exception.
* local to remote
CLASS-METHODS receive_pack
IMPORTING iv_url TYPE string
iv_old TYPE zif_abapgit_definitions=>ty_sha1
iv_new TYPE zif_abapgit_definitions=>ty_sha1
iv_branch_name TYPE string
iv_pack TYPE xstring
RAISING zcx_abapgit_exception.
CLASS-METHODS branches
IMPORTING iv_url TYPE string
RETURNING VALUE(ro_branch_list) TYPE REF TO zcl_abapgit_git_branch_list
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
CONSTANTS: BEGIN OF c_service,
receive TYPE string VALUE 'receive', "#EC NOTEXT
upload TYPE string VALUE 'upload', "#EC NOTEXT
END OF c_service.
CLASS-METHODS branch_list
IMPORTING iv_url TYPE string
iv_service TYPE string
EXPORTING eo_client TYPE REF TO zcl_abapgit_http_client
eo_branch_list TYPE REF TO zcl_abapgit_git_branch_list
RAISING zcx_abapgit_exception.
CLASS-METHODS find_branch
IMPORTING iv_url TYPE string
iv_service TYPE string
iv_branch_name TYPE string
EXPORTING eo_client TYPE REF TO zcl_abapgit_http_client
ev_branch TYPE zif_abapgit_definitions=>ty_sha1
RAISING zcx_abapgit_exception.
CLASS-METHODS parse
EXPORTING ev_pack TYPE xstring
CHANGING cv_data TYPE xstring
RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ZCL_ABAPGIT_GIT_TRANSPORT IMPLEMENTATION.
METHOD branches.
DATA: lo_client TYPE REF TO zcl_abapgit_http_client.
branch_list(
EXPORTING
iv_url = iv_url
iv_service = c_service-upload
IMPORTING
eo_client = lo_client
eo_branch_list = ro_branch_list ).
lo_client->close( ).
ENDMETHOD. "branches
METHOD branch_list.
DATA: lv_data TYPE string.
eo_client = zcl_abapgit_http=>create_by_url(
iv_url = iv_url
iv_service = iv_service ).
lv_data = eo_client->get_cdata( ).
CREATE OBJECT eo_branch_list
EXPORTING
iv_data = lv_data.
ENDMETHOD. "branch_list
METHOD find_branch.
DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list.
branch_list(
EXPORTING
iv_url = iv_url
iv_service = iv_service
IMPORTING
eo_client = eo_client
eo_branch_list = lo_branch_list ).
IF ev_branch IS SUPPLIED.
ev_branch = lo_branch_list->find_by_name( iv_branch_name )-sha1.
ENDIF.
ENDMETHOD. "find_branch
METHOD parse.
CONSTANTS: lc_band1 TYPE x VALUE '01'.
DATA: lv_len TYPE i,
lv_contents TYPE xstring,
lv_pack TYPE xstring.
WHILE xstrlen( cv_data ) >= 4.
lv_len = zcl_abapgit_git_utils=>length_utf8_hex( cv_data ).
IF lv_len > xstrlen( cv_data ).
zcx_abapgit_exception=>raise( 'parse, string length too large' ).
ENDIF.
lv_contents = cv_data(lv_len).
IF lv_len = 0.
cv_data = cv_data+4.
CONTINUE.
ELSE.
cv_data = cv_data+lv_len.
ENDIF.
lv_contents = lv_contents+4.
IF xstrlen( lv_contents ) > 1 AND lv_contents(1) = lc_band1.
CONCATENATE lv_pack lv_contents+1 INTO lv_pack IN BYTE MODE.
ENDIF.
ENDWHILE.
ev_pack = lv_pack.
ENDMETHOD. "parse
METHOD receive_pack.
DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
lv_cmd_pkt TYPE string,
lv_line TYPE string,
lv_tmp TYPE xstring,
lv_xstring TYPE xstring,
lv_string TYPE string,
lv_cap_list TYPE string,
lv_buffer TYPE string.
find_branch(
EXPORTING
iv_url = iv_url
iv_service = c_service-receive
iv_branch_name = iv_branch_name
IMPORTING
eo_client = lo_client ).
lo_client->set_headers(
iv_url = iv_url
iv_service = c_service-receive ).
lv_cap_list = 'report-status agent=' && zcl_abapgit_http=>get_agent( ) ##NO_TEXT.
lv_line = iv_old &&
` ` &&
iv_new &&
` ` &&
iv_branch_name &&
zcl_abapgit_git_utils=>get_null( ) &&
` ` &&
lv_cap_list &&
zif_abapgit_definitions=>gc_newline. "#EC NOTEXT
lv_cmd_pkt = zcl_abapgit_git_utils=>pkt_string( lv_line ).
lv_buffer = lv_cmd_pkt && '0000'.
lv_tmp = zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ).
CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE.
lv_xstring = lo_client->send_receive_close( lv_xstring ).
lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ).
IF NOT lv_string CP '*unpack ok*'.
zcx_abapgit_exception=>raise( 'unpack not ok' ).
ELSEIF lv_string CP '*pre-receive hook declined*'.
zcx_abapgit_exception=>raise( 'pre-receive hook declined' ).
ELSEIF lv_string CP '*funny refname*'.
zcx_abapgit_exception=>raise( 'funny refname' ).
ELSEIF lv_string CP '*failed to update ref*'.
zcx_abapgit_exception=>raise( 'failed to update ref' ).
ENDIF.
ENDMETHOD. "receive_pack
METHOD upload_pack.
DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
lv_buffer TYPE string,
lv_xstring TYPE xstring,
lv_line TYPE string,
lv_pack TYPE xstring,
lt_branches TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt,
lv_capa TYPE string.
FIELD-SYMBOLS: <ls_branch> LIKE LINE OF lt_branches.
CLEAR et_objects.
find_branch(
EXPORTING
iv_url = iv_url
iv_service = c_service-upload
iv_branch_name = iv_branch_name
IMPORTING
eo_client = lo_client
ev_branch = ev_branch ).
IF it_branches IS INITIAL.
APPEND INITIAL LINE TO lt_branches ASSIGNING <ls_branch>.
<ls_branch>-sha1 = ev_branch.
ELSE.
lt_branches = it_branches.
ENDIF.
lo_client->set_headers( iv_url = iv_url
iv_service = c_service-upload ).
LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>.
IF sy-tabix = 1.
lv_capa = 'side-band-64k no-progress multi_ack agent='
&& zcl_abapgit_http=>get_agent( ) ##NO_TEXT.
lv_line = 'want' && ` ` && <ls_branch>-sha1
&& ` ` && lv_capa && zif_abapgit_definitions=>gc_newline. "#EC NOTEXT
ELSE.
lv_line = 'want' && ` ` && <ls_branch>-sha1
&& zif_abapgit_definitions=>gc_newline. "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( lv_line ).
ENDLOOP.
IF iv_deepen = abap_true.
lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( 'deepen 1'
&& zif_abapgit_definitions=>gc_newline ). "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer
&& '0000'
&& '0009done' && zif_abapgit_definitions=>gc_newline.
lv_xstring = lo_client->send_receive_close(
zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ) ).
parse( IMPORTING ev_pack = lv_pack
CHANGING cv_data = lv_xstring ).
IF lv_pack IS INITIAL.
zcx_abapgit_exception=>raise( 'empty pack' ).
ENDIF.
et_objects = zcl_abapgit_git_pack=>decode( lv_pack ).
ENDMETHOD. "upload_pack
ENDCLASS.

View File

@ -0,0 +1,19 @@
<?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>ZCL_ABAPGIT_GIT_TRANSPORT</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>Git transport</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSFINAL>X</CLSFINAL>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -1,8 +1,7 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_HTTP
*&---------------------------------------------------------------------*
CLASS lcl_http DEFINITION FINAL.
CLASS zcl_abapgit_http DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CONSTANTS: BEGIN OF gc_scheme,
@ -36,14 +35,84 @@ CLASS lcl_http DEFINITION FINAL.
ENDCLASS.
CLASS lcl_http IMPLEMENTATION.
METHOD get_agent.
* bitbucket require agent prefix = "git/"
rv_agent = 'git/abapGit-' && zif_abapgit_definitions=>gc_abap_version.
CLASS ZCL_ABAPGIT_HTTP IMPLEMENTATION.
METHOD acquire_login_details.
DATA: lv_default_user TYPE string,
lv_user TYPE string,
lv_pass TYPE string,
lo_digest TYPE REF TO zcl_abapgit_http_digest.
lv_default_user = zcl_abapgit_persistence_user=>get_instance( )->get_repo_login( iv_url ).
lv_user = lv_default_user.
zcl_abapgit_password_dialog=>popup(
EXPORTING
iv_repo_url = iv_url
CHANGING
cv_user = lv_user
cv_pass = lv_pass ).
IF lv_user IS INITIAL.
zcx_abapgit_exception=>raise( 'HTTP 401, unauthorized' ).
ENDIF.
IF lv_user <> lv_default_user.
zcl_abapgit_persistence_user=>get_instance( )->set_repo_login(
iv_url = iv_url
iv_login = lv_user ).
ENDIF.
" Offer two factor authentication if it is available and required
zcl_abapgit_2fa_auth_registry=>use_2fa_if_required(
EXPORTING
iv_url = iv_url
CHANGING
cv_username = lv_user
cv_password = lv_pass ).
rv_scheme = ii_client->response->get_header_field( 'www-authenticate' ).
FIND REGEX '^(\w+)' IN rv_scheme SUBMATCHES rv_scheme.
CASE rv_scheme.
WHEN gc_scheme-digest.
* https://en.wikipedia.org/wiki/Digest_access_authentication
* e.g. used by https://www.gerritcodereview.com/
CREATE OBJECT lo_digest
EXPORTING
ii_client = ii_client
iv_username = lv_user
iv_password = lv_pass.
lo_digest->run( ii_client ).
io_client->set_digest( lo_digest ).
WHEN OTHERS.
* https://en.wikipedia.org/wiki/Basic_access_authentication
ii_client->authenticate(
username = lv_user
password = lv_pass ).
ENDCASE.
ENDMETHOD. "acquire_login_details
METHOD check_auth_requested.
DATA: lv_code TYPE i.
ii_client->response->get_status(
IMPORTING
code = lv_code ).
IF lv_code = 401.
rv_auth_requested = abap_true.
ENDIF.
ENDMETHOD. "check_auth_requested
ENDMETHOD.
METHOD create_by_url.
@ -131,6 +200,15 @@ CLASS lcl_http IMPLEMENTATION.
ENDMETHOD.
METHOD get_agent.
* bitbucket require agent prefix = "git/"
rv_agent = 'git/abapGit-' && zif_abapgit_definitions=>gc_abap_version.
ENDMETHOD.
METHOD is_local_system.
DATA: lv_host TYPE string,
@ -164,77 +242,4 @@ CLASS lcl_http IMPLEMENTATION.
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD.
METHOD check_auth_requested.
DATA: lv_code TYPE i.
ii_client->response->get_status(
IMPORTING
code = lv_code ).
IF lv_code = 401.
rv_auth_requested = abap_true.
ENDIF.
ENDMETHOD. "check_auth_requested
METHOD acquire_login_details.
DATA: lv_default_user TYPE string,
lv_user TYPE string,
lv_pass TYPE string,
lo_digest TYPE REF TO zcl_abapgit_http_digest.
lv_default_user = zcl_abapgit_persistence_user=>get_instance( )->get_repo_login( iv_url ).
lv_user = lv_default_user.
zcl_abapgit_password_dialog=>popup(
EXPORTING
iv_repo_url = iv_url
CHANGING
cv_user = lv_user
cv_pass = lv_pass ).
IF lv_user IS INITIAL.
zcx_abapgit_exception=>raise( 'HTTP 401, unauthorized' ).
ENDIF.
IF lv_user <> lv_default_user.
zcl_abapgit_persistence_user=>get_instance( )->set_repo_login(
iv_url = iv_url
iv_login = lv_user ).
ENDIF.
" Offer two factor authentication if it is available and required
zcl_abapgit_2fa_auth_registry=>use_2fa_if_required(
EXPORTING
iv_url = iv_url
CHANGING
cv_username = lv_user
cv_password = lv_pass ).
rv_scheme = ii_client->response->get_header_field( 'www-authenticate' ).
FIND REGEX '^(\w+)' IN rv_scheme SUBMATCHES rv_scheme.
CASE rv_scheme.
WHEN gc_scheme-digest.
* https://en.wikipedia.org/wiki/Digest_access_authentication
* e.g. used by https://www.gerritcodereview.com/
CREATE OBJECT lo_digest
EXPORTING
ii_client = ii_client
iv_username = lv_user
iv_password = lv_pass.
lo_digest->run( ii_client ).
io_client->set_digest( lo_digest ).
WHEN OTHERS.
* https://en.wikipedia.org/wiki/Basic_access_authentication
ii_client->authenticate(
username = lv_user
password = lv_pass ).
ENDCASE.
ENDMETHOD. "acquire_login_details
ENDCLASS.

View File

@ -0,0 +1,19 @@
<?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>ZCL_ABAPGIT_HTTP</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>HTTP</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSFINAL>X</CLSFINAL>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -35,13 +35,10 @@ INCLUDE zabapgit_password_dialog. " !!! Contains SELECTION SCREEN
INCLUDE zabapgit_app. " Some deferred definitions here
INCLUDE zabapgit_authorizations.
INCLUDE zabapgit_exit.
INCLUDE zabapgit_proxy.
INCLUDE zabapgit_repo.
INCLUDE zabapgit_news.
INCLUDE zabapgit_stage_logic.
INCLUDE zabapgit_2fa.
INCLUDE zabapgit_http.
INCLUDE zabapgit_git.
INCLUDE zabapgit_objects.
INCLUDE zabapgit_tadir.
@ -50,14 +47,11 @@ INCLUDE zabapgit_popups.
INCLUDE zabapgit_zip.
INCLUDE zabapgit_objects_impl.
INCLUDE zabapgit_skip_objects.
INCLUDE zabapgit_repo_impl.
INCLUDE zabapgit_background.
INCLUDE zabapgit_transport.
INCLUDE zabapgit_services. " All services here
INCLUDE zabapgit_gui_asset_manager.
INCLUDE zabapgit_gui_pages. " All GUI pages here
INCLUDE zabapgit_gui_pages_userexit IF FOUND.
INCLUDE zabapgit_gui_router.

View File

@ -1,5 +0,0 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_2FA
*&---------------------------------------------------------------------*
* todo, include to be deleted

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_2FA</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<SUBC>I</SUBC>
<FIXPT>X</FIXPT>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>ZABAPGIT_2FA</ENTRY>
<LENGTH>12</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -2,288 +2,6 @@
*& Include ZABAPGIT_GIT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_transport DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_git_transport DEFINITION FINAL.
PUBLIC SECTION.
* remote to local
CLASS-METHODS upload_pack
IMPORTING io_repo TYPE REF TO lcl_repo_online
iv_deepen TYPE abap_bool DEFAULT abap_true
it_branches TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt OPTIONAL
EXPORTING et_objects TYPE zif_abapgit_definitions=>ty_objects_tt
ev_branch TYPE zif_abapgit_definitions=>ty_sha1
RAISING zcx_abapgit_exception.
* local to remote
CLASS-METHODS receive_pack
IMPORTING iv_url TYPE string
iv_old TYPE zif_abapgit_definitions=>ty_sha1
iv_new TYPE zif_abapgit_definitions=>ty_sha1
iv_branch_name TYPE string
iv_pack TYPE xstring
RAISING zcx_abapgit_exception.
CLASS-METHODS branches
IMPORTING iv_url TYPE string
RETURNING VALUE(ro_branch_list) TYPE REF TO zcl_abapgit_git_branch_list
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
CONSTANTS: BEGIN OF c_service,
receive TYPE string VALUE 'receive', "#EC NOTEXT
upload TYPE string VALUE 'upload', "#EC NOTEXT
END OF c_service.
CLASS-METHODS branch_list
IMPORTING iv_url TYPE string
iv_service TYPE string
EXPORTING eo_client TYPE REF TO zcl_abapgit_http_client
eo_branch_list TYPE REF TO zcl_abapgit_git_branch_list
RAISING zcx_abapgit_exception.
CLASS-METHODS find_branch
IMPORTING iv_url TYPE string
iv_service TYPE string
iv_branch_name TYPE string
EXPORTING eo_client TYPE REF TO zcl_abapgit_http_client
ev_branch TYPE zif_abapgit_definitions=>ty_sha1
RAISING zcx_abapgit_exception.
CLASS-METHODS parse
EXPORTING ev_pack TYPE xstring
CHANGING cv_data TYPE xstring
RAISING zcx_abapgit_exception.
ENDCLASS. "lcl_transport DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_transport IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_git_transport IMPLEMENTATION.
METHOD find_branch.
DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list.
branch_list(
EXPORTING
iv_url = iv_url
iv_service = iv_service
IMPORTING
eo_client = eo_client
eo_branch_list = lo_branch_list ).
IF ev_branch IS SUPPLIED.
ev_branch = lo_branch_list->find_by_name( iv_branch_name )-sha1.
ENDIF.
ENDMETHOD. "find_branch
METHOD branches.
DATA: lo_client TYPE REF TO zcl_abapgit_http_client.
lcl_git_transport=>branch_list(
EXPORTING
iv_url = iv_url
iv_service = c_service-upload
IMPORTING
eo_client = lo_client
eo_branch_list = ro_branch_list ).
lo_client->close( ).
ENDMETHOD. "branches
METHOD branch_list.
DATA: lv_data TYPE string.
eo_client = lcl_http=>create_by_url(
iv_url = iv_url
iv_service = iv_service ).
lv_data = eo_client->get_cdata( ).
CREATE OBJECT eo_branch_list
EXPORTING
iv_data = lv_data.
ENDMETHOD. "branch_list
METHOD receive_pack.
DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
lv_cmd_pkt TYPE string,
lv_line TYPE string,
lv_tmp TYPE xstring,
lv_xstring TYPE xstring,
lv_string TYPE string,
lv_cap_list TYPE string,
lv_buffer TYPE string.
find_branch(
EXPORTING
iv_url = iv_url
iv_service = c_service-receive
iv_branch_name = iv_branch_name
IMPORTING
eo_client = lo_client ).
lo_client->set_headers(
iv_url = iv_url
iv_service = c_service-receive ).
lv_cap_list = 'report-status agent=' && lcl_http=>get_agent( ) ##NO_TEXT.
lv_line = iv_old &&
` ` &&
iv_new &&
` ` &&
iv_branch_name &&
zcl_abapgit_git_utils=>get_null( ) &&
` ` &&
lv_cap_list &&
zif_abapgit_definitions=>gc_newline. "#EC NOTEXT
lv_cmd_pkt = zcl_abapgit_git_utils=>pkt_string( lv_line ).
lv_buffer = lv_cmd_pkt && '0000'.
lv_tmp = zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ).
CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE.
lv_xstring = lo_client->send_receive_close( lv_xstring ).
lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ).
IF NOT lv_string CP '*unpack ok*'.
zcx_abapgit_exception=>raise( 'unpack not ok' ).
ELSEIF lv_string CP '*pre-receive hook declined*'.
zcx_abapgit_exception=>raise( 'pre-receive hook declined' ).
ELSEIF lv_string CP '*funny refname*'.
zcx_abapgit_exception=>raise( 'funny refname' ).
ELSEIF lv_string CP '*failed to update ref*'.
zcx_abapgit_exception=>raise( 'failed to update ref' ).
ENDIF.
ENDMETHOD. "receive_pack
METHOD parse.
CONSTANTS: lc_band1 TYPE x VALUE '01'.
DATA: lv_len TYPE i,
lv_contents TYPE xstring,
lv_pack TYPE xstring.
WHILE xstrlen( cv_data ) >= 4.
lv_len = zcl_abapgit_git_utils=>length_utf8_hex( cv_data ).
IF lv_len > xstrlen( cv_data ).
zcx_abapgit_exception=>raise( 'parse, string length too large' ).
ENDIF.
lv_contents = cv_data(lv_len).
IF lv_len = 0.
cv_data = cv_data+4.
CONTINUE.
ELSE.
cv_data = cv_data+lv_len.
ENDIF.
lv_contents = lv_contents+4.
IF xstrlen( lv_contents ) > 1 AND lv_contents(1) = lc_band1.
CONCATENATE lv_pack lv_contents+1 INTO lv_pack IN BYTE MODE.
ENDIF.
ENDWHILE.
ev_pack = lv_pack.
ENDMETHOD. "parse
METHOD upload_pack.
DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
lv_buffer TYPE string,
lv_xstring TYPE xstring,
lv_line TYPE string,
lv_pack TYPE xstring,
lt_branches TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt,
lv_capa TYPE string.
FIELD-SYMBOLS: <ls_branch> LIKE LINE OF lt_branches.
CLEAR et_objects.
find_branch(
EXPORTING
iv_url = io_repo->get_url( )
iv_service = c_service-upload
iv_branch_name = io_repo->get_branch_name( )
IMPORTING
eo_client = lo_client
ev_branch = ev_branch ).
IF it_branches IS INITIAL.
APPEND INITIAL LINE TO lt_branches ASSIGNING <ls_branch>.
<ls_branch>-sha1 = ev_branch.
ELSE.
lt_branches = it_branches.
ENDIF.
lo_client->set_headers( iv_url = io_repo->get_url( )
iv_service = c_service-upload ).
LOOP AT lt_branches FROM 1 ASSIGNING <ls_branch>.
IF sy-tabix = 1.
lv_capa = 'side-band-64k no-progress multi_ack agent='
&& lcl_http=>get_agent( ) ##NO_TEXT.
lv_line = 'want' && ` ` && <ls_branch>-sha1
&& ` ` && lv_capa && zif_abapgit_definitions=>gc_newline. "#EC NOTEXT
ELSE.
lv_line = 'want' && ` ` && <ls_branch>-sha1
&& zif_abapgit_definitions=>gc_newline. "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( lv_line ).
ENDLOOP.
IF iv_deepen = abap_true.
lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( 'deepen 1'
&& zif_abapgit_definitions=>gc_newline ). "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer
&& '0000'
&& '0009done' && zif_abapgit_definitions=>gc_newline.
lv_xstring = lo_client->send_receive_close(
zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ) ).
parse( IMPORTING ev_pack = lv_pack
CHANGING cv_data = lv_xstring ).
IF lv_pack IS INITIAL.
zcx_abapgit_exception=>raise( 'empty pack' ).
ENDIF.
et_objects = zcl_abapgit_git_pack=>decode( lv_pack ).
ENDMETHOD. "upload_pack
ENDCLASS. "lcl_transport IMPLEMENTATION
CLASS ltcl_git_porcelain DEFINITION DEFERRED.
*----------------------------------------------------------------------*
@ -490,7 +208,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
iv_type = zif_abapgit_definitions=>gc_type-commit
iv_data = lv_commit ).
lcl_git_transport=>receive_pack(
zcl_abapgit_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = io_stage->get_branch_sha1( )
iv_new = rv_branch
@ -518,7 +236,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514
lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
lcl_git_transport=>receive_pack(
zcl_abapgit_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = is_branch-sha1
iv_new = c_zero
@ -537,7 +255,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514
lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
lcl_git_transport=>receive_pack(
zcl_abapgit_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = is_tag-sha1
iv_new = c_zero
@ -559,7 +277,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514
lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
lcl_git_transport=>receive_pack(
zcl_abapgit_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = c_zero
iv_new = iv_from
@ -581,7 +299,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514
lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
lcl_git_transport=>receive_pack(
zcl_abapgit_git_transport=>receive_pack(
iv_url = io_repo->get_url( )
iv_old = c_zero
iv_new = iv_from
@ -616,9 +334,13 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
<ls_branch>-name = io_stage->get_branch_name( ).
<ls_branch>-sha1 = io_stage->get_branch_sha1( ).
lcl_git_transport=>upload_pack( EXPORTING io_repo = io_repo
it_branches = lt_branches
IMPORTING et_objects = lt_objects ).
zcl_abapgit_git_transport=>upload_pack(
EXPORTING
iv_url = io_repo->get_url( )
iv_branch_name = io_repo->get_branch_name( )
it_branches = lt_branches
IMPORTING
et_objects = lt_objects ).
ENDIF.
lt_expanded = full_tree( it_objects = lt_objects
@ -745,9 +467,13 @@ CLASS lcl_git_porcelain IMPLEMENTATION.
CLEAR et_objects.
CLEAR ev_branch.
lcl_git_transport=>upload_pack( EXPORTING io_repo = io_repo
IMPORTING et_objects = et_objects
ev_branch = ev_branch ).
zcl_abapgit_git_transport=>upload_pack(
EXPORTING
iv_url = io_repo->get_url( )
iv_branch_name = io_repo->get_branch_name( )
IMPORTING
et_objects = et_objects
ev_branch = ev_branch ).
READ TABLE et_objects INTO ls_object WITH KEY sha1 = ev_branch type = zif_abapgit_definitions=>gc_type-commit.
IF sy-subrc <> 0.

View File

@ -1,5 +0,0 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_GUI_ASSET_MANAGER
*&---------------------------------------------------------------------*
* todo, include to be deleted

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_GUI_ASSET_MANAGER</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_GUI_ASSET_MANAGER</ENTRY>
<LENGTH>34</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -6,7 +6,6 @@
* Super class & common html chunks
INCLUDE zabapgit_html_chunks.
INCLUDE zabapgit_page.
* Utils and helpers
INCLUDE zabapgit_repo_browser_util.

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_HTTP</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_HTTP</ENTRY>
<LENGTH>21</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -1,5 +0,0 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE
*&---------------------------------------------------------------------*
* todo, include to be deleted

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_PAGE</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_PAGE</ENTRY>
<LENGTH>21</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -175,15 +175,19 @@ CLASS lcl_branch_overview IMPLEMENTATION.
"TODO refactor
lo_branch_list = lcl_git_transport=>branches( io_repo->get_url( ) ).
lo_branch_list = zcl_abapgit_git_transport=>branches( io_repo->get_url( ) ).
gt_branches = lo_branch_list->get_branches_only( ).
gt_tags = lo_branch_list->get_tags_only( ).
lcl_git_transport=>upload_pack( EXPORTING io_repo = io_repo
iv_deepen = abap_false
it_branches = gt_branches
IMPORTING et_objects = rt_objects ).
zcl_abapgit_git_transport=>upload_pack(
EXPORTING
iv_url = io_repo->get_url( )
iv_branch_name = io_repo->get_branch_name( )
iv_deepen = abap_false
it_branches = gt_branches
IMPORTING
et_objects = rt_objects ).
DELETE rt_objects WHERE type = zif_abapgit_definitions=>gc_type-blob.

View File

@ -297,7 +297,7 @@ CLASS lcl_merge IMPLEMENTATION.
DATA: lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list,
lt_upload TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt.
lo_branch_list = lcl_git_transport=>branches( gs_merge-repo->get_url( ) ).
lo_branch_list = zcl_abapgit_git_transport=>branches( gs_merge-repo->get_url( ) ).
gs_merge-source = lo_branch_list->find_by_name(
zcl_abapgit_git_branch_list=>complete_heads_branch_name( iv_source ) ).
gs_merge-target = lo_branch_list->find_by_name(
@ -306,10 +306,14 @@ CLASS lcl_merge IMPLEMENTATION.
APPEND gs_merge-source TO lt_upload.
APPEND gs_merge-target TO lt_upload.
lcl_git_transport=>upload_pack( EXPORTING io_repo = gs_merge-repo
iv_deepen = abap_false
it_branches = lt_upload
IMPORTING et_objects = gt_objects ).
zcl_abapgit_git_transport=>upload_pack(
EXPORTING
iv_url = gs_merge-repo->get_url( )
iv_branch_name = gs_merge-repo->get_branch_name( )
iv_deepen = abap_false
it_branches = lt_upload
IMPORTING
et_objects = gt_objects ).
ENDMETHOD.

View File

@ -510,7 +510,7 @@ CLASS lcl_popups IMPLEMENTATION.
<ls_branch> LIKE LINE OF lt_branches.
lo_branches = lcl_git_transport=>branches( iv_url ).
lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
lt_branches = lo_branches->get_branches_only( ).
lv_head_suffix = | ({ zcl_abapgit_git_branch_list=>c_head_name })|.
lv_head_symref = lo_branches->get_head_symref( ).
@ -616,7 +616,7 @@ CLASS lcl_popups IMPLEMENTATION.
FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection,
<ls_tag> LIKE LINE OF lt_tags.
lo_branches = lcl_git_transport=>branches( iv_url ).
lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
lt_tags = lo_branches->get_tags_only( ).
IF lines( lt_tags ) = 0.

View File

@ -1,5 +0,0 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_proxy
*&---------------------------------------------------------------------*
* todo, include to be deleted

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_PROXY</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<SUBC>I</SUBC>
<FIXPT>X</FIXPT>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>ZABAPGIT_PROXY</ENTRY>
<LENGTH>14</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -98,7 +98,7 @@ CLASS lcl_repo_online IMPLEMENTATION.
ENDTRY.
mo_branches = lcl_git_transport=>branches( get_url( ) ).
mo_branches = zcl_abapgit_git_transport=>branches( get_url( ) ).
actualize_head_branch( ).
mv_initialized = abap_true.
@ -147,7 +147,7 @@ CLASS lcl_repo_online IMPLEMENTATION.
METHOD get_branches.
IF mo_branches IS NOT BOUND.
mo_branches = lcl_git_transport=>branches( get_url( ) ).
mo_branches = zcl_abapgit_git_transport=>branches( get_url( ) ).
ENDIF.
ro_branches = mo_branches.
ENDMETHOD. "get_branches

View File

@ -1,5 +0,0 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_skip_objects
*&---------------------------------------------------------------------*
* todo, include to be deleted

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_SKIP_OBJECTS</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<DBAPL>S</DBAPL>
<DBNA>D$</DBNA>
<SUBC>I</SUBC>
<FIXPT>X</FIXPT>
<LDBNAME>D$S</LDBNAME>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_SKIP_OBJECTS</ENTRY>
<LENGTH>29</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -1164,4 +1164,3 @@ ENDCLASS.
*ENDCLASS.
INCLUDE zabapgit_unit_test_clas_intf.
INCLUDE zabapgit_unit_test_transport.

View File

@ -1,5 +0,0 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_UNIT_TEST_TRANSPORT
*&---------------------------------------------------------------------*
* todo, include to be deleted

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_UNIT_TEST_TRANSPORT</NAME>
<STATE>A</STATE>
<VARCL>X</VARCL>
<SUBC>I</SUBC>
<RLOAD>E</RLOAD>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<ENTRY>Include ZABAPGIT_UNIT_TEST_TRANSPORT</ENTRY>
<LENGTH>36</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>