diff --git a/src/cts/zcl_abapgit_cts_api.clas.abap b/src/cts/zcl_abapgit_cts_api.clas.abap index a92ffc8d5..19b11f0e9 100644 --- a/src/cts/zcl_abapgit_cts_api.clas.abap +++ b/src/cts/zcl_abapgit_cts_api.clas.abap @@ -381,7 +381,7 @@ CLASS ZCL_ABAPGIT_CTS_API IMPLEMENTATION. LOOP AT lt_tlock ASSIGNING WHERE object = ls_lock_key-obj AND hikey >= ls_lock_key-low - AND lokey <= ls_lock_key-hi. "#EC PORTABLE + AND lokey <= ls_lock_key-hi. "#EC PORTABLE lv_request = -trkorr. EXIT. ENDLOOP. @@ -487,6 +487,65 @@ CLASS ZCL_ABAPGIT_CTS_API IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_cts_api~list_r3tr_by_request. + + TYPES: BEGIN OF ty_contents, + trkorr TYPE e071-trkorr, + as4pos TYPE e071-as4pos, + pgmid TYPE e071-pgmid, + object TYPE e071-object, + obj_name TYPE e071-obj_name, + END OF ty_contents. + + DATA lt_tasks TYPE STANDARD TABLE OF trkorr WITH DEFAULT KEY. + DATA lt_contents TYPE STANDARD TABLE OF ty_contents WITH DEFAULT KEY. + DATA ls_contents LIKE LINE OF lt_contents. + DATA ls_list LIKE LINE OF rt_list. + + + SELECT trkorr FROM e070 INTO TABLE lt_tasks + WHERE strkorr = iv_request + ORDER BY PRIMARY KEY. + IF sy-subrc <> 0. + RETURN. + ENDIF. + + SELECT trkorr as4pos pgmid object obj_name FROM e071 + INTO TABLE lt_contents + FOR ALL ENTRIES IN lt_tasks + WHERE trkorr = lt_tasks-table_line + ORDER BY PRIMARY KEY. + IF sy-subrc <> 0. + RETURN. + ENDIF. + + LOOP AT lt_contents INTO ls_contents. + CASE ls_contents-pgmid. + WHEN 'R3TR'. + ls_list-object = ls_contents-object. + ls_list-obj_name = ls_contents-obj_name. + INSERT ls_list INTO TABLE rt_list. + WHEN 'LIMU'. + TRY. + zif_abapgit_cts_api~get_r3tr_obj_for_limu_obj( + EXPORTING + iv_object = ls_contents-object + iv_obj_name = ls_contents-obj_name + IMPORTING + ev_object = ls_list-object + ev_obj_name = ls_list-obj_name ). + INSERT ls_list INTO TABLE rt_list. + CATCH zcx_abapgit_exception. + ENDTRY. + ENDCASE. + ENDLOOP. + + SORT rt_list BY object obj_name. + DELETE ADJACENT DUPLICATES FROM rt_list COMPARING object obj_name. + + ENDMETHOD. + + METHOD zif_abapgit_cts_api~read. DATA ls_request TYPE trwbo_request. diff --git a/src/cts/zif_abapgit_cts_api.intf.abap b/src/cts/zif_abapgit_cts_api.intf.abap index 6868d04e8..e6e403d70 100644 --- a/src/cts/zif_abapgit_cts_api.intf.abap +++ b/src/cts/zif_abapgit_cts_api.intf.abap @@ -1,6 +1,36 @@ INTERFACE zif_abapgit_cts_api PUBLIC . + + TYPES: + BEGIN OF ty_transport, + obj_type TYPE tadir-object, + obj_name TYPE tadir-obj_name, + trkorr TYPE trkorr, + END OF ty_transport . + TYPES: + ty_transport_list TYPE SORTED TABLE OF ty_transport WITH NON-UNIQUE KEY obj_type obj_name . + TYPES: + ty_trkorr_tt TYPE STANDARD TABLE OF trkorr WITH DEFAULT KEY . + TYPES: + BEGIN OF ty_transport_key, + object TYPE e071k-object, + objname TYPE e071k-objname, + tabkey TYPE e071k-tabkey, + END OF ty_transport_key . + TYPES: + BEGIN OF ty_transport_data, + trstatus TYPE e070-trstatus, + keys TYPE STANDARD TABLE OF ty_transport_key WITH DEFAULT KEY, + END OF ty_transport_data . + TYPES: + BEGIN OF ty_transport_obj, + object TYPE e071-object, + obj_name TYPE e071-obj_name, + END OF ty_transport_obj . + TYPES: + ty_transport_obj_tt TYPE STANDARD TABLE OF ty_transport_obj WITH DEFAULT KEY . + CONSTANTS: BEGIN OF c_transport_type, wb_request TYPE c LENGTH 1 VALUE 'K', "workbench request @@ -8,46 +38,50 @@ INTERFACE zif_abapgit_cts_api wb_task TYPE c LENGTH 1 VALUE 'S', "workbench task cust_request TYPE c LENGTH 1 VALUE 'W', "customizing request cust_task TYPE c LENGTH 1 VALUE 'Q', "customizing task - END OF c_transport_type. - + END OF c_transport_type . CONSTANTS: BEGIN OF c_transport_category, workbench TYPE c LENGTH 4 VALUE 'SYST', customizing TYPE c LENGTH 4 VALUE 'CUST', - END OF c_transport_category. - + END OF c_transport_category . CONSTANTS: BEGIN OF c_transport_mode, insert TYPE c LENGTH 1 VALUE 'I', delete TYPE c LENGTH 1 VALUE 'D', - END OF c_transport_mode. - + END OF c_transport_mode . CONSTANTS: BEGIN OF c_transport_status, modifiable TYPE c LENGTH 1 VALUE 'D', - END OF c_transport_status. - - TYPES: BEGIN OF ty_transport, - obj_type TYPE tadir-object, - obj_name TYPE tadir-obj_name, - trkorr TYPE trkorr, - END OF ty_transport. - - TYPES ty_transport_list TYPE SORTED TABLE OF ty_transport WITH NON-UNIQUE KEY obj_type obj_name. - - TYPES ty_trkorr_tt TYPE STANDARD TABLE OF trkorr WITH DEFAULT KEY. - - TYPES: BEGIN OF ty_transport_key, - object TYPE e071k-object, - objname TYPE e071k-objname, - tabkey TYPE e071k-tabkey, - END OF ty_transport_key. - - TYPES: BEGIN OF ty_transport_data, - trstatus TYPE e070-trstatus, - keys TYPE STANDARD TABLE OF ty_transport_key WITH DEFAULT KEY, - END OF ty_transport_data. + END OF c_transport_status . + METHODS confirm_transport_messages + RETURNING + VALUE(rv_messages_confirmed) TYPE abap_bool . + METHODS create_transport_entries + IMPORTING + !iv_transport TYPE trkorr + !it_table_ins TYPE ANY TABLE + !it_table_upd TYPE ANY TABLE + !it_table_del TYPE ANY TABLE + !iv_tabname TYPE tabname + RAISING + zcx_abapgit_exception . + METHODS get_r3tr_obj_for_limu_obj + IMPORTING + !iv_object TYPE tadir-object + !iv_obj_name TYPE trobj_name + EXPORTING + !ev_object TYPE tadir-object + !ev_obj_name TYPE trobj_name + RAISING + zcx_abapgit_exception . + METHODS get_transports_for_list + IMPORTING + !it_items TYPE zif_abapgit_definitions=>ty_items_tt + RETURNING + VALUE(rt_transports) TYPE ty_transport_list + RAISING + zcx_abapgit_exception . "! Returns the transport request / task the object is currently in "! @parameter is_item | Object "! @parameter rv_transport | Transport request / task @@ -59,7 +93,19 @@ INTERFACE zif_abapgit_cts_api VALUE(rv_transport) TYPE trkorr RAISING zcx_abapgit_exception . - + METHODS insert_transport_object + IMPORTING + !iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' + !iv_object TYPE tadir-object + !iv_obj_name TYPE csequence + !iv_package TYPE devclass + !iv_language TYPE sy-langu DEFAULT sy-langu + !iv_mode TYPE c DEFAULT 'I' + EXPORTING + !ev_object TYPE tadir-object + !ev_obj_name TYPE trobj_name + RAISING + zcx_abapgit_exception . "! Check if change recording is possible for the given package "! @parameter iv_package | Package "! @parameter rv_possible | Change recording is possible @@ -71,65 +117,20 @@ INTERFACE zif_abapgit_cts_api VALUE(rv_possible) TYPE abap_bool RAISING zcx_abapgit_exception . - - METHODS get_transports_for_list + METHODS list_open_requests_by_user IMPORTING - !it_items TYPE zif_abapgit_definitions=>ty_items_tt + !iv_user TYPE sy-uname DEFAULT sy-uname RETURNING - VALUE(rt_transports) TYPE ty_transport_list + VALUE(rt_trkorr) TYPE ty_trkorr_tt RAISING zcx_abapgit_exception . - - METHODS get_r3tr_obj_for_limu_obj + METHODS list_r3tr_by_request IMPORTING - iv_object TYPE tadir-object - iv_obj_name TYPE trobj_name - EXPORTING - ev_object TYPE tadir-object - ev_obj_name TYPE trobj_name + !iv_request TYPE trkorr + RETURNING + VALUE(rt_list) TYPE ty_transport_obj_tt RAISING zcx_abapgit_exception . - - METHODS read_description - IMPORTING - iv_trkorr TYPE trkorr - RETURNING - VALUE(rv_description) TYPE string. - - METHODS read_user - IMPORTING - iv_trkorr TYPE trkorr - RETURNING - VALUE(rv_uname) TYPE uname. - - METHODS create_transport_entries - IMPORTING - iv_transport TYPE trkorr - it_table_ins TYPE ANY TABLE - it_table_upd TYPE ANY TABLE - it_table_del TYPE ANY TABLE - iv_tabname TYPE tabname - RAISING - zcx_abapgit_exception. - - METHODS insert_transport_object - IMPORTING - iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' - iv_object TYPE tadir-object - iv_obj_name TYPE csequence - iv_package TYPE devclass - iv_language TYPE sy-langu DEFAULT sy-langu - iv_mode TYPE c DEFAULT 'I' - EXPORTING - ev_object TYPE tadir-object - ev_obj_name TYPE trobj_name - RAISING - zcx_abapgit_exception. - - METHODS confirm_transport_messages - RETURNING - VALUE(rv_messages_confirmed) TYPE abap_bool . - METHODS read IMPORTING !iv_trkorr TYPE trkorr @@ -137,19 +138,19 @@ INTERFACE zif_abapgit_cts_api VALUE(rs_request) TYPE ty_transport_data RAISING zcx_abapgit_exception . - + METHODS read_description + IMPORTING + !iv_trkorr TYPE trkorr + RETURNING + VALUE(rv_description) TYPE string . + METHODS read_user + IMPORTING + !iv_trkorr TYPE trkorr + RETURNING + VALUE(rv_uname) TYPE uname . METHODS validate_transport_request IMPORTING - iv_transport_request TYPE trkorr + !iv_transport_request TYPE trkorr RAISING - zcx_abapgit_exception. - - METHODS list_open_requests_by_user - IMPORTING - iv_user TYPE sy-uname DEFAULT sy-uname - RETURNING - VALUE(rt_trkorr) TYPE ty_trkorr_tt - RAISING - zcx_abapgit_exception. - + zcx_abapgit_exception . ENDINTERFACE. diff --git a/src/git/v2/zcl_abapgit_gitv2_porcelain.clas.abap b/src/git/v2/zcl_abapgit_gitv2_porcelain.clas.abap index fe785879b..406bd953f 100644 --- a/src/git/v2/zcl_abapgit_gitv2_porcelain.clas.abap +++ b/src/git/v2/zcl_abapgit_gitv2_porcelain.clas.abap @@ -4,30 +4,8 @@ CLASS zcl_abapgit_gitv2_porcelain DEFINITION PUBLIC SECTION. - CLASS-METHODS list_branches - IMPORTING - !iv_url TYPE string - !iv_prefix TYPE string OPTIONAL - RETURNING - VALUE(ro_list) TYPE REF TO zcl_abapgit_git_branch_list - RAISING - zcx_abapgit_exception . - CLASS-METHODS list_no_blobs - IMPORTING - !iv_url TYPE string - !iv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1 - RETURNING - VALUE(rt_expanded) TYPE zif_abapgit_git_definitions=>ty_expanded_tt - RAISING - zcx_abapgit_exception . - CLASS-METHODS list_no_blobs_multi - IMPORTING - !iv_url TYPE string - !it_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt - RETURNING - VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING - zcx_abapgit_exception . + INTERFACES zif_abapgit_gitv2_porcelain. + PROTECTED SECTION. PRIVATE SECTION. CONSTANTS: @@ -52,7 +30,7 @@ CLASS zcl_abapgit_gitv2_porcelain DEFINITION CLASS-METHODS decode_pack IMPORTING - iv_xstring TYPE xstring + iv_xstring TYPE xstring RETURNING VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt RAISING @@ -62,65 +40,9 @@ ENDCLASS. -CLASS zcl_abapgit_gitv2_porcelain IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GITV2_PORCELAIN IMPLEMENTATION. - METHOD list_branches. - DATA lv_xstring TYPE xstring. - DATA lt_arguments TYPE string_table. - DATA lv_argument TYPE string. - DATA lv_data TYPE string. - - IF iv_prefix IS NOT INITIAL. - lv_argument = |ref-prefix { iv_prefix }|. - APPEND lv_argument TO lt_arguments. - ENDIF. - - lv_xstring = send_command( - iv_url = iv_url - iv_service = c_service-upload - iv_command = |ls-refs| - it_arguments = lt_arguments ). - - " add dummy packet so the v1 branch parsing can be reused - lv_data = |0004\n{ zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ) }|. - - CREATE OBJECT ro_list - EXPORTING - iv_data = lv_data. - - ENDMETHOD. - - - METHOD list_no_blobs_multi. - - DATA lv_xstring TYPE xstring. - DATA lt_arguments TYPE string_table. - DATA lv_argument TYPE string. - DATA lv_sha1 LIKE LINE OF it_sha1. - - - ASSERT lines( it_sha1 ) > 0. - - APPEND 'deepen 1' TO lt_arguments. - LOOP AT it_sha1 INTO lv_sha1. - lv_argument = |want { lv_sha1 }|. - APPEND lv_argument TO lt_arguments. - ENDLOOP. - APPEND 'filter blob:none' TO lt_arguments. - APPEND 'no-progress' TO lt_arguments. - APPEND 'done' TO lt_arguments. - - lv_xstring = send_command( - iv_url = iv_url - iv_service = c_service-upload - iv_command = |fetch| - it_arguments = lt_arguments ). - - rt_objects = decode_pack( lv_xstring ). - - ENDMETHOD. - METHOD decode_pack. DATA lv_xstring TYPE xstring. @@ -154,24 +76,6 @@ CLASS zcl_abapgit_gitv2_porcelain IMPLEMENTATION. ENDMETHOD. - METHOD list_no_blobs. - - DATA lt_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt. - DATA lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. - - ASSERT iv_sha1 IS NOT INITIAL. - APPEND iv_sha1 TO lt_sha1. - - lt_objects = list_no_blobs_multi( - iv_url = iv_url - it_sha1 = lt_sha1 ). - - rt_expanded = zcl_abapgit_git_porcelain=>full_tree( - it_objects = lt_objects - iv_parent = iv_sha1 ). - - ENDMETHOD. - METHOD send_command. @@ -226,4 +130,113 @@ CLASS zcl_abapgit_gitv2_porcelain IMPLEMENTATION. rv_response = lo_client->send_receive_close( zcl_abapgit_convert=>string_to_xstring_utf8( lv_cmd_pkt ) ). ENDMETHOD. + + + METHOD zif_abapgit_gitv2_porcelain~commits_last_year. + + DATA lv_xstring TYPE xstring. + DATA lt_arguments TYPE string_table. + DATA lv_argument TYPE string. + DATA lv_sha1 LIKE LINE OF it_sha1. + + + ASSERT lines( it_sha1 ) > 0. + + lv_argument = |deepen-since { zcl_abapgit_git_time=>get_one_year_ago( ) }|. + APPEND lv_argument TO lt_arguments. + LOOP AT it_sha1 INTO lv_sha1. + lv_argument = |want { lv_sha1 }|. + APPEND lv_argument TO lt_arguments. + ENDLOOP. +* 'filter object:type=commit' doesnt work on github + APPEND 'filter blob:none' TO lt_arguments. + APPEND 'no-progress' TO lt_arguments. + APPEND 'done' TO lt_arguments. + + lv_xstring = send_command( + iv_url = iv_url + iv_service = c_service-upload + iv_command = |fetch| + it_arguments = lt_arguments ). + + rt_objects = decode_pack( lv_xstring ). + DELETE rt_objects WHERE type <> zif_abapgit_git_definitions=>c_type-commit. + + ENDMETHOD. + + + METHOD zif_abapgit_gitv2_porcelain~list_branches. + DATA lv_xstring TYPE xstring. + DATA lt_arguments TYPE string_table. + DATA lv_argument TYPE string. + DATA lv_data TYPE string. + + IF iv_prefix IS NOT INITIAL. + lv_argument = |ref-prefix { iv_prefix }|. + APPEND lv_argument TO lt_arguments. + ENDIF. + + lv_xstring = send_command( + iv_url = iv_url + iv_service = c_service-upload + iv_command = |ls-refs| + it_arguments = lt_arguments ). + + " add dummy packet so the v1 branch parsing can be reused + lv_data = |0004\n{ zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ) }|. + + CREATE OBJECT ro_list + EXPORTING + iv_data = lv_data. + + ENDMETHOD. + + + METHOD zif_abapgit_gitv2_porcelain~list_no_blobs. + + DATA lt_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt. + DATA lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. + + ASSERT iv_sha1 IS NOT INITIAL. + APPEND iv_sha1 TO lt_sha1. + + lt_objects = zif_abapgit_gitv2_porcelain~list_no_blobs_multi( + iv_url = iv_url + it_sha1 = lt_sha1 ). + + rt_expanded = zcl_abapgit_git_porcelain=>full_tree( + it_objects = lt_objects + iv_parent = iv_sha1 ). + + ENDMETHOD. + + + METHOD zif_abapgit_gitv2_porcelain~list_no_blobs_multi. + + DATA lv_xstring TYPE xstring. + DATA lt_arguments TYPE string_table. + DATA lv_argument TYPE string. + DATA lv_sha1 LIKE LINE OF it_sha1. + + + ASSERT lines( it_sha1 ) > 0. + + APPEND 'deepen 1' TO lt_arguments. + LOOP AT it_sha1 INTO lv_sha1. + lv_argument = |want { lv_sha1 }|. + APPEND lv_argument TO lt_arguments. + ENDLOOP. + APPEND 'filter blob:none' TO lt_arguments. + APPEND 'no-progress' TO lt_arguments. + APPEND 'done' TO lt_arguments. + + lv_xstring = send_command( + iv_url = iv_url + iv_service = c_service-upload + iv_command = |fetch| + it_arguments = lt_arguments ). + + rt_objects = decode_pack( lv_xstring ). + + ENDMETHOD. ENDCLASS. diff --git a/src/git/v2/zif_abapgit_gitv2_porcelain.intf.abap b/src/git/v2/zif_abapgit_gitv2_porcelain.intf.abap new file mode 100644 index 000000000..16065abdd --- /dev/null +++ b/src/git/v2/zif_abapgit_gitv2_porcelain.intf.abap @@ -0,0 +1,37 @@ +INTERFACE zif_abapgit_gitv2_porcelain + PUBLIC . + + METHODS list_branches + IMPORTING + !iv_url TYPE string + !iv_prefix TYPE string OPTIONAL + RETURNING + VALUE(ro_list) TYPE REF TO zcl_abapgit_git_branch_list + RAISING + zcx_abapgit_exception . + METHODS list_no_blobs + IMPORTING + !iv_url TYPE string + !iv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1 + RETURNING + VALUE(rt_expanded) TYPE zif_abapgit_git_definitions=>ty_expanded_tt + RAISING + zcx_abapgit_exception . + METHODS list_no_blobs_multi + IMPORTING + !iv_url TYPE string + !it_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt + RETURNING + VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING + zcx_abapgit_exception . + METHODS commits_last_year + IMPORTING + !iv_url TYPE string + !it_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt + RETURNING + VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING + zcx_abapgit_exception . + +ENDINTERFACE. diff --git a/src/git/v2/zif_abapgit_gitv2_porcelain.intf.xml b/src/git/v2/zif_abapgit_gitv2_porcelain.intf.xml new file mode 100644 index 000000000..8341e449d --- /dev/null +++ b/src/git/v2/zif_abapgit_gitv2_porcelain.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_GITV2_PORCELAIN + E + abapGit - Git v2 + 2 + 1 + X + + + + diff --git a/src/git/zcl_abapgit_git_factory.clas.abap b/src/git/zcl_abapgit_git_factory.clas.abap new file mode 100644 index 000000000..0e5e94f30 --- /dev/null +++ b/src/git/zcl_abapgit_git_factory.clas.abap @@ -0,0 +1,22 @@ +CLASS zcl_abapgit_git_factory DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + CLASS-METHODS + get_v2_porcelain + RETURNING VALUE(ri_v2) TYPE REF TO zif_abapgit_gitv2_porcelain. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_GIT_FACTORY IMPLEMENTATION. + + + METHOD get_v2_porcelain. + CREATE OBJECT ri_v2 TYPE zcl_abapgit_gitv2_porcelain. + ENDMETHOD. +ENDCLASS. diff --git a/src/git/zcl_abapgit_git_factory.clas.xml b/src/git/zcl_abapgit_git_factory.clas.xml new file mode 100644 index 000000000..300fd284c --- /dev/null +++ b/src/git/zcl_abapgit_git_factory.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_GIT_FACTORY + E + abapGit - Git Factory + 1 + X + X + X + + + + diff --git a/src/git/zcl_abapgit_git_time.clas.abap b/src/git/zcl_abapgit_git_time.clas.abap index ada27fb23..9a2e0fdc3 100644 --- a/src/git/zcl_abapgit_git_time.clas.abap +++ b/src/git/zcl_abapgit_git_time.clas.abap @@ -13,6 +13,13 @@ CLASS zcl_abapgit_git_time DEFINITION VALUE(rv_time) TYPE ty_unixtime RAISING zcx_abapgit_exception . + + CLASS-METHODS get_one_year_ago + RETURNING + VALUE(rv_time) TYPE i + RAISING + zcx_abapgit_exception . + CLASS-METHODS get_utc IMPORTING !iv_unix TYPE ty_unixtime @@ -28,6 +35,20 @@ ENDCLASS. CLASS zcl_abapgit_git_time IMPLEMENTATION. + METHOD get_one_year_ago. +* https://www.epochconverter.com + CONSTANTS lc_epoch TYPE timestamp VALUE '19700101000000'. + DATA lv_time TYPE timestamp. + + GET TIME STAMP FIELD lv_time. + + rv_time = cl_abap_tstmp=>subtract( + tstmp1 = lv_time + tstmp2 = lc_epoch ). + + rv_time = rv_time - 31536000. + ENDMETHOD. + METHOD get_unix. * returns seconds since unix epoch, including timezone indicator diff --git a/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap b/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap index 410d59eca..6f5709644 100644 --- a/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap +++ b/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap @@ -105,6 +105,8 @@ CLASS ZCL_ABAPGIT_PR_ENUM_GITHUB IMPLEMENTATION. -head_url = ii_json->get( |/{ lv_i }/head/repo/clone_url| ). -head_branch = ii_json->get( |/{ lv_i }/head/ref| ). -created_at = ii_json->get( |/{ lv_i }/created_at| ). + -draft = ii_json->get_boolean( |/{ lv_i }/draft| ). + -html_url = ii_json->get( |/{ lv_i }/html_url| ). ENDLOOP. ENDMETHOD. diff --git a/src/git_platform/zif_abapgit_pr_enum_provider.intf.abap b/src/git_platform/zif_abapgit_pr_enum_provider.intf.abap index 933b904b2..25bba8288 100644 --- a/src/git_platform/zif_abapgit_pr_enum_provider.intf.abap +++ b/src/git_platform/zif_abapgit_pr_enum_provider.intf.abap @@ -11,6 +11,8 @@ INTERFACE zif_abapgit_pr_enum_provider head_branch TYPE string, created_at TYPE string, " TODO change to D after date parsing fixed is_for_upstream TYPE abap_bool, + draft TYPE abap_bool, + html_url TYPE string, END OF ty_pull_request. TYPES: ty_pull_requests TYPE STANDARD TABLE OF ty_pull_request WITH KEY base_url number. diff --git a/src/persist/zif_abapgit_persistence.intf.abap b/src/persist/zif_abapgit_persistence.intf.abap index 98c36a257..f19b53752 100644 --- a/src/persist/zif_abapgit_persistence.intf.abap +++ b/src/persist/zif_abapgit_persistence.intf.abap @@ -30,6 +30,7 @@ INTERFACE zif_abapgit_persistence PUBLIC. labels TYPE string, transport_request TYPE trkorr, customizing_request TYPE trkorr, + flow TYPE abap_bool, END OF ty_local_settings. TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY. diff --git a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap index 546929061..51c236e11 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap @@ -23,11 +23,15 @@ CLASS zcl_abapgit_gui_page_flow DEFINITION PROTECTED SECTION. PRIVATE SECTION. + CONSTANTS: BEGIN OF c_action, + refresh TYPE string VALUE 'refresh', + END OF c_action. + ENDCLASS. -CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GUI_PAGE_FLOW IMPLEMENTATION. METHOD constructor. @@ -51,7 +55,11 @@ CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. METHOD zif_abapgit_gui_event_handler~on_event. - RETURN. " todo, implement method + + IF ii_event->mv_action = c_action-refresh. + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ENDIF. + ENDMETHOD. @@ -59,6 +67,10 @@ CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. CREATE OBJECT ro_toolbar EXPORTING iv_id = 'toolbar-main'. + ro_toolbar->add( + iv_txt = 'Refresh' + iv_act = c_action-refresh ). + ro_toolbar->add( iv_txt = zcl_abapgit_gui_buttons=>repo_list( ) iv_act = zif_abapgit_definitions=>c_action-abapgit_home ). @@ -67,32 +79,99 @@ CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. METHOD zif_abapgit_gui_renderable~render. - DATA lt_favorites TYPE zif_abapgit_repo_srv=>ty_repo_list. - DATA li_favorite LIKE LINE OF lt_favorites. - DATA lo_online TYPE REF TO zcl_abapgit_repo_online. + DATA lt_features TYPE lcl_helper=>ty_features. + DATA ls_feature LIKE LINE OF lt_features. + DATA ls_path_name LIKE LINE OF ls_feature-changed_files. + DATA ls_item LIKE LINE OF ls_feature-changed_objects. + DATA lv_status TYPE string. + DATA lv_full_match TYPE abap_bool. + DATA li_table TYPE REF TO zif_abapgit_html. register_handlers( ). CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->add( '
' ). -* list branches on favorite transported repos - lt_favorites = zcl_abapgit_repo_srv=>get_instance( )->list_favorites( abap_false ). - LOOP AT lt_favorites INTO li_favorite. - " todo, IF zcl_abapgit_factory=>get_sap_package( li_favorite->get_package( ) - " todo, )->are_changes_recorded_in_tr_req( ) = abap_false. - " todo, CONTINUE. - " todo, ENDIF. + lt_features = lcl_helper=>get_information( ). + LOOP AT lt_features INTO ls_feature. + IF lines( ls_feature-changed_files ) = 0. +* no changes, eg. only files outside of starting folder changed + CONTINUE. + ENDIF. - lo_online ?= li_favorite. - ri_html->add( '' && li_favorite->get_name( ) && '
' ). + ri_html->add( '' && ls_feature-repo_name ). + IF ls_feature-branch IS NOT INITIAL. + ri_html->add( | - | ). + ri_html->add_icon( 'code-branch' ). + ri_html->add( ls_feature-branch-display_name ). + ENDIF. + IF ls_feature-transport-trkorr IS NOT INITIAL. + ri_html->add( | - | ). + ri_html->add_icon( 'truck-solid' ). + ri_html->add( |{ ls_feature-transport-trkorr }| ). + ENDIF. + ri_html->add( |
| ). - lcl_helper=>list_changes_per_branch( lo_online ). + IF ls_feature-branch IS INITIAL. + ri_html->add( |No branch found, comparing with main| ). + ELSEIF ls_feature-pr IS NOT INITIAL. + ri_html->add_a( + iv_txt = ls_feature-pr-title + iv_act = |{ zif_abapgit_definitions=>c_action-url }?url={ ls_feature-pr-url }| + iv_class = |url| ). + + IF ls_feature-pr-draft = abap_true. + ri_html->add( 'DRAFT' ). + ENDIF. + ELSE. + ri_html->add( |No PR found| ). + ENDIF. + ri_html->add( |
| ). + + IF ls_feature-transport IS NOT INITIAL. + ri_html->add( |{ ls_feature-transport-trkorr } - { ls_feature-transport-title }
| ). + ELSE. + ri_html->add( |No corresponding transport found
| ). + ENDIF. + + ri_html->add( '
' ). + IF ls_feature-branch IS NOT INITIAL AND ls_feature-branch-up_to_date = abap_false. + ri_html->add( 'Branch not up to date

' ). + CONTINUE. + ENDIF. + + CREATE OBJECT li_table TYPE zcl_abapgit_html. + lv_full_match = abap_true. + + li_table->add( || ). + li_table->add( || && + || ). + LOOP AT ls_feature-changed_files INTO ls_path_name. + + IF ls_path_name-remote_sha1 = ls_path_name-local_sha1. + lv_status = 'Match'. + ELSE. + lv_full_match = abap_false. + lv_status = 'Diff'. + ENDIF. + li_table->add( || ). + ENDLOOP. + li_table->add( |
FilenameRemote SHA1Local SHA1
{ ls_path_name-path }{ ls_path_name-name }{ + ls_path_name-remote_sha1(7) }{ + ls_path_name-local_sha1(7) }{ lv_status }
| ). + LOOP AT ls_feature-changed_objects INTO ls_item. + li_table->add( |{ ls_item-obj_type } { ls_item-obj_name }
| ). + ENDLOOP. + + IF lv_full_match = abap_true. + ri_html->add( |Full Match
| ). + ELSE. + ri_html->add( li_table ). + ENDIF. + + ri_html->add( '
' ). ENDLOOP. -* list open transports for current user -* todo - ri_html->add( '
' ). ENDMETHOD. diff --git a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_imp.abap b/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_imp.abap index 6bd5a76f8..0cbbef8a9 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_imp.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_imp.abap @@ -2,45 +2,660 @@ *"* local helper classes, interface definitions and type *"* declarations +CLASS lcl_sha1_stack DEFINITION. + PUBLIC SECTION. + METHODS clear + RETURNING + VALUE(ro_stack) TYPE REF TO lcl_sha1_stack. + + METHODS push + IMPORTING + iv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1. + + METHODS pop + RETURNING + VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1. + + METHODS size + RETURNING + VALUE(rv_size) TYPE i. + PRIVATE SECTION. + DATA mt_list TYPE STANDARD TABLE OF zif_abapgit_git_definitions=>ty_sha1 WITH DEFAULT KEY. +ENDCLASS. + +CLASS lcl_sha1_stack IMPLEMENTATION. + METHOD clear. + CLEAR mt_list. + ro_stack = me. + ENDMETHOD. + + METHOD push. + INSERT iv_sha1 INTO mt_list INDEX 1. + ENDMETHOD. + + METHOD pop. + READ TABLE mt_list INDEX 1 INTO rv_sha1. + ASSERT sy-subrc = 0. + DELETE mt_list INDEX 1. + ENDMETHOD. + + METHOD size. + rv_size = lines( mt_list ). + ENDMETHOD. +ENDCLASS. + +*************************************************** + +CLASS lcl_filter DEFINITION FINAL. + PUBLIC SECTION. + INTERFACES zif_abapgit_object_filter. + + METHODS constructor + IMPORTING + it_filter TYPE zif_abapgit_definitions=>ty_tadir_tt. + + PRIVATE SECTION. + DATA mt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt. +ENDCLASS. + +CLASS lcl_filter IMPLEMENTATION. + METHOD constructor. + mt_filter = it_filter. + ENDMETHOD. + + METHOD zif_abapgit_object_filter~get_filter. + rt_filter = mt_filter. + ENDMETHOD. +ENDCLASS. + +*************************************************** + CLASS lcl_helper DEFINITION FINAL. PUBLIC SECTION. - CLASS-METHODS list_changes_per_branch - IMPORTING - io_online TYPE REF TO zcl_abapgit_repo_online + + TYPES: + BEGIN OF ty_path_name, + path TYPE string, + name TYPE string, + remote_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, + local_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, + END OF ty_path_name. + TYPES: + ty_path_name_tt TYPE HASHED TABLE OF ty_path_name WITH UNIQUE KEY path name. + + TYPES: BEGIN OF ty_feature, + repo_name TYPE string, + package TYPE devclass, + BEGIN OF branch, + display_name TYPE string, + sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, + up_to_date TYPE abap_bool, + END OF branch, + BEGIN OF pr, + title TYPE string, + url TYPE string, + draft TYPE abap_bool, + END OF pr, + BEGIN OF transport, + trkorr TYPE trkorr, + title TYPE string, + END OF transport, + changed_files TYPE ty_path_name_tt, + changed_objects TYPE zif_abapgit_definitions=>ty_items_ts, + END OF ty_feature. + TYPES ty_features TYPE STANDARD TABLE OF ty_feature WITH DEFAULT KEY. + + CLASS-METHODS get_information + RETURNING + VALUE(rt_features) TYPE ty_features RAISING zcx_abapgit_exception. + PRIVATE SECTION. + CONSTANTS c_main TYPE string VALUE 'main'. + + TYPES: BEGIN OF ty_transport, + trkorr TYPE trkorr, + title TYPE string, + object TYPE e071-object, + obj_name TYPE e071-obj_name, + devclass TYPE tadir-devclass, + END OF ty_transport. + + TYPES ty_transports_tt TYPE STANDARD TABLE OF ty_transport WITH DEFAULT KEY. + + CLASS-METHODS map_files_to_objects + IMPORTING + it_files TYPE ty_path_name_tt + io_online TYPE REF TO zcl_abapgit_repo_online + RETURNING + VALUE(rt_changed_objects) TYPE zif_abapgit_definitions=>ty_items_ts + RAISING + zcx_abapgit_exception. + + CLASS-METHODS find_changed_files_all + IMPORTING + io_online TYPE REF TO zcl_abapgit_repo_online + it_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt + EXPORTING + et_main_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt + CHANGING + ct_features TYPE ty_features + RAISING + zcx_abapgit_exception. + + CLASS-METHODS try_matching_transports + IMPORTING + ii_repo TYPE REF TO zif_abapgit_repo + it_main_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt + CHANGING + ct_features TYPE ty_features + ct_transports TYPE ty_transports_tt + RAISING + zcx_abapgit_exception. + + CLASS-METHODS find_up_to_date + IMPORTING + iv_url TYPE string + it_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt + CHANGING + ct_features TYPE ty_features + RAISING + zcx_abapgit_exception. + + CLASS-METHODS find_prs + IMPORTING + iv_url TYPE string + CHANGING + ct_features TYPE ty_features + RAISING + zcx_abapgit_exception. + + CLASS-METHODS add_local_status + IMPORTING + io_online TYPE REF TO zcl_abapgit_repo_online + CHANGING + ct_features TYPE ty_features + RAISING + zcx_abapgit_exception. + + CLASS-METHODS find_open_transports + RETURNING + VALUE(rt_transports) TYPE ty_transports_tt + RAISING + zcx_abapgit_exception. + + CLASS-METHODS find_changed_files + IMPORTING + it_expanded1 TYPE zif_abapgit_git_definitions=>ty_expanded_tt + it_expanded2 TYPE zif_abapgit_git_definitions=>ty_expanded_tt + RETURNING + VALUE(rt_files) TYPE ty_path_name_tt. ENDCLASS. CLASS lcl_helper IMPLEMENTATION. - METHOD list_changes_per_branch. + METHOD find_prs. - DATA lt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt. - DATA ls_branch LIKE LINE OF lt_branches. - DATA lt_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt. - DATA lt_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt. - DATA lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. - DATA lv_starting_folder TYPE string. + DATA lt_pulls TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests. + DATA ls_pull LIKE LINE OF lt_pulls. - lt_branches = zcl_abapgit_gitv2_porcelain=>list_branches( - iv_url = io_online->get_url( ) - iv_prefix = 'refs/heads/' )->get_all( ). - LOOP AT lt_branches INTO ls_branch WHERE is_head = abap_false. + FIELD-SYMBOLS LIKE LINE OF ct_features. + + + IF lines( ct_features ) = 0. + " only main branch + RETURN. + ENDIF. + + lt_pulls = zcl_abapgit_pr_enumerator=>new( iv_url )->get_pulls( ). + + LOOP AT ct_features ASSIGNING . + READ TABLE lt_pulls INTO ls_pull WITH KEY head_branch = -branch-display_name. + IF sy-subrc = 0. + -pr-title = |{ ls_pull-title } #{ ls_pull-number }|. + -pr-url = ls_pull-html_url. + -pr-draft = ls_pull-draft. + ENDIF. + ENDLOOP. + + ENDMETHOD. + + METHOD get_information. + + DATA lt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt. + DATA ls_branch LIKE LINE OF lt_branches. + DATA ls_result LIKE LINE OF rt_features. + DATA lt_favorites TYPE zif_abapgit_repo_srv=>ty_repo_list. + DATA li_favorite LIKE LINE OF lt_favorites. + DATA lo_online TYPE REF TO zcl_abapgit_repo_online. + DATA lt_features LIKE rt_features. + DATA lt_transports TYPE ty_transports_tt. + DATA lt_main_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt. + + + lt_transports = find_open_transports( ). + +* list branches on favorite + flow enabled + transported repos + lt_favorites = zcl_abapgit_repo_srv=>get_instance( )->list_favorites( abap_false ). + LOOP AT lt_favorites INTO li_favorite. + IF li_favorite->get_local_settings( )-flow = abap_false. + CONTINUE. + ELSEIF zcl_abapgit_factory=>get_sap_package( li_favorite->get_package( ) + )->are_changes_recorded_in_tr_req( ) = abap_false. + CONTINUE. + ENDIF. + + lo_online ?= li_favorite. + + lt_branches = zcl_abapgit_git_factory=>get_v2_porcelain( )->list_branches( + iv_url = lo_online->get_url( ) + iv_prefix = 'refs/heads/' )->get_all( ). + + CLEAR lt_features. + LOOP AT lt_branches INTO ls_branch WHERE display_name <> c_main. + ls_result-repo_name = li_favorite->get_name( ). + ls_result-package = li_favorite->get_package( ). + ls_result-branch-display_name = ls_branch-display_name. + ls_result-branch-sha1 = ls_branch-sha1. + INSERT ls_result INTO TABLE lt_features. + ENDLOOP. + + find_changed_files_all( + EXPORTING + io_online = lo_online + it_branches = lt_branches + IMPORTING + et_main_expanded = lt_main_expanded + CHANGING + ct_features = lt_features ). + + try_matching_transports( + EXPORTING + ii_repo = li_favorite + it_main_expanded = lt_main_expanded + CHANGING + ct_transports = lt_transports + ct_features = lt_features ). + + find_up_to_date( + EXPORTING + iv_url = lo_online->get_url( ) + it_branches = lt_branches + CHANGING + ct_features = lt_features ). + + find_prs( + EXPORTING + iv_url = lo_online->get_url( ) + CHANGING + ct_features = lt_features ). + + add_local_status( + EXPORTING + io_online = lo_online + CHANGING + ct_features = lt_features ). + + INSERT LINES OF lt_features INTO TABLE rt_features. + ENDLOOP. + + ENDMETHOD. + + METHOD try_matching_transports. + + DATA lt_trkorr LIKE ct_transports. + DATA ls_trkorr LIKE LINE OF lt_trkorr. + DATA ls_result LIKE LINE OF ct_features. + DATA lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt. + DATA lv_package LIKE LINE OF lt_packages. + DATA lv_found TYPE abap_bool. + DATA ls_changed LIKE LINE OF ls_result-changed_objects. + DATA lo_filter TYPE REF TO lcl_filter. + DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt. + DATA lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt. + DATA ls_changed_file LIKE LINE OF ls_result-changed_files. + + FIELD-SYMBOLS LIKE LINE OF ct_features. + FIELD-SYMBOLS LIKE LINE OF ct_transports. + FIELD-SYMBOLS LIKE LINE OF lt_local. + FIELD-SYMBOLS LIKE LINE OF lt_filter. + FIELD-SYMBOLS LIKE LINE OF -changed_objects. + FIELD-SYMBOLS LIKE LINE OF it_main_expanded. + + + SORT ct_transports BY object obj_name. + + LOOP AT ct_features ASSIGNING . + LOOP AT -changed_objects ASSIGNING . + READ TABLE ct_transports ASSIGNING + WITH KEY object = -obj_type obj_name = -obj_name BINARY SEARCH. + IF sy-subrc = 0. + -transport-trkorr = -trkorr. + -transport-title = -title. + + DELETE ct_transports WHERE trkorr = -trkorr. +* todo, fill changed objects/files? + EXIT. + ENDIF. + ENDLOOP. + ENDLOOP. + +* unmatched transports + lt_trkorr = ct_transports. + SORT lt_trkorr BY trkorr. + DELETE ADJACENT DUPLICATES FROM lt_trkorr COMPARING trkorr. + + lt_packages = zcl_abapgit_factory=>get_sap_package( ii_repo->get_package( ) )->list_subpackages( ). + + LOOP AT lt_trkorr INTO ls_trkorr. + lv_found = abap_false. + LOOP AT lt_packages INTO lv_package. + READ TABLE ct_transports ASSIGNING WITH KEY trkorr = ls_trkorr-trkorr devclass = lv_package. + IF sy-subrc = 0. + lv_found = abap_true. + ENDIF. + ENDLOOP. + IF lv_found = abap_false. + CONTINUE. + ENDIF. + + CLEAR ls_result. + CLEAR lt_filter. + ls_result-repo_name = ii_repo->get_name( ). + ls_result-package = ii_repo->get_package( ). + ls_result-transport-trkorr = -trkorr. + ls_result-transport-title = -title. + LOOP AT ct_transports ASSIGNING WHERE trkorr = ls_trkorr-trkorr. + ls_changed-obj_type = -object. + ls_changed-obj_name = -obj_name. + INSERT ls_changed INTO TABLE ls_result-changed_objects. + + APPEND INITIAL LINE TO lt_filter ASSIGNING . + -object = -object. + -obj_name = -obj_name. + ENDLOOP. + + CREATE OBJECT lo_filter EXPORTING it_filter = lt_filter. + lt_local = ii_repo->get_files_local_filtered( lo_filter ). + LOOP AT lt_local ASSIGNING WHERE file-filename <> zif_abapgit_definitions=>c_dot_abapgit. + ls_changed_file-path = -file-path. + ls_changed_file-name = -file-filename. + ls_changed_file-local_sha1 = -file-sha1. + + READ TABLE it_main_expanded ASSIGNING + WITH TABLE KEY path_name COMPONENTS + path = ls_changed_file-path + name = ls_changed_file-name. + IF sy-subrc = 0. + ls_changed_file-remote_sha1 = -sha1. + ENDIF. + + INSERT ls_changed_file INTO TABLE ls_result-changed_files. + ENDLOOP. + + INSERT ls_result INTO TABLE ct_features. + ENDLOOP. + + ENDMETHOD. + + METHOD find_open_transports. + + DATA lt_trkorr TYPE zif_abapgit_cts_api=>ty_trkorr_tt. + DATA lv_trkorr LIKE LINE OF lt_trkorr. + DATA ls_result LIKE LINE OF rt_transports. + DATA lt_objects TYPE zif_abapgit_cts_api=>ty_transport_obj_tt. + DATA lv_obj_name TYPE tadir-obj_name. + + FIELD-SYMBOLS LIKE LINE OF lt_objects. + + + lt_trkorr = zcl_abapgit_factory=>get_cts_api( )->list_open_requests_by_user( ). + + LOOP AT lt_trkorr INTO lv_trkorr. + ls_result-trkorr = lv_trkorr. + ls_result-title = zcl_abapgit_factory=>get_cts_api( )->read_description( lv_trkorr ). + + lt_objects = zcl_abapgit_factory=>get_cts_api( )->list_r3tr_by_request( lv_trkorr ). + LOOP AT lt_objects ASSIGNING . + ls_result-object = -object. + ls_result-obj_name = -obj_name. + + lv_obj_name = -obj_name. + ls_result-devclass = zcl_abapgit_factory=>get_tadir( )->read_single( + iv_object = ls_result-object + iv_obj_name = lv_obj_name )-devclass. + INSERT ls_result INTO TABLE rt_transports. + ENDLOOP. + + ENDLOOP. + + ENDMETHOD. + + METHOD find_up_to_date. + + DATA ls_branch LIKE LINE OF it_branches. + DATA lt_commits TYPE zif_abapgit_definitions=>ty_objects_tt. + DATA ls_main LIKE LINE OF it_branches. + DATA lv_current TYPE zif_abapgit_git_definitions=>ty_sha1. + DATA lt_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt. + DATA lo_visit TYPE REF TO lcl_sha1_stack. + DATA ls_raw TYPE zcl_abapgit_git_pack=>ty_commit. + + DATA lt_main_reachable TYPE HASHED TABLE OF zif_abapgit_git_definitions=>ty_sha1 WITH UNIQUE KEY table_line. + + FIELD-SYMBOLS LIKE LINE OF ct_features. + FIELD-SYMBOLS LIKE LINE OF lt_commits. + + + IF lines( it_branches ) = 1. + " only main branch + RETURN. + ENDIF. + + READ TABLE it_branches INTO ls_main WITH KEY display_name = c_main. + ASSERT sy-subrc = 0. + + LOOP AT it_branches INTO ls_branch WHERE is_head = abap_false. APPEND ls_branch-sha1 TO lt_sha1. ENDLOOP. - lt_objects = zcl_abapgit_gitv2_porcelain=>list_no_blobs_multi( + lt_commits = zcl_abapgit_git_factory=>get_v2_porcelain( )->commits_last_year( + iv_url = iv_url + it_sha1 = lt_sha1 ). + + CREATE OBJECT lo_visit. + lo_visit->clear( )->push( ls_main-sha1 ). + WHILE lo_visit->size( ) > 0. + lv_current = lo_visit->pop( ). + INSERT lv_current INTO TABLE lt_main_reachable. + READ TABLE lt_commits ASSIGNING WITH TABLE KEY sha COMPONENTS sha1 = lv_current. + IF sy-subrc = 0. + ls_raw = zcl_abapgit_git_pack=>decode_commit( -data ). + lo_visit->push( ls_raw-parent ). + IF ls_raw-parent2 IS NOT INITIAL. + lo_visit->push( ls_raw-parent2 ). + ENDIF. + ENDIF. + ENDWHILE. + + LOOP AT ct_features ASSIGNING . + -branch-up_to_date = abap_undefined. + lo_visit->clear( )->push( -branch-sha1 ). + + WHILE lo_visit->size( ) > 0. + lv_current = lo_visit->pop( ). + IF lv_current = ls_main-sha1. + -branch-up_to_date = abap_true. + EXIT. + ENDIF. + + READ TABLE lt_main_reachable WITH KEY table_line = lv_current TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + -branch-up_to_date = abap_false. + EXIT. + ENDIF. + + READ TABLE lt_commits ASSIGNING WITH TABLE KEY sha COMPONENTS sha1 = lv_current. + IF sy-subrc = 0. + ls_raw = zcl_abapgit_git_pack=>decode_commit( -data ). + lo_visit->push( ls_raw-parent ). + IF ls_raw-parent2 IS NOT INITIAL. + lo_visit->push( ls_raw-parent2 ). + ENDIF. + ENDIF. + ENDWHILE. + + ENDLOOP. + + ENDMETHOD. + + METHOD find_changed_files_all. + + DATA ls_branch LIKE LINE OF it_branches. + DATA lt_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt. + DATA lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. + DATA lv_starting_folder TYPE string. + DATA ls_main LIKE LINE OF it_branches. + DATA lt_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt. + + FIELD-SYMBOLS LIKE LINE OF ct_features. + + + LOOP AT it_branches INTO ls_branch WHERE is_head = abap_false. + APPEND ls_branch-sha1 TO lt_sha1. + ENDLOOP. + + lt_objects = zcl_abapgit_git_factory=>get_v2_porcelain( )->list_no_blobs_multi( iv_url = io_online->get_url( ) it_sha1 = lt_sha1 ). lv_starting_folder = io_online->get_dot_abapgit( )->get_starting_folder( ) && '*'. - LOOP AT lt_branches INTO ls_branch WHERE is_head = abap_false. + READ TABLE it_branches INTO ls_main WITH KEY display_name = c_main. + ASSERT sy-subrc = 0. + + et_main_expanded = zcl_abapgit_git_porcelain=>full_tree( + it_objects = lt_objects + iv_parent = ls_main-sha1 ). + DELETE et_main_expanded WHERE path NP lv_starting_folder. + + LOOP AT ct_features ASSIGNING WHERE branch-display_name <> c_main. lt_expanded = zcl_abapgit_git_porcelain=>full_tree( it_objects = lt_objects - iv_parent = ls_branch-sha1 ). + iv_parent = -branch-sha1 ). DELETE lt_expanded WHERE path NP lv_starting_folder. + + -changed_files = find_changed_files( + it_expanded1 = lt_expanded + it_expanded2 = et_main_expanded ). + + -changed_objects = map_files_to_objects( + io_online = io_online + it_files = -changed_files ). ENDLOOP. ENDMETHOD. + + METHOD add_local_status. + + DATA lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt. + DATA lo_filter TYPE REF TO lcl_filter. + DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt. + + FIELD-SYMBOLS LIKE LINE OF ct_features. + FIELD-SYMBOLS LIKE LINE OF lt_local. + FIELD-SYMBOLS TYPE ty_path_name. + FIELD-SYMBOLS LIKE LINE OF lt_filter. + FIELD-SYMBOLS LIKE LINE OF -changed_objects. + + + LOOP AT ct_features ASSIGNING . + LOOP AT -changed_objects ASSIGNING . + APPEND INITIAL LINE TO lt_filter ASSIGNING . + -object = -obj_type. + -obj_name = -obj_name. + ENDLOOP. + ENDLOOP. + SORT lt_filter BY object obj_name. + DELETE ADJACENT DUPLICATES FROM lt_filter COMPARING object obj_name. + + IF lines( lt_filter ) = 0. + RETURN. + ENDIF. + + CREATE OBJECT lo_filter EXPORTING it_filter = lt_filter. + lt_local = io_online->get_files_local_filtered( lo_filter ). + + LOOP AT ct_features ASSIGNING . + LOOP AT -changed_files ASSIGNING . + READ TABLE lt_local ASSIGNING + WITH KEY file-filename = -name + file-path = -path. + IF sy-subrc = 0. + -local_sha1 = -file-sha1. + ENDIF. + ENDLOOP. + ENDLOOP. + + ENDMETHOD. + + METHOD map_files_to_objects. + + DATA ls_item TYPE zif_abapgit_definitions=>ty_item. + + FIELD-SYMBOLS LIKE LINE OF it_files. + + LOOP AT it_files ASSIGNING . + zcl_abapgit_filename_logic=>file_to_object( + EXPORTING + iv_filename = -name + iv_path = -path + iv_devclass = io_online->get_package( ) + io_dot = io_online->get_dot_abapgit( ) + IMPORTING + es_item = ls_item ). + INSERT ls_item INTO TABLE rt_changed_objects. + ENDLOOP. + + ENDMETHOD. + + METHOD find_changed_files. +* dont care if its added or removed or changed, just remove identical +* also list identical moved files + + DATA ls_path_name LIKE LINE OF rt_files. + + FIELD-SYMBOLS LIKE LINE OF it_expanded1. + FIELD-SYMBOLS LIKE LINE OF it_expanded1. + + LOOP AT it_expanded1 ASSIGNING . + READ TABLE it_expanded2 ASSIGNING + WITH TABLE KEY path_name COMPONENTS + path = -path + name = -name. + IF sy-subrc = 0 AND -sha1 = -sha1. + CONTINUE. + ENDIF. + + MOVE-CORRESPONDING TO ls_path_name. + ls_path_name-remote_sha1 = -sha1. + INSERT ls_path_name INTO TABLE rt_files. + ENDLOOP. + + LOOP AT it_expanded2 ASSIGNING . + READ TABLE it_expanded1 ASSIGNING + WITH TABLE KEY path_name COMPONENTS + path = -path + name = -name. + IF sy-subrc = 0 AND -sha1 = -sha1. + CONTINUE. + ENDIF. + + MOVE-CORRESPONDING TO ls_path_name. + ls_path_name-remote_sha1 = -sha1. + INSERT ls_path_name INTO TABLE rt_files. + ENDLOOP. + + ENDMETHOD. + ENDCLASS. diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap index 3f4d11a07..3275ad8ae 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap @@ -41,6 +41,7 @@ CLASS zcl_abapgit_gui_page_sett_locl DEFINITION checks TYPE string VALUE 'checks', code_inspector_check_variant TYPE string VALUE 'code_inspector_check_variant', block_commit TYPE string VALUE 'block_commit', + flow TYPE string VALUE 'flow', END OF c_id . CONSTANTS: BEGIN OF c_event, @@ -271,8 +272,15 @@ CLASS zcl_abapgit_gui_page_sett_locl IMPLEMENTATION. )->checkbox( iv_name = c_id-main_language_only iv_label = 'Only Serialize Main Language' - iv_hint = 'Ignore translations; serialize only main language of repository' - )->start_group( + iv_hint = 'Ignore translations; serialize only main language of repository' ). + + IF zcl_abapgit_feature=>is_enabled( 'FLOW' ) = abap_true. + ro_form->checkbox( + iv_name = c_id-flow + iv_label = 'Enable Flow Page' ). + ENDIF. + + ro_form->start_group( iv_name = c_id-checks iv_label = 'Local Checks' iv_hint = 'Code Inspector check performed to run from menu and before commit' @@ -366,6 +374,9 @@ CLASS zcl_abapgit_gui_page_sett_locl IMPLEMENTATION. ro_form_data->set( iv_key = c_id-main_language_only iv_val = boolc( ms_settings-main_language_only = abap_true ) ) ##TYPE. + ro_form_data->set( + iv_key = c_id-flow + iv_val = boolc( ms_settings-flow = abap_true ) ) ##TYPE. ro_form_data->set( iv_key = c_id-write_protected iv_val = boolc( ms_settings-write_protected = abap_true ) ) ##TYPE. @@ -390,6 +401,7 @@ CLASS zcl_abapgit_gui_page_sett_locl IMPLEMENTATION. ms_settings-labels = zcl_abapgit_repo_labels=>normalize( mo_form_data->get( c_id-labels ) ). ms_settings-ignore_subpackages = mo_form_data->get( c_id-ignore_subpackages ). ms_settings-main_language_only = mo_form_data->get( c_id-main_language_only ). + ms_settings-flow = mo_form_data->get( c_id-flow ). ms_settings-write_protected = mo_form_data->get( c_id-write_protected ). ms_settings-only_local_objects = mo_form_data->get( c_id-only_local_objects ). ms_settings-code_inspector_check_variant = mo_form_data->get( c_id-code_inspector_check_variant ). diff --git a/test/zcl_abapgit_integration_git.clas.testclasses.abap b/test/zcl_abapgit_integration_git.clas.testclasses.abap index a31612e0a..bfe77b0e2 100644 --- a/test/zcl_abapgit_integration_git.clas.testclasses.abap +++ b/test/zcl_abapgit_integration_git.clas.testclasses.abap @@ -26,9 +26,9 @@ CLASS ltcl_test IMPLEMENTATION. METHOD test01. CONSTANTS lc_url TYPE string VALUE 'https://github.com/larshp/Empty.git'. - DATA lv_ref TYPE string. + DATA lv_ref TYPE string. DATA li_memory TYPE REF TO lcl_memory_settings. - DATA ls_pull TYPE zcl_abapgit_git_porcelain=>ty_pull_result. + DATA ls_pull TYPE zcl_abapgit_git_porcelain=>ty_pull_result. CREATE OBJECT li_memory. diff --git a/test/zcl_abapgit_integration_gitv2.clas.testclasses.abap b/test/zcl_abapgit_integration_gitv2.clas.testclasses.abap index c90b9fba3..1ffb739c4 100644 --- a/test/zcl_abapgit_integration_gitv2.clas.testclasses.abap +++ b/test/zcl_abapgit_integration_gitv2.clas.testclasses.abap @@ -2,7 +2,8 @@ CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL CRITICAL FINAL. PRIVATE SECTION. METHODS list_branches FOR TESTING RAISING cx_static_check. - METHODS test02 FOR TESTING RAISING cx_static_check. + METHODS list_no_blobs FOR TESTING RAISING cx_static_check. + METHODS commits_last_year FOR TESTING RAISING cx_static_check. ENDCLASS. @@ -14,7 +15,7 @@ CLASS ltcl_test IMPLEMENTATION. DATA lo_list TYPE REF TO zcl_abapgit_git_branch_list. DATA lt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt. - lo_list = zcl_abapgit_gitv2_porcelain=>list_branches( + lo_list = zcl_abapgit_git_factory=>get_v2_porcelain( )->list_branches( iv_url = 'https://github.com/abapGit/abapGit.git' iv_prefix = 'refs/heads' ). @@ -27,11 +28,11 @@ CLASS ltcl_test IMPLEMENTATION. ENDMETHOD. - METHOD test02. + METHOD list_no_blobs. DATA lt_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt. - lt_expanded = zcl_abapgit_gitv2_porcelain=>list_no_blobs( + lt_expanded = zcl_abapgit_git_factory=>get_v2_porcelain( )->list_no_blobs( iv_url = 'https://github.com/abapGit/abapGit.git' iv_sha1 = '7bdd8f9f4c6bb0ece461b78c7b559957fad6c3ae' ). @@ -42,4 +43,19 @@ CLASS ltcl_test IMPLEMENTATION. ENDMETHOD. + METHOD commits_last_year. + + DATA lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt. + DATA lt_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1_tt. + + INSERT '7bdd8f9f4c6bb0ece461b78c7b559957fad6c3ae' INTO TABLE lt_sha1. + + lt_objects = zcl_abapgit_git_factory=>get_v2_porcelain( )->commits_last_year( + iv_url = 'https://github.com/abapGit/abapGit.git' + it_sha1 = lt_sha1 ). + +* just check it doesnt throw an exception + + ENDMETHOD. + ENDCLASS.