diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 077873785..12ea0bb1c 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -55,7 +55,9 @@ INCLUDE zabapgit_sap_package. CLASS lcl_repo_online DEFINITION DEFERRED. INCLUDE zabapgit_stage. +INCLUDE zabapgit_git_helpers. INCLUDE zabapgit_repo. +INCLUDE zabapgit_git. INCLUDE zabapgit_stage_logic. INCLUDE zabapgit_objects. INCLUDE zabapgit_tadir. @@ -103,7 +105,6 @@ INCLUDE zabapgit_object_wdyn. INCLUDE zabapgit_object_webi. INCLUDE zabapgit_object_xslt. -INCLUDE zabapgit_git. INCLUDE zabapgit_repo_impl. INCLUDE zabapgit_background. INCLUDE zabapgit_zip. diff --git a/src/zabapgit_forms.prog.abap b/src/zabapgit_forms.prog.abap index 14c7788af..cd8359a13 100644 --- a/src/zabapgit_forms.prog.abap +++ b/src/zabapgit_forms.prog.abap @@ -54,7 +54,7 @@ FORM branch_popup TABLES tt_fields TYPE ty_sval_tt DATA: lv_url TYPE string, lx_error TYPE REF TO lcx_exception, ls_package_data TYPE scompkdtln, - ls_branch TYPE lcl_git_transport=>ty_branch_list. + ls_branch TYPE lcl_git_branch_list=>ty_git_branch. FIELD-SYMBOLS: LIKE LINE OF tt_fields, LIKE LINE OF tt_fields. diff --git a/src/zabapgit_git.prog.abap b/src/zabapgit_git.prog.abap index 91ba955f2..5a2c23569 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/zabapgit_git.prog.abap @@ -7,22 +7,15 @@ CLASS ltcl_git_pack DEFINITION DEFERRED. *----------------------------------------------------------------------* * CLASS lcl_transport DEFINITION *----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_git_transport DEFINITION FINAL. +CLASS lcl_git_transport DEFINITION FINAL. PUBLIC SECTION. - TYPES: BEGIN OF ty_branch_list, - sha1 TYPE ty_sha1, - name TYPE string, - END OF ty_branch_list. - TYPES: ty_branch_list_tt TYPE STANDARD TABLE OF ty_branch_list WITH DEFAULT KEY. * 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 ty_branch_list_tt OPTIONAL + it_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt OPTIONAL EXPORTING et_objects TYPE ty_objects_tt ev_branch TYPE ty_sha1 RAISING lcx_exception. @@ -38,11 +31,12 @@ CLASS lcl_git_transport DEFINITION FINAL. CLASS-METHODS branches IMPORTING iv_url TYPE string - RETURNING VALUE(rt_branch_list) TYPE ty_branch_list_tt + RETURNING VALUE(ro_branch_list) TYPE REF TO lcl_git_branch_list RAISING lcx_exception. CLASS-METHODS class_constructor. + PRIVATE SECTION. CLASS-DATA: gv_agent TYPE string. @@ -55,12 +49,7 @@ CLASS lcl_git_transport DEFINITION FINAL. IMPORTING iv_url TYPE string iv_service TYPE string EXPORTING ei_client TYPE REF TO if_http_client - et_branch_list TYPE ty_branch_list_tt - RAISING lcx_exception. - - CLASS-METHODS pkt_string - IMPORTING iv_string TYPE string - RETURNING VALUE(rv_pkt) TYPE string + eo_branch_list TYPE REF TO lcl_git_branch_list RAISING lcx_exception. CLASS-METHODS find_branch @@ -76,16 +65,6 @@ CLASS lcl_git_transport DEFINITION FINAL. CHANGING cv_data TYPE xstring RAISING lcx_exception. - CLASS-METHODS length_utf8_hex - IMPORTING iv_data TYPE xstring - RETURNING VALUE(rv_len) TYPE i - RAISING lcx_exception. - - CLASS-METHODS parse_branch_list - IMPORTING iv_data TYPE string - RETURNING VALUE(rt_list) TYPE ty_branch_list_tt - RAISING lcx_exception. - CLASS-METHODS set_headers IMPORTING iv_url TYPE string iv_service TYPE string @@ -96,9 +75,6 @@ CLASS lcl_git_transport DEFINITION FINAL. IMPORTING ii_client TYPE REF TO if_http_client RAISING lcx_exception. - CLASS-METHODS get_null - RETURNING VALUE(rv_c) TYPE char1. - CLASS-METHODS send_receive IMPORTING ii_client TYPE REF TO if_http_client RAISING lcx_exception. @@ -251,20 +227,6 @@ CLASS lcl_git_transport IMPLEMENTATION. ENDMETHOD. "set_headers - METHOD get_null. - - DATA: lv_x(4) TYPE x VALUE '00000000', - lv_z(2) TYPE c. - - FIELD-SYMBOLS TYPE c. - - - ASSIGN lv_x TO CASTING. - lv_z = . - rv_c = lv_z(1). - - ENDMETHOD. "get_null - METHOD check_http_200. DATA: lv_code TYPE i. @@ -335,52 +297,9 @@ CLASS lcl_git_transport IMPLEMENTATION. ENDMETHOD. "acquire_login_details - METHOD parse_branch_list. - - DATA: lt_result TYPE TABLE OF string, - lv_hash TYPE ty_sha1, - lv_name TYPE string, - lv_foo TYPE string ##needed, - lv_char TYPE c, - lv_data LIKE LINE OF lt_result. - - FIELD-SYMBOLS: LIKE LINE OF rt_list. - - - SPLIT iv_data AT gc_newline INTO TABLE lt_result. - LOOP AT lt_result INTO lv_data. - IF sy-tabix = 1. - CONTINUE. " current loop - ELSEIF sy-tabix = 2 AND strlen( lv_data ) > 49. - lv_hash = lv_data+8. - lv_name = lv_data+49. - lv_char = get_null( ). - SPLIT lv_name AT lv_char INTO lv_name lv_foo. - ELSEIF sy-tabix > 2 AND strlen( lv_data ) > 45. - lv_hash = lv_data+4. - lv_name = lv_data+45. - ELSEIF sy-tabix = 2 AND strlen( lv_data ) = 8 AND lv_data(8) = '00000000'. - lcx_exception=>raise( 'No branches, create branch manually by adding file' ). - ELSE. - CONTINUE. - ENDIF. - - IF lv_name CP 'refs/pull/*'. - CONTINUE. - ENDIF. - - APPEND INITIAL LINE TO rt_list ASSIGNING . - -sha1 = lv_hash. - -name = lv_name. - ENDLOOP. - - ENDMETHOD. "parse_branch_list - METHOD find_branch. - DATA: lt_branch_list TYPE ty_branch_list_tt, - ls_branch_list LIKE LINE OF lt_branch_list. - + DATA: lo_branch_list TYPE REF TO lcl_git_branch_list. branch_list( EXPORTING @@ -388,20 +307,10 @@ CLASS lcl_git_transport IMPLEMENTATION. iv_service = iv_service IMPORTING ei_client = ei_client - et_branch_list = lt_branch_list ). + eo_branch_list = lo_branch_list ). IF ev_branch IS SUPPLIED. - IF iv_branch_name IS INITIAL. - lcx_exception=>raise( 'branch empty' ). - ENDIF. - - READ TABLE lt_branch_list INTO ls_branch_list - WITH KEY name = iv_branch_name. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Branch not found' ). - ENDIF. - - ev_branch = ls_branch_list-sha1. + ev_branch = lo_branch_list->find_by_name( iv_branch_name )-sha1. ENDIF. ENDMETHOD. "find_branch @@ -417,7 +326,7 @@ CLASS lcl_git_transport IMPLEMENTATION. iv_service = c_service-upload IMPORTING ei_client = li_client - et_branch_list = rt_branch_list ). + eo_branch_list = ro_branch_list ). li_client->close( ). ENDMETHOD. "branches @@ -470,9 +379,9 @@ CLASS lcl_git_transport IMPLEMENTATION. ii_client = ei_client ). lv_data = ei_client->response->get_cdata( ). - et_branch_list = parse_branch_list( lv_data ). + create object eo_branch_list exporting iv_data = lv_data. - ENDMETHOD. "ref_discovery + ENDMETHOD. "branch_list METHOD send_receive. @@ -505,7 +414,6 @@ CLASS lcl_git_transport IMPLEMENTATION. ENDMETHOD. "send_receive - METHOD receive_pack. DATA: li_client TYPE REF TO if_http_client, @@ -538,11 +446,11 @@ CLASS lcl_git_transport IMPLEMENTATION. iv_new && ` ` && iv_branch_name && - get_null( ) && + lcl_git_utils=>get_null( ) && ` ` && lv_cap_list && gc_newline. "#EC NOTEXT - lv_cmd_pkt = pkt_string( lv_line ). + lv_cmd_pkt = lcl_git_utils=>pkt_string( lv_line ). lv_buffer = lv_cmd_pkt && '0000'. lv_tmp = lcl_convert=>string_to_xstring_utf8( lv_buffer ). @@ -566,38 +474,6 @@ CLASS lcl_git_transport IMPLEMENTATION. ENDMETHOD. "receive_pack - METHOD length_utf8_hex. - - DATA: lv_xstring TYPE xstring, - lv_string TYPE string, - lv_char4 TYPE c LENGTH 4, - lv_x TYPE x LENGTH 2, - lo_obj TYPE REF TO cl_abap_conv_in_ce, - lv_len TYPE int4. - -* hmm, can this be done easier? - - lv_xstring = iv_data(4). - - lo_obj = cl_abap_conv_in_ce=>create( - input = lv_xstring - encoding = 'UTF-8' ). - lv_len = xstrlen( lv_xstring ). - - TRY. - lo_obj->read( EXPORTING n = lv_len - IMPORTING data = lv_string ). - CATCH cx_sy_conversion_codepage. - lcx_exception=>raise( 'error converting to hex, LENGTH_UTF8_HEX' ). - ENDTRY. - - lv_char4 = lv_string. - TRANSLATE lv_char4 TO UPPER CASE. - lv_x = lv_char4. - rv_len = lv_x. - - ENDMETHOD. "length_utf8_hex - METHOD parse. CONSTANTS: lc_band1 TYPE x VALUE '01'. @@ -608,7 +484,7 @@ CLASS lcl_git_transport IMPLEMENTATION. WHILE xstrlen( cv_data ) >= 4. - lv_len = length_utf8_hex( cv_data ). + lv_len = lcl_git_utils=>length_utf8_hex( cv_data ). IF lv_len > xstrlen( cv_data ). lcx_exception=>raise( 'parse, string length too large' ). @@ -641,7 +517,7 @@ CLASS lcl_git_transport IMPLEMENTATION. lv_xstring TYPE xstring, lv_line TYPE string, lv_pack TYPE xstring, - lt_branches TYPE ty_branch_list_tt, + lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, lv_capa TYPE string. FIELD-SYMBOLS: LIKE LINE OF lt_branches. @@ -678,11 +554,11 @@ CLASS lcl_git_transport IMPLEMENTATION. lv_line = 'want' && ` ` && -sha1 && gc_newline. "#EC NOTEXT ENDIF. - lv_buffer = lv_buffer && pkt_string( lv_line ). + lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( lv_line ). ENDLOOP. IF iv_deepen = abap_true. - lv_buffer = lv_buffer && pkt_string( 'deepen 1' && gc_newline ). "#EC NOTEXT + lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( 'deepen 1' && gc_newline ). "#EC NOTEXT ENDIF. lv_buffer = lv_buffer @@ -707,28 +583,10 @@ CLASS lcl_git_transport IMPLEMENTATION. ENDMETHOD. "upload_pack - METHOD pkt_string. - - DATA: lv_x TYPE x, - lv_len TYPE i. - - - lv_len = strlen( iv_string ). - - IF lv_len >= 255. - lcx_exception=>raise( 'PKT, todo' ). - ENDIF. - - lv_x = lv_len + 4. - - rv_pkt = rv_pkt && '00' && lv_x && iv_string. - - ENDMETHOD. "pkt - ENDCLASS. "lcl_transport IMPLEMENTATION *----------------------------------------------------------------------* -* CLASS lcl_pack IMPLEMENTATION +* CLASS lcl_git_pack IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* @@ -1438,7 +1296,7 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain. CLASS-METHODS delete_branch IMPORTING io_repo TYPE REF TO lcl_repo_online - is_branch TYPE lcl_git_transport=>ty_branch_list + is_branch TYPE lcl_git_branch_list=>ty_git_branch RAISING lcx_exception. CLASS-METHODS full_tree @@ -1627,7 +1485,7 @@ CLASS lcl_git_porcelain IMPLEMENTATION. lv_sha1 TYPE ty_sha1, lt_trees TYPE ty_trees_tt, lt_objects TYPE ty_objects_tt, - lt_branches TYPE lcl_git_transport=>ty_branch_list_tt, + lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, lt_stage TYPE lcl_stage=>ty_stage_tt. FIELD-SYMBOLS: LIKE LINE OF lt_stage, diff --git a/src/zabapgit_git_helpers.prog.abap b/src/zabapgit_git_helpers.prog.abap new file mode 100644 index 000000000..15e26ff14 --- /dev/null +++ b/src/zabapgit_git_helpers.prog.abap @@ -0,0 +1,342 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_GIT_HELPERS +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_git_utils +*----------------------------------------------------------------------* +CLASS lcl_git_utils DEFINITION FINAL. " > Maybe better move to lcl_git_pack ?? + PUBLIC SECTION. + + CLASS-METHODS get_null + RETURNING VALUE(rv_c) TYPE char1. + + CLASS-METHODS pkt_string + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_pkt) TYPE string + RAISING lcx_exception. + + CLASS-METHODS length_utf8_hex + IMPORTING iv_data TYPE xstring + RETURNING VALUE(rv_len) TYPE i + RAISING lcx_exception. + +ENDCLASS. "lcl_git_utils + +CLASS lcl_git_utils IMPLEMENTATION. + + METHOD get_null. + + DATA: lv_x(4) TYPE x VALUE '00000000', + lv_z(2) TYPE c. + + FIELD-SYMBOLS TYPE c. + + + ASSIGN lv_x TO CASTING. + lv_z = . + rv_c = lv_z(1). + + ENDMETHOD. "get_null + + METHOD length_utf8_hex. + + DATA: lv_xstring TYPE xstring, + lv_string TYPE string, + lv_char4 TYPE c LENGTH 4, + lv_x TYPE x LENGTH 2, + lo_obj TYPE REF TO cl_abap_conv_in_ce, + lv_len TYPE int4. + +* hmm, can this be done easier? + + lv_xstring = iv_data(4). + + lo_obj = cl_abap_conv_in_ce=>create( + input = lv_xstring + encoding = 'UTF-8' ). + lv_len = xstrlen( lv_xstring ). + + TRY. + lo_obj->read( EXPORTING n = lv_len + IMPORTING data = lv_string ). + CATCH cx_sy_conversion_codepage. + lcx_exception=>raise( 'error converting to hex, LENGTH_UTF8_HEX' ). + ENDTRY. + + lv_char4 = lv_string. + TRANSLATE lv_char4 TO UPPER CASE. + lv_x = lv_char4. + rv_len = lv_x. + + ENDMETHOD. "length_utf8_hex + + METHOD pkt_string. + + DATA: lv_x TYPE x, + lv_len TYPE i. + + + lv_len = strlen( iv_string ). + + IF lv_len >= 255. + lcx_exception=>raise( 'PKT, todo' ). + ENDIF. + + lv_x = lv_len + 4. + + rv_pkt = rv_pkt && '00' && lv_x && iv_string. + + ENDMETHOD. "pkt_string + +ENDCLASS. "lcl_git_utils + +*----------------------------------------------------------------------* +* CLASS lcl_git_branch_list DEFINITION +*----------------------------------------------------------------------* +CLASS lcl_git_branch_list DEFINITION FINAL. + PUBLIC SECTION. + TYPES: ty_git_branch_type TYPE char2. + TYPES: BEGIN OF ty_git_branch, + sha1 TYPE ty_sha1, + name TYPE string, + type TYPE ty_git_branch_type, + is_head TYPE abap_bool, + display_name TYPE string, + END OF ty_git_branch. + TYPES: ty_git_branch_list_tt TYPE STANDARD TABLE OF ty_git_branch WITH DEFAULT KEY. + + CONSTANTS: BEGIN OF c_type, + branch TYPE ty_git_branch_type VALUE 'HD', + tag TYPE ty_git_branch_type VALUE 'TG', + other TYPE ty_git_branch_type VALUE 'ZZ', + END OF c_type. + CONSTANTS HEAD_NAME TYPE string VALUE 'HEAD'. + + METHODS constructor + IMPORTING iv_data TYPE string + RAISING lcx_exception. + + METHODS find_by_name + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rs_branch) TYPE ty_git_branch + RAISING lcx_exception. + + METHODS get_head " For potential future use + RETURNING VALUE(rs_branch) TYPE ty_git_branch + RAISING lcx_exception. + + METHODS get_branches_only + RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt + RAISING lcx_exception. + + METHODS get_tags_only " For potential future use + RETURNING VALUE(rt_branches) TYPE ty_git_branch_list_tt + RAISING lcx_exception. + + CLASS-METHODS is_ignored + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_ignore) TYPE abap_bool. + + CLASS-METHODS get_display_name + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_display_name) TYPE string. + + CLASS-METHODS get_type + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_type) TYPE ty_git_branch_type. + + CLASS-METHODS complete_heads_branch_name + IMPORTING iv_branch_name TYPE clike + RETURNING VALUE(rv_name) TYPE string. + + PRIVATE SECTION. + DATA mt_branches TYPE ty_git_branch_list_tt. + DATA mv_head_symref TYPE string. + + CLASS-METHODS parse_branch_list + IMPORTING iv_data TYPE string + EXPORTING et_list TYPE ty_git_branch_list_tt + ev_head_symref TYPE string + RAISING lcx_exception. + + CLASS-METHODS parse_head_params + IMPORTING iv_data TYPE string + EXPORTING ev_head_symref TYPE string. + +ENDCLASS. "lcl_git_branch_list + +*----------------------------------------------------------------------* +* CLASS lcl_git_branch_list IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS lcl_git_branch_list IMPLEMENTATION. + + METHOD constructor. + parse_branch_list( + EXPORTING iv_data = iv_data + IMPORTING et_list = me->mt_branches + ev_head_symref = me->mv_head_symref ). + ENDMETHOD. "create + + METHOD find_by_name. + + IF iv_branch_name IS INITIAL. + lcx_exception=>raise( 'Branch name empty' ). + ENDIF. + + READ TABLE mt_branches INTO rs_branch + WITH KEY name = iv_branch_name. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Branch not found' ). + ENDIF. + + ENDMETHOD. "find_by_name + + METHOD get_head. + + IF mv_head_symref IS NOT INITIAL. + rs_branch = find_by_name( mv_head_symref ). + ELSE. + rs_branch = find_by_name( HEAD_NAME ). + ENDIF. + + ENDMETHOD. "get_head + + METHOD parse_branch_list. + + DATA: lt_result TYPE TABLE OF string, + lv_hash TYPE ty_sha1, + lv_name TYPE string, + lv_head_params TYPE string, + lv_char TYPE c, + lv_data LIKE LINE OF lt_result. + + FIELD-SYMBOLS: LIKE LINE OF et_list. + + CLEAR: et_list, ev_head_symref. + + SPLIT iv_data AT gc_newline INTO TABLE lt_result. + + LOOP AT lt_result INTO lv_data. + IF sy-tabix = 1. + CONTINUE. " current loop + ELSEIF sy-tabix = 2 AND strlen( lv_data ) > 49. + lv_hash = lv_data+8. + lv_name = lv_data+49. + lv_char = lcl_git_utils=>get_null( ). + + SPLIT lv_name AT lv_char INTO lv_name lv_head_params. + parse_head_params( + EXPORTING iv_data = lv_head_params + IMPORTING ev_head_symref = ev_head_symref ). + ELSEIF sy-tabix > 2 AND strlen( lv_data ) > 45. + lv_hash = lv_data+4. + lv_name = lv_data+45. + ELSEIF sy-tabix = 2 AND strlen( lv_data ) = 8 AND lv_data(8) = '00000000'. + lcx_exception=>raise( 'No branches, create branch manually by adding file' ). + ELSE. + CONTINUE. + ENDIF. + + CHECK is_ignored( lv_name ) = abap_false. + ASSERT lv_name IS NOT INITIAL. + + APPEND INITIAL LINE TO et_list ASSIGNING . + -sha1 = lv_hash. + -name = lv_name. + -display_name = get_display_name( lv_name ). + -type = get_type( lv_name ). + IF -name = HEAD_NAME OR -name = ev_head_symref. + -is_head = abap_true. + ENDIF. + ENDLOOP. + + ENDMETHOD. "parse_branch_list + + METHOD parse_head_params. + + DATA: ls_match TYPE match_result, + ls_submatch TYPE submatch_result. + + FIND FIRST OCCURRENCE OF REGEX '\ssymref=HEAD:([^\s]+)' IN iv_data RESULTS ls_match. + READ TABLE ls_match-submatches INTO ls_submatch INDEX 1. + IF sy-subrc IS INITIAL. + ev_head_symref = iv_data+ls_submatch-offset(ls_submatch-length). + ENDIF. + + ENDMETHOD. "parse_head_params + + METHOD is_ignored. + + IF iv_branch_name EQ 'refs/heads/gh-pages'. " Github pages + rv_ignore = abap_true. + ENDIF. + + IF iv_branch_name CP 'refs/pull/*' + OR iv_branch_name CP 'refs/merge-requests/*' + OR iv_branch_name CP 'refs/keep-around/*' + OR iv_branch_name CP 'refs/tmp/*'. + rv_ignore = abap_true. + ENDIF. + + ENDMETHOD. "is_ignored + + METHOD get_display_name. + rv_display_name = iv_branch_name. + + IF rv_display_name CP 'refs/heads/*'. + REPLACE FIRST OCCURRENCE OF 'refs/heads/' IN rv_display_name WITH ''. + RETURN. + ENDIF. + + IF rv_display_name CP 'refs/tags/*'. + REPLACE FIRST OCCURRENCE OF 'refs/' IN rv_display_name WITH ''. + RETURN. + ENDIF. + + ENDMETHOD. "get_display_name + + METHOD get_type. + rv_type = c_type-other. + + IF iv_branch_name CP 'refs/heads/*' OR iv_branch_name = HEAD_NAME. + rv_type = c_type-branch. + RETURN. + ENDIF. + + IF iv_branch_name CP 'refs/tags/*'. + rv_type = c_type-tag. + RETURN. + ENDIF. + + ENDMETHOD. "get_type + + METHOD complete_heads_branch_name. + IF iv_branch_name CP 'refs/heads/*'. + rv_name = iv_branch_name. + ELSE. + rv_name = 'refs/heads/' && iv_branch_name. + ENDIF. + ENDMETHOD. "complete_heads_branch_name + + METHOD get_branches_only. + FIELD-SYMBOLS LIKE LINE OF mt_branches. + + LOOP AT mt_branches ASSIGNING . + IF -type = c_type-branch. + APPEND TO rt_branches. + ENDIF. + ENDLOOP. + ENDMETHOD. "get_branches_only + + METHOD get_tags_only. + FIELD-SYMBOLS LIKE LINE OF mt_branches. + + LOOP AT mt_branches ASSIGNING . + IF -type = c_type-tag. + APPEND TO rt_branches. + ENDIF. + ENDLOOP. + ENDMETHOD. "get_tags_only + +ENDCLASS. "lcl_git_branch_list \ No newline at end of file diff --git a/src/zabapgit_git_helpers.prog.xml b/src/zabapgit_git_helpers.prog.xml new file mode 100644 index 000000000..486b646d6 --- /dev/null +++ b/src/zabapgit_git_helpers.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_GIT_HELPERS + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_GIT_HELPERS + 28 + + + + + + diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index e10bf51b8..cf23604e8 100644 --- a/src/zabapgit_gui.prog.abap +++ b/src/zabapgit_gui.prog.abap @@ -869,7 +869,7 @@ CLASS lcl_gui_router IMPLEMENTATION. lo_repo = lcl_app=>repo_srv( )->new_online( iv_url = lv_url - iv_branch_name = 'refs/heads/master' + iv_branch_name = 'refs/heads/master' "TODO replace with HEAD ? iv_package = lv_target_package ) ##NO_TEXT. lo_repo->status( ). " check for errors diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap index ad8d74ee1..47b5564cc 100644 --- a/src/zabapgit_page.prog.abap +++ b/src/zabapgit_page.prog.abap @@ -30,11 +30,19 @@ CLASS lcl_gui_page_super DEFINITION ABSTRACT. PROTECTED SECTION. METHODS render_repo_top - IMPORTING io_repo TYPE REF TO lcl_repo - iv_show_package TYPE abap_bool DEFAULT abap_true - iv_show_branch TYPE abap_bool DEFAULT abap_true - iv_branch TYPE string OPTIONAL - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + IMPORTING io_repo TYPE REF TO lcl_repo + iv_show_package TYPE abap_bool DEFAULT abap_true + iv_show_branch TYPE abap_bool DEFAULT abap_true + iv_interactive_branch TYPE abap_bool DEFAULT abap_false + iv_branch TYPE string OPTIONAL + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RAISING lcx_exception. + + METHODS render_branch_span + IMPORTING iv_branch TYPE string + io_repo TYPE REF TO lcl_repo_online + iv_interactive TYPE abap_bool + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RAISING lcx_exception. METHODS header @@ -94,9 +102,13 @@ CLASS lcl_gui_page_super IMPLEMENTATION. IF iv_show_branch = abap_true. ro_html->add( '' ). IF iv_branch IS INITIAL. - ro_html->add( |{ lo_repo_online->get_branch_name( ) }| ). + ro_html->add( render_branch_span( iv_branch = lo_repo_online->get_branch_name( ) + io_repo = lo_repo_online + iv_interactive = iv_interactive_branch ) ). ELSE. - ro_html->add( |{ iv_branch }| ). + ro_html->add( render_branch_span( iv_branch = iv_branch + io_repo = lo_repo_online + iv_interactive = iv_interactive_branch ) ). ENDIF. ENDIF. ENDIF. @@ -111,6 +123,30 @@ CLASS lcl_gui_page_super IMPLEMENTATION. ENDMETHOD. + METHOD render_branch_span. + DATA: lv_text TYPE string, + lv_class TYPE string. + + lv_text = lcl_git_branch_list=>get_display_name( iv_branch ). + + CASE lcl_git_branch_list=>get_type( iv_branch ). "TODO + WHEN lcl_git_branch_list=>c_type-branch. + WHEN lcl_git_branch_list=>c_type-tag. + WHEN OTHERS. + ENDCASE. + + CREATE OBJECT ro_html. + IF iv_interactive = abap_true. + ro_html->add( || ). + ro_html->add_anchor( iv_act = |switch_branch?{ io_repo->get_key( ) }| + iv_txt = lv_text ). "TODO refactor + ro_html->add( '' ). + ELSE. + ro_html->add( |{ lv_text }| ). + ENDIF. + + ENDMETHOD. "render_branch_span + METHOD header. CREATE OBJECT ro_html. @@ -321,6 +357,7 @@ CLASS lcl_gui_page_super IMPLEMENTATION. _add '.dropdown:hover .dropdown_content { display: block; }'. _add '.dropdown:hover .dropbtn { color: #79a0d2; }'. + " REPOSITORY _add '/* REPOSITORY */'. _add 'div.repo {'. _add ' margin-top: 3px;'. diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap index a3c879ea7..bd6bfd4a9 100644 --- a/src/zabapgit_page_branch_overview.prog.abap +++ b/src/zabapgit_page_branch_overview.prog.abap @@ -37,7 +37,7 @@ CLASS lcl_branch_overview DEFINITION FINAL. RAISING lcx_exception. CLASS-METHODS: get_branches - RETURNING VALUE(rt_branches) TYPE lcl_git_transport=>ty_branch_list_tt. + RETURNING VALUE(rt_branches) TYPE lcl_git_branch_list=>ty_git_branch_list_tt. PRIVATE SECTION. @@ -57,7 +57,7 @@ CLASS lcl_branch_overview DEFINITION FINAL. RAISING lcx_exception. CLASS-DATA: - gt_branches TYPE lcl_git_transport=>ty_branch_list_tt, + gt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, gt_commits TYPE TABLE OF ty_commit. ENDCLASS. @@ -161,11 +161,8 @@ CLASS lcl_branch_overview IMPLEMENTATION. * get objects directly from git, mo_repo only contains a shallow clone of only * the selected branch - gt_branches = lcl_git_transport=>branches( io_repo->get_url( ) ). - - DELETE gt_branches WHERE name = 'refs/heads/gh-pages' ##NO_TEXT. - DELETE gt_branches WHERE name CP 'refs/tags/*' ##NO_TEXT. - DELETE gt_branches WHERE name CP 'refs/pull/*' ##NO_TEXT. + "TODO refactor + gt_branches = lcl_git_transport=>branches( io_repo->get_url( ) )->get_branches_only( ). lcl_git_transport=>upload_pack( EXPORTING io_repo = io_repo iv_deepen = abap_false @@ -379,7 +376,7 @@ CLASS lcl_gui_page_branch_overview IMPLEMENTATION. METHOD form_select. DATA: lv_name TYPE string, - lt_branches TYPE lcl_git_transport=>ty_branch_list_tt. + lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt. FIELD-SYMBOLS: LIKE LINE OF lt_branches. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index a551e5a1d..1e61a07ad 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -293,7 +293,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CREATE OBJECT ro_html. ro_html->add( |
| ). - ro_html->add( render_repo_top( io_repo ) ). + ro_html->add( render_repo_top( io_repo = io_repo iv_interactive_branch = abap_true ) ). TRY. extract_repo_content( EXPORTING io_repo = io_repo diff --git a/src/zabapgit_page_merge.prog.abap b/src/zabapgit_page_merge.prog.abap index 95e129579..df5f4c004 100644 --- a/src/zabapgit_page_merge.prog.abap +++ b/src/zabapgit_page_merge.prog.abap @@ -14,8 +14,8 @@ CLASS lcl_merge DEFINITION FINAL. TYPES: BEGIN OF ty_merge, repo TYPE REF TO lcl_repo_online, - source TYPE lcl_git_transport=>ty_branch_list, - target TYPE lcl_git_transport=>ty_branch_list, + source TYPE lcl_git_branch_list=>ty_git_branch, + target TYPE lcl_git_branch_list=>ty_git_branch, common TYPE ty_ancestor, stree TYPE lcl_git_porcelain=>ty_expanded_tt, ttree TYPE lcl_git_porcelain=>ty_expanded_tt, @@ -294,29 +294,20 @@ CLASS lcl_merge IMPLEMENTATION. METHOD fetch_git. - DEFINE _find. - lv_name = 'refs/heads/' && &1 ##NO_TEXT. - READ TABLE lt_branches INTO &2 WITH KEY name = lv_name. - IF sy-subrc <> 0. - lcx_exception=>raise( 'branch not found' ). - ENDIF. - APPEND &2 TO lt_upload. - END-OF-DEFINITION. + DATA: lo_branch_list TYPE REF TO lcl_git_branch_list, + lt_upload TYPE lcl_git_branch_list=>ty_git_branch_list_tt. - DATA: lv_name TYPE string, - lt_branches TYPE lcl_git_transport=>ty_branch_list_tt, - lt_upload TYPE lcl_git_transport=>ty_branch_list_tt. + lo_branch_list = lcl_git_transport=>branches( gs_merge-repo->get_url( ) ). + gs_merge-source = lo_branch_list->find_by_name( lcl_git_branch_list=>complete_heads_branch_name( iv_source ) ). + gs_merge-target = lo_branch_list->find_by_name( lcl_git_branch_list=>complete_heads_branch_name( iv_target ) ). + APPEND gs_merge-source TO lt_upload. + APPEND gs_merge-target TO lt_upload. - lt_branches = lcl_git_transport=>branches( gs_merge-repo->get_url( ) ). - - _find iv_source gs_merge-source. - _find iv_target gs_merge-target. - - lcl_git_transport=>upload_pack( EXPORTING io_repo = gs_merge-repo - iv_deepen = abap_false + lcl_git_transport=>upload_pack( EXPORTING io_repo = gs_merge-repo + iv_deepen = abap_false it_branches = lt_upload - IMPORTING et_objects = gt_objects ). + IMPORTING et_objects = gt_objects ). ENDMETHOD. diff --git a/src/zabapgit_popups.prog.abap b/src/zabapgit_popups.prog.abap index 132f51197..2a76a08f1 100644 --- a/src/zabapgit_popups.prog.abap +++ b/src/zabapgit_popups.prog.abap @@ -31,7 +31,7 @@ CLASS lcl_popups DEFINITION. RAISING lcx_exception, branch_list_popup IMPORTING iv_url TYPE string - RETURNING VALUE(rs_branch) TYPE lcl_git_transport=>ty_branch_list + RETURNING VALUE(rs_branch) TYPE lcl_git_branch_list=>ty_git_branch RAISING lcx_exception, repo_popup IMPORTING iv_url TYPE string @@ -116,7 +116,7 @@ CLASS lcl_popups IMPLEMENTATION. CLEAR ev_cancel. * TAB FLD LABEL DEF ATTR - _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'refs/heads/branch_name' ''. + _add_dialog_fld 'TEXTL' 'LINE' 'Name' 'new_branch_name' ''. CALL FUNCTION 'POPUP_GET_VALUES' EXPORTING @@ -137,7 +137,7 @@ CLASS lcl_popups IMPLEMENTATION. ELSE. READ TABLE lt_fields INDEX 1 ASSIGNING . ASSERT sy-subrc = 0. - ev_name = -value. + ev_name = lcl_git_branch_list=>complete_heads_branch_name( -value ). ENDIF. ENDMETHOD. @@ -194,7 +194,7 @@ CLASS lcl_popups IMPLEMENTATION. METHOD delete_branch. DATA: lo_repo TYPE REF TO lcl_repo_online, - ls_branch TYPE lcl_git_transport=>ty_branch_list. + ls_branch TYPE lcl_git_branch_list=>ty_git_branch. lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). @@ -220,7 +220,8 @@ CLASS lcl_popups IMPLEMENTATION. METHOD branch_list_popup. - DATA: lt_branches TYPE lcl_git_transport=>ty_branch_list_tt, + DATA: lo_branches TYPE REF TO lcl_git_branch_list, + lt_branches TYPE lcl_git_branch_list=>ty_git_branch_list_tt, lv_answer TYPE c LENGTH 1, lt_selection TYPE TABLE OF spopli. @@ -228,13 +229,20 @@ CLASS lcl_popups IMPLEMENTATION. LIKE LINE OF lt_branches. - lt_branches = lcl_git_transport=>branches( iv_url ). + lo_branches = lcl_git_transport=>branches( iv_url ). + lt_branches = lo_branches->get_branches_only( ). LOOP AT lt_branches ASSIGNING . APPEND INITIAL LINE TO lt_selection ASSIGNING . -varoption = -name. ENDLOOP. +* lt_branches = lo_branches->get_tags_only( ). +* LOOP AT lt_branches ASSIGNING . +* APPEND INITIAL LINE TO lt_selection ASSIGNING . +* -varoption = -name. +* ENDLOOP. + CALL FUNCTION 'POPUP_TO_DECIDE_LIST' EXPORTING textline1 = 'Select branch' @@ -261,8 +269,7 @@ CLASS lcl_popups IMPLEMENTATION. READ TABLE lt_selection ASSIGNING WITH KEY selflag = abap_true. ASSERT sy-subrc = 0. - READ TABLE lt_branches INTO rs_branch WITH KEY name = -varoption. - ASSERT sy-subrc = 0. + rs_branch = lo_branches->find_by_name( -varoption ). ENDMETHOD. @@ -298,6 +305,7 @@ CLASS lcl_popups IMPLEMENTATION. lv_icon_br TYPE icon-name, lt_fields TYPE TABLE OF sval, lv_pattr TYPE spo_fattr, + lv_battr TYPE spo_fattr, lv_button2 TYPE svalbutton-buttontext, lv_icon2 TYPE icon-name. @@ -306,15 +314,17 @@ CLASS lcl_popups IMPLEMENTATION. IF NOT iv_package IS INITIAL. lv_pattr = '05'. + lv_battr = '03'. ELSE. + lv_battr = '05'. lv_button2 = 'Create package' ##NO_TEXT. lv_icon2 = icon_msg. ENDIF. * TAB FLD LABEL DEF ATTR - _add_dialog_fld 'ABAPTXT255' 'LINE' 'Git Clone Url' iv_url ''. + _add_dialog_fld 'ABAPTXT255' 'LINE' 'Git Clone Url' iv_url lv_pattr. _add_dialog_fld 'TDEVC' 'DEVCLASS' 'Target Package' iv_package lv_pattr. - _add_dialog_fld 'TEXTL' 'LINE' 'Branch' iv_branch '05'. + _add_dialog_fld 'TEXTL' 'LINE' 'Branch' iv_branch lv_battr. lv_icon_ok = icon_okay. lv_icon_br = icon_workflow_fork. diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index ad7ba6612..94d0700e5 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -80,6 +80,8 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. RETURNING VALUE(rv_url) TYPE lcl_persistence_repo=>ty_repo-url, get_branch_name RETURNING VALUE(rv_name) TYPE lcl_persistence_repo=>ty_repo-branch_name, + get_branches + RETURNING VALUE(ro_branches) TYPE REF TO lcl_git_branch_list, set_url IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url RAISING lcx_exception, @@ -109,7 +111,8 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. DATA: mt_objects TYPE ty_objects_tt, mv_branch TYPE ty_sha1, - mv_initialized TYPE abap_bool. + mv_initialized TYPE abap_bool, + mo_branches TYPE REF TO lcl_git_branch_list. METHODS: handle_stage_ignore diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 6ac4788ff..92e723fc4 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -73,6 +73,8 @@ CLASS lcl_repo_online IMPLEMENTATION. et_objects = mt_objects ev_branch = mv_branch ). + mo_branches = lcl_git_transport=>branches( get_url( ) ). + find_dot_abapgit( ). mv_initialized = abap_true. @@ -105,6 +107,10 @@ CLASS lcl_repo_online IMPLEMENTATION. rv_name = ms_data-branch_name. ENDMETHOD. "get_branch_name + METHOD get_branches. + ro_branches = mo_branches. + ENDMETHOD. "get_branches + METHOD set_url. mv_initialized = abap_false.