From 18ea5d637cf35699525be81f94c4d27ac36a65c9 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 15 Feb 2018 15:10:13 +0100 Subject: [PATCH] lcl_repo (#1205) * lcl_repo and more to global * cleanup includes * fix indentation --- .../zcl_abapgit_git_porcelain.clas.abap} | 855 ++++---- ...bapgit_git_porcelain.clas.testclasses.abap | 153 ++ src/git/zcl_abapgit_git_porcelain.clas.xml | 20 + .../zcl_abapgit_popups.clas.abap} | 1941 +++++++++-------- src/ui/zcl_abapgit_popups.clas.xml | 19 + src/zabapgit.prog.abap | 9 - src/zabapgit_background.prog.abap | 18 +- src/zabapgit_file_status.prog.xml | 22 - src/zabapgit_forms.prog.abap | 4 +- src/zabapgit_git.prog.xml | 22 - src/zabapgit_gui_router.prog.abap | 18 +- src/zabapgit_html_chunks.prog.abap | 6 +- src/zabapgit_migrations.prog.abap | 12 +- src/zabapgit_news.prog.abap | 5 +- src/zabapgit_objects.prog.abap | 313 --- src/zabapgit_objects.prog.xml | 22 - src/zabapgit_objects_impl.prog.xml | 22 - src/zabapgit_page_background.prog.abap | 4 +- src/zabapgit_page_branch_overview.prog.abap | 8 +- src/zabapgit_page_commit.prog.abap | 4 +- src/zabapgit_page_db.prog.abap | 2 +- src/zabapgit_page_debug.prog.abap | 2 +- src/zabapgit_page_diff.prog.abap | 6 +- src/zabapgit_page_main.prog.abap | 20 +- src/zabapgit_page_merge.prog.abap | 26 +- src/zabapgit_page_repo_settings.prog.abap | 4 +- src/zabapgit_page_stage.prog.abap | 8 +- src/zabapgit_page_syntax_check.prog.abap | 4 +- src/zabapgit_popups.prog.xml | 22 - src/zabapgit_repo.prog.abap | 251 --- src/zabapgit_repo.prog.xml | 22 - src/zabapgit_repo_browser_util.prog.abap | 8 +- src/zabapgit_repo_impl.prog.abap | 1096 ---------- src/zabapgit_repo_impl.prog.xml | 22 - src/zabapgit_services_abapgit.prog.abap | 19 +- src/zabapgit_services_db.prog.abap | 2 +- src/zabapgit_services_git.prog.abap | 70 +- src/zabapgit_services_repo.prog.abap | 78 +- src/zabapgit_stage_logic.prog.xml | 22 - src/zabapgit_tadir.prog.xml | 22 - src/zabapgit_transport.prog.abap | 15 +- src/zabapgit_unit_test.prog.abap | 444 +--- src/zabapgit_view_repo.prog.abap | 6 +- src/zabapgit_zip.prog.abap | 14 +- ...abap => zcl_abapgit_file_status.clas.abap} | 491 +++-- ..._abapgit_file_status.clas.testclasses.abap | 267 +++ src/zcl_abapgit_file_status.clas.xml | 20 + ...rog.abap => zcl_abapgit_objects.clas.abap} | 751 ++++--- src/zcl_abapgit_objects.clas.xml | 18 + src/zcl_abapgit_objects_bridge.clas.abap | 192 ++ src/zcl_abapgit_objects_bridge.clas.xml | 19 + src/zcl_abapgit_repo.clas.abap | 576 +++++ src/zcl_abapgit_repo.clas.xml | 19 + src/zcl_abapgit_repo_offline.clas.abap | 15 + src/zcl_abapgit_repo_offline.clas.xml | 19 + src/zcl_abapgit_repo_online.clas.abap | 465 ++++ src/zcl_abapgit_repo_online.clas.xml | 19 + src/zcl_abapgit_repo_srv.clas.abap | 352 +++ src/zcl_abapgit_repo_srv.clas.xml | 18 + ...abap => zcl_abapgit_stage_logic.clas.abap} | 76 +- src/zcl_abapgit_stage_logic.clas.xml | 19 + ....prog.abap => zcl_abapgit_tadir.clas.abap} | 189 +- src/zcl_abapgit_tadir.clas.xml | 19 + 63 files changed, 4652 insertions(+), 4554 deletions(-) rename src/{zabapgit_git.prog.abap => git/zcl_abapgit_git_porcelain.clas.abap} (86%) create mode 100644 src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap create mode 100644 src/git/zcl_abapgit_git_porcelain.clas.xml rename src/{zabapgit_popups.prog.abap => ui/zcl_abapgit_popups.clas.abap} (97%) create mode 100644 src/ui/zcl_abapgit_popups.clas.xml delete mode 100644 src/zabapgit_file_status.prog.xml delete mode 100644 src/zabapgit_git.prog.xml delete mode 100644 src/zabapgit_objects.prog.abap delete mode 100644 src/zabapgit_objects.prog.xml delete mode 100644 src/zabapgit_objects_impl.prog.xml delete mode 100644 src/zabapgit_popups.prog.xml delete mode 100644 src/zabapgit_repo.prog.abap delete mode 100644 src/zabapgit_repo.prog.xml delete mode 100644 src/zabapgit_repo_impl.prog.abap delete mode 100644 src/zabapgit_repo_impl.prog.xml delete mode 100644 src/zabapgit_stage_logic.prog.xml delete mode 100644 src/zabapgit_tadir.prog.xml rename src/{zabapgit_file_status.prog.abap => zcl_abapgit_file_status.clas.abap} (92%) create mode 100644 src/zcl_abapgit_file_status.clas.testclasses.abap create mode 100644 src/zcl_abapgit_file_status.clas.xml rename src/{zabapgit_objects_impl.prog.abap => zcl_abapgit_objects.clas.abap} (80%) create mode 100644 src/zcl_abapgit_objects.clas.xml create mode 100644 src/zcl_abapgit_objects_bridge.clas.abap create mode 100644 src/zcl_abapgit_objects_bridge.clas.xml create mode 100644 src/zcl_abapgit_repo.clas.abap create mode 100644 src/zcl_abapgit_repo.clas.xml create mode 100644 src/zcl_abapgit_repo_offline.clas.abap create mode 100644 src/zcl_abapgit_repo_offline.clas.xml create mode 100644 src/zcl_abapgit_repo_online.clas.abap create mode 100644 src/zcl_abapgit_repo_online.clas.xml create mode 100644 src/zcl_abapgit_repo_srv.clas.abap create mode 100644 src/zcl_abapgit_repo_srv.clas.xml rename src/{zabapgit_stage_logic.prog.abap => zcl_abapgit_stage_logic.clas.abap} (81%) create mode 100644 src/zcl_abapgit_stage_logic.clas.xml rename src/{zabapgit_tadir.prog.abap => zcl_abapgit_tadir.clas.abap} (87%) create mode 100644 src/zcl_abapgit_tadir.clas.xml diff --git a/src/zabapgit_git.prog.abap b/src/git/zcl_abapgit_git_porcelain.clas.abap similarity index 86% rename from src/zabapgit_git.prog.abap rename to src/git/zcl_abapgit_git_porcelain.clas.abap index a5108004b..7deeaaf32 100644 --- a/src/zabapgit_git.prog.abap +++ b/src/git/zcl_abapgit_git_porcelain.clas.abap @@ -1,70 +1,73 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_GIT -*&---------------------------------------------------------------------* - -CLASS ltcl_git_porcelain DEFINITION DEFERRED. - -*----------------------------------------------------------------------* -* CLASS lcl_porcelain DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain. +CLASS zcl_abapgit_git_porcelain DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . PUBLIC SECTION. - TYPES: BEGIN OF ty_expanded, - path TYPE string, - name TYPE string, - sha1 TYPE zif_abapgit_definitions=>ty_sha1, - chmod TYPE zif_abapgit_definitions=>ty_chmod, - END OF ty_expanded. - - TYPES: ty_expanded_tt TYPE STANDARD TABLE OF ty_expanded WITH DEFAULT KEY. + TYPES: + BEGIN OF ty_expanded, + path TYPE string, + name TYPE string, + sha1 TYPE zif_abapgit_definitions=>ty_sha1, + chmod TYPE zif_abapgit_definitions=>ty_chmod, + END OF ty_expanded . + TYPES: + ty_expanded_tt TYPE STANDARD TABLE OF ty_expanded WITH DEFAULT KEY . CLASS-METHODS pull - IMPORTING io_repo TYPE REF TO lcl_repo_online - EXPORTING et_files TYPE zif_abapgit_definitions=>ty_files_tt - et_objects TYPE zif_abapgit_definitions=>ty_objects_tt - ev_branch TYPE zif_abapgit_definitions=>ty_sha1 - RAISING zcx_abapgit_exception. - + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + EXPORTING + !et_files TYPE zif_abapgit_definitions=>ty_files_tt + !et_objects TYPE zif_abapgit_definitions=>ty_objects_tt + !ev_branch TYPE zif_abapgit_definitions=>ty_sha1 + RAISING + zcx_abapgit_exception . CLASS-METHODS push - IMPORTING io_repo TYPE REF TO lcl_repo_online - is_comment TYPE zif_abapgit_definitions=>ty_comment - io_stage TYPE REF TO zcl_abapgit_stage - EXPORTING ev_branch TYPE zif_abapgit_definitions=>ty_sha1 - et_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt - RAISING zcx_abapgit_exception. - + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !is_comment TYPE zif_abapgit_definitions=>ty_comment + !io_stage TYPE REF TO zcl_abapgit_stage + EXPORTING + !ev_branch TYPE zif_abapgit_definitions=>ty_sha1 + !et_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt + RAISING + zcx_abapgit_exception . CLASS-METHODS create_branch - IMPORTING io_repo TYPE REF TO lcl_repo_online - iv_name TYPE string - iv_from TYPE zif_abapgit_definitions=>ty_sha1 - RAISING zcx_abapgit_exception. - + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !iv_name TYPE string + !iv_from TYPE zif_abapgit_definitions=>ty_sha1 + RAISING + zcx_abapgit_exception . CLASS-METHODS create_tag - IMPORTING io_repo TYPE REF TO lcl_repo_online - iv_name TYPE string - iv_from TYPE zif_abapgit_definitions=>ty_sha1 - RAISING zcx_abapgit_exception. - + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !iv_name TYPE string + !iv_from TYPE zif_abapgit_definitions=>ty_sha1 + RAISING + zcx_abapgit_exception . CLASS-METHODS delete_branch - IMPORTING io_repo TYPE REF TO lcl_repo_online - is_branch TYPE zcl_abapgit_git_branch_list=>ty_git_branch - RAISING zcx_abapgit_exception. - + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !is_branch TYPE zcl_abapgit_git_branch_list=>ty_git_branch + RAISING + zcx_abapgit_exception . CLASS-METHODS delete_tag - IMPORTING io_repo TYPE REF TO lcl_repo_online - is_tag TYPE zcl_abapgit_git_branch_list=>ty_git_branch - RAISING zcx_abapgit_exception. - + IMPORTING + !io_repo TYPE REF TO zcl_abapgit_repo_online + !is_tag TYPE zcl_abapgit_git_branch_list=>ty_git_branch + RAISING + zcx_abapgit_exception . CLASS-METHODS full_tree - IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt - iv_branch TYPE zif_abapgit_definitions=>ty_sha1 - RETURNING VALUE(rt_expanded) TYPE ty_expanded_tt - RAISING zcx_abapgit_exception. - + IMPORTING + !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt + !iv_branch TYPE zif_abapgit_definitions=>ty_sha1 + RETURNING + VALUE(rt_expanded) TYPE ty_expanded_tt + RAISING + zcx_abapgit_exception . PRIVATE SECTION. TYPES: BEGIN OF ty_tree, @@ -110,21 +113,346 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain. CLASS-METHODS receive_pack IMPORTING is_comment TYPE zif_abapgit_definitions=>ty_comment - io_repo TYPE REF TO lcl_repo_online + io_repo TYPE REF TO zcl_abapgit_repo_online it_trees TYPE ty_trees_tt it_blobs TYPE zif_abapgit_definitions=>ty_files_tt io_stage TYPE REF TO zcl_abapgit_stage RETURNING VALUE(rv_branch) TYPE zif_abapgit_definitions=>ty_sha1 RAISING zcx_abapgit_exception. -ENDCLASS. "lcl_porcelain DEFINITION +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_GIT_PORCELAIN IMPLEMENTATION. + + + METHOD build_trees. + + DATA: lt_nodes TYPE zcl_abapgit_git_pack=>ty_nodes_tt, + ls_tree LIKE LINE OF rt_trees, + lv_len TYPE i, + lt_folders TYPE ty_folders_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_folders, + LIKE LINE OF lt_nodes, + LIKE LINE OF lt_folders, + LIKE LINE OF it_expanded. + + + lt_folders = find_folders( it_expanded ). + +* start with the deepest folders + SORT lt_folders BY count DESCENDING. + + LOOP AT lt_folders ASSIGNING . + CLEAR lt_nodes. + +* files + LOOP AT it_expanded ASSIGNING WHERE path = -path. + APPEND INITIAL LINE TO lt_nodes ASSIGNING . + -chmod = -chmod. + -name = -name. + -sha1 = -sha1. + ENDLOOP. + +* folders + LOOP AT lt_folders ASSIGNING WHERE count = -count + 1. + lv_len = strlen( -path ). + IF strlen( -path ) > lv_len AND -path(lv_len) = -path. + APPEND INITIAL LINE TO lt_nodes ASSIGNING . + -chmod = zif_abapgit_definitions=>gc_chmod-dir. + +* extract folder name, this can probably be done easier using regular expressions + -name = -path+lv_len. + lv_len = strlen( -name ) - 1. + -name = -name(lv_len). + + -sha1 = -sha1. + ENDIF. + ENDLOOP. + + CLEAR ls_tree. + ls_tree-path = -path. + ls_tree-data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ). + ls_tree-sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-tree iv_data = ls_tree-data ). + APPEND ls_tree TO rt_trees. + + -sha1 = ls_tree-sha1. + ENDLOOP. + + ENDMETHOD. + + + METHOD create_branch. + + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lv_pack TYPE xstring. + + IF iv_name CS ` `. + zcx_abapgit_exception=>raise( 'Branch name cannot contain blank spaces' ). + ENDIF. + +* "client MUST send an empty packfile" +* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 + lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + + zcl_abapgit_git_transport=>receive_pack( + iv_url = io_repo->get_url( ) + iv_old = c_zero + iv_new = iv_from + iv_branch_name = iv_name + iv_pack = lv_pack ). + + ENDMETHOD. + + + METHOD create_tag. + + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lv_pack TYPE xstring. + + IF iv_name CS ` `. + zcx_abapgit_exception=>raise( 'Tag name cannot contain blank spaces' ). + ENDIF. + +* "client MUST send an empty packfile" +* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 + lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + + zcl_abapgit_git_transport=>receive_pack( + iv_url = io_repo->get_url( ) + iv_old = c_zero + iv_new = iv_from + iv_branch_name = iv_name + iv_pack = lv_pack ). + + ENDMETHOD. + + + METHOD delete_branch. + + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lv_pack TYPE xstring. + + +* "client MUST send an empty packfile" +* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 + lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + + zcl_abapgit_git_transport=>receive_pack( + iv_url = io_repo->get_url( ) + iv_old = is_branch-sha1 + iv_new = c_zero + iv_branch_name = is_branch-name + iv_pack = lv_pack ). + + ENDMETHOD. + + + METHOD delete_tag. + + DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lv_pack TYPE xstring. + + +* "client MUST send an empty packfile" +* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 + lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). + + zcl_abapgit_git_transport=>receive_pack( + iv_url = io_repo->get_url( ) + iv_old = is_tag-sha1 + iv_new = c_zero + iv_branch_name = is_tag-name + iv_pack = lv_pack ). + + ENDMETHOD. + + + METHOD find_folders. + + DATA: lt_paths TYPE TABLE OF string, + lv_split TYPE string, + lv_path TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF rt_folders, + LIKE LINE OF rt_folders, + LIKE LINE OF it_expanded. + + + LOOP AT it_expanded ASSIGNING . + READ TABLE rt_folders WITH KEY path = -path TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + APPEND INITIAL LINE TO rt_folders ASSIGNING . + -path = -path. + ENDIF. + ENDLOOP. + +* add empty folders + LOOP AT rt_folders ASSIGNING . + SPLIT -path AT '/' INTO TABLE lt_paths. + + CLEAR lv_path. + LOOP AT lt_paths INTO lv_split. + CONCATENATE lv_path lv_split '/' INTO lv_path. + READ TABLE rt_folders WITH KEY path = lv_path TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + APPEND INITIAL LINE TO rt_folders ASSIGNING . + -path = lv_path. + ENDIF. + ENDLOOP. + ENDLOOP. + + LOOP AT rt_folders ASSIGNING . + FIND ALL OCCURRENCES OF '/' IN -path MATCH COUNT -count. + ENDLOOP. + + ENDMETHOD. + + + METHOD full_tree. + + DATA: ls_object LIKE LINE OF it_objects, + ls_commit TYPE zcl_abapgit_git_pack=>ty_commit. + + + READ TABLE it_objects INTO ls_object WITH KEY sha1 = iv_branch type = zif_abapgit_definitions=>gc_type-commit. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'commit not found' ). + ENDIF. + ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ). + + rt_expanded = walk_tree( it_objects = it_objects + iv_tree = ls_commit-tree + iv_base = '/' ). + + ENDMETHOD. "root_tree + + + METHOD pull. + + DATA: ls_object LIKE LINE OF et_objects, + ls_commit TYPE zcl_abapgit_git_pack=>ty_commit. + + + CLEAR et_files. + CLEAR et_objects. + CLEAR 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. + zcx_abapgit_exception=>raise( 'Commit/branch not found' ). + ENDIF. + ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ). + + walk( EXPORTING it_objects = et_objects + iv_sha1 = ls_commit-tree + iv_path = '/' + CHANGING ct_files = et_files ). + + ENDMETHOD. "pull + + + METHOD push. + + DATA: lt_expanded TYPE ty_expanded_tt, + lt_blobs TYPE zif_abapgit_definitions=>ty_files_tt, + lv_sha1 TYPE zif_abapgit_definitions=>ty_sha1, + lt_trees TYPE ty_trees_tt, + lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + lt_branches TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt, + lt_stage TYPE zcl_abapgit_stage=>ty_stage_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_stage, + LIKE LINE OF et_updated_files, + LIKE LINE OF lt_branches, + LIKE LINE OF lt_expanded. + + + CLEAR et_updated_files. + + IF io_stage->get_branch_sha1( ) = io_repo->get_sha1_remote( ). +* objects cached in io_repo can be used, if pushing to the branch configured in repo + lt_objects = io_repo->get_objects( ). + ELSE. + APPEND INITIAL LINE TO lt_branches ASSIGNING . + -name = io_stage->get_branch_name( ). + -sha1 = io_stage->get_branch_sha1( ). + + 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 + iv_branch = io_stage->get_branch_sha1( ) ). + + lt_stage = io_stage->get_all( ). + LOOP AT lt_stage ASSIGNING . + + " Save file ref to updated files table + APPEND INITIAL LINE TO et_updated_files ASSIGNING . + MOVE-CORRESPONDING -file TO . + + CASE -method. + WHEN zcl_abapgit_stage=>c_method-add. + + APPEND -file TO lt_blobs. + + READ TABLE lt_expanded ASSIGNING WITH KEY + name = -file-filename + path = -file-path. + IF sy-subrc <> 0. " new files + APPEND INITIAL LINE TO lt_expanded ASSIGNING . + -name = -file-filename. + -path = -file-path. + -chmod = zif_abapgit_definitions=>gc_chmod-file. + ENDIF. + + lv_sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-blob + iv_data = -file-data ). + IF -sha1 <> lv_sha1. + -sha1 = lv_sha1. + ENDIF. + + -sha1 = lv_sha1. "New sha1 + + WHEN zcl_abapgit_stage=>c_method-rm. + DELETE lt_expanded + WHERE name = -file-filename + AND path = -file-path. + ASSERT sy-subrc = 0. + + CLEAR -sha1. " Mark as deleted + + WHEN OTHERS. + zcx_abapgit_exception=>raise( 'stage method not supported, todo' ). + ENDCASE. + ENDLOOP. + + lt_trees = build_trees( lt_expanded ). + + ev_branch = receive_pack( is_comment = is_comment + io_repo = io_repo + it_trees = lt_trees + it_blobs = lt_blobs + io_stage = io_stage ). + + ENDMETHOD. "push -*----------------------------------------------------------------------* -* CLASS lcl_porcelain IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_git_porcelain IMPLEMENTATION. METHOD receive_pack. @@ -226,363 +554,6 @@ CLASS lcl_git_porcelain IMPLEMENTATION. ENDMETHOD. "receive_pack - METHOD delete_branch. - - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lv_pack TYPE xstring. - - -* "client MUST send an empty packfile" -* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). - - zcl_abapgit_git_transport=>receive_pack( - iv_url = io_repo->get_url( ) - iv_old = is_branch-sha1 - iv_new = c_zero - iv_branch_name = is_branch-name - iv_pack = lv_pack ). - - ENDMETHOD. - - METHOD delete_tag. - - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lv_pack TYPE xstring. - - -* "client MUST send an empty packfile" -* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). - - zcl_abapgit_git_transport=>receive_pack( - iv_url = io_repo->get_url( ) - iv_old = is_tag-sha1 - iv_new = c_zero - iv_branch_name = is_tag-name - iv_pack = lv_pack ). - - ENDMETHOD. - - METHOD create_branch. - - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lv_pack TYPE xstring. - - IF iv_name CS ` `. - zcx_abapgit_exception=>raise( 'Branch name cannot contain blank spaces' ). - ENDIF. - -* "client MUST send an empty packfile" -* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). - - zcl_abapgit_git_transport=>receive_pack( - iv_url = io_repo->get_url( ) - iv_old = c_zero - iv_new = iv_from - iv_branch_name = iv_name - iv_pack = lv_pack ). - - ENDMETHOD. - - METHOD create_tag. - - DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lv_pack TYPE xstring. - - IF iv_name CS ` `. - zcx_abapgit_exception=>raise( 'Tag name cannot contain blank spaces' ). - ENDIF. - -* "client MUST send an empty packfile" -* https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L514 - lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ). - - zcl_abapgit_git_transport=>receive_pack( - iv_url = io_repo->get_url( ) - iv_old = c_zero - iv_new = iv_from - iv_branch_name = iv_name - iv_pack = lv_pack ). - - ENDMETHOD. - - METHOD push. - - DATA: lt_expanded TYPE ty_expanded_tt, - lt_blobs TYPE zif_abapgit_definitions=>ty_files_tt, - lv_sha1 TYPE zif_abapgit_definitions=>ty_sha1, - lt_trees TYPE ty_trees_tt, - lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - lt_branches TYPE zcl_abapgit_git_branch_list=>ty_git_branch_list_tt, - lt_stage TYPE zcl_abapgit_stage=>ty_stage_tt. - - FIELD-SYMBOLS: LIKE LINE OF lt_stage, - LIKE LINE OF et_updated_files, - LIKE LINE OF lt_branches, - LIKE LINE OF lt_expanded. - - - CLEAR et_updated_files. - - IF io_stage->get_branch_sha1( ) = io_repo->get_sha1_remote( ). -* objects cached in io_repo can be used, if pushing to the branch configured in repo - lt_objects = io_repo->get_objects( ). - ELSE. - APPEND INITIAL LINE TO lt_branches ASSIGNING . - -name = io_stage->get_branch_name( ). - -sha1 = io_stage->get_branch_sha1( ). - - 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 - iv_branch = io_stage->get_branch_sha1( ) ). - - lt_stage = io_stage->get_all( ). - LOOP AT lt_stage ASSIGNING . - - " Save file ref to updated files table - APPEND INITIAL LINE TO et_updated_files ASSIGNING . - MOVE-CORRESPONDING -file TO . - - CASE -method. - WHEN zcl_abapgit_stage=>c_method-add. - - APPEND -file TO lt_blobs. - - READ TABLE lt_expanded ASSIGNING WITH KEY - name = -file-filename - path = -file-path. - IF sy-subrc <> 0. " new files - APPEND INITIAL LINE TO lt_expanded ASSIGNING . - -name = -file-filename. - -path = -file-path. - -chmod = zif_abapgit_definitions=>gc_chmod-file. - ENDIF. - - lv_sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-blob - iv_data = -file-data ). - IF -sha1 <> lv_sha1. - -sha1 = lv_sha1. - ENDIF. - - -sha1 = lv_sha1. "New sha1 - - WHEN zcl_abapgit_stage=>c_method-rm. - DELETE lt_expanded - WHERE name = -file-filename - AND path = -file-path. - ASSERT sy-subrc = 0. - - CLEAR -sha1. " Mark as deleted - - WHEN OTHERS. - zcx_abapgit_exception=>raise( 'stage method not supported, todo' ). - ENDCASE. - ENDLOOP. - - lt_trees = build_trees( lt_expanded ). - - ev_branch = receive_pack( is_comment = is_comment - io_repo = io_repo - it_trees = lt_trees - it_blobs = lt_blobs - io_stage = io_stage ). - - ENDMETHOD. "push - - METHOD walk_tree. - - DATA: ls_object LIKE LINE OF it_objects, - lt_expanded LIKE rt_expanded, - lt_nodes TYPE zcl_abapgit_git_pack=>ty_nodes_tt. - - FIELD-SYMBOLS: LIKE LINE OF rt_expanded, - LIKE LINE OF lt_nodes. - - - READ TABLE it_objects INTO ls_object - WITH KEY sha1 = iv_tree - type = zif_abapgit_definitions=>gc_type-tree. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'tree not found' ). - ENDIF. - lt_nodes = zcl_abapgit_git_pack=>decode_tree( ls_object-data ). - - LOOP AT lt_nodes ASSIGNING . - CASE -chmod. - WHEN zif_abapgit_definitions=>gc_chmod-file - OR zif_abapgit_definitions=>gc_chmod-executable. - APPEND INITIAL LINE TO rt_expanded ASSIGNING . - -path = iv_base. - -name = -name. - -sha1 = -sha1. - -chmod = -chmod. - WHEN zif_abapgit_definitions=>gc_chmod-dir. - lt_expanded = walk_tree( - it_objects = it_objects - iv_tree = -sha1 - iv_base = iv_base && -name && '/' ). - APPEND LINES OF lt_expanded TO rt_expanded. - WHEN OTHERS. - zcx_abapgit_exception=>raise( 'walk_tree: unknown chmod' ). - ENDCASE. - ENDLOOP. - - ENDMETHOD. - - METHOD full_tree. - - DATA: ls_object LIKE LINE OF it_objects, - ls_commit TYPE zcl_abapgit_git_pack=>ty_commit. - - - READ TABLE it_objects INTO ls_object WITH KEY sha1 = iv_branch type = zif_abapgit_definitions=>gc_type-commit. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'commit not found' ). - ENDIF. - ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ). - - rt_expanded = walk_tree( it_objects = it_objects - iv_tree = ls_commit-tree - iv_base = '/' ). - - ENDMETHOD. "root_tree - - METHOD pull. - - DATA: ls_object LIKE LINE OF et_objects, - ls_commit TYPE zcl_abapgit_git_pack=>ty_commit. - - - CLEAR et_files. - CLEAR et_objects. - CLEAR 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. - zcx_abapgit_exception=>raise( 'Commit/branch not found' ). - ENDIF. - ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ). - - walk( EXPORTING it_objects = et_objects - iv_sha1 = ls_commit-tree - iv_path = '/' - CHANGING ct_files = et_files ). - - ENDMETHOD. "pull - - METHOD find_folders. - - DATA: lt_paths TYPE TABLE OF string, - lv_split TYPE string, - lv_path TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF rt_folders, - LIKE LINE OF rt_folders, - LIKE LINE OF it_expanded. - - - LOOP AT it_expanded ASSIGNING . - READ TABLE rt_folders WITH KEY path = -path TRANSPORTING NO FIELDS. - IF sy-subrc <> 0. - APPEND INITIAL LINE TO rt_folders ASSIGNING . - -path = -path. - ENDIF. - ENDLOOP. - -* add empty folders - LOOP AT rt_folders ASSIGNING . - SPLIT -path AT '/' INTO TABLE lt_paths. - - CLEAR lv_path. - LOOP AT lt_paths INTO lv_split. - CONCATENATE lv_path lv_split '/' INTO lv_path. - READ TABLE rt_folders WITH KEY path = lv_path TRANSPORTING NO FIELDS. - IF sy-subrc <> 0. - APPEND INITIAL LINE TO rt_folders ASSIGNING . - -path = lv_path. - ENDIF. - ENDLOOP. - ENDLOOP. - - LOOP AT rt_folders ASSIGNING . - FIND ALL OCCURRENCES OF '/' IN -path MATCH COUNT -count. - ENDLOOP. - - ENDMETHOD. - - METHOD build_trees. - - DATA: lt_nodes TYPE zcl_abapgit_git_pack=>ty_nodes_tt, - ls_tree LIKE LINE OF rt_trees, - lv_len TYPE i, - lt_folders TYPE ty_folders_tt. - - FIELD-SYMBOLS: LIKE LINE OF lt_folders, - LIKE LINE OF lt_nodes, - LIKE LINE OF lt_folders, - LIKE LINE OF it_expanded. - - - lt_folders = find_folders( it_expanded ). - -* start with the deepest folders - SORT lt_folders BY count DESCENDING. - - LOOP AT lt_folders ASSIGNING . - CLEAR lt_nodes. - -* files - LOOP AT it_expanded ASSIGNING WHERE path = -path. - APPEND INITIAL LINE TO lt_nodes ASSIGNING . - -chmod = -chmod. - -name = -name. - -sha1 = -sha1. - ENDLOOP. - -* folders - LOOP AT lt_folders ASSIGNING WHERE count = -count + 1. - lv_len = strlen( -path ). - IF strlen( -path ) > lv_len AND -path(lv_len) = -path. - APPEND INITIAL LINE TO lt_nodes ASSIGNING . - -chmod = zif_abapgit_definitions=>gc_chmod-dir. - -* extract folder name, this can probably be done easier using regular expressions - -name = -path+lv_len. - lv_len = strlen( -name ) - 1. - -name = -name(lv_len). - - -sha1 = -sha1. - ENDIF. - ENDLOOP. - - CLEAR ls_tree. - ls_tree-path = -path. - ls_tree-data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ). - ls_tree-sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-tree iv_data = ls_tree-data ). - APPEND ls_tree TO rt_trees. - - -sha1 = ls_tree-sha1. - ENDLOOP. - - ENDMETHOD. METHOD walk. @@ -629,4 +600,44 @@ CLASS lcl_git_porcelain IMPLEMENTATION. ENDMETHOD. "walk -ENDCLASS. "lcl_porcelain IMPLEMENTATION + + METHOD walk_tree. + + DATA: ls_object LIKE LINE OF it_objects, + lt_expanded LIKE rt_expanded, + lt_nodes TYPE zcl_abapgit_git_pack=>ty_nodes_tt. + + FIELD-SYMBOLS: LIKE LINE OF rt_expanded, + LIKE LINE OF lt_nodes. + + + READ TABLE it_objects INTO ls_object + WITH KEY sha1 = iv_tree + type = zif_abapgit_definitions=>gc_type-tree. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'tree not found' ). + ENDIF. + lt_nodes = zcl_abapgit_git_pack=>decode_tree( ls_object-data ). + + LOOP AT lt_nodes ASSIGNING . + CASE -chmod. + WHEN zif_abapgit_definitions=>gc_chmod-file + OR zif_abapgit_definitions=>gc_chmod-executable. + APPEND INITIAL LINE TO rt_expanded ASSIGNING . + -path = iv_base. + -name = -name. + -sha1 = -sha1. + -chmod = -chmod. + WHEN zif_abapgit_definitions=>gc_chmod-dir. + lt_expanded = walk_tree( + it_objects = it_objects + iv_tree = -sha1 + iv_base = iv_base && -name && '/' ). + APPEND LINES OF lt_expanded TO rt_expanded. + WHEN OTHERS. + zcx_abapgit_exception=>raise( 'walk_tree: unknown chmod' ). + ENDCASE. + ENDLOOP. + + ENDMETHOD. +ENDCLASS. diff --git a/src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap b/src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap new file mode 100644 index 000000000..3353fcced --- /dev/null +++ b/src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap @@ -0,0 +1,153 @@ +CLASS ltcl_git_porcelain DEFINITION DEFERRED. +CLASS zcl_abapgit_git_porcelain DEFINITION LOCAL FRIENDS ltcl_git_porcelain. + +CLASS ltcl_git_porcelain DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. + + PRIVATE SECTION. + METHODS: + setup, + append + IMPORTING iv_path TYPE string + iv_name TYPE string, + single_file FOR TESTING + RAISING zcx_abapgit_exception, + two_files_same_path FOR TESTING + RAISING zcx_abapgit_exception, + root_empty FOR TESTING + RAISING zcx_abapgit_exception, + namespaces FOR TESTING + RAISING zcx_abapgit_exception, + more_sub FOR TESTING + RAISING zcx_abapgit_exception, + sub FOR TESTING + RAISING zcx_abapgit_exception. + + DATA: mt_expanded TYPE zcl_abapgit_git_porcelain=>ty_expanded_tt, + mt_trees TYPE zcl_abapgit_git_porcelain=>ty_trees_tt. + +ENDCLASS. + +CLASS ltcl_git_porcelain IMPLEMENTATION. + + METHOD setup. + CLEAR mt_expanded. + CLEAR mt_trees. + ENDMETHOD. + + METHOD append. + + FIELD-SYMBOLS: LIKE LINE OF mt_expanded. + + + APPEND INITIAL LINE TO mt_expanded ASSIGNING . + -path = iv_path. + -name = iv_name. + -sha1 = 'a'. + -chmod = zif_abapgit_definitions=>gc_chmod-file. + + ENDMETHOD. + + METHOD single_file. + + append( iv_path = '/' + iv_name = 'foobar.txt' ). + + mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ). + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_trees ) + exp = 1 ). + + ENDMETHOD. + + METHOD two_files_same_path. + + append( iv_path = '/' + iv_name = 'foo.txt' ). + + append( iv_path = '/' + iv_name = 'bar.txt' ). + + mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ). + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_trees ) + exp = 1 ). + + ENDMETHOD. + + METHOD sub. + + append( iv_path = '/' + iv_name = 'foo.txt' ). + + append( iv_path = '/sub/' + iv_name = 'bar.txt' ). + + mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ). + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_trees ) + exp = 2 ). + + ENDMETHOD. + + METHOD more_sub. + + FIELD-SYMBOLS: LIKE LINE OF mt_trees. + + append( iv_path = '/src/foo_a/foo_a1/' + iv_name = 'a1.txt' ). + + append( iv_path = '/src/foo_a/foo_a2/' + iv_name = 'a2.txt' ). + + mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ). + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_trees ) + exp = 5 ). + + LOOP AT mt_trees ASSIGNING . + cl_abap_unit_assert=>assert_not_initial( -data ). + ENDLOOP. + + ENDMETHOD. + + METHOD namespaces. + + FIELD-SYMBOLS: LIKE LINE OF mt_trees. + + append( iv_path = '/src/#foo#a/#foo#a1/' + iv_name = 'a1.txt' ). + + append( iv_path = '/src/#foo#a/#foo#a2/' + iv_name = 'a2.txt' ). + + mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ). + + cl_abap_unit_assert=>assert_equals( + act = lines( mt_trees ) + exp = 5 ). + + LOOP AT mt_trees ASSIGNING . + cl_abap_unit_assert=>assert_not_initial( -data ). + ENDLOOP. + + ENDMETHOD. + + METHOD root_empty. + + append( iv_path = '/sub/' + iv_name = 'bar.txt' ). + + mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ). + +* so 2 total trees are expected: '/' and '/sub/' + cl_abap_unit_assert=>assert_equals( + act = lines( mt_trees ) + exp = 2 ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/git/zcl_abapgit_git_porcelain.clas.xml b/src/git/zcl_abapgit_git_porcelain.clas.xml new file mode 100644 index 000000000..8c6334575 --- /dev/null +++ b/src/git/zcl_abapgit_git_porcelain.clas.xml @@ -0,0 +1,20 @@ + + + + + + ZCL_ABAPGIT_GIT_PORCELAIN + 1 + E + High level git methods + 2 + 1 + X + X + X + X + X + + + + diff --git a/src/zabapgit_popups.prog.abap b/src/ui/zcl_abapgit_popups.clas.abap similarity index 97% rename from src/zabapgit_popups.prog.abap rename to src/ui/zcl_abapgit_popups.clas.abap index 358500e26..cf1962aee 100644 --- a/src/zabapgit_popups.prog.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -1,9 +1,7 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_POPUPS -*&---------------------------------------------------------------------* - -"! various popups, static methods, no class/object state -CLASS lcl_popups DEFINITION FINAL. +CLASS zcl_abapgit_popups DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . PUBLIC SECTION. TYPES: BEGIN OF ty_popup, @@ -149,7 +147,10 @@ CLASS lcl_popups DEFINITION FINAL. ENDCLASS. -CLASS lcl_popups IMPLEMENTATION. + + +CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. + METHOD add_field. @@ -165,336 +166,6 @@ CLASS lcl_popups IMPLEMENTATION. ENDMETHOD. - METHOD popup_object. - - DATA: lv_returncode TYPE c, - lt_fields TYPE TABLE OF sval. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - add_field( EXPORTING iv_tabname = 'TADIR' - iv_fieldname = 'OBJECT' - iv_fieldtext = 'Type' - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TADIR' - iv_fieldname = 'OBJ_NAME' - iv_fieldtext = 'Name' - CHANGING ct_fields = lt_fields ). - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - no_value_check = abap_true - popup_title = 'Object' "#EC NOTEXT - IMPORTING - returncode = lv_returncode - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_returncode = 'A'. - RETURN. - ENDIF. - - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - TRANSLATE -value TO UPPER CASE. - rs_tadir-object = -value. - - READ TABLE lt_fields INDEX 2 ASSIGNING . - ASSERT sy-subrc = 0. - TRANSLATE -value TO UPPER CASE. - rs_tadir-obj_name = -value. - - rs_tadir = lcl_tadir=>read_single( iv_object = rs_tadir-object - iv_obj_name = rs_tadir-obj_name ). - - ENDMETHOD. - - METHOD popup_package_export. - - DATA: lv_returncode TYPE c, - lt_fields TYPE TABLE OF sval. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - add_field( EXPORTING iv_tabname = 'TDEVC' - iv_fieldname = 'DEVCLASS' - iv_fieldtext = 'Package' - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TDEVC' - iv_fieldname = 'INTSYS' - iv_fieldtext = 'Folder logic' - iv_value = 'PREFIX' - CHANGING ct_fields = lt_fields ). - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - no_value_check = abap_true - popup_title = 'Export package' "#EC NOTEXT - IMPORTING - returncode = lv_returncode - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_returncode = 'A'. - RETURN. - ENDIF. - - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - TRANSLATE -value TO UPPER CASE. - ev_package = -value. - - READ TABLE lt_fields INDEX 2 ASSIGNING . - ASSERT sy-subrc = 0. - TRANSLATE -value TO UPPER CASE. - ev_folder_logic = -value. - - ENDMETHOD. "popup_package_export - - METHOD create_branch_popup. - - DATA: lv_answer TYPE c LENGTH 1, - lt_fields TYPE TABLE OF sval. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - CLEAR: ev_name, ev_cancel. - - add_field( EXPORTING iv_tabname = 'TEXTL' - iv_fieldname = 'LINE' - iv_fieldtext = 'Name' - iv_value = 'new-branch-name' - CHANGING ct_fields = lt_fields ). - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - popup_title = 'Create branch' - IMPORTING - returncode = lv_answer - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2 ##NO_TEXT. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_answer = 'A'. - ev_cancel = abap_true. - ELSE. - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - ev_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name( - zcl_abapgit_git_branch_list=>normalize_branch_name( -value ) ). - ENDIF. - - ENDMETHOD. - - METHOD create_tag_popup. - - DATA: lv_answer TYPE c LENGTH 1, - lt_fields TYPE TABLE OF sval, - lv_exit_while_loop TYPE abap_bool. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - CLEAR: ev_name, ev_cancel, ev_sha1. - - add_field( EXPORTING iv_tabname = 'TBDTPPT' - iv_fieldname = 'P_TEXT' - iv_fieldtext = 'SHA' - iv_value = iv_sha1 - iv_obligatory = abap_true - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TEXTL' - iv_fieldname = 'LINE' - iv_fieldtext = 'Name' - iv_obligatory = abap_true - CHANGING ct_fields = lt_fields ). - - WHILE lv_exit_while_loop = abap_false. - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - popup_title = 'Create tag' - IMPORTING - returncode = lv_answer - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2 ##NO_TEXT. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_answer = 'A'. - ev_cancel = abap_true. - RETURN. - ENDIF. - - READ TABLE lt_fields WITH KEY fieldname = 'P_TEXT' - ASSIGNING . - ASSERT sy-subrc = 0. - - ev_sha1 = -value. - - READ TABLE lt_fields WITH KEY fieldname = 'LINE' - ASSIGNING . - ASSERT sy-subrc = 0. - - IF condense( -value ) CS ` `. - CLEAR: lv_exit_while_loop. - MESSAGE 'Tag name cannot contain blank spaces' TYPE 'S' DISPLAY LIKE 'E'. - CONTINUE. - ENDIF. - - ev_name = zcl_abapgit_tag=>add_tag_prefix( -value ). - - lv_exit_while_loop = abap_true. - - ENDWHILE. - - ENDMETHOD. - - METHOD run_page_class_popup. - - DATA: lv_answer TYPE c LENGTH 1, - lt_fields TYPE TABLE OF sval. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - CLEAR: ev_name, ev_cancel. - - add_field( EXPORTING iv_tabname = 'TEXTL' - iv_fieldname = 'LINE' - iv_fieldtext = 'Name' - iv_value = 'lcl_gui_page_' - CHANGING ct_fields = lt_fields ). - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - popup_title = 'Run page manually' - IMPORTING - returncode = lv_answer - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2 ##NO_TEXT. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_answer = 'A'. - ev_cancel = abap_true. - ELSE. - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - ev_name = to_upper( -value ). - ENDIF. - - ENDMETHOD. "run_page_class_popup - - METHOD repo_new_offline. - - DATA: lv_returncode TYPE c, - lt_fields TYPE TABLE OF sval, - lv_icon_ok TYPE icon-name, - lv_button1 TYPE svalbutton-buttontext, - lv_icon1 TYPE icon-name, - lv_finished TYPE abap_bool, - lx_error TYPE REF TO zcx_abapgit_exception. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - add_field( EXPORTING iv_tabname = 'ABAPTXT255' - iv_fieldname = 'LINE' - iv_fieldtext = 'Name' - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TDEVC' - iv_fieldname = 'DEVCLASS' - iv_fieldtext = 'Package' - CHANGING ct_fields = lt_fields ). - - WHILE lv_finished = abap_false. - - lv_icon_ok = icon_okay. - lv_button1 = 'Create package' ##NO_TEXT. - lv_icon1 = icon_folder. - - CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' - EXPORTING - popup_title = 'New Offline Project' - programname = sy-repid - formname = 'PACKAGE_POPUP' - ok_pushbuttontext = '' - icon_ok_push = lv_icon_ok - first_pushbutton = lv_button1 - icon_button_1 = lv_icon1 - second_pushbutton = '' - icon_button_2 = '' - IMPORTING - returncode = lv_returncode - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_returncode = 'A'. - rs_popup-cancel = abap_true. - RETURN. - ENDIF. - - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - rs_popup-url = -value. - - READ TABLE lt_fields INDEX 2 ASSIGNING . - ASSERT sy-subrc = 0. - TRANSLATE -value TO UPPER CASE. - rs_popup-package = -value. - - lv_finished = abap_true. - - TRY. - lcl_repo_srv=>get_instance( )->validate_package( rs_popup-package ). - - CATCH zcx_abapgit_exception INTO lx_error. - " in case of validation errors we display the popup again - MESSAGE lx_error->text TYPE 'S' DISPLAY LIKE 'E'. - CLEAR lv_finished. - ENDTRY. - - ENDWHILE. - - ENDMETHOD. "repo_new_offline METHOD branch_list_popup. @@ -601,6 +272,979 @@ CLASS lcl_popups IMPLEMENTATION. ENDMETHOD. + + METHOD branch_popup_callback. + + DATA: lv_url TYPE string, + ls_package_data TYPE scompkdtln, + ls_branch TYPE zcl_abapgit_git_branch_list=>ty_git_branch, + lv_create TYPE boolean. + + FIELD-SYMBOLS: LIKE LINE OF ct_fields, + LIKE LINE OF ct_fields, + LIKE LINE OF ct_fields. + + CLEAR cs_error. + + IF iv_code = 'COD1'. + cv_show_popup = abap_true. + + READ TABLE ct_fields ASSIGNING WITH KEY tabname = 'ABAPTXT255'. + IF sy-subrc <> 0 OR -value IS INITIAL. + MESSAGE 'Fill URL' TYPE 'S' DISPLAY LIKE 'E'. "#EC NOTEXT + RETURN. + ENDIF. + lv_url = -value. + + ls_branch = zcl_abapgit_popups=>branch_list_popup( lv_url ). + IF ls_branch IS INITIAL. + RETURN. + ENDIF. + + READ TABLE ct_fields ASSIGNING WITH KEY tabname = 'TEXTL'. + ASSERT sy-subrc = 0. + -value = ls_branch-name. + + ELSEIF iv_code = 'COD2'. + cv_show_popup = abap_true. + + READ TABLE ct_fields ASSIGNING WITH KEY fieldname = 'DEVCLASS'. + ASSERT sy-subrc = 0. + ls_package_data-devclass = -value. + + zcl_abapgit_popups=>popup_to_create_package( + IMPORTING + es_package_data = ls_package_data + ev_create = lv_create ). + IF lv_create = abap_false. + RETURN. + ENDIF. + + zcl_abapgit_sap_package=>create( ls_package_data ). + COMMIT WORK. + + -value = ls_package_data-devclass. + ENDIF. + + ENDMETHOD. + + + METHOD create_branch_popup. + + DATA: lv_answer TYPE c LENGTH 1, + lt_fields TYPE TABLE OF sval. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + CLEAR: ev_name, ev_cancel. + + add_field( EXPORTING iv_tabname = 'TEXTL' + iv_fieldname = 'LINE' + iv_fieldtext = 'Name' + iv_value = 'new-branch-name' + CHANGING ct_fields = lt_fields ). + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING + popup_title = 'Create branch' + IMPORTING + returncode = lv_answer + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2 ##NO_TEXT. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_answer = 'A'. + ev_cancel = abap_true. + ELSE. + READ TABLE lt_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + ev_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name( + zcl_abapgit_git_branch_list=>normalize_branch_name( -value ) ). + ENDIF. + + ENDMETHOD. + + + METHOD create_new_table. + + " create and populate a table on the fly derived from + " it_data with a select column + + DATA: lr_struct TYPE REF TO data, + lt_components TYPE cl_abap_structdescr=>component_table, + lo_struct_descr TYPE REF TO cl_abap_structdescr, + struct_descr TYPE REF TO cl_abap_structdescr. + + FIELD-SYMBOLS: TYPE STANDARD TABLE, + TYPE abap_componentdescr, + TYPE data, + TYPE any. + + mo_table_descr ?= cl_abap_tabledescr=>describe_by_data( it_list ). + lo_struct_descr ?= mo_table_descr->get_table_line_type( ). + lt_components = lo_struct_descr->get_components( ). + + INSERT INITIAL LINE INTO lt_components ASSIGNING INDEX 1. + ASSERT sy-subrc = 0. + + -name = co_fieldname_selected. + -type ?= cl_abap_datadescr=>describe_by_name( 'FLAG' ). + + struct_descr = cl_abap_structdescr=>create( lt_components ). + mo_table_descr = cl_abap_tabledescr=>create( struct_descr ). + + CREATE DATA mr_table TYPE HANDLE mo_table_descr. + ASSIGN mr_table->* TO
. + ASSERT sy-subrc = 0. + + CREATE DATA lr_struct TYPE HANDLE struct_descr. + ASSIGN lr_struct->* TO . + ASSERT sy-subrc = 0. + + LOOP AT it_list ASSIGNING . + + CLEAR: . + MOVE-CORRESPONDING TO . + INSERT INTO TABLE
. + + ENDLOOP. + + ENDMETHOD. + + + METHOD create_tag_popup. + + DATA: lv_answer TYPE c LENGTH 1, + lt_fields TYPE TABLE OF sval, + lv_exit_while_loop TYPE abap_bool. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + CLEAR: ev_name, ev_cancel, ev_sha1. + + add_field( EXPORTING iv_tabname = 'TBDTPPT' + iv_fieldname = 'P_TEXT' + iv_fieldtext = 'SHA' + iv_value = iv_sha1 + iv_obligatory = abap_true + CHANGING ct_fields = lt_fields ). + + add_field( EXPORTING iv_tabname = 'TEXTL' + iv_fieldname = 'LINE' + iv_fieldtext = 'Name' + iv_obligatory = abap_true + CHANGING ct_fields = lt_fields ). + + WHILE lv_exit_while_loop = abap_false. + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING + popup_title = 'Create tag' + IMPORTING + returncode = lv_answer + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2 ##NO_TEXT. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_answer = 'A'. + ev_cancel = abap_true. + RETURN. + ENDIF. + + READ TABLE lt_fields WITH KEY fieldname = 'P_TEXT' + ASSIGNING . + ASSERT sy-subrc = 0. + + ev_sha1 = -value. + + READ TABLE lt_fields WITH KEY fieldname = 'LINE' + ASSIGNING . + ASSERT sy-subrc = 0. + + IF condense( -value ) CS ` `. + CLEAR: lv_exit_while_loop. + MESSAGE 'Tag name cannot contain blank spaces' TYPE 'S' DISPLAY LIKE 'E'. + CONTINUE. + ENDIF. + + ev_name = zcl_abapgit_tag=>add_tag_prefix( -value ). + + lv_exit_while_loop = abap_true. + + ENDWHILE. + + ENDMETHOD. + + + METHOD extract_field_values. + + FIELD-SYMBOLS: LIKE LINE OF it_fields. + + CLEAR: ev_url, + ev_package, + ev_branch. + + READ TABLE it_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + ev_url = -value. + + READ TABLE it_fields INDEX 2 ASSIGNING . + ASSERT sy-subrc = 0. + ev_package = -value. + TRANSLATE ev_package TO UPPER CASE. + + READ TABLE it_fields INDEX 3 ASSIGNING . + ASSERT sy-subrc = 0. + ev_branch = -value. + + ENDMETHOD. + + + METHOD get_selected_rows. + + DATA: lv_condition TYPE string, + lr_exporting TYPE REF TO data. + + FIELD-SYMBOLS: TYPE any, +
TYPE STANDARD TABLE, + TYPE any. + + lv_condition = |{ co_fieldname_selected } = ABAP_TRUE|. + + ASSIGN mr_table->* TO
. + ASSERT sy-subrc = 0. + + CREATE DATA lr_exporting LIKE LINE OF et_list. + ASSIGN lr_exporting->* TO . + + LOOP AT
ASSIGNING + WHERE (lv_condition). + + CLEAR: . + MOVE-CORRESPONDING TO . + APPEND TO et_list. + + ENDLOOP. + + ENDMETHOD. + + + METHOD on_select_list_function_click. + + FIELD-SYMBOLS:
TYPE STANDARD TABLE, + TYPE any, + TYPE flag. + + ASSIGN mr_table->* TO
. + ASSERT sy-subrc = 0. + + CASE e_salv_function. + WHEN 'O.K.'. + mo_select_list_popup->close_screen( ). + + WHEN 'ABR'. + "Canceled: clear list to overwrite nothing + CLEAR
. + mo_select_list_popup->close_screen( ). + + WHEN 'SALL'. + + LOOP AT
ASSIGNING . + + ASSIGN COMPONENT co_fieldname_selected + OF STRUCTURE + TO . + ASSERT sy-subrc = 0. + + = abap_true. + + ENDLOOP. + + mo_select_list_popup->refresh( ). + + WHEN 'DSEL'. + + LOOP AT
ASSIGNING . + + ASSIGN COMPONENT co_fieldname_selected + OF STRUCTURE + TO . + ASSERT sy-subrc = 0. + + = abap_false. + + ENDLOOP. + + mo_select_list_popup->refresh( ). + + WHEN OTHERS. + CLEAR
. + mo_select_list_popup->close_screen( ). + ENDCASE. + + ENDMETHOD. + + + METHOD on_select_list_link_click. + + DATA: lv_line TYPE sytabix. + + FIELD-SYMBOLS:
TYPE STANDARD TABLE, + TYPE any, + TYPE flag. + + ASSIGN mr_table->* TO
. + ASSERT sy-subrc = 0. + + lv_line = row. + + READ TABLE
ASSIGNING + INDEX lv_line. + IF sy-subrc = 0. + + ASSIGN COMPONENT co_fieldname_selected + OF STRUCTURE + TO . + ASSERT sy-subrc = 0. + + IF = abap_true. + = abap_false. + ELSE. + = abap_true. + ENDIF. + + ENDIF. + + mo_select_list_popup->refresh( ). + ENDMETHOD. + + + METHOD package_popup_callback. + + DATA: ls_package_data TYPE scompkdtln, + lv_create TYPE boolean. + + FIELD-SYMBOLS: LIKE LINE OF ct_fields. + + CLEAR cs_error. + + IF iv_code = 'COD1'. + cv_show_popup = abap_true. + + READ TABLE ct_fields ASSIGNING WITH KEY fieldname = 'DEVCLASS'. + ASSERT sy-subrc = 0. + ls_package_data-devclass = -value. + + zcl_abapgit_popups=>popup_to_create_package( IMPORTING es_package_data = ls_package_data + ev_create = lv_create ). + IF lv_create = abap_false. + RETURN. + ENDIF. + + zcl_abapgit_sap_package=>create( ls_package_data ). + COMMIT WORK. + + -value = ls_package_data-devclass. + ENDIF. + + ENDMETHOD. + + + METHOD popup_object. + + DATA: lv_returncode TYPE c, + lt_fields TYPE TABLE OF sval. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + add_field( EXPORTING iv_tabname = 'TADIR' + iv_fieldname = 'OBJECT' + iv_fieldtext = 'Type' + CHANGING ct_fields = lt_fields ). + + add_field( EXPORTING iv_tabname = 'TADIR' + iv_fieldname = 'OBJ_NAME' + iv_fieldtext = 'Name' + CHANGING ct_fields = lt_fields ). + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING + no_value_check = abap_true + popup_title = 'Object' "#EC NOTEXT + IMPORTING + returncode = lv_returncode + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_returncode = 'A'. + RETURN. + ENDIF. + + READ TABLE lt_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + TRANSLATE -value TO UPPER CASE. + rs_tadir-object = -value. + + READ TABLE lt_fields INDEX 2 ASSIGNING . + ASSERT sy-subrc = 0. + TRANSLATE -value TO UPPER CASE. + rs_tadir-obj_name = -value. + + rs_tadir = zcl_abapgit_tadir=>read_single( + iv_object = rs_tadir-object + iv_obj_name = rs_tadir-obj_name ). + + ENDMETHOD. + + + METHOD popup_package_export. + + DATA: lv_returncode TYPE c, + lt_fields TYPE TABLE OF sval. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + add_field( EXPORTING iv_tabname = 'TDEVC' + iv_fieldname = 'DEVCLASS' + iv_fieldtext = 'Package' + CHANGING ct_fields = lt_fields ). + + add_field( EXPORTING iv_tabname = 'TDEVC' + iv_fieldname = 'INTSYS' + iv_fieldtext = 'Folder logic' + iv_value = 'PREFIX' + CHANGING ct_fields = lt_fields ). + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING + no_value_check = abap_true + popup_title = 'Export package' "#EC NOTEXT + IMPORTING + returncode = lv_returncode + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_returncode = 'A'. + RETURN. + ENDIF. + + READ TABLE lt_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + TRANSLATE -value TO UPPER CASE. + ev_package = -value. + + READ TABLE lt_fields INDEX 2 ASSIGNING . + ASSERT sy-subrc = 0. + TRANSLATE -value TO UPPER CASE. + ev_folder_logic = -value. + + ENDMETHOD. "popup_package_export + + + METHOD popup_to_confirm. + + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + titlebar = titlebar + text_question = text_question + text_button_1 = text_button_1 + icon_button_1 = icon_button_1 + text_button_2 = text_button_2 + icon_button_2 = icon_button_2 + default_button = default_button + display_cancel_button = display_cancel_button + IMPORTING + answer = rv_answer + EXCEPTIONS + text_not_found = 1 + OTHERS = 2. "#EC NOTEXT + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from POPUP_TO_CONFIRM' ). + ENDIF. + + ENDMETHOD. "popup_to_confirm + + + METHOD popup_to_create_package. + CALL FUNCTION 'FUNCTION_EXISTS' + EXPORTING + funcname = 'PB_POPUP_PACKAGE_CREATE' + EXCEPTIONS + function_not_exist = 1 + OTHERS = 2. + IF sy-subrc = 1. +* looks like the function module used does not exist on all +* versions since 702, so show an error + zcx_abapgit_exception=>raise( 'Function module PB_POPUP_PACKAGE_CREATE does not exist' ). + ENDIF. + + CALL FUNCTION 'PB_POPUP_PACKAGE_CREATE' + CHANGING + p_object_data = es_package_data + EXCEPTIONS + action_cancelled = 1. + IF sy-subrc = 0. + ev_create = abap_true. + ELSE. + ev_create = abap_false. + ENDIF. + ENDMETHOD. " popup_to_create_package + + + METHOD popup_to_create_transp_branch. + DATA: lv_returncode TYPE c, + lt_fields TYPE TABLE OF sval, + lv_transports_as_text TYPE string, + ls_transport_header LIKE LINE OF it_transport_headers. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + lv_transports_as_text = 'Transport(s)'. + LOOP AT it_transport_headers INTO ls_transport_header. + CONCATENATE lv_transports_as_text '_' ls_transport_header-trkorr INTO lv_transports_as_text. + ENDLOOP. + + add_field( EXPORTING iv_tabname = 'TEXTL' + iv_fieldname = 'LINE' + iv_fieldtext = 'Branch name' + iv_value = lv_transports_as_text + CHANGING ct_fields = lt_fields ). + + add_field( EXPORTING iv_tabname = 'ABAPTXT255' + iv_fieldname = 'LINE' + iv_fieldtext = 'Commit text' + iv_value = lv_transports_as_text + CHANGING ct_fields = lt_fields ). + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING + popup_title = 'Transport to new Branch' + IMPORTING + returncode = lv_returncode + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_returncode = 'A'. + RAISE EXCEPTION TYPE zcx_abapgit_cancel. + ENDIF. + + READ TABLE lt_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + rs_transport_branch-branch_name = -value. + + READ TABLE lt_fields INDEX 2 ASSIGNING . + ASSERT sy-subrc = 0. + rs_transport_branch-commit_text = -value. + ENDMETHOD. + + + METHOD popup_to_inform. + + DATA: lv_line1 TYPE char70, + lv_line2 TYPE char70. + + lv_line1 = text_message. + IF strlen( text_message ) > 70. + lv_line2 = text_message+70. + ENDIF. + + CALL FUNCTION 'POPUP_TO_INFORM' + EXPORTING + titel = titlebar + txt1 = lv_line1 + txt2 = lv_line2. + + ENDMETHOD. " popup_to_inform. + + + METHOD popup_to_select_from_list. + + DATA: + lo_events TYPE REF TO cl_salv_events_table, + lo_columns TYPE REF TO cl_salv_columns_table, + lt_columns TYPE salv_t_column_ref, + ls_column TYPE salv_s_column_ref, + lo_column TYPE REF TO cl_salv_column_list, + lo_table_header TYPE REF TO cl_salv_form_text. + + FIELD-SYMBOLS:
TYPE STANDARD TABLE. + + CLEAR: et_list. + + create_new_table( it_list = it_list ). + + ASSIGN mr_table->* TO
. + ASSERT sy-subrc = 0. + + TRY. + cl_salv_table=>factory( IMPORTING r_salv_table = mo_select_list_popup + CHANGING t_table =
). + + mo_select_list_popup->set_screen_status( pfstatus = '102' + report = 'SAPMSVIM' ). + + mo_select_list_popup->set_screen_popup( start_column = 1 + end_column = 65 + start_line = 1 + end_line = 20 ). + + lo_events = mo_select_list_popup->get_event( ). + + SET HANDLER on_select_list_link_click FOR lo_events. + SET HANDLER on_select_list_function_click FOR lo_events. + + CREATE OBJECT lo_table_header + EXPORTING + text = i_header_text. + + mo_select_list_popup->set_top_of_list( lo_table_header ). + + lo_columns = mo_select_list_popup->get_columns( ). + lo_columns->set_optimize( abap_true ). + lt_columns = lo_columns->get( ). + + LOOP AT lt_columns INTO ls_column. + + IF ls_column-columnname = co_fieldname_selected. + lo_column ?= ls_column-r_column. + lo_column->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ). + lo_column->set_output_length( 20 ). + lo_column->set_short_text( |{ i_select_column_text }| ). + lo_column->set_medium_text( |{ i_select_column_text }| ). + lo_column->set_long_text( |{ i_select_column_text }| ). + CONTINUE. + ENDIF. + + READ TABLE it_columns_to_display TRANSPORTING NO FIELDS + WITH KEY table_line = ls_column-columnname. + IF sy-subrc <> 0. + ls_column-r_column->set_technical( abap_true ). + ENDIF. + + ENDLOOP. + + mo_select_list_popup->display( ). + + CATCH cx_salv_msg. + zcx_abapgit_exception=>raise( 'Error from POPUP_SELECT_OBJ_OVERWRITE' ). + ENDTRY. + + get_selected_rows( + IMPORTING + et_list = et_list ). + + CLEAR: mo_select_list_popup, + mr_table, + mo_table_descr. + + ENDMETHOD. + + + METHOD popup_to_select_transports. + DATA: lrs_trfunction TYPE trsel_trs_function, + lv_types TYPE string, + ls_ranges TYPE trsel_ts_ranges. + + " Fill all request types + lv_types = 'KWTCOEMPDRSXQFG'. + lrs_trfunction-sign = 'I'. + lrs_trfunction-option = 'EQ'. + WHILE lv_types <> space. + lrs_trfunction-low = lv_types(1). + APPEND lrs_trfunction TO ls_ranges-request_funcs. + SHIFT lv_types. + ENDWHILE. + + CALL FUNCTION 'TRINT_SELECT_REQUESTS' + EXPORTING + iv_username_pattern = sy-uname + iv_via_selscreen = 'X' + iv_complete_projects = '' + "is_popup = '' + iv_title = 'abapGit: Transport Request Selection' + IMPORTING + et_requests = rt_trkorr + CHANGING + cs_ranges = ls_ranges + EXCEPTIONS + action_aborted_by_user = 1 + OTHERS = 2. + + ENDMETHOD. + + + METHOD repo_new_offline. + + DATA: lv_returncode TYPE c, + lt_fields TYPE TABLE OF sval, + lv_icon_ok TYPE icon-name, + lv_button1 TYPE svalbutton-buttontext, + lv_icon1 TYPE icon-name, + lv_finished TYPE abap_bool, + lx_error TYPE REF TO zcx_abapgit_exception. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + add_field( EXPORTING iv_tabname = 'ABAPTXT255' + iv_fieldname = 'LINE' + iv_fieldtext = 'Name' + CHANGING ct_fields = lt_fields ). + + add_field( EXPORTING iv_tabname = 'TDEVC' + iv_fieldname = 'DEVCLASS' + iv_fieldtext = 'Package' + CHANGING ct_fields = lt_fields ). + + WHILE lv_finished = abap_false. + + lv_icon_ok = icon_okay. + lv_button1 = 'Create package' ##NO_TEXT. + lv_icon1 = icon_folder. + + CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' + EXPORTING + popup_title = 'New Offline Project' + programname = sy-cprog + formname = 'PACKAGE_POPUP' + ok_pushbuttontext = '' + icon_ok_push = lv_icon_ok + first_pushbutton = lv_button1 + icon_button_1 = lv_icon1 + second_pushbutton = '' + icon_button_2 = '' + IMPORTING + returncode = lv_returncode + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_returncode = 'A'. + rs_popup-cancel = abap_true. + RETURN. + ENDIF. + + READ TABLE lt_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + rs_popup-url = -value. + + READ TABLE lt_fields INDEX 2 ASSIGNING . + ASSERT sy-subrc = 0. + TRANSLATE -value TO UPPER CASE. + rs_popup-package = -value. + + lv_finished = abap_true. + + TRY. + zcl_abapgit_repo_srv=>get_instance( )->validate_package( rs_popup-package ). + + CATCH zcx_abapgit_exception INTO lx_error. + " in case of validation errors we display the popup again + MESSAGE lx_error->text TYPE 'S' DISPLAY LIKE 'E'. + CLEAR lv_finished. + ENDTRY. + + ENDWHILE. + + ENDMETHOD. "repo_new_offline + + + METHOD repo_popup. + + DATA: lv_returncode TYPE c, + lv_icon_ok TYPE icon-name, + lv_icon_br TYPE icon-name, + lt_fields TYPE TABLE OF sval, + lv_uattr TYPE spo_fattr, + lv_pattr TYPE spo_fattr, + lv_button2 TYPE svalbutton-buttontext, + lv_icon2 TYPE icon-name, + lv_package TYPE tdevc-devclass, + lv_url TYPE abaptxt255-line, + lv_branch TYPE textl-line, + lv_finished TYPE abap_bool, + lx_error TYPE REF TO zcx_abapgit_exception. + + IF iv_freeze_url = abap_true. + lv_uattr = '05'. + ENDIF. + + IF iv_freeze_package = abap_true. + lv_pattr = '05'. + ENDIF. + + IF iv_package IS INITIAL. " Empty package -> can be created + lv_button2 = 'Create package' ##NO_TEXT. + lv_icon2 = icon_folder. + ENDIF. + + lv_package = iv_package. + lv_url = iv_url. + lv_branch = iv_branch. + + WHILE lv_finished = abap_false. + + CLEAR: lt_fields. + + add_field( EXPORTING iv_tabname = 'ABAPTXT255' + iv_fieldname = 'LINE' + iv_fieldtext = 'Git clone URL' + iv_value = lv_url + iv_field_attr = lv_uattr + CHANGING ct_fields = lt_fields ). + + add_field( EXPORTING iv_tabname = 'TDEVC' + iv_fieldname = 'DEVCLASS' + iv_fieldtext = 'Target package' + iv_value = lv_package + iv_field_attr = lv_pattr + CHANGING ct_fields = lt_fields ). + + add_field( EXPORTING iv_tabname = 'TEXTL' + iv_fieldname = 'LINE' + iv_fieldtext = 'Branch' + iv_value = lv_branch + iv_field_attr = '05' + CHANGING ct_fields = lt_fields ). + + lv_icon_ok = icon_okay. + lv_icon_br = icon_workflow_fork. + + CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' + EXPORTING + popup_title = iv_title + programname = sy-cprog + formname = 'BRANCH_POPUP' + ok_pushbuttontext = 'OK' + icon_ok_push = lv_icon_ok + first_pushbutton = 'Select branch' + icon_button_1 = lv_icon_br + second_pushbutton = lv_button2 + icon_button_2 = lv_icon2 + IMPORTING + returncode = lv_returncode + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2. "#EC NOTEXT + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_returncode = 'A'. + rs_popup-cancel = abap_true. + RETURN. + ENDIF. + + extract_field_values( + EXPORTING + it_fields = lt_fields + IMPORTING + ev_url = lv_url + ev_package = lv_package + ev_branch = lv_branch ). + + lv_finished = abap_true. + + TRY. + zcl_abapgit_url=>name( |{ lv_url }| ). + IF iv_freeze_package = abap_false. + zcl_abapgit_repo_srv=>get_instance( )->validate_package( lv_package ). + ENDIF. + CATCH zcx_abapgit_exception INTO lx_error. + MESSAGE lx_error->text TYPE 'S' DISPLAY LIKE 'E'. + " in case of validation errors we display the popup again + CLEAR: lv_finished. + ENDTRY. + + ENDWHILE. + + rs_popup-url = lv_url. + rs_popup-package = lv_package. + rs_popup-branch_name = lv_branch. + + ENDMETHOD. + + + METHOD run_page_class_popup. + + DATA: lv_answer TYPE c LENGTH 1, + lt_fields TYPE TABLE OF sval. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + CLEAR: ev_name, ev_cancel. + + add_field( EXPORTING iv_tabname = 'TEXTL' + iv_fieldname = 'LINE' + iv_fieldtext = 'Name' + iv_value = 'lcl_gui_page_' + CHANGING ct_fields = lt_fields ). + + CALL FUNCTION 'POPUP_GET_VALUES' + EXPORTING + popup_title = 'Run page manually' + IMPORTING + returncode = lv_answer + TABLES + fields = lt_fields + EXCEPTIONS + error_in_fields = 1 + OTHERS = 2 ##NO_TEXT. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from POPUP_GET_VALUES' ). + ENDIF. + + IF lv_answer = 'A'. + ev_cancel = abap_true. + ELSE. + READ TABLE lt_fields INDEX 1 ASSIGNING . + ASSERT sy-subrc = 0. + ev_name = to_upper( -value ). + ENDIF. + + ENDMETHOD. "run_page_class_popup + + METHOD tag_list_popup. DATA: lo_branches TYPE REF TO zcl_abapgit_git_branch_list, @@ -713,627 +1357,4 @@ CLASS lcl_popups IMPLEMENTATION. ENDIF. ENDMETHOD. - - METHOD repo_popup. - - DATA: lv_returncode TYPE c, - lv_icon_ok TYPE icon-name, - lv_icon_br TYPE icon-name, - lt_fields TYPE TABLE OF sval, - lv_uattr TYPE spo_fattr, - lv_pattr TYPE spo_fattr, - lv_button2 TYPE svalbutton-buttontext, - lv_icon2 TYPE icon-name, - lv_package TYPE tdevc-devclass, - lv_url TYPE abaptxt255-line, - lv_branch TYPE textl-line, - lv_finished TYPE abap_bool, - lx_error TYPE REF TO zcx_abapgit_exception. - - IF iv_freeze_url = abap_true. - lv_uattr = '05'. - ENDIF. - - IF iv_freeze_package = abap_true. - lv_pattr = '05'. - ENDIF. - - IF iv_package IS INITIAL. " Empty package -> can be created - lv_button2 = 'Create package' ##NO_TEXT. - lv_icon2 = icon_folder. - ENDIF. - - lv_package = iv_package. - lv_url = iv_url. - lv_branch = iv_branch. - - WHILE lv_finished = abap_false. - - CLEAR: lt_fields. - - add_field( EXPORTING iv_tabname = 'ABAPTXT255' - iv_fieldname = 'LINE' - iv_fieldtext = 'Git clone URL' - iv_value = lv_url - iv_field_attr = lv_uattr - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TDEVC' - iv_fieldname = 'DEVCLASS' - iv_fieldtext = 'Target package' - iv_value = lv_package - iv_field_attr = lv_pattr - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TEXTL' - iv_fieldname = 'LINE' - iv_fieldtext = 'Branch' - iv_value = lv_branch - iv_field_attr = '05' - CHANGING ct_fields = lt_fields ). - - lv_icon_ok = icon_okay. - lv_icon_br = icon_workflow_fork. - - CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' - EXPORTING - popup_title = iv_title - programname = sy-repid - formname = 'BRANCH_POPUP' - ok_pushbuttontext = 'OK' - icon_ok_push = lv_icon_ok - first_pushbutton = 'Select branch' - icon_button_1 = lv_icon_br - second_pushbutton = lv_button2 - icon_button_2 = lv_icon2 - IMPORTING - returncode = lv_returncode - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. "#EC NOTEXT - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_returncode = 'A'. - rs_popup-cancel = abap_true. - RETURN. - ENDIF. - - extract_field_values( - EXPORTING - it_fields = lt_fields - IMPORTING - ev_url = lv_url - ev_package = lv_package - ev_branch = lv_branch ). - - lv_finished = abap_true. - - TRY. - zcl_abapgit_url=>name( |{ lv_url }| ). - IF iv_freeze_package = abap_false. - lcl_repo_srv=>get_instance( )->validate_package( lv_package ). - ENDIF. - CATCH zcx_abapgit_exception INTO lx_error. - MESSAGE lx_error->text TYPE 'S' DISPLAY LIKE 'E'. - " in case of validation errors we display the popup again - CLEAR: lv_finished. - ENDTRY. - - ENDWHILE. - - rs_popup-url = lv_url. - rs_popup-package = lv_package. - rs_popup-branch_name = lv_branch. - - ENDMETHOD. - - METHOD popup_to_confirm. - - CALL FUNCTION 'POPUP_TO_CONFIRM' - EXPORTING - titlebar = titlebar - text_question = text_question - text_button_1 = text_button_1 - icon_button_1 = icon_button_1 - text_button_2 = text_button_2 - icon_button_2 = icon_button_2 - default_button = default_button - display_cancel_button = display_cancel_button - IMPORTING - answer = rv_answer - EXCEPTIONS - text_not_found = 1 - OTHERS = 2. "#EC NOTEXT - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from POPUP_TO_CONFIRM' ). - ENDIF. - - ENDMETHOD. "popup_to_confirm - - METHOD popup_to_inform. - - DATA: lv_line1 TYPE char70, - lv_line2 TYPE char70. - - lv_line1 = text_message. - IF strlen( text_message ) > 70. - lv_line2 = text_message+70. - ENDIF. - - CALL FUNCTION 'POPUP_TO_INFORM' - EXPORTING - titel = titlebar - txt1 = lv_line1 - txt2 = lv_line2. - - ENDMETHOD. " popup_to_inform. - - METHOD popup_to_create_package. - CALL FUNCTION 'FUNCTION_EXISTS' - EXPORTING - funcname = 'PB_POPUP_PACKAGE_CREATE' - EXCEPTIONS - function_not_exist = 1 - OTHERS = 2. - IF sy-subrc = 1. -* looks like the function module used does not exist on all -* versions since 702, so show an error - zcx_abapgit_exception=>raise( 'Function module PB_POPUP_PACKAGE_CREATE does not exist' ). - ENDIF. - - CALL FUNCTION 'PB_POPUP_PACKAGE_CREATE' - CHANGING - p_object_data = es_package_data - EXCEPTIONS - action_cancelled = 1. - IF sy-subrc = 0. - ev_create = abap_true. - ELSE. - ev_create = abap_false. - ENDIF. - ENDMETHOD. " popup_to_create_package - - METHOD popup_to_select_transports. - DATA: lrs_trfunction TYPE trsel_trs_function, - lv_types TYPE string, - ls_ranges TYPE trsel_ts_ranges. - - " Fill all request types - lv_types = 'KWTCOEMPDRSXQFG'. - lrs_trfunction-sign = 'I'. - lrs_trfunction-option = 'EQ'. - WHILE lv_types <> space. - lrs_trfunction-low = lv_types(1). - APPEND lrs_trfunction TO ls_ranges-request_funcs. - SHIFT lv_types. - ENDWHILE. - - CALL FUNCTION 'TRINT_SELECT_REQUESTS' - EXPORTING - iv_username_pattern = sy-uname - iv_via_selscreen = 'X' - iv_complete_projects = '' - "is_popup = '' - iv_title = 'abapGit: Transport Request Selection' - IMPORTING - et_requests = rt_trkorr - CHANGING - cs_ranges = ls_ranges - EXCEPTIONS - action_aborted_by_user = 1 - OTHERS = 2. - - ENDMETHOD. - - METHOD popup_to_create_transp_branch. - DATA: lv_returncode TYPE c, - lt_fields TYPE TABLE OF sval, - lv_transports_as_text TYPE string, - ls_transport_header LIKE LINE OF it_transport_headers. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - lv_transports_as_text = 'Transport(s)'. - LOOP AT it_transport_headers INTO ls_transport_header. - CONCATENATE lv_transports_as_text '_' ls_transport_header-trkorr INTO lv_transports_as_text. - ENDLOOP. - - add_field( EXPORTING iv_tabname = 'TEXTL' - iv_fieldname = 'LINE' - iv_fieldtext = 'Branch name' - iv_value = lv_transports_as_text - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'ABAPTXT255' - iv_fieldname = 'LINE' - iv_fieldtext = 'Commit text' - iv_value = lv_transports_as_text - CHANGING ct_fields = lt_fields ). - - CALL FUNCTION 'POPUP_GET_VALUES' - EXPORTING - popup_title = 'Transport to new Branch' - IMPORTING - returncode = lv_returncode - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_returncode = 'A'. - RAISE EXCEPTION TYPE zcx_abapgit_cancel. - ENDIF. - - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - rs_transport_branch-branch_name = -value. - - READ TABLE lt_fields INDEX 2 ASSIGNING . - ASSERT sy-subrc = 0. - rs_transport_branch-commit_text = -value. - ENDMETHOD. - - METHOD popup_to_select_from_list. - - DATA: - lo_events TYPE REF TO cl_salv_events_table, - lo_columns TYPE REF TO cl_salv_columns_table, - lt_columns TYPE salv_t_column_ref, - ls_column TYPE salv_s_column_ref, - lo_column TYPE REF TO cl_salv_column_list, - lo_table_header TYPE REF TO cl_salv_form_text. - - FIELD-SYMBOLS:
TYPE STANDARD TABLE. - - CLEAR: et_list. - - create_new_table( it_list = it_list ). - - ASSIGN mr_table->* TO
. - ASSERT sy-subrc = 0. - - TRY. - cl_salv_table=>factory( IMPORTING r_salv_table = mo_select_list_popup - CHANGING t_table =
). - - mo_select_list_popup->set_screen_status( pfstatus = '102' - report = 'SAPMSVIM' ). - - mo_select_list_popup->set_screen_popup( start_column = 1 - end_column = 65 - start_line = 1 - end_line = 20 ). - - lo_events = mo_select_list_popup->get_event( ). - - SET HANDLER on_select_list_link_click FOR lo_events. - SET HANDLER on_select_list_function_click FOR lo_events. - - CREATE OBJECT lo_table_header - EXPORTING - text = i_header_text. - - mo_select_list_popup->set_top_of_list( lo_table_header ). - - lo_columns = mo_select_list_popup->get_columns( ). - lo_columns->set_optimize( abap_true ). - lt_columns = lo_columns->get( ). - - LOOP AT lt_columns INTO ls_column. - - IF ls_column-columnname = co_fieldname_selected. - lo_column ?= ls_column-r_column. - lo_column->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ). - lo_column->set_output_length( 20 ). - lo_column->set_short_text( |{ i_select_column_text }| ). - lo_column->set_medium_text( |{ i_select_column_text }| ). - lo_column->set_long_text( |{ i_select_column_text }| ). - CONTINUE. - ENDIF. - - READ TABLE it_columns_to_display TRANSPORTING NO FIELDS - WITH KEY table_line = ls_column-columnname. - IF sy-subrc <> 0. - ls_column-r_column->set_technical( abap_true ). - ENDIF. - - ENDLOOP. - - mo_select_list_popup->display( ). - - CATCH cx_salv_msg. - zcx_abapgit_exception=>raise( 'Error from POPUP_SELECT_OBJ_OVERWRITE' ). - ENDTRY. - - get_selected_rows( - IMPORTING - et_list = et_list ). - - CLEAR: mo_select_list_popup, - mr_table, - mo_table_descr. - - ENDMETHOD. - - METHOD create_new_table. - - " create and populate a table on the fly derived from - " it_data with a select column - - DATA: lr_struct TYPE REF TO data, - lt_components TYPE cl_abap_structdescr=>component_table, - lo_struct_descr TYPE REF TO cl_abap_structdescr, - struct_descr TYPE REF TO cl_abap_structdescr. - - FIELD-SYMBOLS:
TYPE STANDARD TABLE, - TYPE abap_componentdescr, - TYPE data, - TYPE any. - - mo_table_descr ?= cl_abap_tabledescr=>describe_by_data( it_list ). - lo_struct_descr ?= mo_table_descr->get_table_line_type( ). - lt_components = lo_struct_descr->get_components( ). - - INSERT INITIAL LINE INTO lt_components ASSIGNING INDEX 1. - ASSERT sy-subrc = 0. - - -name = co_fieldname_selected. - -type ?= cl_abap_datadescr=>describe_by_name( 'FLAG' ). - - struct_descr = cl_abap_structdescr=>create( lt_components ). - mo_table_descr = cl_abap_tabledescr=>create( struct_descr ). - - CREATE DATA mr_table TYPE HANDLE mo_table_descr. - ASSIGN mr_table->* TO
. - ASSERT sy-subrc = 0. - - CREATE DATA lr_struct TYPE HANDLE struct_descr. - ASSIGN lr_struct->* TO . - ASSERT sy-subrc = 0. - - LOOP AT it_list ASSIGNING . - - CLEAR: . - MOVE-CORRESPONDING TO . - INSERT INTO TABLE
. - - ENDLOOP. - - ENDMETHOD. - - - METHOD on_select_list_function_click. - - FIELD-SYMBOLS:
TYPE STANDARD TABLE, - TYPE any, - TYPE flag. - - ASSIGN mr_table->* TO
. - ASSERT sy-subrc = 0. - - CASE e_salv_function. - WHEN 'O.K.'. - mo_select_list_popup->close_screen( ). - - WHEN 'ABR'. - "Canceled: clear list to overwrite nothing - CLEAR
. - mo_select_list_popup->close_screen( ). - - WHEN 'SALL'. - - LOOP AT
ASSIGNING . - - ASSIGN COMPONENT co_fieldname_selected - OF STRUCTURE - TO . - ASSERT sy-subrc = 0. - - = abap_true. - - ENDLOOP. - - mo_select_list_popup->refresh( ). - - WHEN 'DSEL'. - - LOOP AT
ASSIGNING . - - ASSIGN COMPONENT co_fieldname_selected - OF STRUCTURE - TO . - ASSERT sy-subrc = 0. - - = abap_false. - - ENDLOOP. - - mo_select_list_popup->refresh( ). - - WHEN OTHERS. - CLEAR
. - mo_select_list_popup->close_screen( ). - ENDCASE. - - ENDMETHOD. - - METHOD on_select_list_link_click. - - DATA: lv_line TYPE sytabix. - - FIELD-SYMBOLS:
TYPE STANDARD TABLE, - TYPE any, - TYPE flag. - - ASSIGN mr_table->* TO
. - ASSERT sy-subrc = 0. - - lv_line = row. - - READ TABLE
ASSIGNING - INDEX lv_line. - IF sy-subrc = 0. - - ASSIGN COMPONENT co_fieldname_selected - OF STRUCTURE - TO . - ASSERT sy-subrc = 0. - - IF = abap_true. - = abap_false. - ELSE. - = abap_true. - ENDIF. - - ENDIF. - - mo_select_list_popup->refresh( ). - ENDMETHOD. - - - METHOD get_selected_rows. - - DATA: lv_condition TYPE string, - lr_exporting TYPE REF TO data. - - FIELD-SYMBOLS: TYPE any, -
TYPE STANDARD TABLE, - TYPE any. - - lv_condition = |{ co_fieldname_selected } = ABAP_TRUE|. - - ASSIGN mr_table->* TO
. - ASSERT sy-subrc = 0. - - CREATE DATA lr_exporting LIKE LINE OF et_list. - ASSIGN lr_exporting->* TO . - - LOOP AT
ASSIGNING - WHERE (lv_condition). - - CLEAR: . - MOVE-CORRESPONDING TO . - APPEND TO et_list. - - ENDLOOP. - - ENDMETHOD. - - - METHOD extract_field_values. - - FIELD-SYMBOLS: LIKE LINE OF it_fields. - - CLEAR: ev_url, - ev_package, - ev_branch. - - READ TABLE it_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - ev_url = -value. - - READ TABLE it_fields INDEX 2 ASSIGNING . - ASSERT sy-subrc = 0. - ev_package = -value. - TRANSLATE ev_package TO UPPER CASE. - - READ TABLE it_fields INDEX 3 ASSIGNING . - ASSERT sy-subrc = 0. - ev_branch = -value. - - ENDMETHOD. - - METHOD branch_popup_callback. - - DATA: lv_url TYPE string, - ls_package_data TYPE scompkdtln, - ls_branch TYPE zcl_abapgit_git_branch_list=>ty_git_branch, - lv_create TYPE boolean. - - FIELD-SYMBOLS: LIKE LINE OF ct_fields, - LIKE LINE OF ct_fields, - LIKE LINE OF ct_fields. - - CLEAR cs_error. - - IF iv_code = 'COD1'. - cv_show_popup = abap_true. - - READ TABLE ct_fields ASSIGNING WITH KEY tabname = 'ABAPTXT255'. - IF sy-subrc <> 0 OR -value IS INITIAL. - MESSAGE 'Fill URL' TYPE 'S' DISPLAY LIKE 'E'. "#EC NOTEXT - RETURN. - ENDIF. - lv_url = -value. - - ls_branch = lcl_popups=>branch_list_popup( lv_url ). - IF ls_branch IS INITIAL. - RETURN. - ENDIF. - - READ TABLE ct_fields ASSIGNING WITH KEY tabname = 'TEXTL'. - ASSERT sy-subrc = 0. - -value = ls_branch-name. - - ELSEIF iv_code = 'COD2'. - cv_show_popup = abap_true. - - READ TABLE ct_fields ASSIGNING WITH KEY fieldname = 'DEVCLASS'. - ASSERT sy-subrc = 0. - ls_package_data-devclass = -value. - - lcl_popups=>popup_to_create_package( IMPORTING es_package_data = ls_package_data - ev_create = lv_create ). - IF lv_create = abap_false. - RETURN. - ENDIF. - - zcl_abapgit_sap_package=>create( ls_package_data ). - COMMIT WORK. - - -value = ls_package_data-devclass. - ENDIF. - - ENDMETHOD. - - - METHOD package_popup_callback. - - DATA: ls_package_data TYPE scompkdtln, - lv_create TYPE boolean. - - FIELD-SYMBOLS: LIKE LINE OF ct_fields. - - CLEAR cs_error. - - IF iv_code = 'COD1'. - cv_show_popup = abap_true. - - READ TABLE ct_fields ASSIGNING WITH KEY fieldname = 'DEVCLASS'. - ASSERT sy-subrc = 0. - ls_package_data-devclass = -value. - - lcl_popups=>popup_to_create_package( IMPORTING es_package_data = ls_package_data - ev_create = lv_create ). - IF lv_create = abap_false. - RETURN. - ENDIF. - - zcl_abapgit_sap_package=>create( ls_package_data ). - COMMIT WORK. - - -value = ls_package_data-devclass. - ENDIF. - - ENDMETHOD. - ENDCLASS. diff --git a/src/ui/zcl_abapgit_popups.clas.xml b/src/ui/zcl_abapgit_popups.clas.xml new file mode 100644 index 000000000..48c46ddc3 --- /dev/null +++ b/src/ui/zcl_abapgit_popups.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_POPUPS + 1 + E + Popups + 2 + 1 + X + X + X + X + + + + diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 516b0c246..f2855de4f 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -35,18 +35,9 @@ INCLUDE zabapgit_password_dialog. " !!! Contains SELECTION SCREEN INCLUDE zabapgit_authorizations. INCLUDE zabapgit_exit. -INCLUDE zabapgit_repo. INCLUDE zabapgit_news. -INCLUDE zabapgit_stage_logic. -INCLUDE zabapgit_git. -INCLUDE zabapgit_objects. -INCLUDE zabapgit_tadir. -INCLUDE zabapgit_file_status. -INCLUDE zabapgit_popups. INCLUDE zabapgit_zip. -INCLUDE zabapgit_objects_impl. -INCLUDE zabapgit_repo_impl. INCLUDE zabapgit_background. INCLUDE zabapgit_transport. diff --git a/src/zabapgit_background.prog.abap b/src/zabapgit_background.prog.abap index e1f707b0c..4c99eb647 100644 --- a/src/zabapgit_background.prog.abap +++ b/src/zabapgit_background.prog.abap @@ -15,15 +15,15 @@ CLASS lcl_background DEFINITION FINAL. IMPORTING is_files TYPE zif_abapgit_definitions=>ty_stage_files RETURNING VALUE(rv_comment) TYPE string, push - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online is_settings TYPE zcl_abapgit_persist_background=>ty_background RAISING zcx_abapgit_exception, push_fixed - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online is_settings TYPE zcl_abapgit_persist_background=>ty_background RAISING zcx_abapgit_exception, push_auto - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online RAISING zcx_abapgit_exception. ENDCLASS. @@ -32,7 +32,7 @@ CLASS lcl_background IMPLEMENTATION. METHOD push. - IF lines( lcl_stage_logic=>get( io_repo )-local ) = 0. + IF lines( zcl_abapgit_stage_logic=>get( io_repo )-local ) = 0. WRITE: / 'nothing to stage' ##NO_TEXT. RETURN. ENDIF. @@ -58,7 +58,7 @@ CLASS lcl_background IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF ls_files-local. - ls_files = lcl_stage_logic=>get( io_repo ). + ls_files = zcl_abapgit_stage_logic=>get( io_repo ). ASSERT lines( ls_files-local ) > 0. CREATE OBJECT lo_stage @@ -132,10 +132,10 @@ CLASS lcl_background IMPLEMENTATION. LIKE LINE OF ls_files-local. - ls_files = lcl_stage_logic=>get( io_repo ). + ls_files = zcl_abapgit_stage_logic=>get( io_repo ). LOOP AT ls_files-local ASSIGNING . - lv_changed_by = lcl_objects=>changed_by( -item ). + lv_changed_by = zcl_abapgit_objects=>changed_by( -item ). APPEND lv_changed_by TO lt_users. APPEND INITIAL LINE TO lt_changed ASSIGNING . -changed_by = lv_changed_by. @@ -206,7 +206,7 @@ CLASS lcl_background IMPLEMENTATION. CONSTANTS: c_enq_type TYPE c LENGTH 12 VALUE 'BACKGROUND'. DATA: lo_per TYPE REF TO zcl_abapgit_persist_background, - lo_repo TYPE REF TO lcl_repo_online, + lo_repo TYPE REF TO zcl_abapgit_repo_online, lt_list TYPE zcl_abapgit_persist_background=>tt_background, lv_repo_name TYPE string. @@ -233,7 +233,7 @@ CLASS lcl_background IMPLEMENTATION. WRITE: / 'Background mode' ##NO_TEXT. LOOP AT lt_list ASSIGNING . - lo_repo ?= lcl_repo_srv=>get_instance( )->get( -key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( -key ). lv_repo_name = lo_repo->get_name( ). WRITE: / -method, lv_repo_name. diff --git a/src/zabapgit_file_status.prog.xml b/src/zabapgit_file_status.prog.xml deleted file mode 100644 index d137f4325..000000000 --- a/src/zabapgit_file_status.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_FILE_STATUS - A - X - I - E - X - - - - R - Include ZABAPGIT_FILE_STATUS - 28 - - - - - diff --git a/src/zabapgit_forms.prog.abap b/src/zabapgit_forms.prog.abap index b8ec4b82b..b0b4427c5 100644 --- a/src/zabapgit_forms.prog.abap +++ b/src/zabapgit_forms.prog.abap @@ -64,7 +64,7 @@ FORM branch_popup TABLES tt_fields TYPE zif_abapgit_definitions=>ty_sval_tt DATA: lx_error TYPE REF TO zcx_abapgit_exception. TRY. - lcl_popups=>branch_popup_callback( + zcl_abapgit_popups=>branch_popup_callback( EXPORTING iv_code = pv_code CHANGING @@ -88,7 +88,7 @@ FORM package_popup TABLES tt_fields TYPE zif_abapgit_definitions=>ty_sval_tt DATA: lx_error TYPE REF TO zcx_abapgit_exception. TRY. - lcl_popups=>package_popup_callback( + zcl_abapgit_popups=>package_popup_callback( EXPORTING iv_code = pv_code CHANGING diff --git a/src/zabapgit_git.prog.xml b/src/zabapgit_git.prog.xml deleted file mode 100644 index 829207dc7..000000000 --- a/src/zabapgit_git.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_GIT - A - X - I - E - X - - - - R - Include ZABAPGIT_GIT - 20 - - - - - diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap index 081f23e39..25830ea77 100644 --- a/src/zabapgit_gui_router.prog.abap +++ b/src/zabapgit_gui_router.prog.abap @@ -115,7 +115,7 @@ CLASS lcl_gui_router IMPLEMENTATION. EXPORTING iv_string = iv_getdata IMPORTING ev_obj_type = ls_item-obj_type ev_obj_name = ls_item-obj_name ). - lcl_objects=>jump( ls_item ). + zcl_abapgit_objects=>jump( ls_item ). ev_state = zif_abapgit_definitions=>gc_event_state-no_more_act. WHEN zif_abapgit_definitions=>gc_action-jump_pkg. " Open SE80 lcl_services_repo=>open_se80( |{ iv_getdata }| ). @@ -166,7 +166,7 @@ CLASS lcl_gui_router IMPLEMENTATION. WHEN zif_abapgit_definitions=>gc_action-repo_syntax_check. CREATE OBJECT ei_page TYPE lcl_gui_page_syntax EXPORTING - io_repo = lcl_repo_srv=>get_instance( )->get( lv_key ). + io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-new_page. WHEN zif_abapgit_definitions=>gc_action-repo_purge. " Repo remove & purge all objects lcl_services_repo=>purge( lv_key ). @@ -189,7 +189,7 @@ CLASS lcl_gui_router IMPLEMENTATION. WHEN zif_abapgit_definitions=>gc_action-repo_settings. CREATE OBJECT ei_page TYPE lcl_gui_page_repo_sett EXPORTING - io_repo = lcl_repo_srv=>get_instance( )->get( lv_key ). + io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-new_page. " ZIP services actions @@ -197,7 +197,7 @@ CLASS lcl_gui_router IMPLEMENTATION. lcl_zip=>import( lv_key ). ev_state = zif_abapgit_definitions=>gc_event_state-re_render. WHEN zif_abapgit_definitions=>gc_action-zip_export. " Export repo as ZIP - lcl_zip=>export( lcl_repo_srv=>get_instance( )->get( lv_key ) ). + lcl_zip=>export( zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ) ). ev_state = zif_abapgit_definitions=>gc_event_state-no_more_act. WHEN zif_abapgit_definitions=>gc_action-zip_package. " Export package as ZIP lcl_zip=>export_package( ). @@ -298,14 +298,14 @@ CLASS lcl_gui_router IMPLEMENTATION. METHOD get_page_branch_overview. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, lo_page TYPE REF TO lcl_gui_page_boverview, lv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key. lv_key = iv_getdata. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( lv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). CREATE OBJECT lo_page EXPORTING @@ -344,7 +344,7 @@ CLASS lcl_gui_router IMPLEMENTATION. METHOD get_page_stage. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, lv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key, lv_seed TYPE string, lo_stage_page TYPE REF TO lcl_gui_page_stage. @@ -359,7 +359,7 @@ CLASS lcl_gui_router IMPLEMENTATION. ev_seed = lv_seed ). ENDIF. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( lv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). " force refresh on stage, to make sure the latest local and remote files are used lo_repo->refresh( ). @@ -385,7 +385,7 @@ CLASS lcl_gui_router IMPLEMENTATION. DATA: lv_class_name TYPE string, lv_cancel TYPE abap_bool. - lcl_popups=>run_page_class_popup( IMPORTING ev_name = lv_class_name + zcl_abapgit_popups=>run_page_class_popup( IMPORTING ev_name = lv_class_name ev_cancel = lv_cancel ). IF lv_cancel = abap_true. RAISE EXCEPTION TYPE zcx_abapgit_cancel. diff --git a/src/zabapgit_html_chunks.prog.abap b/src/zabapgit_html_chunks.prog.abap index fbf0d78d8..4b2c04ab2 100644 --- a/src/zabapgit_html_chunks.prog.abap +++ b/src/zabapgit_html_chunks.prog.abap @@ -12,7 +12,7 @@ CLASS lcl_gui_chunk_lib DEFINITION FINAL. RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html. CLASS-METHODS render_repo_top - IMPORTING io_repo TYPE REF TO lcl_repo + IMPORTING io_repo TYPE REF TO zcl_abapgit_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 @@ -28,7 +28,7 @@ CLASS lcl_gui_chunk_lib DEFINITION FINAL. CLASS-METHODS render_branch_span IMPORTING iv_branch TYPE string - io_repo TYPE REF TO lcl_repo_online + io_repo TYPE REF TO zcl_abapgit_repo_online iv_interactive TYPE abap_bool RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. @@ -49,7 +49,7 @@ CLASS lcl_gui_chunk_lib IMPLEMENTATION. METHOD render_repo_top. - DATA: lo_repo_online TYPE REF TO lcl_repo_online, + DATA: lo_repo_online TYPE REF TO zcl_abapgit_repo_online, lo_pback TYPE REF TO zcl_abapgit_persist_background, lv_hint TYPE string, lv_icon TYPE string. diff --git a/src/zabapgit_migrations.prog.abap b/src/zabapgit_migrations.prog.abap index d168c049a..685276d58 100644 --- a/src/zabapgit_migrations.prog.abap +++ b/src/zabapgit_migrations.prog.abap @@ -33,7 +33,7 @@ CLASS lcl_migrations IMPLEMENTATION. METHOD local_dot_abapgit. - DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, + DATA: lt_repos TYPE zcl_abapgit_repo_srv=>ty_repo_tt, lv_msg TYPE string, lv_shown TYPE abap_bool, lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit, @@ -42,7 +42,7 @@ CLASS lcl_migrations IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_repos. - lt_repos = lcl_repo_srv=>get_instance( )->list( ). + lt_repos = zcl_abapgit_repo_srv=>get_instance( )->list( ). LOOP AT lt_repos ASSIGNING . lo_dot_abapgit = ->get_dot_abapgit( ). @@ -90,16 +90,16 @@ CLASS lcl_migrations IMPLEMENTATION. METHOD rebuild_local_checksums_161112. - DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, + DATA: lt_repos TYPE zcl_abapgit_repo_srv=>ty_repo_tt, lv_repo_list TYPE string, lv_question TYPE string, lv_answer TYPE c, lv_index TYPE i, - lo_repo TYPE REF TO lcl_repo_online. + lo_repo TYPE REF TO zcl_abapgit_repo_online. FIELD-SYMBOLS: LIKE LINE OF lt_repos. - lt_repos = lcl_repo_srv=>get_instance( )->list( ). + lt_repos = zcl_abapgit_repo_srv=>get_instance( )->list( ). LOOP AT lt_repos ASSIGNING . lv_index = sy-tabix. @@ -134,7 +134,7 @@ CLASS lcl_migrations IMPLEMENTATION. && ' by "Advances/Update local checksums" command.' && | Repos affected: { lv_repo_list }|. - lv_answer = lcl_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = 'Warning' text_question = lv_question text_button_1 = 'OK' diff --git a/src/zabapgit_news.prog.abap b/src/zabapgit_news.prog.abap index 66ce652ef..cf59ce6ae 100644 --- a/src/zabapgit_news.prog.abap +++ b/src/zabapgit_news.prog.abap @@ -26,7 +26,7 @@ CLASS lcl_news DEFINITION CREATE PRIVATE FRIENDS ltcl_news. CLASS-METHODS: create " TODO REFACTOR - IMPORTING io_repo TYPE REF TO lcl_repo + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo RETURNING VALUE(ro_instance) TYPE REF TO lcl_news RAISING zcx_abapgit_exception. @@ -94,10 +94,11 @@ CLASS lcl_news IMPLEMENTATION. DATA: lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, lv_last_seen TYPE string, lv_url TYPE string, - lo_repo_online TYPE REF TO lcl_repo_online. + lo_repo_online TYPE REF TO zcl_abapgit_repo_online. FIELD-SYMBOLS LIKE LINE OF lt_remote. + IF io_repo->is_offline( ) = abap_true. RETURN. ENDIF. diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap deleted file mode 100644 index df6bb5c1e..000000000 --- a/src/zabapgit_objects.prog.abap +++ /dev/null @@ -1,313 +0,0 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_OBJECTS -*&---------------------------------------------------------------------* - -********************************************************************** -* Enable plugins - -CLASS lcl_objects_bridge DEFINITION INHERITING FROM zcl_abapgit_objects_super FINAL. - - PUBLIC SECTION. - - CLASS-METHODS class_constructor. - - METHODS constructor - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - RAISING cx_sy_create_object_error. - - INTERFACES zif_abapgit_object. - ALIASES mo_files FOR zif_abapgit_object~mo_files. - - PRIVATE SECTION. - DATA: mo_plugin TYPE REF TO object. - - TYPES: BEGIN OF ty_s_objtype_map, - obj_typ TYPE trobjtype, - plugin_class TYPE seoclsname, - END OF ty_s_objtype_map, - ty_t_objtype_map TYPE SORTED TABLE OF ty_s_objtype_map WITH UNIQUE KEY obj_typ. - - CLASS-DATA gt_objtype_map TYPE ty_t_objtype_map. - -ENDCLASS. "lcl_objects_bridge DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_objects_bridge IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_objects_bridge IMPLEMENTATION. - - METHOD zif_abapgit_object~has_changed_since. - rv_changed = abap_true. - ENDMETHOD. "lif_object~has_changed_since - - METHOD zif_abapgit_object~get_metadata. - - CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~GET_METADATA') - RECEIVING - rs_metadata = rs_metadata. - - ENDMETHOD. "lif_object~get_metadata - - METHOD zif_abapgit_object~changed_by. - rv_user = c_user_unknown. " todo - ENDMETHOD. - - METHOD constructor. - - DATA ls_objtype_map LIKE LINE OF gt_objtype_map. - - super->constructor( is_item = is_item - iv_language = zif_abapgit_definitions=>gc_english ). - -* determine the responsible plugin - READ TABLE gt_objtype_map INTO ls_objtype_map - WITH TABLE KEY obj_typ = is_item-obj_type. - IF sy-subrc = 0. - CREATE OBJECT mo_plugin TYPE (ls_objtype_map-plugin_class). - - CALL METHOD mo_plugin->('SET_ITEM') - EXPORTING - iv_obj_type = is_item-obj_type - iv_obj_name = is_item-obj_name. - ELSE. - RAISE EXCEPTION TYPE cx_sy_create_object_error - EXPORTING - classname = 'LCL_OBJECTS_BRIDGE'. - ENDIF. - ENDMETHOD. "constructor - - METHOD zif_abapgit_object~serialize. - - CALL METHOD mo_plugin->('WRAP_SERIALIZE') - EXPORTING - io_xml = io_xml. - - ENDMETHOD. "lif_object~serialize - - METHOD zif_abapgit_object~deserialize. - - DATA: lx_plugin TYPE REF TO cx_static_check. - - TRY. - CALL METHOD mo_plugin->('WRAP_DESERIALIZE') - EXPORTING - iv_package = iv_package - io_xml = io_xml. - CATCH cx_static_check INTO lx_plugin. - zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ). - ENDTRY. - ENDMETHOD. "lif_object~deserialize - - METHOD zif_abapgit_object~delete. - DATA lx_plugin TYPE REF TO cx_static_check. - - TRY. - CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~DELETE'). - CATCH cx_static_check INTO lx_plugin. - zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ). - ENDTRY. - - ENDMETHOD. "lif_object~delete - - METHOD zif_abapgit_object~exists. - - CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~EXISTS') - RECEIVING - rv_bool = rv_bool. - - ENDMETHOD. "lif_object~exists - - METHOD zif_abapgit_object~jump. - - CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~JUMP'). - - ENDMETHOD. "lif_object~jump - - METHOD class_constructor. - - DATA lt_plugin_class TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY. - DATA lv_plugin_class LIKE LINE OF lt_plugin_class. - DATA lo_plugin TYPE REF TO object. - DATA lt_plugin_obj_type TYPE objtyptable. - DATA ls_objtype_map LIKE LINE OF gt_objtype_map. - - - SELECT ext~clsname - FROM vseoextend AS ext - INTO TABLE lt_plugin_class - WHERE ext~refclsname LIKE 'ZCL_ABAPGITP_OBJECT%' - AND ext~version = '1'. "#EC CI_SUBRC - - CLEAR gt_objtype_map. - LOOP AT lt_plugin_class INTO lv_plugin_class - WHERE table_line <> 'ZCL_ABAPGITP_OBJECT_BY_SOBJ'. -* have the generic plugin only as fallback - TRY. - CREATE OBJECT lo_plugin TYPE (lv_plugin_class). - CATCH cx_sy_create_object_error. - CONTINUE. ">>>>>>>>>>>>>> - ENDTRY. - - CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES') - IMPORTING - rt_obj_type = lt_plugin_obj_type. - - ls_objtype_map-plugin_class = lv_plugin_class. - LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ. - INSERT ls_objtype_map INTO TABLE gt_objtype_map. - IF sy-subrc <> 0. -* No exception in class-contructor possible. -* Anyway, a shortdump is more appropriate in this case - ASSERT 'There must not be' = - |multiple abapGit-Plugins for the same object type { - ls_objtype_map-obj_typ }|. - ENDIF. - ENDLOOP. - ENDLOOP. "at plugins - -* and the same for the generic plugin if exists -* have the generic plugin only as fallback - LOOP AT lt_plugin_class INTO lv_plugin_class - WHERE table_line = 'ZCL_ABAPGITP_OBJECT_BY_SOBJ'. - CREATE OBJECT lo_plugin TYPE (lv_plugin_class). - - CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES') - RECEIVING - rt_obj_type = lt_plugin_obj_type. - - ls_objtype_map-plugin_class = lv_plugin_class. - LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ. - INSERT ls_objtype_map INTO TABLE gt_objtype_map. "knowingly ignore the subrc - ENDLOOP. - ENDLOOP. "at plugins - - ENDMETHOD. "class_constructor - - METHOD zif_abapgit_object~compare_to_remote_version. - CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. - ENDMETHOD. - -ENDCLASS. "lcl_objects_bridge IMPLEMENTATION - -********************************************************************** - -*----------------------------------------------------------------------* -* CLASS lcl_object DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_objects DEFINITION FINAL. - - PUBLIC SECTION. - TYPES: ty_types_tt TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY. - - TYPES: BEGIN OF ty_deserialization, - obj TYPE REF TO zif_abapgit_object, - xml TYPE REF TO zcl_abapgit_xml_input, - package TYPE devclass, - item TYPE zif_abapgit_definitions=>ty_item, - END OF ty_deserialization. - - TYPES: ty_deserialization_tt TYPE STANDARD TABLE OF ty_deserialization WITH DEFAULT KEY. - - CLASS-METHODS serialize - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - iv_language TYPE spras - io_log TYPE REF TO zcl_abapgit_log OPTIONAL - RETURNING VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt - RAISING zcx_abapgit_exception. - - CLASS-METHODS deserialize - IMPORTING io_repo TYPE REF TO lcl_repo - RETURNING VALUE(rt_accessed_files) TYPE zif_abapgit_definitions=>ty_file_signatures_tt - RAISING zcx_abapgit_exception. - - CLASS-METHODS delete - IMPORTING it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt - RAISING zcx_abapgit_exception. - - CLASS-METHODS jump - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - RAISING zcx_abapgit_exception. - - CLASS-METHODS changed_by - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - RETURNING VALUE(rv_user) TYPE xubname - RAISING zcx_abapgit_exception. - - CLASS-METHODS has_changed_since - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - iv_timestamp TYPE timestamp - RETURNING VALUE(rv_changed) TYPE abap_bool - RAISING zcx_abapgit_exception. - - CLASS-METHODS is_supported - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - iv_native_only TYPE abap_bool DEFAULT abap_false - RETURNING VALUE(rv_bool) TYPE abap_bool. - - CLASS-METHODS exists - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - RETURNING VALUE(rv_bool) TYPE abap_bool. - - CLASS-METHODS supported_list - RETURNING VALUE(rt_types) TYPE ty_types_tt. - - PRIVATE SECTION. - - CLASS-METHODS check_duplicates - IMPORTING it_files TYPE zif_abapgit_definitions=>ty_files_tt - RAISING zcx_abapgit_exception. - - CLASS-METHODS create_object - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - iv_language TYPE spras - is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL - iv_native_only TYPE abap_bool DEFAULT abap_false - RETURNING VALUE(ri_obj) TYPE REF TO zif_abapgit_object - RAISING zcx_abapgit_exception. - - CLASS-METHODS - prioritize_deser - IMPORTING it_results TYPE zif_abapgit_definitions=>ty_results_tt - RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt. - - CLASS-METHODS class_name - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - RETURNING VALUE(rv_class_name) TYPE string. - - CLASS-METHODS warning_overwrite - CHANGING ct_results TYPE zif_abapgit_definitions=>ty_results_tt - RAISING zcx_abapgit_exception. - - CLASS-METHODS warning_package - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - iv_package TYPE devclass - RETURNING VALUE(rv_cancel) TYPE abap_bool - RAISING zcx_abapgit_exception. - - CLASS-METHODS update_package_tree - IMPORTING iv_package TYPE devclass. - - CLASS-METHODS delete_obj - IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item - RAISING zcx_abapgit_exception. - - CLASS-METHODS compare_remote_to_local - IMPORTING - io_object TYPE REF TO zif_abapgit_object - it_remote TYPE zif_abapgit_definitions=>ty_files_tt - is_result TYPE zif_abapgit_definitions=>ty_result - RAISING - zcx_abapgit_exception. - - CLASS-METHODS deserialize_objects - IMPORTING it_objects TYPE ty_deserialization_tt - iv_ddic TYPE abap_bool DEFAULT abap_false - iv_descr TYPE string - CHANGING ct_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt - RAISING zcx_abapgit_exception. - -ENDCLASS. "lcl_object DEFINITION diff --git a/src/zabapgit_objects.prog.xml b/src/zabapgit_objects.prog.xml deleted file mode 100644 index 48776da05..000000000 --- a/src/zabapgit_objects.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_OBJECTS - A - X - I - E - X - - - - R - Include ZABAPGIT_OBJECTS - 24 - - - - - diff --git a/src/zabapgit_objects_impl.prog.xml b/src/zabapgit_objects_impl.prog.xml deleted file mode 100644 index 8fd2077d7..000000000 --- a/src/zabapgit_objects_impl.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_OBJECTS_IMPL - A - X - I - E - X - - - - R - Include ZABAPGIT_OBJECT - 23 - - - - - diff --git a/src/zabapgit_page_background.prog.abap b/src/zabapgit_page_background.prog.abap index 7db1f504f..256c38c6d 100644 --- a/src/zabapgit_page_background.prog.abap +++ b/src/zabapgit_page_background.prog.abap @@ -128,7 +128,7 @@ CLASS lcl_gui_page_bkg IMPLEMENTATION. METHOD render_data. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, lo_per TYPE REF TO zcl_abapgit_persist_background, lt_per TYPE zcl_abapgit_persist_background=>tt_background, ls_per LIKE LINE OF lt_per, @@ -146,7 +146,7 @@ CLASS lcl_gui_page_bkg IMPLEMENTATION. CREATE OBJECT lo_per. lt_per = lo_per->list( ). - lo_repo ?= lcl_repo_srv=>get_instance( )->get( mv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( mv_key ). READ TABLE lt_per INTO ls_per WITH KEY key = lo_repo->get_key( ). IF sy-subrc <> 0. diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap index b3aad54a8..d6198245a 100644 --- a/src/zabapgit_page_branch_overview.prog.abap +++ b/src/zabapgit_page_branch_overview.prog.abap @@ -28,7 +28,7 @@ CLASS lcl_branch_overview DEFINITION FINAL. TYPES: ty_commit_tt TYPE STANDARD TABLE OF ty_commit WITH DEFAULT KEY. CLASS-METHODS: run - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online RETURNING VALUE(rt_commits) TYPE ty_commit_tt RAISING zcx_abapgit_exception. @@ -53,7 +53,7 @@ CLASS lcl_branch_overview DEFINITION FINAL. fixes RAISING zcx_abapgit_exception, get_git_objects - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online RETURNING VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt RAISING zcx_abapgit_exception, determine_tags @@ -348,7 +348,7 @@ CLASS lcl_gui_page_boverview DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_pa PUBLIC SECTION. METHODS: constructor - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online RAISING zcx_abapgit_exception, zif_abapgit_gui_page~on_event REDEFINITION. @@ -356,7 +356,7 @@ CLASS lcl_gui_page_boverview DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_pa METHODS render_content REDEFINITION. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO lcl_repo_online, + DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, mv_compress TYPE abap_bool VALUE abap_false, mt_commits TYPE lcl_branch_overview=>ty_commit_tt. diff --git a/src/zabapgit_page_commit.prog.abap b/src/zabapgit_page_commit.prog.abap index 5cc5826cd..f1e12fa41 100644 --- a/src/zabapgit_page_commit.prog.abap +++ b/src/zabapgit_page_commit.prog.abap @@ -13,7 +13,7 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. METHODS: constructor - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception, zif_abapgit_gui_page~on_event REDEFINITION. @@ -24,7 +24,7 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. scripts REDEFINITION. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO lcl_repo_online, + DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, mo_stage TYPE REF TO zcl_abapgit_stage. METHODS: diff --git a/src/zabapgit_page_db.prog.abap b/src/zabapgit_page_db.prog.abap index 25dad3043..0303a1c65 100644 --- a/src/zabapgit_page_db.prog.abap +++ b/src/zabapgit_page_db.prog.abap @@ -262,7 +262,7 @@ CLASS lcl_gui_page_db IMPLEMENTATION. RETURN. ENDIF. rv_text = |Method: { is_data-data_str+lv_match-offset(lv_match-length) }, | - && |Repository: { lcl_repo_srv=>get_instance( )->get( is_data-value )->get_name( ) }|. + && |Repository: { zcl_abapgit_repo_srv=>get_instance( )->get( is_data-value )->get_name( ) }|. WHEN 'USER'. rv_text = '-'. " No additional explanation for user diff --git a/src/zabapgit_page_debug.prog.abap b/src/zabapgit_page_debug.prog.abap index 60d863de9..2bd62da23 100644 --- a/src/zabapgit_page_debug.prog.abap +++ b/src/zabapgit_page_debug.prog.abap @@ -79,7 +79,7 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION. LOOP AT lt_objects ASSIGNING WHERE pgmid = 'R3TR'. ls_item-obj_type = -object. - IF lcl_objects=>is_supported( is_item = ls_item iv_native_only = abap_true ) = abap_true. + IF zcl_abapgit_objects=>is_supported( is_item = ls_item iv_native_only = abap_true ) = abap_true. IF lv_list IS INITIAL. lv_list = ls_item-obj_type. ELSE. diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index 41286717f..549ea9818 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -94,7 +94,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. DATA: lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, lt_status TYPE zif_abapgit_definitions=>ty_results_tt, - lo_repo TYPE REF TO lcl_repo_online, + lo_repo TYPE REF TO zcl_abapgit_repo_online, lv_ts TYPE timestamp. FIELD-SYMBOLS: LIKE LINE OF lt_status. @@ -109,7 +109,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lt_remote = lo_repo->get_files_remote( ). lt_local = lo_repo->get_files_local( ). lt_status = lo_repo->status( ). @@ -198,7 +198,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. " Changed by IF -item-obj_type IS NOT INITIAL. - -changed_by = to_lower( lcl_objects=>changed_by( -item ) ). + -changed_by = to_lower( zcl_abapgit_objects=>changed_by( -item ) ). ENDIF. " Extension diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index c1ee726b9..019abcbd5 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -28,13 +28,13 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. retrieve_active_repo RAISING zcx_abapgit_exception, render_toc - IMPORTING it_repo_list TYPE lcl_repo_srv=>ty_repo_tt + IMPORTING it_repo_list TYPE zcl_abapgit_repo_srv=>ty_repo_tt RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception, build_main_menu RETURNING VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar, render_repo - IMPORTING io_repo TYPE REF TO lcl_repo + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. @@ -76,7 +76,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. WHEN c_actions-show. " Change displayed repo zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ). TRY. - lcl_repo_srv=>get_instance( )->get( lv_key )->refresh( ). + zcl_abapgit_repo_srv=>get_instance( )->get( lv_key )->refresh( ). CATCH zcx_abapgit_exception ##NO_HANDLER. ENDTRY. @@ -95,7 +95,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ls_item TYPE zif_abapgit_definitions=>ty_item. - ls_tadir = lcl_popups=>popup_object( ). + ls_tadir = zcl_abapgit_popups=>popup_object( ). IF ls_tadir IS INITIAL. RETURN. ENDIF. @@ -103,7 +103,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ls_item-obj_type = ls_tadir-object. ls_item-obj_name = ls_tadir-obj_name. - lv_user = lcl_objects=>changed_by( ls_item ). + lv_user = zcl_abapgit_objects=>changed_by( ls_item ). MESSAGE lv_user TYPE 'S'. @@ -111,7 +111,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD render_content. - DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, + DATA: lt_repos TYPE zcl_abapgit_repo_srv=>ty_repo_tt, lx_error TYPE REF TO zcx_abapgit_exception, lo_tutorial TYPE REF TO lcl_gui_view_tutorial, lo_repo LIKE LINE OF lt_repos. @@ -121,7 +121,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CREATE OBJECT ro_html. TRY. - lt_repos = lcl_repo_srv=>get_instance( )->list( ). + lt_repos = zcl_abapgit_repo_srv=>get_instance( )->list( ). CATCH zcx_abapgit_exception INTO lx_error. ro_html->add( lcl_gui_chunk_lib=>render_error( ix_error = lx_error ) ). RETURN. @@ -133,7 +133,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CREATE OBJECT lo_tutorial. ro_html->add( lo_tutorial->render( ) ). ELSE. - lo_repo = lcl_repo_srv=>get_instance( )->get( mv_show ). + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( mv_show ). ro_html->add( render_repo( lo_repo ) ). ENDIF. @@ -144,7 +144,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. DATA: lv_show_old LIKE mv_show. TRY. - lcl_repo_srv=>get_instance( )->list( ). + zcl_abapgit_repo_srv=>get_instance( )->list( ). CATCH zcx_abapgit_exception. RETURN. ENDTRY. @@ -154,7 +154,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. IF mv_show IS NOT INITIAL. TRY. " verify the key exists - lcl_repo_srv=>get_instance( )->get( mv_show ). + zcl_abapgit_repo_srv=>get_instance( )->get( mv_show ). CATCH zcx_abapgit_exception. CLEAR mv_show. zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( mv_show ). diff --git a/src/zabapgit_page_merge.prog.abap b/src/zabapgit_page_merge.prog.abap index f517dd551..c03a41a75 100644 --- a/src/zabapgit_page_merge.prog.abap +++ b/src/zabapgit_page_merge.prog.abap @@ -13,21 +13,21 @@ CLASS lcl_merge DEFINITION FINAL. END OF ty_ancestor. TYPES: BEGIN OF ty_merge, - repo TYPE REF TO lcl_repo_online, + repo TYPE REF TO zcl_abapgit_repo_online, source TYPE zcl_abapgit_git_branch_list=>ty_git_branch, target TYPE zcl_abapgit_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, - ctree TYPE lcl_git_porcelain=>ty_expanded_tt, - result TYPE lcl_git_porcelain=>ty_expanded_tt, + stree TYPE zcl_abapgit_git_porcelain=>ty_expanded_tt, + ttree TYPE zcl_abapgit_git_porcelain=>ty_expanded_tt, + ctree TYPE zcl_abapgit_git_porcelain=>ty_expanded_tt, + result TYPE zcl_abapgit_git_porcelain=>ty_expanded_tt, stage TYPE REF TO zcl_abapgit_stage, conflict TYPE string, END OF ty_merge. CLASS-METHODS: run - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online iv_source TYPE string iv_target TYPE string RETURNING VALUE(rs_merge) TYPE ty_merge @@ -41,7 +41,7 @@ CLASS lcl_merge DEFINITION FINAL. CLASS-METHODS: all_files - RETURNING VALUE(rt_files) TYPE lcl_git_porcelain=>ty_expanded_tt, + RETURNING VALUE(rt_files) TYPE zcl_abapgit_git_porcelain=>ty_expanded_tt, calculate_result RAISING zcx_abapgit_exception, find_ancestors @@ -85,13 +85,13 @@ CLASS lcl_merge IMPLEMENTATION. gs_merge-common = find_first_common( it_list1 = lt_asource it_list2 = lt_atarget ). - gs_merge-stree = lcl_git_porcelain=>full_tree( + gs_merge-stree = zcl_abapgit_git_porcelain=>full_tree( it_objects = gt_objects iv_branch = gs_merge-source-sha1 ). - gs_merge-ttree = lcl_git_porcelain=>full_tree( + gs_merge-ttree = zcl_abapgit_git_porcelain=>full_tree( it_objects = gt_objects iv_branch = gs_merge-target-sha1 ). - gs_merge-ctree = lcl_git_porcelain=>full_tree( + gs_merge-ctree = zcl_abapgit_git_porcelain=>full_tree( it_objects = gt_objects iv_branch = gs_merge-common-commit ). @@ -124,7 +124,7 @@ CLASS lcl_merge IMPLEMENTATION. iv_data = -data ). END-OF-DEFINITION. - DATA: lt_files TYPE lcl_git_porcelain=>ty_expanded_tt, + DATA: lt_files TYPE zcl_abapgit_git_porcelain=>ty_expanded_tt, lv_found_source TYPE abap_bool, lv_found_target TYPE abap_bool, lv_found_common TYPE abap_bool. @@ -326,7 +326,7 @@ CLASS lcl_gui_page_merge DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. PUBLIC SECTION. METHODS: constructor - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online iv_source TYPE string iv_target TYPE string RAISING zcx_abapgit_exception, @@ -336,7 +336,7 @@ CLASS lcl_gui_page_merge DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. METHODS render_content REDEFINITION. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO lcl_repo_online, + DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, ms_merge TYPE lcl_merge=>ty_merge. CONSTANTS: BEGIN OF c_actions, diff --git a/src/zabapgit_page_repo_settings.prog.abap b/src/zabapgit_page_repo_settings.prog.abap index 506189912..9062bde52 100644 --- a/src/zabapgit_page_repo_settings.prog.abap +++ b/src/zabapgit_page_repo_settings.prog.abap @@ -6,7 +6,7 @@ CLASS lcl_gui_page_repo_sett DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_pa PUBLIC SECTION. METHODS: constructor - IMPORTING io_repo TYPE REF TO lcl_repo, + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo, zif_abapgit_gui_page~on_event REDEFINITION. PROTECTED SECTION. @@ -15,7 +15,7 @@ CLASS lcl_gui_page_repo_sett DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_pa save_settings TYPE string VALUE 'save_settings', END OF c_action. - DATA: mo_repo TYPE REF TO lcl_repo. + DATA: mo_repo TYPE REF TO zcl_abapgit_repo. METHODS: render_content REDEFINITION, diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index ff6f4ab02..1d5d14498 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -13,7 +13,7 @@ CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. METHODS: constructor IMPORTING - io_repo TYPE REF TO lcl_repo_online + io_repo TYPE REF TO zcl_abapgit_repo_online iv_seed TYPE string OPTIONAL RAISING zcx_abapgit_exception, zif_abapgit_gui_page~on_event REDEFINITION. @@ -24,7 +24,7 @@ CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. scripts REDEFINITION. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO lcl_repo_online, + DATA: mo_repo TYPE REF TO zcl_abapgit_repo_online, ms_files TYPE zif_abapgit_definitions=>ty_stage_files, mv_seed TYPE string. " Unique page id to bind JS sessionStorage @@ -65,7 +65,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. ms_control-page_title = 'STAGE'. mo_repo = io_repo. - ms_files = lcl_stage_logic=>get( mo_repo ). + ms_files = zcl_abapgit_stage_logic=>get( mo_repo ). mv_seed = iv_seed. IF mv_seed IS INITIAL. " Generate based on time unless obtained from diff page @@ -350,7 +350,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. lt_files_local = mo_repo->get_files_local( ). READ TABLE lt_files_local INTO ls_local_file WITH KEY file = is_file. IF sy-subrc = 0. - rv_user = lcl_objects=>changed_by( ls_local_file-item ). + rv_user = zcl_abapgit_objects=>changed_by( ls_local_file-item ). ENDIF. CATCH zcx_abapgit_exception. CLEAR rv_user. "Should not raise errors if user last changed by was not found diff --git a/src/zabapgit_page_syntax_check.prog.abap b/src/zabapgit_page_syntax_check.prog.abap index 2ac864c8d..1313ee2ce 100644 --- a/src/zabapgit_page_syntax_check.prog.abap +++ b/src/zabapgit_page_syntax_check.prog.abap @@ -10,10 +10,10 @@ CLASS lcl_gui_page_syntax DEFINITION FINAL INHERITING FROM zcl_abapgit_gui_page. PUBLIC SECTION. METHODS: constructor - IMPORTING io_repo TYPE REF TO lcl_repo. + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo. PROTECTED SECTION. - DATA: mo_repo TYPE REF TO lcl_repo. + DATA: mo_repo TYPE REF TO zcl_abapgit_repo. METHODS: render_content REDEFINITION. diff --git a/src/zabapgit_popups.prog.xml b/src/zabapgit_popups.prog.xml deleted file mode 100644 index bb223be13..000000000 --- a/src/zabapgit_popups.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_POPUPS - A - X - I - E - X - - - - R - Include ZABAPGIT_POPUPS - 23 - - - - - diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap deleted file mode 100644 index 73caab202..000000000 --- a/src/zabapgit_repo.prog.abap +++ /dev/null @@ -1,251 +0,0 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_REPO -*&---------------------------------------------------------------------* - -CLASS lcl_repo_srv DEFINITION DEFERRED. - -*----------------------------------------------------------------------* -* CLASS lcl_repo DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv. - - PUBLIC SECTION. - METHODS: - constructor - IMPORTING is_data TYPE zcl_abapgit_persistence_repo=>ty_repo, - get_key - RETURNING VALUE(rv_key) TYPE zif_abapgit_persistence=>ty_value, - get_name - RETURNING VALUE(rv_name) TYPE string - RAISING zcx_abapgit_exception, - get_files_local - IMPORTING io_log TYPE REF TO zcl_abapgit_log OPTIONAL - it_filter TYPE scts_tadir OPTIONAL - RETURNING VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_item_tt - RAISING zcx_abapgit_exception, - get_local_checksums - RETURNING VALUE(rt_checksums) TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt, - get_local_checksums_per_file - RETURNING VALUE(rt_checksums) TYPE zif_abapgit_definitions=>ty_file_signatures_tt, - get_files_remote - RETURNING VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt - RAISING zcx_abapgit_exception, - get_package - RETURNING VALUE(rv_package) TYPE zcl_abapgit_persistence_repo=>ty_repo-package, - get_master_language - RETURNING VALUE(rv_language) TYPE spras, - is_write_protected - RETURNING VALUE(rv_yes) TYPE sap_bool, - ignore_subpackages - RETURNING VALUE(rv_yes) TYPE sap_bool, - delete - RAISING zcx_abapgit_exception, - get_dot_abapgit - RETURNING VALUE(ro_dot_abapgit) TYPE REF TO zcl_abapgit_dot_abapgit, - set_dot_abapgit - IMPORTING io_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit - RAISING zcx_abapgit_exception, - deserialize - RAISING zcx_abapgit_exception, - refresh - IMPORTING iv_drop_cache TYPE abap_bool DEFAULT abap_false - RAISING zcx_abapgit_exception, - refresh_local, " For testing purposes, maybe removed later - update_local_checksums - IMPORTING it_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt - RAISING zcx_abapgit_exception, - rebuild_local_checksums - RAISING zcx_abapgit_exception, - find_remote_dot_abapgit - RETURNING VALUE(ro_dot) TYPE REF TO zcl_abapgit_dot_abapgit - RAISING zcx_abapgit_exception, - is_offline - RETURNING VALUE(rv_offline) TYPE abap_bool - RAISING zcx_abapgit_exception, - set_files_remote - IMPORTING it_files TYPE zif_abapgit_definitions=>ty_files_tt - RAISING zcx_abapgit_exception. - - PROTECTED SECTION. - DATA: mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - mt_remote TYPE zif_abapgit_definitions=>ty_files_tt, - mv_do_local_refresh TYPE abap_bool, - mv_last_serialization TYPE timestamp, - ms_data TYPE zcl_abapgit_persistence_repo=>ty_repo. - - METHODS: - set - IMPORTING iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1 OPTIONAL - it_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt OPTIONAL - iv_url TYPE zcl_abapgit_persistence_repo=>ty_repo-url OPTIONAL - iv_branch_name TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name OPTIONAL - iv_head_branch TYPE zcl_abapgit_persistence_repo=>ty_repo-head_branch OPTIONAL - iv_offline TYPE zcl_abapgit_persistence_repo=>ty_repo-offline OPTIONAL - is_dot_abapgit TYPE zcl_abapgit_persistence_repo=>ty_repo-dot_abapgit OPTIONAL - RAISING zcx_abapgit_exception. - -ENDCLASS. "lcl_repo DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_repo_online DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. - - PUBLIC SECTION. - METHODS: - refresh REDEFINITION, - constructor - IMPORTING is_data TYPE zcl_abapgit_persistence_repo=>ty_repo - RAISING zcx_abapgit_exception, - get_url - RETURNING VALUE(rv_url) TYPE zcl_abapgit_persistence_repo=>ty_repo-url, - get_branch_name - RETURNING VALUE(rv_name) TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name, - get_head_branch_name - RETURNING VALUE(rv_name) TYPE zcl_abapgit_persistence_repo=>ty_repo-head_branch, - get_branches - RETURNING VALUE(ro_branches) TYPE REF TO zcl_abapgit_git_branch_list - RAISING zcx_abapgit_exception, - set_url - IMPORTING iv_url TYPE zcl_abapgit_persistence_repo=>ty_repo-url - RAISING zcx_abapgit_exception, - set_branch_name - IMPORTING iv_branch_name TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name - RAISING zcx_abapgit_exception, - set_new_remote - IMPORTING iv_url TYPE zcl_abapgit_persistence_repo=>ty_repo-url - iv_branch_name TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name - RAISING zcx_abapgit_exception, - get_sha1_local - RETURNING VALUE(rv_sha1) TYPE zcl_abapgit_persistence_repo=>ty_repo-sha1, - get_sha1_remote - RETURNING VALUE(rv_sha1) TYPE zcl_abapgit_persistence_repo=>ty_repo-sha1 - RAISING zcx_abapgit_exception, - get_files_remote REDEFINITION, - get_objects - RETURNING VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING zcx_abapgit_exception, - deserialize REDEFINITION, - status - IMPORTING io_log TYPE REF TO zcl_abapgit_log OPTIONAL - RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt - RAISING zcx_abapgit_exception, - reset_status, - set_objects - IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt - RAISING zcx_abapgit_exception, - initialize - RAISING zcx_abapgit_exception, - rebuild_local_checksums REDEFINITION, - push - IMPORTING is_comment TYPE zif_abapgit_definitions=>ty_comment - io_stage TYPE REF TO zcl_abapgit_stage - RAISING zcx_abapgit_exception, - get_unnecessary_local_objs - RETURNING VALUE(rt_unnecessary_local_objects) TYPE zif_abapgit_definitions=>ty_tadir_tt - RAISING zcx_abapgit_exception. - - PRIVATE SECTION. - DATA: - mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, - mv_branch TYPE zif_abapgit_definitions=>ty_sha1, - mv_initialized TYPE abap_bool, - mo_branches TYPE REF TO zcl_abapgit_git_branch_list, - mt_status TYPE zif_abapgit_definitions=>ty_results_tt. - - METHODS: - handle_stage_ignore - IMPORTING io_stage TYPE REF TO zcl_abapgit_stage - RAISING zcx_abapgit_exception, - actualize_head_branch - RAISING zcx_abapgit_exception, - delete_initial_online_repo - IMPORTING iv_commit TYPE flag - RAISING zcx_abapgit_exception. - -ENDCLASS. "lcl_repo_online DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_repo_offline DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_repo_offline DEFINITION INHERITING FROM lcl_repo FINAL. - - PUBLIC SECTION. - -ENDCLASS. "lcl_repo_offline DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_repo_srv DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_repo_srv DEFINITION FINAL CREATE PRIVATE. - - PUBLIC SECTION. - - CLASS-METHODS: get_instance - RETURNING VALUE(rv_srv) TYPE REF TO lcl_repo_srv. - - TYPES: ty_repo_tt TYPE STANDARD TABLE OF REF TO lcl_repo WITH DEFAULT KEY. - - METHODS list - RETURNING VALUE(rt_list) TYPE ty_repo_tt - RAISING zcx_abapgit_exception. - - METHODS refresh - RAISING zcx_abapgit_exception. - - METHODS new_online - IMPORTING iv_url TYPE string - iv_branch_name TYPE string - iv_package TYPE devclass - RETURNING VALUE(ro_repo) TYPE REF TO lcl_repo_online - RAISING zcx_abapgit_exception. - - METHODS new_offline - IMPORTING iv_url TYPE string - iv_package TYPE devclass - RETURNING VALUE(ro_repo) TYPE REF TO lcl_repo_offline - RAISING zcx_abapgit_exception. - - METHODS delete - IMPORTING io_repo TYPE REF TO lcl_repo - RAISING zcx_abapgit_exception. - - METHODS get - IMPORTING iv_key TYPE zif_abapgit_persistence=>ty_value - RETURNING VALUE(ro_repo) TYPE REF TO lcl_repo - RAISING zcx_abapgit_exception. - - METHODS is_repo_installed - IMPORTING iv_url TYPE string - iv_target_package TYPE devclass OPTIONAL - RETURNING VALUE(rv_installed) TYPE abap_bool - RAISING zcx_abapgit_exception. - - METHODS switch_repo_type - IMPORTING iv_key TYPE zif_abapgit_persistence=>ty_value - iv_offline TYPE abap_bool - RAISING zcx_abapgit_exception. - - METHODS validate_package - IMPORTING iv_package TYPE devclass - RAISING zcx_abapgit_exception. - - PRIVATE SECTION. - - CLASS-DATA: go_ref TYPE REF TO lcl_repo_srv. - - METHODS constructor. - - DATA: mv_init TYPE abap_bool VALUE abap_false, - mo_persistence TYPE REF TO zcl_abapgit_persistence_repo, - mt_list TYPE ty_repo_tt. - - METHODS is_sap_object_allowed - RETURNING - VALUE(rv_allowed) TYPE abap_bool. - - METHODS add - IMPORTING io_repo TYPE REF TO lcl_repo - RAISING zcx_abapgit_exception. - -ENDCLASS. "lcl_repo_srv DEFINITION diff --git a/src/zabapgit_repo.prog.xml b/src/zabapgit_repo.prog.xml deleted file mode 100644 index 928e7e911..000000000 --- a/src/zabapgit_repo.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_REPO - A - X - I - E - X - - - - R - Include ZABAPGIT_REPO - 21 - - - - - diff --git a/src/zabapgit_repo_browser_util.prog.abap b/src/zabapgit_repo_browser_util.prog.abap index 9e8303c00..5a30ce56e 100644 --- a/src/zabapgit_repo_browser_util.prog.abap +++ b/src/zabapgit_repo_browser_util.prog.abap @@ -28,7 +28,7 @@ CLASS lcl_repo_content_list DEFINITION FINAL. TYPES tt_repo_items TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY. METHODS constructor - IMPORTING io_repo TYPE REF TO lcl_repo. + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo. METHODS list IMPORTING iv_path TYPE string @@ -41,7 +41,7 @@ CLASS lcl_repo_content_list DEFINITION FINAL. RETURNING VALUE(ro_log) TYPE REF TO zcl_abapgit_log. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO lcl_repo, + DATA: mo_repo TYPE REF TO zcl_abapgit_repo, mo_log TYPE REF TO zcl_abapgit_log. METHODS build_repo_items_offline @@ -173,7 +173,7 @@ CLASS lcl_repo_content_list IMPLEMENTATION. LIKE LINE OF lt_tadir. - lt_tadir = lcl_tadir=>read( + lt_tadir = zcl_abapgit_tadir=>read( iv_package = mo_repo->get_package( ) io_dot = mo_repo->get_dot_abapgit( ) ). @@ -189,7 +189,7 @@ CLASS lcl_repo_content_list IMPLEMENTATION. METHOD build_repo_items_online. - DATA: lo_repo_online TYPE REF TO lcl_repo_online, + DATA: lo_repo_online TYPE REF TO zcl_abapgit_repo_online, ls_file TYPE zif_abapgit_definitions=>ty_repo_file, lt_status TYPE zif_abapgit_definitions=>ty_results_tt. diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap deleted file mode 100644 index bea8a86e2..000000000 --- a/src/zabapgit_repo_impl.prog.abap +++ /dev/null @@ -1,1096 +0,0 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_REPO_IMPL -*&---------------------------------------------------------------------* - -*----------------------------------------------------------------------* -* CLASS lcl_repo_offline IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_repo_offline IMPLEMENTATION. - -ENDCLASS. "lcl_repo_offline IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_repo_online IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_repo_online IMPLEMENTATION. - - METHOD constructor. - - super->constructor( is_data ). - - mv_initialized = abap_false. - - ENDMETHOD. "constructor - - METHOD initialize. - IF mv_initialized = abap_false. - refresh( ). - ENDIF. - ENDMETHOD. - - METHOD status. - - initialize( ). - - IF lines( mt_status ) = 0. - mt_status = lcl_file_status=>status( io_repo = me - io_log = io_log ). - ENDIF. - rt_results = mt_status. - - ENDMETHOD. "status - - METHOD deserialize. - - IF ms_data-write_protect = abap_true. - zcx_abapgit_exception=>raise( 'Cannot deserialize. Local code is write-protected by repo config' ). - ENDIF. - - initialize( ). - - super->deserialize( ). - - set( iv_sha1 = mv_branch ). - - reset_status( ). - - COMMIT WORK AND WAIT. - - ENDMETHOD. "deserialize - - METHOD reset_status. - CLEAR mt_status. - ENDMETHOD. " reset_status. - - METHOD set_objects. - mt_objects = it_objects. - ENDMETHOD. - - METHOD refresh. - - DATA: lo_progress TYPE REF TO zcl_abapgit_progress, - lx_exception TYPE REF TO zcx_abapgit_exception. - - super->refresh( iv_drop_cache ). - reset_status( ). - - CREATE OBJECT lo_progress - EXPORTING - iv_total = 1. - - lo_progress->show( iv_current = 1 - iv_text = 'Fetch remote files' ) ##NO_TEXT. - - TRY. - - lcl_git_porcelain=>pull( EXPORTING io_repo = me - IMPORTING et_files = mt_remote - et_objects = mt_objects - ev_branch = mv_branch ). - - CATCH zcx_abapgit_exception INTO lx_exception. - - delete_initial_online_repo( abap_true ). - - RAISE EXCEPTION lx_exception. - - ENDTRY. - - mo_branches = zcl_abapgit_git_transport=>branches( get_url( ) ). - actualize_head_branch( ). - - mv_initialized = abap_true. - - ENDMETHOD. "refresh - - METHOD actualize_head_branch. - DATA lv_branch_name TYPE string. - lv_branch_name = mo_branches->get_head( )-name. - - IF lv_branch_name <> ms_data-head_branch. - set( iv_head_branch = lv_branch_name ). - ENDIF. - - ENDMETHOD. "actualize_head_branch - - METHOD get_sha1_remote. - initialize( ). - - rv_sha1 = mv_branch. - ENDMETHOD. "get_sha1_remote - - METHOD get_files_remote. - initialize( ). - - rt_files = mt_remote. - ENDMETHOD. "get_files - - METHOD get_objects. - initialize( ). - - rt_objects = mt_objects. - ENDMETHOD. "get_objects - - METHOD get_url. - rv_url = ms_data-url. - ENDMETHOD. "get_url - - METHOD get_branch_name. - rv_name = ms_data-branch_name. - ENDMETHOD. "get_branch_name - - METHOD get_head_branch_name. - rv_name = ms_data-head_branch. - ENDMETHOD. "get_head_branch_name - - METHOD get_branches. - IF mo_branches IS NOT BOUND. - mo_branches = zcl_abapgit_git_transport=>branches( get_url( ) ). - ENDIF. - ro_branches = mo_branches. - ENDMETHOD. "get_branches - - METHOD set_url. - - IF ms_data-write_protect = abap_true. - zcx_abapgit_exception=>raise( 'Cannot change URL. Local code is write-protected by repo config' ). - ENDIF. - - mv_initialized = abap_false. - set( iv_url = iv_url ). - - ENDMETHOD. - - METHOD set_branch_name. - - IF ms_data-write_protect = abap_true. - zcx_abapgit_exception=>raise( 'Cannot switch branch. Local code is write-protected by repo config' ). - ENDIF. - - mv_initialized = abap_false. - set( iv_branch_name = iv_branch_name ). - - ENDMETHOD. - - METHOD set_new_remote. - - IF ms_data-write_protect = abap_true. - zcx_abapgit_exception=>raise( 'Cannot change remote. Local code is write-protected by repo config' ). - ENDIF. - - mv_initialized = abap_false. - set( iv_url = iv_url - iv_branch_name = iv_branch_name - iv_head_branch = '' - iv_sha1 = '' ). - - ENDMETHOD. "set_new_remote - - METHOD get_sha1_local. - rv_sha1 = ms_data-sha1. - ENDMETHOD. "get_sha1_local - - METHOD push. - - DATA: lv_branch TYPE zif_abapgit_definitions=>ty_sha1, - lt_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt, - lv_text TYPE string. - - IF ms_data-branch_name CP 'refs/tags*'. - lv_text = |You're working on a tag. Currently it's not | - && |possible to push on tags. Consider creating a branch instead|. - zcx_abapgit_exception=>raise( lv_text ). - ENDIF. - - handle_stage_ignore( io_stage ). - - lcl_git_porcelain=>push( EXPORTING is_comment = is_comment - io_repo = me - io_stage = io_stage - IMPORTING ev_branch = lv_branch - et_updated_files = lt_updated_files ). - - IF io_stage->get_branch_sha1( ) = get_sha1_local( ). -* pushing to the branch currently represented by this repository object - mv_branch = lv_branch. - set( iv_sha1 = lv_branch ). - ELSE. - refresh( ). - ENDIF. - - update_local_checksums( lt_updated_files ). - - IF lcl_stage_logic=>count( me ) = 0. - set( iv_sha1 = lv_branch ). - ENDIF. - - ENDMETHOD. "push - - METHOD handle_stage_ignore. - - DATA: lv_add TYPE abap_bool, - lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit, - lt_stage TYPE zcl_abapgit_stage=>ty_stage_tt. - - FIELD-SYMBOLS: LIKE LINE OF lt_stage. - - - lo_dot_abapgit = get_dot_abapgit( ). - lt_stage = io_stage->get_all( ). - LOOP AT lt_stage ASSIGNING WHERE method = zcl_abapgit_stage=>c_method-ignore. - - lo_dot_abapgit->add_ignore( - iv_path = -file-path - iv_filename = -file-filename ). - - " remove it from the staging object, as the action is handled here - io_stage->reset( iv_path = -file-path - iv_filename = -file-filename ). - - lv_add = abap_true. - - ENDLOOP. - - IF lv_add = abap_true. - io_stage->add( - iv_path = zif_abapgit_definitions=>gc_root_dir - iv_filename = zif_abapgit_definitions=>gc_dot_abapgit - iv_data = lo_dot_abapgit->serialize( ) ). - - set_dot_abapgit( lo_dot_abapgit ). - ENDIF. - - ENDMETHOD. - - METHOD rebuild_local_checksums. "REMOTE - - DATA: lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, - lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - ls_last_item TYPE zif_abapgit_definitions=>ty_item, - lv_branch_equal TYPE abap_bool, - lt_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt. - - FIELD-SYMBOLS: LIKE LINE OF lt_checksums, - LIKE LINE OF -files, - LIKE LINE OF lt_remote, - LIKE LINE OF lt_local. - - lt_remote = get_files_remote( ). - lt_local = get_files_local( ). - lv_branch_equal = boolc( get_sha1_remote( ) = get_sha1_local( ) ). - - DELETE lt_local " Remove non-code related files except .abapgit - WHERE item IS INITIAL - AND NOT ( file-path = zif_abapgit_definitions=>gc_root_dir - AND file-filename = zif_abapgit_definitions=>gc_dot_abapgit ). - - SORT lt_local BY item. - SORT lt_remote BY path filename. - - LOOP AT lt_local ASSIGNING . - IF ls_last_item <> -item OR sy-tabix = 1. " First or New item reached ? - APPEND INITIAL LINE TO lt_checksums ASSIGNING . - -item = -item. - ls_last_item = -item. - ENDIF. - - READ TABLE lt_remote ASSIGNING - WITH KEY path = -file-path filename = -file-filename - BINARY SEARCH. - CHECK sy-subrc = 0. " Ignore new ones - - APPEND INITIAL LINE TO -files ASSIGNING . - MOVE-CORRESPONDING -file TO . - - " If hashes are equal -> local sha1 is OK - " Else if R-branch is ahead -> assume changes were remote, state - local sha1 - " Else (branches equal) -> assume changes were local, state - remote sha1 - IF -file-sha1 <> -sha1 AND lv_branch_equal = abap_true. - -sha1 = -sha1. - ENDIF. - ENDLOOP. - - set( it_checksums = lt_checksums ). - reset_status( ). - - ENDMETHOD. " rebuild_local_checksums. - - METHOD delete_initial_online_repo. - - IF me->is_offline( ) = abap_false AND me->get_sha1_local( ) IS INITIAL. - - lcl_repo_srv=>get_instance( )->delete( me ). - - IF iv_commit = abap_true. - COMMIT WORK. - ENDIF. - - ENDIF. - - ENDMETHOD. " delete_initial_online_repo - - METHOD get_unnecessary_local_objs. - - DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, - lt_tadir_unique TYPE HASHED TABLE OF zif_abapgit_definitions=>ty_tadir - WITH UNIQUE KEY pgmid object obj_name, - lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, - lt_status TYPE zif_abapgit_definitions=>ty_results_tt, - lv_package TYPE zcl_abapgit_persistence_repo=>ty_repo-package. - - FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result, - TYPE zif_abapgit_definitions=>ty_tadir. - - " delete objects which are added locally but are not in remote repo - lt_local = me->get_files_local( ). - lt_remote = me->get_files_remote( ). - lt_status = me->status( ). - - lv_package = me->get_package( ). - lt_tadir = lcl_tadir=>read( lv_package ). - SORT lt_tadir BY pgmid ASCENDING object ASCENDING obj_name ASCENDING devclass ASCENDING. - - LOOP AT lt_status ASSIGNING - WHERE lstate = zif_abapgit_definitions=>gc_state-added. - - READ TABLE lt_tadir ASSIGNING - WITH KEY pgmid = 'R3TR' - object = -obj_type - obj_name = -obj_name - devclass = -package - BINARY SEARCH. - IF sy-subrc <> 0. -* skip objects that does not exist locally - CONTINUE. - ENDIF. - - INSERT INTO TABLE lt_tadir_unique. - - ENDLOOP. - - rt_unnecessary_local_objects = lt_tadir_unique. - - ENDMETHOD. - -ENDCLASS. "lcl_repo_online IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_repo IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_repo IMPLEMENTATION. - - METHOD constructor. - - ASSERT NOT is_data-key IS INITIAL. - - ms_data = is_data. - - ENDMETHOD. "constructor - - METHOD find_remote_dot_abapgit. - - FIELD-SYMBOLS: LIKE LINE OF mt_remote. - - - READ TABLE mt_remote ASSIGNING - WITH KEY path = zif_abapgit_definitions=>gc_root_dir - filename = zif_abapgit_definitions=>gc_dot_abapgit. - IF sy-subrc = 0. - ro_dot = zcl_abapgit_dot_abapgit=>deserialize( -data ). - set_dot_abapgit( ro_dot ). - ENDIF. - - ENDMETHOD. - - METHOD get_files_remote. - rt_files = mt_remote. - ENDMETHOD. - - METHOD set. - - DATA: lo_persistence TYPE REF TO zcl_abapgit_persistence_repo. - - - ASSERT iv_sha1 IS SUPPLIED - OR it_checksums IS SUPPLIED - OR iv_url IS SUPPLIED - OR iv_branch_name IS SUPPLIED - OR iv_head_branch IS SUPPLIED - OR iv_offline IS SUPPLIED - OR is_dot_abapgit IS SUPPLIED. - - CREATE OBJECT lo_persistence. - - IF iv_sha1 IS SUPPLIED. - lo_persistence->update_sha1( - iv_key = ms_data-key - iv_branch_sha1 = iv_sha1 ). - ms_data-sha1 = iv_sha1. - ENDIF. - - IF it_checksums IS SUPPLIED. - lo_persistence->update_local_checksums( - iv_key = ms_data-key - it_checksums = it_checksums ). - ms_data-local_checksums = it_checksums. - ENDIF. - - IF iv_url IS SUPPLIED. - lo_persistence->update_url( - iv_key = ms_data-key - iv_url = iv_url ). - ms_data-url = iv_url. - ENDIF. - - IF iv_branch_name IS SUPPLIED. - lo_persistence->update_branch_name( - iv_key = ms_data-key - iv_branch_name = iv_branch_name ). - ms_data-branch_name = iv_branch_name. - ENDIF. - - IF iv_head_branch IS SUPPLIED. - lo_persistence->update_head_branch( - iv_key = ms_data-key - iv_head_branch = iv_head_branch ). - ms_data-head_branch = iv_head_branch. - ENDIF. - - IF iv_offline IS SUPPLIED. - lo_persistence->update_offline( - iv_key = ms_data-key - iv_offline = iv_offline ). - ms_data-offline = iv_offline. - ENDIF. - - IF is_dot_abapgit IS SUPPLIED. - lo_persistence->update_dot_abapgit( - iv_key = ms_data-key - is_dot_abapgit = is_dot_abapgit ). - ms_data-dot_abapgit = is_dot_abapgit. - ENDIF. - - ENDMETHOD. - - METHOD update_local_checksums. - - " ASSUMTION: SHA1 in param is actual and correct. - " Push fills it from local files before pushing, deserialize from remote - " If this is not true that there is an error somewhere but not here - - DATA: lt_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt, - lt_files_idx TYPE zif_abapgit_definitions=>ty_file_signatures_tt, - lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - lv_chks_row TYPE i, - lv_file_row TYPE i. - - FIELD-SYMBOLS: LIKE LINE OF lt_checksums, - LIKE LINE OF -files, - LIKE LINE OF lt_local, - LIKE LINE OF it_files. - - lt_checksums = get_local_checksums( ). - lt_files_idx = it_files. - SORT lt_files_idx BY path filename. " Sort for binary search - - " Loop through current chacksum state, update sha1 for common files - LOOP AT lt_checksums ASSIGNING . - lv_chks_row = sy-tabix. - - LOOP AT -files ASSIGNING . - lv_file_row = sy-tabix. - - READ TABLE lt_files_idx ASSIGNING - WITH KEY path = -path filename = -filename - BINARY SEARCH. - CHECK sy-subrc = 0. " Missing in param table, skip - - IF -sha1 IS INITIAL. " Empty input sha1 is a deletion marker - DELETE -files INDEX lv_file_row. - ELSE. - -sha1 = -sha1. " Update sha1 - CLEAR -sha1. " Mark as processed - ENDIF. - ENDLOOP. - - IF lines( -files ) = 0. " Remove empty objects - DELETE lt_checksums INDEX lv_chks_row. - ENDIF. - ENDLOOP. - - DELETE lt_files_idx WHERE sha1 IS INITIAL. " Remove processed - IF lines( lt_files_idx ) > 0. - lt_local = get_files_local( ). - SORT lt_local BY file-path file-filename. " Sort for binary search - ENDIF. - - " Add new files - not deleted and not marked as processed above - LOOP AT lt_files_idx ASSIGNING . - - READ TABLE lt_local ASSIGNING - WITH KEY file-path = -path file-filename = -filename - BINARY SEARCH. - IF sy-subrc <> 0. -* if the deserialization fails, the local file might not be there - CONTINUE. - ENDIF. - - READ TABLE lt_checksums ASSIGNING " TODO Optimize - WITH KEY item = -item. - IF sy-subrc > 0. - APPEND INITIAL LINE TO lt_checksums ASSIGNING . - -item = -item. - ENDIF. - - APPEND TO -files. - ENDLOOP. - - SORT lt_checksums BY item. - set( it_checksums = lt_checksums ). - - ENDMETHOD. " update_local_checksums - - METHOD deserialize. - - DATA: lt_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt, - lt_requirements TYPE STANDARD TABLE OF zif_abapgit_dot_abapgit=>ty_requirement, - lx_error TYPE REF TO zcx_abapgit_exception. - - find_remote_dot_abapgit( ). - - IF get_dot_abapgit( )->get_master_language( ) <> sy-langu. - zcx_abapgit_exception=>raise( 'Current login language does not match master language' ). - ENDIF. - - lt_requirements = get_dot_abapgit( )->get_data( )-requirements. - IF lt_requirements IS NOT INITIAL. - zcl_abapgit_requirement_helper=>check_requirements( it_requirements = lt_requirements - iv_show_popup = abap_true ). - ENDIF. - - TRY. - lt_updated_files = lcl_objects=>deserialize( me ). - - CATCH zcx_abapgit_exception INTO lx_error. - - " ensure to reset default transport request task - zcl_abapgit_default_task=>get_instance( )->reset( ). - zcx_abapgit_exception=>raise( lx_error->text ). - - ENDTRY. - - APPEND get_dot_abapgit( )->get_signature( ) TO lt_updated_files. - - CLEAR: mt_local, mv_last_serialization. - - update_local_checksums( lt_updated_files ). - - ENDMETHOD. - - METHOD get_local_checksums. - rt_checksums = ms_data-local_checksums. - ENDMETHOD. - - METHOD get_local_checksums_per_file. - - FIELD-SYMBOLS LIKE LINE OF ms_data-local_checksums. - - LOOP AT ms_data-local_checksums ASSIGNING . - APPEND LINES OF -files TO rt_checksums. - ENDLOOP. - - ENDMETHOD. - - METHOD get_files_local. - - DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, - ls_item TYPE zif_abapgit_definitions=>ty_item, - lt_files TYPE zif_abapgit_definitions=>ty_files_tt, - lo_progress TYPE REF TO zcl_abapgit_progress, - lt_cache TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_file_item - WITH NON-UNIQUE KEY item. - - DATA: lt_filter TYPE SORTED TABLE OF tadir - WITH NON-UNIQUE KEY object obj_name, - lv_filter_exist TYPE abap_bool. - - FIELD-SYMBOLS: LIKE LINE OF lt_files, - LIKE LINE OF rt_files, - LIKE LINE OF lt_cache, - LIKE LINE OF lt_tadir. - - - " Serialization happened before and no refresh request - IF mv_last_serialization IS NOT INITIAL AND mv_do_local_refresh = abap_false. - rt_files = mt_local. - RETURN. - ENDIF. - - APPEND INITIAL LINE TO rt_files ASSIGNING . - -file-path = zif_abapgit_definitions=>gc_root_dir. - -file-filename = zif_abapgit_definitions=>gc_dot_abapgit. - -file-data = get_dot_abapgit( )->serialize( ). - -file-sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-blob - iv_data = -file-data ). - - lt_cache = mt_local. - lt_tadir = lcl_tadir=>read( - iv_package = get_package( ) - iv_ignore_subpackages = ignore_subpackages( ) - io_dot = get_dot_abapgit( ) - io_log = io_log ). - - lt_filter = it_filter. - lv_filter_exist = boolc( lines( lt_filter ) > 0 ). - - CREATE OBJECT lo_progress - EXPORTING - iv_total = lines( lt_tadir ). - - LOOP AT lt_tadir ASSIGNING . - IF lv_filter_exist = abap_true. - READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY object = -object - obj_name = -obj_name - BINARY SEARCH. - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - ENDIF. - - lo_progress->show( - iv_current = sy-tabix - iv_text = |Serialize { -obj_name }| ) ##NO_TEXT. - - ls_item-obj_type = -object. - ls_item-obj_name = -obj_name. - ls_item-devclass = -devclass. - - IF mv_last_serialization IS NOT INITIAL. " Try to fetch from cache - READ TABLE lt_cache TRANSPORTING NO FIELDS - WITH KEY item = ls_item. " type+name+package key - " There is something in cache and the object is unchanged - IF sy-subrc = 0 - AND abap_false = lcl_objects=>has_changed_since( - is_item = ls_item - iv_timestamp = mv_last_serialization ). - LOOP AT lt_cache ASSIGNING WHERE item = ls_item. - APPEND TO rt_files. - ENDLOOP. - - CONTINUE. - ENDIF. - ENDIF. - - lt_files = lcl_objects=>serialize( - is_item = ls_item - iv_language = get_master_language( ) - io_log = io_log ). - LOOP AT lt_files ASSIGNING . - -path = -path. - -sha1 = zcl_abapgit_hash=>sha1( - iv_type = zif_abapgit_definitions=>gc_type-blob - iv_data = -data ). - - APPEND INITIAL LINE TO rt_files ASSIGNING . - -file = . - -item = ls_item. - ENDLOOP. - ENDLOOP. - - GET TIME STAMP FIELD mv_last_serialization. - mt_local = rt_files. - mv_do_local_refresh = abap_false. " Fulfill refresh - - ENDMETHOD. - - METHOD get_dot_abapgit. - CREATE OBJECT ro_dot_abapgit - EXPORTING - is_data = ms_data-dot_abapgit. - ENDMETHOD. - - METHOD set_dot_abapgit. - set( is_dot_abapgit = io_dot_abapgit->get_data( ) ). - ENDMETHOD. - - METHOD delete. - - DATA: lo_persistence TYPE REF TO zcl_abapgit_persistence_repo. - - - CREATE OBJECT lo_persistence. - - lo_persistence->delete( ms_data-key ). - - ENDMETHOD. "delete - - METHOD is_offline. - rv_offline = ms_data-offline. - ENDMETHOD. - - METHOD set_files_remote. - - mt_remote = it_files. - - ENDMETHOD. - - METHOD refresh. - - mv_do_local_refresh = abap_true. - - IF iv_drop_cache = abap_true. - CLEAR: mv_last_serialization, mt_local. - ENDIF. - - ENDMETHOD. "refresh - - METHOD refresh_local. " For testing purposes, maybe removed later - mv_do_local_refresh = abap_true. - ENDMETHOD. "refresh_local - - METHOD get_package. - rv_package = ms_data-package. - ENDMETHOD. "get_package - - METHOD get_master_language. - rv_language = ms_data-dot_abapgit-master_language. - ENDMETHOD. - - METHOD get_key. - rv_key = ms_data-key. - ENDMETHOD. "get_key - - METHOD get_name. - - IF ms_data-offline = abap_true. - rv_name = ms_data-url. - ELSE. - rv_name = zcl_abapgit_url=>name( ms_data-url ). - rv_name = cl_http_utility=>if_http_utility~unescape_url( rv_name ). - ENDIF. - - ENDMETHOD. "get_name - - METHOD is_write_protected. - rv_yes = ms_data-write_protect. - ENDMETHOD. "is_write_protected - - METHOD ignore_subpackages. - rv_yes = ms_data-ignore_subpackages. - ENDMETHOD. - - METHOD rebuild_local_checksums. "LOCAL (BASE) - - DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - ls_last_item TYPE zif_abapgit_definitions=>ty_item, - lt_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt. - - FIELD-SYMBOLS: LIKE LINE OF lt_checksums, - LIKE LINE OF -files, - LIKE LINE OF lt_local. - - - lt_local = get_files_local( ). - - DELETE lt_local " Remove non-code related files except .abapgit - WHERE item IS INITIAL - AND NOT ( file-path = zif_abapgit_definitions=>gc_root_dir - AND file-filename = zif_abapgit_definitions=>gc_dot_abapgit ). - - SORT lt_local BY item. - - LOOP AT lt_local ASSIGNING . - IF ls_last_item <> -item OR sy-tabix = 1. " First or New item reached ? - APPEND INITIAL LINE TO lt_checksums ASSIGNING . - -item = -item. - ls_last_item = -item. - ENDIF. - - APPEND INITIAL LINE TO -files ASSIGNING . - MOVE-CORRESPONDING -file TO . - - ENDLOOP. - - set( it_checksums = lt_checksums ). - - ENDMETHOD. " rebuild_local_checksums. - -ENDCLASS. "lcl_repo IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_repo_srv IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_repo_srv IMPLEMENTATION. - - METHOD get_instance. - IF go_ref IS INITIAL. - CREATE OBJECT go_ref. - ENDIF. - rv_srv = go_ref. - ENDMETHOD. - - METHOD constructor. - CREATE OBJECT mo_persistence. - ENDMETHOD. "class_constructor - - METHOD list. - - IF mv_init = abap_false. - refresh( ). - ENDIF. - - rt_list = mt_list. - - ENDMETHOD. "list - - METHOD get. - - FIELD-SYMBOLS: LIKE LINE OF mt_list. - - - IF mv_init = abap_false. - refresh( ). - ENDIF. - - LOOP AT mt_list ASSIGNING . - IF ->get_key( ) = iv_key. - ro_repo = . - RETURN. - ENDIF. - ENDLOOP. - - zcx_abapgit_exception=>raise( 'repo not found, get' ). - - ENDMETHOD. "get - - METHOD refresh. - - DATA: lt_list TYPE zcl_abapgit_persistence_repo=>tt_repo, - lo_online TYPE REF TO lcl_repo_online, - lo_offline TYPE REF TO lcl_repo_offline. - - FIELD-SYMBOLS: LIKE LINE OF lt_list. - - - CLEAR mt_list. - - lt_list = mo_persistence->list( ). - LOOP AT lt_list ASSIGNING . - IF -offline = abap_false. - CREATE OBJECT lo_online - EXPORTING - is_data = . - APPEND lo_online TO mt_list. - ELSE. - CREATE OBJECT lo_offline - EXPORTING - is_data = . - APPEND lo_offline TO mt_list. - ENDIF. - ENDLOOP. - - mv_init = abap_true. - - ENDMETHOD. "refresh - - METHOD new_online. - - DATA: ls_repo TYPE zcl_abapgit_persistence_repo=>ty_repo, - lv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key. - - - validate_package( iv_package ). - - lv_key = mo_persistence->add( - iv_url = iv_url - iv_branch_name = iv_branch_name - iv_package = iv_package - iv_offline = abap_false - is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). - TRY. - ls_repo = mo_persistence->read( lv_key ). - CATCH zcx_abapgit_not_found. - zcx_abapgit_exception=>raise( 'new_online not found' ). - ENDTRY. - - CREATE OBJECT ro_repo - EXPORTING - is_data = ls_repo. - - add( ro_repo ). - - ENDMETHOD. "new_online - - METHOD new_offline. - - DATA: ls_repo TYPE zcl_abapgit_persistence_repo=>ty_repo, - lv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key. - - - validate_package( iv_package ). - - lv_key = mo_persistence->add( - iv_url = iv_url - iv_branch_name = '' - iv_package = iv_package - iv_offline = abap_true - is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). - - TRY. - ls_repo = mo_persistence->read( lv_key ). - CATCH zcx_abapgit_not_found. - zcx_abapgit_exception=>raise( 'new_offline not found' ). - ENDTRY. - - CREATE OBJECT ro_repo - EXPORTING - is_data = ls_repo. - - add( ro_repo ). - - ENDMETHOD. "new_offline - - METHOD add. - - DATA: lo_repo LIKE LINE OF mt_list. - - - LOOP AT mt_list INTO lo_repo. - IF lo_repo->get_key( ) = io_repo->get_key( ). - IF lo_repo = io_repo. - RETURN. - ENDIF. - zcx_abapgit_exception=>raise( 'identical keys' ). - ENDIF. - ENDLOOP. - - APPEND io_repo TO mt_list. - - ENDMETHOD. "add - - METHOD validate_package. - - DATA: ls_devclass TYPE tdevc, - lt_repos TYPE zcl_abapgit_persistence_repo=>tt_repo. - - IF iv_package IS INITIAL. - zcx_abapgit_exception=>raise( 'add, package empty' ). - ENDIF. - - IF iv_package = '$TMP'. - zcx_abapgit_exception=>raise( 'not possible to use $TMP, create new (local) package' ). - ENDIF. - - SELECT SINGLE * - FROM tdevc - INTO ls_devclass - WHERE devclass = iv_package. "#EC CI_GENBUFF - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Package { iv_package } not found| ). - ENDIF. - - IF is_sap_object_allowed( ) = abap_false AND ls_devclass-as4user = 'SAP'. - zcx_abapgit_exception=>raise( |Package { iv_package } not allowed| ). - ENDIF. - - " make sure its not already in use for a different repository - lt_repos = mo_persistence->list( ). - READ TABLE lt_repos WITH KEY package = iv_package TRANSPORTING NO FIELDS. - IF sy-subrc = 0. - zcx_abapgit_exception=>raise( |Package { iv_package } already in use| ). - ENDIF. - - ENDMETHOD. "validate_package - - METHOD delete. - - io_repo->delete( ). - - DELETE TABLE mt_list FROM io_repo. - ASSERT sy-subrc = 0. - - ENDMETHOD. "delete - - METHOD is_repo_installed. - - DATA: lt_repo TYPE lcl_repo_srv=>ty_repo_tt, - lo_repo TYPE REF TO lcl_repo, - lv_url TYPE string, - lv_package TYPE devclass, - lo_repo_online TYPE REF TO lcl_repo_online, - lv_err TYPE string. - - lt_repo = list( ). - - LOOP AT lt_repo INTO lo_repo. - CHECK lo_repo->is_offline( ) = abap_false. - lo_repo_online ?= lo_repo. - - lv_url = lo_repo_online->get_url( ). - lv_package = lo_repo_online->get_package( ). - CHECK to_upper( lv_url ) = to_upper( iv_url ). - - " Validate bindings - "TODO refactor: move this message out of this method - IF iv_target_package IS NOT INITIAL AND iv_target_package <> lv_package. - lv_err = |Installation to package { lv_package } detected. | - && |Cancelling installation|. - zcx_abapgit_exception=>raise( lv_err ). - ENDIF. - - rv_installed = abap_true. - EXIT. - ENDLOOP. - - ENDMETHOD. "is_repo_installed - - METHOD switch_repo_type. - - DATA lo_repo TYPE REF TO lcl_repo. - - FIELD-SYMBOLS LIKE LINE OF mt_list. - - lo_repo = get( iv_key ). - READ TABLE mt_list ASSIGNING FROM lo_repo. - ASSERT sy-subrc IS INITIAL. - ASSERT iv_offline <> lo_repo->ms_data-offline. - - IF iv_offline = abap_true. " On-line -> OFFline - lo_repo->set( - iv_url = zcl_abapgit_url=>name( lo_repo->ms_data-url ) - iv_branch_name = '' - iv_sha1 = '' - iv_head_branch = '' - iv_offline = abap_true ). - CREATE OBJECT TYPE lcl_repo_offline - EXPORTING - is_data = lo_repo->ms_data. - ELSE. " OFFline -> On-line - lo_repo->set( iv_offline = abap_false ). - CREATE OBJECT TYPE lcl_repo_online - EXPORTING - is_data = lo_repo->ms_data. - ENDIF. - - ENDMETHOD. "switch_repo_type - - METHOD is_sap_object_allowed. - - rv_allowed = cl_enh_badi_def_utility=>is_sap_system( ). - IF rv_allowed = abap_true. - RETURN. - ENDIF. - - rv_allowed = zcl_abapgit_exit=>get_instance( )->allow_sap_objects( ). - - ENDMETHOD. - -ENDCLASS. "lcl_repo_srv IMPLEMENTATION diff --git a/src/zabapgit_repo_impl.prog.xml b/src/zabapgit_repo_impl.prog.xml deleted file mode 100644 index eb737a7ba..000000000 --- a/src/zabapgit_repo_impl.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_REPO_IMPL - A - X - I - E - X - - - - R - Include ZABAPGIT_REPO_IMPL - 26 - - - - - diff --git a/src/zabapgit_services_abapgit.prog.abap b/src/zabapgit_services_abapgit.prog.abap index 32e578a5e..453c0cf65 100644 --- a/src/zabapgit_services_abapgit.prog.abap +++ b/src/zabapgit_services_abapgit.prog.abap @@ -78,7 +78,7 @@ CLASS lcl_services_abapgit IMPLEMENTATION. IF is_installed( ) = abap_true. lv_text = 'Seems like abapGit package is already installed. No changes to be done'. - lcl_popups=>popup_to_inform( + zcl_abapgit_popups=>popup_to_inform( titlebar = lc_title text_message = lv_text ). RETURN. @@ -100,7 +100,7 @@ CLASS lcl_services_abapgit IMPLEMENTATION. IF is_installed_pi( ) = abap_true. lv_text = 'Seems like abapGit plugins package is already installed. No changes to be done'. - lcl_popups=>popup_to_inform( + zcl_abapgit_popups=>popup_to_inform( titlebar = lc_title text_message = lv_text ). RETURN. @@ -118,10 +118,11 @@ CLASS lcl_services_abapgit IMPLEMENTATION. METHOD do_install. - DATA lo_repo TYPE REF TO lcl_repo_online. - DATA lv_answer TYPE c LENGTH 1. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, + lv_answer TYPE c LENGTH 1. - lv_answer = lcl_popups=>popup_to_confirm( + + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = iv_title text_question = iv_text text_button_1 = 'Continue' @@ -133,13 +134,13 @@ CLASS lcl_services_abapgit IMPLEMENTATION. RETURN. ENDIF. - IF abap_false = lcl_repo_srv=>get_instance( )->is_repo_installed( + IF abap_false = zcl_abapgit_repo_srv=>get_instance( )->is_repo_installed( iv_url = iv_url iv_target_package = iv_package ). zcl_abapgit_sap_package=>create_local( iv_package ). - lo_repo = lcl_repo_srv=>get_instance( )->new_online( + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->new_online( iv_url = iv_url iv_branch_name = 'refs/heads/master' iv_package = iv_package ) ##NO_TEXT. @@ -159,7 +160,7 @@ CLASS lcl_services_abapgit IMPLEMENTATION. METHOD is_installed. TRY. - rv_installed = lcl_repo_srv=>get_instance( )->is_repo_installed( c_abapgit_url ). + rv_installed = zcl_abapgit_repo_srv=>get_instance( )->is_repo_installed( c_abapgit_url ). " TODO, alternative checks for presence in the system CATCH zcx_abapgit_exception. " cannot be installed anyway in this case, e.g. no connection @@ -171,7 +172,7 @@ CLASS lcl_services_abapgit IMPLEMENTATION. METHOD is_installed_pi. TRY. - rv_installed = lcl_repo_srv=>get_instance( )->is_repo_installed( c_plugins_url ). + rv_installed = zcl_abapgit_repo_srv=>get_instance( )->is_repo_installed( c_plugins_url ). " TODO, alternative checks for presence in the system CATCH zcx_abapgit_exception. " cannot be installed anyway in this case, e.g. no connection diff --git a/src/zabapgit_services_db.prog.abap b/src/zabapgit_services_db.prog.abap index 3ac4b1cdf..604730565 100644 --- a/src/zabapgit_services_db.prog.abap +++ b/src/zabapgit_services_db.prog.abap @@ -24,7 +24,7 @@ CLASS lcl_services_db IMPLEMENTATION. ASSERT is_key-type IS NOT INITIAL. ASSERT is_key-value IS NOT INITIAL. - lv_answer = lcl_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = 'Warning' text_question = 'Delete?' text_button_1 = 'Ok' diff --git a/src/zabapgit_services_git.prog.abap b/src/zabapgit_services_git.prog.abap index 6dc0d16af..9c1894ab8 100644 --- a/src/zabapgit_services_git.prog.abap +++ b/src/zabapgit_services_git.prog.abap @@ -52,7 +52,7 @@ CLASS lcl_services_git DEFINITION FINAL. RAISING zcx_abapgit_exception zcx_abapgit_cancel. CLASS-METHODS commit - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online is_commit TYPE ty_commit_fields io_stage TYPE REF TO zcl_abapgit_stage RAISING zcx_abapgit_exception zcx_abapgit_cancel. @@ -63,19 +63,19 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD reset. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, lv_answer TYPE c LENGTH 1, lt_unnecessary_local_objs TYPE zif_abapgit_definitions=>ty_tadir_tt, lt_selected LIKE lt_unnecessary_local_objs, lt_columns TYPE stringtab. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). IF lo_repo->is_write_protected( ) = abap_true. zcx_abapgit_exception=>raise( 'Cannot reset. Local code is write-protected by repo config' ). ENDIF. - lv_answer = lcl_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = 'Warning' text_question = 'Reset local objects?' text_button_1 = 'Ok' @@ -96,7 +96,7 @@ CLASS lcl_services_git IMPLEMENTATION. INSERT `OBJECT` INTO TABLE lt_columns. INSERT `OBJ_NAME` INTO TABLE lt_columns. - lcl_popups=>popup_to_select_from_list( + zcl_abapgit_popups=>popup_to_select_from_list( EXPORTING it_list = lt_unnecessary_local_objs i_header_text = |Which unnecessary objects should be deleted?| @@ -106,9 +106,7 @@ CLASS lcl_services_git IMPLEMENTATION. et_list = lt_selected ). IF lines( lt_selected ) > 0. - - lcl_objects=>delete( lt_selected ). - + zcl_abapgit_objects=>delete( lt_selected ). ENDIF. ENDIF. @@ -121,12 +119,12 @@ CLASS lcl_services_git IMPLEMENTATION. DATA: lv_name TYPE string, lv_cancel TYPE abap_bool, - lo_repo TYPE REF TO lcl_repo_online. + lo_repo TYPE REF TO zcl_abapgit_repo_online. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - lcl_popups=>create_branch_popup( + zcl_abapgit_popups=>create_branch_popup( IMPORTING ev_name = lv_name ev_cancel = lv_cancel ). @@ -136,7 +134,7 @@ CLASS lcl_services_git IMPLEMENTATION. ASSERT lv_name CP 'refs/heads/+*'. - lcl_git_porcelain=>create_branch( + zcl_abapgit_git_porcelain=>create_branch( io_repo = lo_repo iv_name = lv_name iv_from = lo_repo->get_sha1_local( ) ). @@ -150,9 +148,9 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD pull. - DATA: lo_repo TYPE REF TO lcl_repo_online. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). IF lo_repo->is_write_protected( ) = abap_true. zcx_abapgit_exception=>raise( 'Cannot pull. Local code is write-protected by repo config' ). @@ -167,13 +165,13 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD switch_branch. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, ls_branch TYPE zcl_abapgit_git_branch_list=>ty_git_branch. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_branch = lcl_popups=>branch_list_popup( + ls_branch = zcl_abapgit_popups=>branch_list_popup( iv_url = lo_repo->get_url( ) iv_default_branch = lo_repo->get_branch_name( ) iv_show_new_option = abap_true ). @@ -181,7 +179,7 @@ CLASS lcl_services_git IMPLEMENTATION. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - IF ls_branch-name = lcl_popups=>c_new_branch_label. + IF ls_branch-name = zcl_abapgit_popups=>c_new_branch_label. create_branch( iv_key ). RETURN. ENDIF. @@ -196,13 +194,13 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD delete_branch. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, ls_branch TYPE zcl_abapgit_git_branch_list=>ty_git_branch. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_branch = lcl_popups=>branch_list_popup( lo_repo->get_url( ) ). + ls_branch = zcl_abapgit_popups=>branch_list_popup( lo_repo->get_url( ) ). IF ls_branch IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -213,7 +211,7 @@ CLASS lcl_services_git IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Switch branch before deleting current' ). ENDIF. - lcl_git_porcelain=>delete_branch( + zcl_abapgit_git_porcelain=>delete_branch( io_repo = lo_repo is_branch = ls_branch ). @@ -235,12 +233,12 @@ CLASS lcl_services_git IMPLEMENTATION. lv_cancel TYPE abap_bool, lx_error TYPE REF TO zcx_abapgit_exception, lv_text TYPE string, - lo_repo TYPE REF TO lcl_repo_online, + lo_repo TYPE REF TO zcl_abapgit_repo_online, lv_sha1 TYPE zif_abapgit_definitions=>ty_sha1. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - lcl_popups=>create_tag_popup( + zcl_abapgit_popups=>create_tag_popup( EXPORTING iv_sha1 = lo_repo->get_sha1_local( ) IMPORTING @@ -255,7 +253,7 @@ CLASS lcl_services_git IMPLEMENTATION. ASSERT lv_name CP 'refs/tags/+*'. TRY. - lcl_git_porcelain=>create_tag( io_repo = lo_repo + zcl_abapgit_git_porcelain=>create_tag( io_repo = lo_repo iv_name = lv_name iv_from = lv_sha1 ). @@ -271,18 +269,18 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD delete_tag. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, ls_tag TYPE zcl_abapgit_git_branch_list=>ty_git_branch, lv_text TYPE string. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_tag = lcl_popups=>tag_list_popup( lo_repo->get_url( ) ). + ls_tag = zcl_abapgit_popups=>tag_list_popup( lo_repo->get_url( ) ). IF ls_tag IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lcl_git_porcelain=>delete_tag( + zcl_abapgit_git_porcelain=>delete_tag( io_repo = lo_repo is_tag = ls_tag ). @@ -294,13 +292,13 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD switch_tag. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, ls_tag TYPE zcl_abapgit_git_branch_list=>ty_git_branch, lv_text TYPE string. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_tag = lcl_popups=>tag_list_popup( lo_repo->get_url( ) ). + ls_tag = zcl_abapgit_popups=>tag_list_popup( lo_repo->get_url( ) ). IF ls_tag IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -315,11 +313,11 @@ CLASS lcl_services_git IMPLEMENTATION. METHOD tag_overview. - DATA: lo_repo TYPE REF TO lcl_repo_online. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - lcl_popups=>tag_list_popup( iv_url = lo_repo->get_url( ) + zcl_abapgit_popups=>tag_list_popup( iv_url = lo_repo->get_url( ) iv_select_mode = abap_false ). ENDMETHOD. diff --git a/src/zabapgit_services_repo.prog.abap b/src/zabapgit_services_repo.prog.abap index 57c7c9ef5..821bacf94 100644 --- a/src/zabapgit_services_repo.prog.abap +++ b/src/zabapgit_services_repo.prog.abap @@ -57,16 +57,16 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD clone. - DATA: lo_repo TYPE REF TO lcl_repo_online, - ls_popup TYPE lcl_popups=>ty_popup. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, + ls_popup TYPE zcl_abapgit_popups=>ty_popup. - ls_popup = lcl_popups=>repo_popup( iv_url ). + ls_popup = zcl_abapgit_popups=>repo_popup( iv_url ). IF ls_popup-cancel = abap_true. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lo_repo = lcl_repo_srv=>get_instance( )->new_online( + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->new_online( iv_url = ls_popup-url iv_branch_name = ls_popup-branch_name iv_package = ls_popup-package ). @@ -86,24 +86,24 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD refresh. - lcl_repo_srv=>get_instance( )->get( iv_key )->refresh( ). + zcl_abapgit_repo_srv=>get_instance( )->get( iv_key )->refresh( ). ENDMETHOD. "refresh METHOD remove. DATA: lv_answer TYPE c LENGTH 1, - lo_repo TYPE REF TO lcl_repo, + lo_repo TYPE REF TO zcl_abapgit_repo, lv_package TYPE devclass, lv_question TYPE c LENGTH 200. - lo_repo = lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lv_package = lo_repo->get_package( ). lv_question = |This will remove the repository reference to the package { lv_package }| && '. All objects will safely remain in the system.'. - lv_answer = lcl_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = 'Remove' text_question = lv_question text_button_1 = 'Remove' @@ -117,7 +117,7 @@ CLASS lcl_services_repo IMPLEMENTATION. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lcl_repo_srv=>get_instance( )->delete( lo_repo ). + zcl_abapgit_repo_srv=>get_instance( )->delete( lo_repo ). COMMIT WORK. @@ -127,26 +127,26 @@ CLASS lcl_services_repo IMPLEMENTATION. DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, lv_answer TYPE c LENGTH 1, - lo_repo TYPE REF TO lcl_repo, + lo_repo TYPE REF TO zcl_abapgit_repo, lv_package TYPE devclass, lv_question TYPE c LENGTH 100. - lo_repo = lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). IF lo_repo->is_write_protected( ) = abap_true. zcx_abapgit_exception=>raise( 'Cannot purge. Local code is write-protected by repo config' ). ENDIF. lv_package = lo_repo->get_package( ). - lt_tadir = lcl_tadir=>read( lv_package ). + lt_tadir = zcl_abapgit_tadir=>read( lv_package ). IF lines( lt_tadir ) > 0. lv_question = |This will DELETE all objects in package { lv_package }| && | ({ lines( lt_tadir ) } objects) from the system|. "#EC NOTEXT - lv_answer = lcl_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = 'Uninstall' text_question = lv_question text_button_1 = 'Delete' @@ -160,11 +160,11 @@ CLASS lcl_services_repo IMPLEMENTATION. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lcl_objects=>delete( lt_tadir ). + zcl_abapgit_objects=>delete( lt_tadir ). ENDIF. - lcl_repo_srv=>get_instance( )->delete( lo_repo ). + zcl_abapgit_repo_srv=>get_instance( )->delete( lo_repo ). COMMIT WORK. @@ -172,15 +172,15 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD new_offline. - DATA: lo_repo TYPE REF TO lcl_repo, - ls_popup TYPE lcl_popups=>ty_popup. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo, + ls_popup TYPE zcl_abapgit_popups=>ty_popup. - ls_popup = lcl_popups=>repo_new_offline( ). + ls_popup = zcl_abapgit_popups=>repo_new_offline( ). IF ls_popup-cancel = abap_true. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lo_repo = lcl_repo_srv=>get_instance( )->new_offline( + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->new_offline( iv_url = ls_popup-url iv_package = ls_popup-package ). @@ -195,7 +195,7 @@ CLASS lcl_services_repo IMPLEMENTATION. DATA: lv_answer TYPE c LENGTH 1. - lv_answer = lcl_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = 'Make repository OFF-line' text_question = 'This will detach the repo from remote and make it OFF-line' text_button_1 = 'Make OFF-line' @@ -209,7 +209,7 @@ CLASS lcl_services_repo IMPLEMENTATION. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lcl_repo_srv=>get_instance( )->switch_repo_type( iv_key = iv_key iv_offline = abap_true ). + zcl_abapgit_repo_srv=>get_instance( )->switch_repo_type( iv_key = iv_key iv_offline = abap_true ). COMMIT WORK. @@ -218,21 +218,21 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD remote_attach. - DATA: ls_popup TYPE lcl_popups=>ty_popup, - lo_repo TYPE REF TO lcl_repo_online. + DATA: ls_popup TYPE zcl_abapgit_popups=>ty_popup, + lo_repo TYPE REF TO zcl_abapgit_repo_online. - ls_popup = lcl_popups=>repo_popup( + ls_popup = zcl_abapgit_popups=>repo_popup( iv_title = 'Attach repo to remote ...' iv_url = '' - iv_package = lcl_repo_srv=>get_instance( )->get( iv_key )->get_package( ) + iv_package = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key )->get_package( ) iv_freeze_package = abap_true ). IF ls_popup-cancel = abap_true. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lcl_repo_srv=>get_instance( )->switch_repo_type( iv_key = iv_key iv_offline = abap_false ). + zcl_abapgit_repo_srv=>get_instance( )->switch_repo_type( iv_key = iv_key iv_offline = abap_false ). - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lo_repo->set_url( ls_popup-url ). lo_repo->set_branch_name( ls_popup-branch_name ). @@ -242,12 +242,12 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD remote_change. - DATA: ls_popup TYPE lcl_popups=>ty_popup, - lo_repo TYPE REF TO lcl_repo_online. + DATA: ls_popup TYPE zcl_abapgit_popups=>ty_popup, + lo_repo TYPE REF TO zcl_abapgit_repo_online. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - ls_popup = lcl_popups=>repo_popup( + ls_popup = zcl_abapgit_popups=>repo_popup( iv_title = 'Change repo remote ...' iv_url = lo_repo->get_url( ) iv_package = lo_repo->get_package( ) @@ -256,7 +256,7 @@ CLASS lcl_services_repo IMPLEMENTATION. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lo_repo->set_new_remote( iv_url = ls_popup-url iv_branch_name = ls_popup-branch_name ). @@ -268,10 +268,10 @@ CLASS lcl_services_repo IMPLEMENTATION. DATA: lv_answer TYPE c, lv_question TYPE string, - lo_repo TYPE REF TO lcl_repo. + lo_repo TYPE REF TO zcl_abapgit_repo. - lo_repo = lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lv_question = 'This will rebuild and overwrite local repo checksums.'. @@ -284,7 +284,7 @@ CLASS lcl_services_repo IMPLEMENTATION. && ' Please make sure you don''t have ones like that.'. ENDIF. - lv_answer = lcl_popups=>popup_to_confirm( + lv_answer = zcl_abapgit_popups=>popup_to_confirm( titlebar = 'Warning' text_question = lv_question text_button_1 = 'OK' @@ -322,21 +322,21 @@ CLASS lcl_services_repo IMPLEMENTATION. METHOD transport_to_branch. DATA: - lo_repository TYPE REF TO lcl_repo_online, + lo_repository TYPE REF TO zcl_abapgit_repo_online, lo_transport_to_branch TYPE REF TO lcl_transport_2_branch, lt_transport_headers TYPE trwbo_request_headers, lt_transport_objects TYPE scts_tadir, ls_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch. - lo_repository ?= lcl_repo_srv=>get_instance( )->get( iv_repository_key ). + lo_repository ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_repository_key ). - lt_transport_headers = lcl_popups=>popup_to_select_transports( ). + lt_transport_headers = zcl_abapgit_popups=>popup_to_select_transports( ). lt_transport_objects = lcl_transport=>to_tadir( lt_transport_headers ). IF lt_transport_objects IS INITIAL. zcx_abapgit_exception=>raise( 'Canceled or List of objects is empty ' ). ENDIF. - ls_transport_to_branch = lcl_popups=>popup_to_create_transp_branch( + ls_transport_to_branch = zcl_abapgit_popups=>popup_to_create_transp_branch( lt_transport_headers ). CREATE OBJECT lo_transport_to_branch. diff --git a/src/zabapgit_stage_logic.prog.xml b/src/zabapgit_stage_logic.prog.xml deleted file mode 100644 index a39f3eb56..000000000 --- a/src/zabapgit_stage_logic.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_STAGE_LOGIC - A - X - I - E - X - - - - R - Include ZABAPGIT_STAGE_LOGIC - 28 - - - - - diff --git a/src/zabapgit_tadir.prog.xml b/src/zabapgit_tadir.prog.xml deleted file mode 100644 index 54f70dd51..000000000 --- a/src/zabapgit_tadir.prog.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ZABAPGIT_TADIR - A - X - I - E - X - - - - R - Include ZABAPGIT_TADIR - 22 - - - - - diff --git a/src/zabapgit_transport.prog.abap b/src/zabapgit_transport.prog.abap index fcf79764d..c42b68571 100644 --- a/src/zabapgit_transport.prog.abap +++ b/src/zabapgit_transport.prog.abap @@ -29,15 +29,16 @@ ENDCLASS. CLASS lcl_transport IMPLEMENTATION. METHOD zip. + DATA: lt_requests TYPE trwbo_requests, lt_tadir TYPE scts_tadir, lv_package TYPE devclass, ls_data TYPE zcl_abapgit_persistence_repo=>ty_repo, - lo_repo TYPE REF TO lcl_repo_offline, + lo_repo TYPE REF TO zcl_abapgit_repo_offline, lt_trkorr TYPE trwbo_request_headers. - lt_trkorr = lcl_popups=>popup_to_select_transports( ). + lt_trkorr = zcl_abapgit_popups=>popup_to_select_transports( ). IF lines( lt_trkorr ) = 0. RETURN. ENDIF. @@ -162,7 +163,7 @@ CLASS lcl_transport IMPLEMENTATION. lv_obj_name = -obj_name. ENDIF. - ls_tadir = lcl_tadir=>read_single( + ls_tadir = zcl_abapgit_tadir=>read_single( iv_object = lv_object iv_obj_name = lv_obj_name ). @@ -180,7 +181,7 @@ CLASS lcl_transport_2_branch DEFINITION. PUBLIC SECTION. METHODS: create - IMPORTING io_repository TYPE REF TO lcl_repo_online + IMPORTING io_repository TYPE REF TO zcl_abapgit_repo_online is_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch it_transport_objects TYPE scts_tadir RAISING zcx_abapgit_exception. @@ -188,7 +189,7 @@ CLASS lcl_transport_2_branch DEFINITION. METHODS create_new_branch IMPORTING - io_repository TYPE REF TO lcl_repo_online + io_repository TYPE REF TO zcl_abapgit_repo_online iv_branch_name TYPE string RAISING zcx_abapgit_exception. @@ -229,7 +230,7 @@ CLASS lcl_transport_2_branch IMPLEMENTATION. iv_branch_name = lv_branch_name iv_branch_sha1 = io_repository->get_sha1_remote( ). - ls_stage_objects = lcl_stage_logic=>get( io_repository ). + ls_stage_objects = zcl_abapgit_stage_logic=>get( io_repository ). lt_object_statuses = io_repository->status( ). @@ -248,7 +249,7 @@ CLASS lcl_transport_2_branch IMPLEMENTATION. METHOD create_new_branch. ASSERT iv_branch_name CP 'refs/heads/+*'. TRY. - lcl_git_porcelain=>create_branch( + zcl_abapgit_git_porcelain=>create_branch( io_repo = io_repository iv_name = iv_branch_name iv_from = io_repository->get_sha1_local( ) ). diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 8c00415fc..c5c9f7fb9 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -2,46 +2,9 @@ *& Include ZABAPGIT_UNIT_TEST *&---------------------------------------------------------------------* -DEFINE _append_local. - APPEND INITIAL LINE TO lt_local ASSIGNING . - -item-obj_type = &1. - -item-obj_name = &2. - -item-devclass = '$Z$'. - -file-path = '/'. - -file-filename = &3. - -file-sha1 = &4. -END-OF-DEFINITION. - -DEFINE _append_remote. - APPEND INITIAL LINE TO lt_remote ASSIGNING . - -path = '/'. - -filename = &1. - -sha1 = &2. -END-OF-DEFINITION. - -DEFINE _append_state. - APPEND INITIAL LINE TO lt_state ASSIGNING . - -path = '/'. - -filename = &1. - -sha1 = &2. -END-OF-DEFINITION. - -DEFINE _append_result. - APPEND INITIAL LINE TO lt_results ASSIGNING . - -obj_type = &1. - -obj_name = &2. - -match = &3. - -lstate = &4. - -rstate = &5. - -package = &6. - -path = &7. - -filename = &8. -END-OF-DEFINITION. - * todo, should the tests be in the same include as the classes * they are testing? - CLASS ltcl_critical_tests DEFINITION FINAL FOR TESTING. PUBLIC SECTION. CLASS-METHODS: @@ -102,11 +65,11 @@ CLASS ltcl_dangerous IMPLEMENTATION. METHOD run. - DATA: lo_repo TYPE REF TO lcl_repo_online, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, lv_msg TYPE string, lt_results TYPE zif_abapgit_definitions=>ty_results_tt, - lt_types TYPE lcl_objects=>ty_types_tt. + lt_types TYPE zcl_abapgit_objects=>ty_types_tt. FIELD-SYMBOLS: LIKE LINE OF lt_results, LIKE LINE OF lt_tadir, @@ -115,16 +78,16 @@ CLASS ltcl_dangerous IMPLEMENTATION. zcl_abapgit_sap_package=>create_local( c_package ). - lt_types = lcl_objects=>supported_list( ). + lt_types = zcl_abapgit_objects=>supported_list( ). - lo_repo = lcl_repo_srv=>get_instance( )->new_online( + lo_repo = zcl_abapgit_repo_srv=>get_instance( )->new_online( iv_url = 'https://github.com/larshp/abapGit-Unit-Test.git' iv_branch_name = 'refs/heads/master' iv_package = c_package ). lo_repo->status( ). lo_repo->deserialize( ). - lt_tadir = lcl_tadir=>read( c_package ). + lt_tadir = zcl_abapgit_tadir=>read( c_package ). LOOP AT lt_types ASSIGNING . READ TABLE lt_tadir WITH KEY object = TRANSPORTING NO FIELDS. IF sy-subrc <> 0. @@ -144,8 +107,8 @@ CLASS ltcl_dangerous IMPLEMENTATION. quit = if_aunit_constants=>no ). ENDLOOP. - lcl_objects=>delete( lt_tadir ). - lt_tadir = lcl_tadir=>read( c_package ). + zcl_abapgit_objects=>delete( lt_tadir ). + lt_tadir = zcl_abapgit_tadir=>read( c_package ). LOOP AT lt_tadir ASSIGNING . lv_msg = |Not deleted properly { -object } { -obj_name }|. cl_abap_unit_assert=>fail( @@ -153,7 +116,7 @@ CLASS ltcl_dangerous IMPLEMENTATION. quit = if_aunit_constants=>no ). ENDLOOP. - lcl_repo_srv=>get_instance( )->delete( lo_repo ). + zcl_abapgit_repo_srv=>get_instance( )->delete( lo_repo ). COMMIT WORK. @@ -161,157 +124,6 @@ CLASS ltcl_dangerous IMPLEMENTATION. ENDCLASS. "ltcl_dangerous IMPLEMENTATION -CLASS ltcl_git_porcelain DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL. - - PRIVATE SECTION. - METHODS: - setup, - append - IMPORTING iv_path TYPE string - iv_name TYPE string, - single_file FOR TESTING - RAISING zcx_abapgit_exception, - two_files_same_path FOR TESTING - RAISING zcx_abapgit_exception, - root_empty FOR TESTING - RAISING zcx_abapgit_exception, - namespaces FOR TESTING - RAISING zcx_abapgit_exception, - more_sub FOR TESTING - RAISING zcx_abapgit_exception, - sub FOR TESTING - RAISING zcx_abapgit_exception. - - DATA: mt_expanded TYPE lcl_git_porcelain=>ty_expanded_tt, - mt_trees TYPE lcl_git_porcelain=>ty_trees_tt. - -ENDCLASS. - -CLASS ltcl_git_porcelain IMPLEMENTATION. - - METHOD setup. - CLEAR mt_expanded. - CLEAR mt_trees. - ENDMETHOD. - - METHOD append. - - FIELD-SYMBOLS: LIKE LINE OF mt_expanded. - - - APPEND INITIAL LINE TO mt_expanded ASSIGNING . - -path = iv_path. - -name = iv_name. - -sha1 = 'a'. - -chmod = zif_abapgit_definitions=>gc_chmod-file. - - ENDMETHOD. - - METHOD single_file. - - append( iv_path = '/' - iv_name = 'foobar.txt' ). - - mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). - - cl_abap_unit_assert=>assert_equals( - act = lines( mt_trees ) - exp = 1 ). - - ENDMETHOD. - - METHOD two_files_same_path. - - append( iv_path = '/' - iv_name = 'foo.txt' ). - - append( iv_path = '/' - iv_name = 'bar.txt' ). - - mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). - - cl_abap_unit_assert=>assert_equals( - act = lines( mt_trees ) - exp = 1 ). - - ENDMETHOD. - - METHOD sub. - - append( iv_path = '/' - iv_name = 'foo.txt' ). - - append( iv_path = '/sub/' - iv_name = 'bar.txt' ). - - mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). - - cl_abap_unit_assert=>assert_equals( - act = lines( mt_trees ) - exp = 2 ). - - ENDMETHOD. - - METHOD more_sub. - - FIELD-SYMBOLS: LIKE LINE OF mt_trees. - - append( iv_path = '/src/foo_a/foo_a1/' - iv_name = 'a1.txt' ). - - append( iv_path = '/src/foo_a/foo_a2/' - iv_name = 'a2.txt' ). - - mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). - - cl_abap_unit_assert=>assert_equals( - act = lines( mt_trees ) - exp = 5 ). - - LOOP AT mt_trees ASSIGNING . - cl_abap_unit_assert=>assert_not_initial( -data ). - ENDLOOP. - - ENDMETHOD. - - METHOD namespaces. - - FIELD-SYMBOLS: LIKE LINE OF mt_trees. - - append( iv_path = '/src/#foo#a/#foo#a1/' - iv_name = 'a1.txt' ). - - append( iv_path = '/src/#foo#a/#foo#a2/' - iv_name = 'a2.txt' ). - - mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). - - cl_abap_unit_assert=>assert_equals( - act = lines( mt_trees ) - exp = 5 ). - - LOOP AT mt_trees ASSIGNING . - cl_abap_unit_assert=>assert_not_initial( -data ). - ENDLOOP. - - ENDMETHOD. - - METHOD root_empty. - - append( iv_path = '/sub/' - iv_name = 'bar.txt' ). - - mt_trees = lcl_git_porcelain=>build_trees( mt_expanded ). - -* so 2 total trees are expected: '/' and '/sub/' - cl_abap_unit_assert=>assert_equals( - act = lines( mt_trees ) - exp = 2 ). - - ENDMETHOD. - -ENDCLASS. - *----------------------------------------------------------------------* * CLASS ltcl_object_types DEFINITION *----------------------------------------------------------------------* @@ -337,18 +149,18 @@ CLASS ltcl_object_types IMPLEMENTATION. DATA: ls_item TYPE zif_abapgit_definitions=>ty_item, lv_supported TYPE abap_bool, - lt_types TYPE lcl_objects=>ty_types_tt. + lt_types TYPE zcl_abapgit_objects=>ty_types_tt. FIELD-SYMBOLS: LIKE LINE OF lt_types. - lt_types = lcl_objects=>supported_list( ). + lt_types = zcl_abapgit_objects=>supported_list( ). LOOP AT lt_types ASSIGNING . CLEAR ls_item. ls_item-obj_type = . - lv_supported = lcl_objects=>is_supported( ls_item ). + lv_supported = zcl_abapgit_objects=>is_supported( ls_item ). cl_abap_unit_assert=>assert_equals( act = lv_supported @@ -363,18 +175,18 @@ CLASS ltcl_object_types IMPLEMENTATION. DATA: ls_item TYPE zif_abapgit_definitions=>ty_item, lv_exists TYPE abap_bool, - lt_types TYPE lcl_objects=>ty_types_tt. + lt_types TYPE zcl_abapgit_objects=>ty_types_tt. FIELD-SYMBOLS: LIKE LINE OF lt_types. - lt_types = lcl_objects=>supported_list( ). + lt_types = zcl_abapgit_objects=>supported_list( ). LOOP AT lt_types ASSIGNING . CLEAR ls_item. ls_item-obj_name = 'ZABAPGIT_FOOBAR'. ls_item-obj_type = . - lv_exists = lcl_objects=>exists( ls_item ). + lv_exists = zcl_abapgit_objects=>exists( ls_item ). cl_abap_unit_assert=>assert_equals( act = lv_exists @@ -583,7 +395,7 @@ CLASS ltcl_serialize IMPLEMENTATION. DATA: lt_files TYPE zif_abapgit_definitions=>ty_files_tt. - lt_files = lcl_objects=>serialize( is_item = is_item + lt_files = zcl_abapgit_objects=>serialize( is_item = is_item iv_language = zif_abapgit_definitions=>gc_english ). cl_abap_unit_assert=>assert_not_initial( lt_files ). @@ -592,232 +404,6 @@ CLASS ltcl_serialize IMPLEMENTATION. ENDCLASS. "ltcl_serialize IMPLEMENTATION -CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT FINAL - INHERITING FROM cl_aunit_assert. - - PUBLIC SECTION. - METHODS calculate_status FOR TESTING - RAISING zcx_abapgit_exception. - -ENDCLASS. "ltcl_file_status - -CLASS ltcl_file_status IMPLEMENTATION. - - METHOD calculate_status. - - DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, - lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, - lt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt, - lt_results TYPE zif_abapgit_definitions=>ty_results_tt, - lt_results_exp TYPE zif_abapgit_definitions=>ty_results_tt, - lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. - - FIELD-SYMBOLS: LIKE LINE OF lt_local, - LIKE LINE OF lt_remote, - LIKE LINE OF lt_results, - LIKE LINE OF lt_state. - - "STATE FILE SHA1 - _append_state '$$zclass1.clas.xml' 'C1_F1'. - " class1 testclasses is new locally, abap is new remotely - " class2 is completely new remotely - _append_state '$$zdoma1.doma.xml' 'D1'. - _append_state '$$zdoma2.doma.xml' 'D2'. - _append_state '$$zdoma3.doma.xml' 'D3'. - " doma4 is new locally - " doma5 is new remotely - _append_state '$$zdoma6.doma.xml' 'D6'. - " doma7 is not in state - emulate brocken cache - " doma8 is not in state - emulate brocken cache - _append_state '$$zdoma9.doma.xml' 'D9'. - _append_state 'num01.doma.xml' 'NUM01'. " another from different package - _append_state 'xfeld.doma.xml' 'XFELD'. " from different package - - "LOCAL TYPE NAME FILE SHA1 - _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.testclasses.abap' 'C1_F3'. - _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.xml' 'C1_F1'. - _append_local 'DOMA' '$$ZDOMA1' '$$zdoma1.doma.xml' 'D1'. - _append_local 'DOMA' '$$ZDOMA2' '$$zdoma2.doma.xml' 'D2_CHANGED_L'. - _append_local 'DOMA' '$$ZDOMA3' '$$zdoma3.doma.xml' 'D3'. - _append_local 'DOMA' '$$ZDOMA4' '$$zdoma4.doma.xml' 'D4'. - _append_local 'DOMA' '$$ZDOMA6' '$$zdoma6.doma.xml' 'D6_CHANGED_L'. - _append_local 'DOMA' '$$ZDOMA7' '$$zdoma7.doma.xml' 'D7'. - _append_local 'DOMA' '$$ZDOMA8' '$$zdoma8.doma.xml' 'D8'. - " dome9 was deleted from local system. Can be found by existing state - - "REMOTE FILE SHA1 - _append_remote 'textfile.txt' 'T1'. - _append_remote '$$zclass1.clas.abap' 'C1_F2'. " Must be before xml for tougher test - _append_remote '$$zclass1.clas.xml' 'C1_F1'. - _append_remote '$$zclass2.clas.abap' 'C1_F2'. " Must be before xml for tougher test - _append_remote '$$zclass2.clas.xml' 'C1_F1'. - _append_remote '$$zdoma1.doma.xml' 'D1'. - _append_remote '$$zdoma2.doma.xml' 'D2'. - _append_remote '$$zdoma3.doma.xml' 'D3_CHANGED_R'. - _append_remote '$$zdoma5.doma.xml' 'D5'. - _append_remote '$$zdoma6.doma.xml' 'D6_CHANGED_R'. - _append_remote '$$zdoma7.doma.xml' 'D7'. - _append_remote '$$zdoma8.doma.xml' 'D8_CHANGED_R'. " This one is changed - _append_remote '$$zdoma9.doma.xml' 'D9'. " This one is deleted locally - _append_remote 'xfeld.doma.xml' 'XFELD'. " Object from different package - _append_remote 'num01.doma.xml' 'NUM01_CHANGED'. " Changed object from different package - - "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE - _append_result '' '' ' ' ' ' 'A' '' '/' 'textfile.txt'. - _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. - _append_result 'CLAS' '$$ZCLASS1' ' ' 'A' ' ' '$Z$' '/' '$$zclass1.clas.testclasses.abap'. - _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. - _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.abap'. - _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.xml'. - _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. - _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. - _append_result 'DOMA' '$$ZDOMA3' ' ' ' ' 'M' '$Z$' '/' '$$zdoma3.doma.xml'. - _append_result 'DOMA' '$$ZDOMA4' ' ' 'A' ' ' '$Z$' '/' '$$zdoma4.doma.xml'. - _append_result 'DOMA' '$$ZDOMA5' ' ' ' ' 'A' '' '/' '$$zdoma5.doma.xml'. - _append_result 'DOMA' '$$ZDOMA6' ' ' 'M' 'M' '$Z$' '/' '$$zdoma6.doma.xml'. - _append_result 'DOMA' '$$ZDOMA7' 'X' ' ' ' ' '$Z$' '/' '$$zdoma7.doma.xml'. - _append_result 'DOMA' '$$ZDOMA8' ' ' 'M' 'M' '$Z$' '/' '$$zdoma8.doma.xml'. - _append_result 'DOMA' '$$ZDOMA9' ' ' 'D' ' ' '' '/' '$$zdoma9.doma.xml'. - _append_result 'DOMA' 'NUM01' ' ' ' ' 'M' 'SUTI' '/' 'num01.doma.xml'. - _append_result 'DOMA' 'XFELD' 'X' ' ' ' ' 'SUTI' '/' 'xfeld.doma.xml'. - lt_results_exp = lt_results. - - lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). -* lo_dot->set_starting_folder( 'SRC' ). -* lo_dot->set_folder_logic( lcl_dot_abapgit=>c_folder_logic-prefix ). - - lt_results = lcl_file_status=>calculate_status( - iv_devclass = '$Z$' - io_dot = lo_dot - it_local = lt_local - it_remote = lt_remote - it_cur_state = lt_state ). - - assert_equals( act = lt_results exp = lt_results_exp ). - - ENDMETHOD. "calculate_status - -ENDCLASS. "ltcl_file_status - -CLASS ltcl_file_status2 DEFINITION FOR TESTING RISK LEVEL HARMLESS - DURATION SHORT FINAL - INHERITING FROM cl_aunit_assert. - - PUBLIC SECTION. - METHODS check FOR TESTING RAISING zcx_abapgit_exception. - -ENDCLASS. "ltcl_sap_package - -CLASS ltcl_file_status2 IMPLEMENTATION. - - METHOD check. - - DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, - lo_log TYPE REF TO zcl_abapgit_log. - - FIELD-SYMBOLS: LIKE LINE OF lt_results. - -*** 0 Positive - - CLEAR lt_results. - CREATE OBJECT lo_log. - "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE - _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. - _append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. - _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. - _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. - - lcl_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). - - assert_equals( act = lo_log->count( ) exp = 0 ). - -*** 1 Negative, different path for same object - - CLEAR lt_results. - CREATE OBJECT lo_log. - - "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE - _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. - _append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/sub' 'zclass1.clas.xml'. - _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. - _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. - - lcl_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). - - " This one is not pure - incorrect path also triggers path vs package check - assert_equals( act = lo_log->count( ) exp = 2 ). - assert_equals( act = lo_log->has_rc( '1' ) exp = abap_true ). - -*** 2 Negative, incorrect path vs package - - CLEAR lt_results. - CREATE OBJECT lo_log. - - "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE - _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. - _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. - _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/sub' '$$zdoma1.doma.xml'. - _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. - - lcl_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). - - assert_equals( act = lo_log->count( ) exp = 1 ). - assert_equals( act = lo_log->has_rc( '2' ) exp = abap_true ). - -*** 3 Negative, similar filenames - - CLEAR lt_results. - CREATE OBJECT lo_log. - - "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE - _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. - _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. - _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. - _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. - - lcl_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). - - assert_equals( act = lo_log->count( ) exp = 1 ). - assert_equals( act = lo_log->has_rc( '3' ) exp = abap_true ). - -*** 4 Negative, empty filenames - - CLEAR lt_results. - CREATE OBJECT lo_log. - - "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE - _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. - _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. - _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' ''. - - lcl_file_status=>run_checks( io_log = lo_log - it_results = lt_results - io_dot = zcl_abapgit_dot_abapgit=>build_default( ) - iv_top = '$Z$' ). - - assert_equals( act = lo_log->count( ) - exp = 1 ). - - assert_equals( act = lo_log->has_rc( '4' ) - exp = abap_true ). - - ENDMETHOD. " check. - -ENDCLASS. "ltcl_sap_package - CLASS ltcl_persistence_settings DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS. diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index b68584daf..cdd93b49c 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -23,7 +23,7 @@ CLASS lcl_gui_view_repo DEFINITION FINAL. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO lcl_repo, + DATA: mo_repo TYPE REF TO zcl_abapgit_repo, mv_cur_dir TYPE string, mv_hide_files TYPE abap_bool, mv_max_lines TYPE i, @@ -85,7 +85,7 @@ CLASS lcl_gui_view_repo IMPLEMENTATION. super->constructor( ). - mo_repo = lcl_repo_srv=>get_instance( )->get( iv_key ). + mo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). mv_cur_dir = '/'. " Root mv_hide_files = zcl_abapgit_persistence_user=>get_instance( )->get_hide_files( ). mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->get_changes_only( ). @@ -138,7 +138,7 @@ CLASS lcl_gui_view_repo IMPLEMENTATION. FIELD-SYMBOLS LIKE LINE OF lt_repo_items. " Reinit, for the case of type change - mo_repo = lcl_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ). + mo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ). CREATE OBJECT ro_html. diff --git a/src/zabapgit_zip.prog.abap b/src/zabapgit_zip.prog.abap index d45897485..48adeea15 100644 --- a/src/zabapgit_zip.prog.abap +++ b/src/zabapgit_zip.prog.abap @@ -15,7 +15,7 @@ CLASS lcl_zip DEFINITION FINAL. RAISING zcx_abapgit_exception. CLASS-METHODS export - IMPORTING io_repo TYPE REF TO lcl_repo + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo it_filter TYPE scts_tadir OPTIONAL RAISING zcx_abapgit_exception. @@ -373,10 +373,10 @@ CLASS lcl_zip IMPLEMENTATION. METHOD import. - DATA: lo_repo TYPE REF TO lcl_repo_offline. + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_offline. - lo_repo ?= lcl_repo_srv=>get_instance( )->get( iv_key ). + lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). lo_repo->set_files_remote( unzip_file( file_upload( ) ) ). lo_repo->deserialize( ). @@ -384,14 +384,14 @@ CLASS lcl_zip IMPLEMENTATION. METHOD export_package. - DATA: lo_repo TYPE REF TO lcl_repo_offline, + DATA: lo_repo TYPE REF TO zcl_abapgit_repo_offline, ls_data TYPE zcl_abapgit_persistence_repo=>ty_repo. ls_data-key = 'DUMMY'. ls_data-dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ). - lcl_popups=>popup_package_export( + zcl_abapgit_popups=>popup_package_export( IMPORTING ev_package = ls_data-package ev_folder_logic = ls_data-dot_abapgit-folder_logic ). @@ -422,7 +422,7 @@ CLASS lcl_zip IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_files. - ls_tadir = lcl_popups=>popup_object( ). + ls_tadir = zcl_abapgit_popups=>popup_object( ). IF ls_tadir IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. @@ -430,7 +430,7 @@ CLASS lcl_zip IMPLEMENTATION. ls_item-obj_type = ls_tadir-object. ls_item-obj_name = ls_tadir-obj_name. - lt_files = lcl_objects=>serialize( + lt_files = zcl_abapgit_objects=>serialize( is_item = ls_item iv_language = sy-langu ). diff --git a/src/zabapgit_file_status.prog.abap b/src/zcl_abapgit_file_status.clas.abap similarity index 92% rename from src/zabapgit_file_status.prog.abap rename to src/zcl_abapgit_file_status.clas.abap index 321c4e4dc..45300efbe 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zcl_abapgit_file_status.clas.abap @@ -1,20 +1,12 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_FILE_STATUS -*&---------------------------------------------------------------------* - -*----------------------------------------------------------------------* -* CLASS lcl_file_status DEFINITION -*----------------------------------------------------------------------* -CLASS ltcl_file_status DEFINITION DEFERRED. -CLASS ltcl_file_status2 DEFINITION DEFERRED. - -CLASS lcl_file_status DEFINITION FINAL - FRIENDS ltcl_file_status ltcl_file_status2. +CLASS zcl_abapgit_file_status DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . PUBLIC SECTION. CLASS-METHODS status - IMPORTING io_repo TYPE REF TO lcl_repo + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo io_log TYPE REF TO zcl_abapgit_log OPTIONAL RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt RAISING zcx_abapgit_exception. @@ -61,12 +53,242 @@ CLASS lcl_file_status DEFINITION FINAL ev_is_xml TYPE abap_bool RAISING zcx_abapgit_exception. -ENDCLASS. "lcl_file_status DEFINITION +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION. + + + METHOD build_existing. + + DATA: ls_file_sig LIKE LINE OF it_state. + + " Item + rs_result-obj_type = is_local-item-obj_type. + rs_result-obj_name = is_local-item-obj_name. + rs_result-package = is_local-item-devclass. + + " File + rs_result-path = is_local-file-path. + rs_result-filename = is_local-file-filename. + + " Match against current state + READ TABLE it_state INTO ls_file_sig + WITH KEY path = is_local-file-path + filename = is_local-file-filename + BINARY SEARCH. + + IF sy-subrc = 0. + IF ls_file_sig-sha1 <> is_local-file-sha1. + rs_result-lstate = zif_abapgit_definitions=>gc_state-modified. + ENDIF. + IF ls_file_sig-sha1 <> is_remote-sha1. + rs_result-rstate = zif_abapgit_definitions=>gc_state-modified. + ENDIF. + rs_result-match = boolc( rs_result-lstate IS INITIAL + AND rs_result-rstate IS INITIAL ). + ELSE. + " This is a strange situation. As both local and remote exist + " the state should also be present. Maybe this is a first run of the code. + " In this case just compare hashes directly and mark both changed + " the user will presumably decide what to do after checking the actual diff + rs_result-match = boolc( is_local-file-sha1 = is_remote-sha1 ). + IF rs_result-match = abap_false. + rs_result-lstate = zif_abapgit_definitions=>gc_state-modified. + rs_result-rstate = zif_abapgit_definitions=>gc_state-modified. + ENDIF. + ENDIF. + + ENDMETHOD. "build_existing + + + METHOD build_new_local. + + " Item + rs_result-obj_type = is_local-item-obj_type. + rs_result-obj_name = is_local-item-obj_name. + rs_result-package = is_local-item-devclass. + + " File + rs_result-path = is_local-file-path. + rs_result-filename = is_local-file-filename. + + " Match + rs_result-match = abap_false. + rs_result-lstate = zif_abapgit_definitions=>gc_state-added. + + ENDMETHOD. "build_new_local + + + METHOD build_new_remote. + + DATA: ls_item LIKE LINE OF it_items, + ls_file_sig LIKE LINE OF it_state. + + " Common and default part + rs_result-path = is_remote-path. + rs_result-filename = is_remote-filename. + rs_result-match = abap_false. + rs_result-rstate = zif_abapgit_definitions=>gc_state-added. + + identify_object( EXPORTING iv_filename = is_remote-filename + iv_path = is_remote-path + iv_devclass = iv_devclass + io_dot = io_dot + IMPORTING es_item = ls_item ). + + " Check if in item index + get package + READ TABLE it_items INTO ls_item + WITH KEY obj_type = ls_item-obj_type obj_name = ls_item-obj_name + BINARY SEARCH. + + IF sy-subrc = 0. + + " Completely new (xml, abap) and new file in an existing object + rs_result-obj_type = ls_item-obj_type. + rs_result-obj_name = ls_item-obj_name. + rs_result-package = ls_item-devclass. + + READ TABLE it_state INTO ls_file_sig + WITH KEY path = is_remote-path filename = is_remote-filename + BINARY SEARCH. + + " Existing file but from another package + " was not added during local file proc as was not in tadir for repo package + IF sy-subrc = 0. + IF ls_file_sig-sha1 = is_remote-sha1. + rs_result-match = abap_true. + CLEAR rs_result-rstate. + ELSE. + rs_result-rstate = zif_abapgit_definitions=>gc_state-modified. + ENDIF. + + " Item is in state and in cache but with no package - it was deleted + " OR devclass is the same as repo package (see #532) + IF ls_item-devclass IS INITIAL OR ls_item-devclass = iv_devclass. + rs_result-match = abap_false. + rs_result-lstate = zif_abapgit_definitions=>gc_state-deleted. + ENDIF. + ENDIF. + + ELSE. " Completely unknown file, probably non-abapgit + ASSERT 1 = 1. " No action, just follow defaults + ENDIF. + + ENDMETHOD. "build_new_remote + + + METHOD calculate_status. + + DATA: lt_remote LIKE it_remote, + lt_items TYPE zif_abapgit_definitions=>ty_items_tt, + ls_item LIKE LINE OF lt_items, + lv_is_xml TYPE abap_bool, + lt_items_idx TYPE zif_abapgit_definitions=>ty_items_ts, + lt_state_idx TYPE zif_abapgit_definitions=>ty_file_signatures_ts. " Sorted by path+filename + + FIELD-SYMBOLS: LIKE LINE OF it_remote, + LIKE LINE OF rt_results, + LIKE LINE OF it_local. + + + lt_state_idx = it_cur_state. " Force sort it + lt_remote = it_remote. + SORT lt_remote BY path filename. + + " Process local files and new local files + LOOP AT it_local ASSIGNING . + APPEND INITIAL LINE TO rt_results ASSIGNING . + IF -item IS NOT INITIAL. + APPEND -item TO lt_items. " Collect for item index + ENDIF. + + READ TABLE lt_remote ASSIGNING + WITH KEY path = -file-path filename = -file-filename + BINARY SEARCH. + IF sy-subrc = 0. " Exist local and remote + = build_existing( + is_local = + is_remote = + it_state = lt_state_idx ). + ASSERT -sha1 IS NOT INITIAL. + CLEAR -sha1. " Mark as processed + ELSE. " Only L exists + = build_new_local( is_local = ). + ENDIF. + ENDLOOP. + + " Complete item index for unmarked remote files + LOOP AT lt_remote ASSIGNING WHERE sha1 IS NOT INITIAL. + identify_object( EXPORTING iv_filename = -filename + iv_path = -path + io_dot = io_dot + iv_devclass = iv_devclass + IMPORTING es_item = ls_item + ev_is_xml = lv_is_xml ). + + CHECK lv_is_xml = abap_true. " Skip all but obj definitions + + ls_item-devclass = zcl_abapgit_tadir=>get_object_package( + iv_object = ls_item-obj_type + iv_obj_name = ls_item-obj_name ). + APPEND ls_item TO lt_items. + ENDLOOP. + + SORT lt_items. " Default key - type, name, pkg + DELETE ADJACENT DUPLICATES FROM lt_items. + lt_items_idx = lt_items. " Self protection + UNIQUE records assertion + + " Process new remote files (marked above with empty SHA1) + LOOP AT lt_remote ASSIGNING WHERE sha1 IS NOT INITIAL. + APPEND INITIAL LINE TO rt_results ASSIGNING . + = build_new_remote( iv_devclass = iv_devclass + io_dot = io_dot + is_remote = + it_items = lt_items_idx + it_state = lt_state_idx ). + ENDLOOP. + + SORT rt_results BY + obj_type ASCENDING + obj_name ASCENDING + filename ASCENDING. + + ENDMETHOD. "calculate_status. + + + METHOD identify_object. + + DATA: lv_name TYPE tadir-obj_name, + lv_type TYPE string, + lv_ext TYPE string. + + " Guess object type and name + SPLIT to_upper( iv_filename ) AT '.' INTO lv_name lv_type lv_ext. + + " Handle namespaces + REPLACE ALL OCCURRENCES OF '#' IN lv_name WITH '/'. + REPLACE ALL OCCURRENCES OF '#' IN lv_type WITH '/'. + REPLACE ALL OCCURRENCES OF '#' IN lv_ext WITH '/'. + + " Try to get a unique package name for DEVC by using the path + IF lv_type = 'DEVC'. + ASSERT lv_name = 'PACKAGE'. + lv_name = zcl_abapgit_folder_logic=>path_to_package( + iv_top = iv_devclass + io_dot = io_dot + iv_create_if_not_exists = abap_false + iv_path = iv_path ). + ENDIF. + + CLEAR es_item. + es_item-obj_type = lv_type. + es_item-obj_name = lv_name. + ev_is_xml = boolc( lv_ext = 'XML' AND strlen( lv_type ) = 4 ). + + ENDMETHOD. "identify_object. -*----------------------------------------------------------------------* -* CLASS lcl_file_status IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_file_status IMPLEMENTATION. METHOD run_checks. @@ -150,10 +372,11 @@ CLASS lcl_file_status IMPLEMENTATION. ENDMETHOD. "check + METHOD status. - DATA: lv_index LIKE sy-tabix, - lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit. + DATA: lv_index LIKE sy-tabix, + lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit. FIELD-SYMBOLS LIKE LINE OF rt_results. @@ -186,230 +409,4 @@ CLASS lcl_file_status IMPLEMENTATION. iv_top = io_repo->get_package( ) ). ENDMETHOD. "status - - METHOD calculate_status. - - DATA: lt_remote LIKE it_remote, - lt_items TYPE zif_abapgit_definitions=>ty_items_tt, - ls_item LIKE LINE OF lt_items, - lv_is_xml TYPE abap_bool, - lt_items_idx TYPE zif_abapgit_definitions=>ty_items_ts, - lt_state_idx TYPE zif_abapgit_definitions=>ty_file_signatures_ts. " Sorted by path+filename - - FIELD-SYMBOLS: LIKE LINE OF it_remote, - LIKE LINE OF rt_results, - LIKE LINE OF it_local. - - - lt_state_idx = it_cur_state. " Force sort it - lt_remote = it_remote. - SORT lt_remote BY path filename. - - " Process local files and new local files - LOOP AT it_local ASSIGNING . - APPEND INITIAL LINE TO rt_results ASSIGNING . - IF -item IS NOT INITIAL. - APPEND -item TO lt_items. " Collect for item index - ENDIF. - - READ TABLE lt_remote ASSIGNING - WITH KEY path = -file-path filename = -file-filename - BINARY SEARCH. - IF sy-subrc = 0. " Exist local and remote - = build_existing( - is_local = - is_remote = - it_state = lt_state_idx ). - ASSERT -sha1 IS NOT INITIAL. - CLEAR -sha1. " Mark as processed - ELSE. " Only L exists - = build_new_local( is_local = ). - ENDIF. - ENDLOOP. - - " Complete item index for unmarked remote files - LOOP AT lt_remote ASSIGNING WHERE sha1 IS NOT INITIAL. - identify_object( EXPORTING iv_filename = -filename - iv_path = -path - io_dot = io_dot - iv_devclass = iv_devclass - IMPORTING es_item = ls_item - ev_is_xml = lv_is_xml ). - - CHECK lv_is_xml = abap_true. " Skip all but obj definitions - - ls_item-devclass = lcl_tadir=>get_object_package( - iv_object = ls_item-obj_type - iv_obj_name = ls_item-obj_name ). - APPEND ls_item TO lt_items. - ENDLOOP. - - SORT lt_items. " Default key - type, name, pkg - DELETE ADJACENT DUPLICATES FROM lt_items. - lt_items_idx = lt_items. " Self protection + UNIQUE records assertion - - " Process new remote files (marked above with empty SHA1) - LOOP AT lt_remote ASSIGNING WHERE sha1 IS NOT INITIAL. - APPEND INITIAL LINE TO rt_results ASSIGNING . - = build_new_remote( iv_devclass = iv_devclass - io_dot = io_dot - is_remote = - it_items = lt_items_idx - it_state = lt_state_idx ). - ENDLOOP. - - SORT rt_results BY - obj_type ASCENDING - obj_name ASCENDING - filename ASCENDING. - - ENDMETHOD. "calculate_status. - - METHOD identify_object. - - DATA: lv_name TYPE tadir-obj_name, - lv_type TYPE string, - lv_ext TYPE string. - - " Guess object type and name - SPLIT to_upper( iv_filename ) AT '.' INTO lv_name lv_type lv_ext. - - " Handle namespaces - REPLACE ALL OCCURRENCES OF '#' IN lv_name WITH '/'. - REPLACE ALL OCCURRENCES OF '#' IN lv_type WITH '/'. - REPLACE ALL OCCURRENCES OF '#' IN lv_ext WITH '/'. - - " Try to get a unique package name for DEVC by using the path - IF lv_type = 'DEVC'. - ASSERT lv_name = 'PACKAGE'. - lv_name = zcl_abapgit_folder_logic=>path_to_package( - iv_top = iv_devclass - io_dot = io_dot - iv_create_if_not_exists = abap_false - iv_path = iv_path ). - ENDIF. - - CLEAR es_item. - es_item-obj_type = lv_type. - es_item-obj_name = lv_name. - ev_is_xml = boolc( lv_ext = 'XML' AND strlen( lv_type ) = 4 ). - - ENDMETHOD. "identify_object. - - METHOD build_existing. - - DATA: ls_file_sig LIKE LINE OF it_state. - - " Item - rs_result-obj_type = is_local-item-obj_type. - rs_result-obj_name = is_local-item-obj_name. - rs_result-package = is_local-item-devclass. - - " File - rs_result-path = is_local-file-path. - rs_result-filename = is_local-file-filename. - - " Match against current state - READ TABLE it_state INTO ls_file_sig - WITH KEY path = is_local-file-path - filename = is_local-file-filename - BINARY SEARCH. - - IF sy-subrc = 0. - IF ls_file_sig-sha1 <> is_local-file-sha1. - rs_result-lstate = zif_abapgit_definitions=>gc_state-modified. - ENDIF. - IF ls_file_sig-sha1 <> is_remote-sha1. - rs_result-rstate = zif_abapgit_definitions=>gc_state-modified. - ENDIF. - rs_result-match = boolc( rs_result-lstate IS INITIAL - AND rs_result-rstate IS INITIAL ). - ELSE. - " This is a strange situation. As both local and remote exist - " the state should also be present. Maybe this is a first run of the code. - " In this case just compare hashes directly and mark both changed - " the user will presumably decide what to do after checking the actual diff - rs_result-match = boolc( is_local-file-sha1 = is_remote-sha1 ). - IF rs_result-match = abap_false. - rs_result-lstate = zif_abapgit_definitions=>gc_state-modified. - rs_result-rstate = zif_abapgit_definitions=>gc_state-modified. - ENDIF. - ENDIF. - - ENDMETHOD. "build_existing - - METHOD build_new_local. - - " Item - rs_result-obj_type = is_local-item-obj_type. - rs_result-obj_name = is_local-item-obj_name. - rs_result-package = is_local-item-devclass. - - " File - rs_result-path = is_local-file-path. - rs_result-filename = is_local-file-filename. - - " Match - rs_result-match = abap_false. - rs_result-lstate = zif_abapgit_definitions=>gc_state-added. - - ENDMETHOD. "build_new_local - - METHOD build_new_remote. - - DATA: ls_item LIKE LINE OF it_items, - ls_file_sig LIKE LINE OF it_state. - - " Common and default part - rs_result-path = is_remote-path. - rs_result-filename = is_remote-filename. - rs_result-match = abap_false. - rs_result-rstate = zif_abapgit_definitions=>gc_state-added. - - identify_object( EXPORTING iv_filename = is_remote-filename - iv_path = is_remote-path - iv_devclass = iv_devclass - io_dot = io_dot - IMPORTING es_item = ls_item ). - - " Check if in item index + get package - READ TABLE it_items INTO ls_item - WITH KEY obj_type = ls_item-obj_type obj_name = ls_item-obj_name - BINARY SEARCH. - - IF sy-subrc = 0. - - " Completely new (xml, abap) and new file in an existing object - rs_result-obj_type = ls_item-obj_type. - rs_result-obj_name = ls_item-obj_name. - rs_result-package = ls_item-devclass. - - READ TABLE it_state INTO ls_file_sig - WITH KEY path = is_remote-path filename = is_remote-filename - BINARY SEARCH. - - " Existing file but from another package - " was not added during local file proc as was not in tadir for repo package - IF sy-subrc = 0. - IF ls_file_sig-sha1 = is_remote-sha1. - rs_result-match = abap_true. - CLEAR rs_result-rstate. - ELSE. - rs_result-rstate = zif_abapgit_definitions=>gc_state-modified. - ENDIF. - - " Item is in state and in cache but with no package - it was deleted - " OR devclass is the same as repo package (see #532) - IF ls_item-devclass IS INITIAL OR ls_item-devclass = iv_devclass. - rs_result-match = abap_false. - rs_result-lstate = zif_abapgit_definitions=>gc_state-deleted. - ENDIF. - ENDIF. - - ELSE. " Completely unknown file, probably non-abapgit - ASSERT 1 = 1. " No action, just follow defaults - ENDIF. - - ENDMETHOD. "build_new_remote - -ENDCLASS. "lcl_file_status IMPLEMENTATION +ENDCLASS. diff --git a/src/zcl_abapgit_file_status.clas.testclasses.abap b/src/zcl_abapgit_file_status.clas.testclasses.abap new file mode 100644 index 000000000..5c626183c --- /dev/null +++ b/src/zcl_abapgit_file_status.clas.testclasses.abap @@ -0,0 +1,267 @@ +CLASS ltcl_file_status DEFINITION DEFERRED. +CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_file_status. + +DEFINE _append_state. + APPEND INITIAL LINE TO lt_state ASSIGNING . + -path = '/'. + -filename = &1. + -sha1 = &2. +END-OF-DEFINITION. + +DEFINE _append_local. + APPEND INITIAL LINE TO lt_local ASSIGNING . + -item-obj_type = &1. + -item-obj_name = &2. + -item-devclass = '$Z$'. + -file-path = '/'. + -file-filename = &3. + -file-sha1 = &4. +END-OF-DEFINITION. + +DEFINE _append_remote. + APPEND INITIAL LINE TO lt_remote ASSIGNING . + -path = '/'. + -filename = &1. + -sha1 = &2. +END-OF-DEFINITION. + +DEFINE _append_result. + APPEND INITIAL LINE TO lt_results ASSIGNING . + -obj_type = &1. + -obj_name = &2. + -match = &3. + -lstate = &4. + -rstate = &5. + -package = &6. + -path = &7. + -filename = &8. +END-OF-DEFINITION. + +CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS + DURATION SHORT FINAL + INHERITING FROM cl_aunit_assert. + + PUBLIC SECTION. + METHODS calculate_status FOR TESTING + RAISING zcx_abapgit_exception. + +ENDCLASS. "ltcl_file_status + +CLASS ltcl_file_status IMPLEMENTATION. + + METHOD calculate_status. + + DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, + lt_state TYPE zif_abapgit_definitions=>ty_file_signatures_tt, + lt_results TYPE zif_abapgit_definitions=>ty_results_tt, + lt_results_exp TYPE zif_abapgit_definitions=>ty_results_tt, + lo_dot TYPE REF TO zcl_abapgit_dot_abapgit. + + FIELD-SYMBOLS: LIKE LINE OF lt_local, + LIKE LINE OF lt_remote, + LIKE LINE OF lt_results, + LIKE LINE OF lt_state. + + "STATE FILE SHA1 + _append_state '$$zclass1.clas.xml' 'C1_F1'. + " class1 testclasses is new locally, abap is new remotely + " class2 is completely new remotely + _append_state '$$zdoma1.doma.xml' 'D1'. + _append_state '$$zdoma2.doma.xml' 'D2'. + _append_state '$$zdoma3.doma.xml' 'D3'. + " doma4 is new locally + " doma5 is new remotely + _append_state '$$zdoma6.doma.xml' 'D6'. + " doma7 is not in state - emulate brocken cache + " doma8 is not in state - emulate brocken cache + _append_state '$$zdoma9.doma.xml' 'D9'. + _append_state 'num01.doma.xml' 'NUM01'. " another from different package + _append_state 'xfeld.doma.xml' 'XFELD'. " from different package + + "LOCAL TYPE NAME FILE SHA1 + _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.testclasses.abap' 'C1_F3'. + _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.xml' 'C1_F1'. + _append_local 'DOMA' '$$ZDOMA1' '$$zdoma1.doma.xml' 'D1'. + _append_local 'DOMA' '$$ZDOMA2' '$$zdoma2.doma.xml' 'D2_CHANGED_L'. + _append_local 'DOMA' '$$ZDOMA3' '$$zdoma3.doma.xml' 'D3'. + _append_local 'DOMA' '$$ZDOMA4' '$$zdoma4.doma.xml' 'D4'. + _append_local 'DOMA' '$$ZDOMA6' '$$zdoma6.doma.xml' 'D6_CHANGED_L'. + _append_local 'DOMA' '$$ZDOMA7' '$$zdoma7.doma.xml' 'D7'. + _append_local 'DOMA' '$$ZDOMA8' '$$zdoma8.doma.xml' 'D8'. + " dome9 was deleted from local system. Can be found by existing state + + "REMOTE FILE SHA1 + _append_remote 'textfile.txt' 'T1'. + _append_remote '$$zclass1.clas.abap' 'C1_F2'. " Must be before xml for tougher test + _append_remote '$$zclass1.clas.xml' 'C1_F1'. + _append_remote '$$zclass2.clas.abap' 'C1_F2'. " Must be before xml for tougher test + _append_remote '$$zclass2.clas.xml' 'C1_F1'. + _append_remote '$$zdoma1.doma.xml' 'D1'. + _append_remote '$$zdoma2.doma.xml' 'D2'. + _append_remote '$$zdoma3.doma.xml' 'D3_CHANGED_R'. + _append_remote '$$zdoma5.doma.xml' 'D5'. + _append_remote '$$zdoma6.doma.xml' 'D6_CHANGED_R'. + _append_remote '$$zdoma7.doma.xml' 'D7'. + _append_remote '$$zdoma8.doma.xml' 'D8_CHANGED_R'. " This one is changed + _append_remote '$$zdoma9.doma.xml' 'D9'. " This one is deleted locally + _append_remote 'xfeld.doma.xml' 'XFELD'. " Object from different package + _append_remote 'num01.doma.xml' 'NUM01_CHANGED'. " Changed object from different package + + "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE + _append_result '' '' ' ' ' ' 'A' '' '/' 'textfile.txt'. + _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. + _append_result 'CLAS' '$$ZCLASS1' ' ' 'A' ' ' '$Z$' '/' '$$zclass1.clas.testclasses.abap'. + _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. + _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.abap'. + _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.xml'. + _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. + _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. + _append_result 'DOMA' '$$ZDOMA3' ' ' ' ' 'M' '$Z$' '/' '$$zdoma3.doma.xml'. + _append_result 'DOMA' '$$ZDOMA4' ' ' 'A' ' ' '$Z$' '/' '$$zdoma4.doma.xml'. + _append_result 'DOMA' '$$ZDOMA5' ' ' ' ' 'A' '' '/' '$$zdoma5.doma.xml'. + _append_result 'DOMA' '$$ZDOMA6' ' ' 'M' 'M' '$Z$' '/' '$$zdoma6.doma.xml'. + _append_result 'DOMA' '$$ZDOMA7' 'X' ' ' ' ' '$Z$' '/' '$$zdoma7.doma.xml'. + _append_result 'DOMA' '$$ZDOMA8' ' ' 'M' 'M' '$Z$' '/' '$$zdoma8.doma.xml'. + _append_result 'DOMA' '$$ZDOMA9' ' ' 'D' ' ' '' '/' '$$zdoma9.doma.xml'. + _append_result 'DOMA' 'NUM01' ' ' ' ' 'M' 'SUTI' '/' 'num01.doma.xml'. + _append_result 'DOMA' 'XFELD' 'X' ' ' ' ' 'SUTI' '/' 'xfeld.doma.xml'. + lt_results_exp = lt_results. + + lo_dot = zcl_abapgit_dot_abapgit=>build_default( ). +* lo_dot->set_starting_folder( 'SRC' ). +* lo_dot->set_folder_logic( lcl_dot_abapgit=>c_folder_logic-prefix ). + + lt_results = zcl_abapgit_file_status=>calculate_status( + iv_devclass = '$Z$' + io_dot = lo_dot + it_local = lt_local + it_remote = lt_remote + it_cur_state = lt_state ). + + assert_equals( act = lt_results exp = lt_results_exp ). + + ENDMETHOD. "calculate_status + +ENDCLASS. "ltcl_file_status + +CLASS ltcl_file_status2 DEFINITION DEFERRED. +CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_file_status2. + +CLASS ltcl_file_status2 DEFINITION FOR TESTING RISK LEVEL HARMLESS + DURATION SHORT FINAL + INHERITING FROM cl_aunit_assert. + + PUBLIC SECTION. + METHODS check FOR TESTING RAISING zcx_abapgit_exception. + +ENDCLASS. "ltcl_sap_package + +CLASS ltcl_file_status2 IMPLEMENTATION. + + METHOD check. + + DATA: lt_results TYPE zif_abapgit_definitions=>ty_results_tt, + lo_log TYPE REF TO zcl_abapgit_log. + + FIELD-SYMBOLS: LIKE LINE OF lt_results. + +*** 0 Positive + + CLEAR lt_results. + CREATE OBJECT lo_log. + "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE + _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. + _append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. + _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. + _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. + + zcl_abapgit_file_status=>run_checks( io_log = lo_log + it_results = lt_results + io_dot = zcl_abapgit_dot_abapgit=>build_default( ) + iv_top = '$Z$' ). + + assert_equals( act = lo_log->count( ) exp = 0 ). + +*** 1 Negative, different path for same object + + CLEAR lt_results. + CREATE OBJECT lo_log. + + "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE + _append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. + _append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/sub' 'zclass1.clas.xml'. + _append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. + _append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. + + zcl_abapgit_file_status=>run_checks( io_log = lo_log + it_results = lt_results + io_dot = zcl_abapgit_dot_abapgit=>build_default( ) + iv_top = '$Z$' ). + + " This one is not pure - incorrect path also triggers path vs package check + assert_equals( act = lo_log->count( ) exp = 2 ). + assert_equals( act = lo_log->has_rc( '1' ) exp = abap_true ). + +*** 2 Negative, incorrect path vs package + + CLEAR lt_results. + CREATE OBJECT lo_log. + + "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE + _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. + _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. + _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/sub' '$$zdoma1.doma.xml'. + _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'. + + zcl_abapgit_file_status=>run_checks( io_log = lo_log + it_results = lt_results + io_dot = zcl_abapgit_dot_abapgit=>build_default( ) + iv_top = '$Z$' ). + + assert_equals( act = lo_log->count( ) exp = 1 ). + assert_equals( act = lo_log->has_rc( '2' ) exp = abap_true ). + +*** 3 Negative, similar filenames + + CLEAR lt_results. + CREATE OBJECT lo_log. + + "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE + _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. + _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. + _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. + _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma1.doma.xml'. + + zcl_abapgit_file_status=>run_checks( io_log = lo_log + it_results = lt_results + io_dot = zcl_abapgit_dot_abapgit=>build_default( ) + iv_top = '$Z$' ). + + assert_equals( act = lo_log->count( ) exp = 1 ). + assert_equals( act = lo_log->has_rc( '3' ) exp = abap_true ). + +*** 4 Negative, empty filenames + + CLEAR lt_results. + CREATE OBJECT lo_log. + + "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE + _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'. + _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'. + _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' ''. + + zcl_abapgit_file_status=>run_checks( io_log = lo_log + it_results = lt_results + io_dot = zcl_abapgit_dot_abapgit=>build_default( ) + iv_top = '$Z$' ). + + assert_equals( act = lo_log->count( ) + exp = 1 ). + + assert_equals( act = lo_log->has_rc( '4' ) + exp = abap_true ). + + ENDMETHOD. " check. + +ENDCLASS. "ltcl_sap_package diff --git a/src/zcl_abapgit_file_status.clas.xml b/src/zcl_abapgit_file_status.clas.xml new file mode 100644 index 000000000..419436b19 --- /dev/null +++ b/src/zcl_abapgit_file_status.clas.xml @@ -0,0 +1,20 @@ + + + + + + ZCL_ABAPGIT_FILE_STATUS + 1 + E + File status + 2 + 1 + X + X + X + X + X + + + + diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zcl_abapgit_objects.clas.abap similarity index 80% rename from src/zabapgit_objects_impl.prog.abap rename to src/zcl_abapgit_objects.clas.abap index 0133f9637..5e8d1dff9 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -1,117 +1,201 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_OBJECT -*&---------------------------------------------------------------------* +CLASS zcl_abapgit_objects DEFINITION PUBLIC CREATE PUBLIC. -*----------------------------------------------------------------------* -* CLASS lcl_objects IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_objects IMPLEMENTATION. + PUBLIC SECTION. + TYPES: ty_types_tt TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY. - METHOD warning_overwrite. + TYPES: BEGIN OF ty_deserialization, + obj TYPE REF TO zif_abapgit_object, + xml TYPE REF TO zcl_abapgit_xml_input, + package TYPE devclass, + item TYPE zif_abapgit_definitions=>ty_item, + END OF ty_deserialization. - DATA: lt_results_overwrite LIKE ct_results, - lt_confirmed_overwrite LIKE ct_results, - lt_columns TYPE stringtab. + TYPES: ty_deserialization_tt TYPE STANDARD TABLE OF ty_deserialization WITH DEFAULT KEY. - FIELD-SYMBOLS: LIKE LINE OF ct_results. + CLASS-METHODS serialize + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras + io_log TYPE REF TO zcl_abapgit_log OPTIONAL + RETURNING VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt + RAISING zcx_abapgit_exception. - LOOP AT ct_results ASSIGNING - WHERE NOT obj_type IS INITIAL. + CLASS-METHODS deserialize + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo + RETURNING VALUE(rt_accessed_files) TYPE zif_abapgit_definitions=>ty_file_signatures_tt + RAISING zcx_abapgit_exception. - IF -lstate IS NOT INITIAL - AND -lstate <> zif_abapgit_definitions=>gc_state-deleted - AND NOT ( -lstate = zif_abapgit_definitions=>gc_state-added - AND -rstate IS INITIAL ). + CLASS-METHODS delete + IMPORTING it_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt + RAISING zcx_abapgit_exception. - "current object has been modified locally, add to table for popup - APPEND TO lt_results_overwrite. - ENDIF. + CLASS-METHODS jump + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + RAISING zcx_abapgit_exception. - ENDLOOP. + CLASS-METHODS changed_by + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + RETURNING VALUE(rv_user) TYPE xubname + RAISING zcx_abapgit_exception. - IF lines( lt_results_overwrite ) > 0. + CLASS-METHODS has_changed_since + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + iv_timestamp TYPE timestamp + RETURNING VALUE(rv_changed) TYPE abap_bool + RAISING zcx_abapgit_exception. - INSERT `OBJ_TYPE` INTO TABLE lt_columns. - INSERT `OBJ_NAME` INTO TABLE lt_columns. + CLASS-METHODS is_supported + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + iv_native_only TYPE abap_bool DEFAULT abap_false + RETURNING VALUE(rv_bool) TYPE abap_bool. - "all returned objects will be overwritten - lcl_popups=>popup_to_select_from_list( - EXPORTING - it_list = lt_results_overwrite - i_header_text = |The following Objects have been modified locally.| - && | Select the Objects which should be overwritten.| - i_select_column_text = 'Overwrite?' - it_columns_to_display = lt_columns - IMPORTING - et_list = lt_confirmed_overwrite ). + CLASS-METHODS exists + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + RETURNING VALUE(rv_bool) TYPE abap_bool. - LOOP AT lt_results_overwrite ASSIGNING . - READ TABLE lt_confirmed_overwrite TRANSPORTING NO FIELDS - WITH KEY obj_type = -obj_type - obj_name = -obj_name. - IF sy-subrc <> 0. - DELETE TABLE ct_results FROM . - ENDIF. - ENDLOOP. + CLASS-METHODS supported_list + RETURNING VALUE(rt_types) TYPE ty_types_tt. + + PRIVATE SECTION. + + CLASS-METHODS check_duplicates + IMPORTING it_files TYPE zif_abapgit_definitions=>ty_files_tt + RAISING zcx_abapgit_exception. + + CLASS-METHODS create_object + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras + is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL + iv_native_only TYPE abap_bool DEFAULT abap_false + RETURNING VALUE(ri_obj) TYPE REF TO zif_abapgit_object + RAISING zcx_abapgit_exception. + + CLASS-METHODS + prioritize_deser + IMPORTING it_results TYPE zif_abapgit_definitions=>ty_results_tt + RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt. + + CLASS-METHODS class_name + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + RETURNING VALUE(rv_class_name) TYPE string. + + CLASS-METHODS warning_overwrite + CHANGING ct_results TYPE zif_abapgit_definitions=>ty_results_tt + RAISING zcx_abapgit_exception. + + CLASS-METHODS warning_package + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + iv_package TYPE devclass + RETURNING VALUE(rv_cancel) TYPE abap_bool + RAISING zcx_abapgit_exception. + + CLASS-METHODS update_package_tree + IMPORTING iv_package TYPE devclass. + + CLASS-METHODS delete_obj + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + RAISING zcx_abapgit_exception. + + CLASS-METHODS compare_remote_to_local + IMPORTING + io_object TYPE REF TO zif_abapgit_object + it_remote TYPE zif_abapgit_definitions=>ty_files_tt + is_result TYPE zif_abapgit_definitions=>ty_result + RAISING + zcx_abapgit_exception. + + CLASS-METHODS deserialize_objects + IMPORTING it_objects TYPE ty_deserialization_tt + iv_ddic TYPE abap_bool DEFAULT abap_false + iv_descr TYPE string + CHANGING ct_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt + RAISING zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. + + + METHOD changed_by. + + DATA: li_obj TYPE REF TO zif_abapgit_object. + + + IF is_item IS INITIAL. +* eg. ".abapgit.xml" file + rv_user = zcl_abapgit_objects_super=>c_user_unknown. + ELSE. + li_obj = create_object( is_item = is_item + iv_language = zif_abapgit_definitions=>gc_english ). + rv_user = li_obj->changed_by( ). + ENDIF. + + ASSERT NOT rv_user IS INITIAL. + +* todo, fallback to looking at transports if rv_user = 'UNKNOWN'? + + ENDMETHOD. + + + METHOD check_duplicates. + + DATA: lt_files TYPE zif_abapgit_definitions=>ty_files_tt. + + + lt_files[] = it_files[]. + SORT lt_files BY path ASCENDING filename ASCENDING. + DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path filename. + IF lines( lt_files ) <> lines( it_files ). + zcx_abapgit_exception=>raise( 'Duplicates' ). ENDIF. ENDMETHOD. - METHOD warning_package. - DATA: lv_question TYPE c LENGTH 200, - lv_answer TYPE c, - ls_tadir TYPE tadir. + METHOD class_name. + + CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type INTO rv_class_name. "#EC NOTEXT + + ENDMETHOD. "class_name - ls_tadir = lcl_tadir=>read_single( iv_object = is_item-obj_type - iv_obj_name = is_item-obj_name ). - IF NOT ls_tadir IS INITIAL AND ls_tadir-devclass <> iv_package. - CONCATENATE 'Overwrite object' is_item-obj_type is_item-obj_name - 'from package' ls_tadir-devclass - INTO lv_question SEPARATED BY space. "#EC NOTEXT + METHOD compare_remote_to_local. +* this method is used for comparing local with remote objects +* before pull, this is useful eg. when overwriting a TABL object. +* only the main XML file is used for comparison - lv_answer = lcl_popups=>popup_to_confirm( - titlebar = 'Warning' - text_question = lv_question - text_button_1 = 'Ok' - icon_button_1 = 'ICON_DELETE' - text_button_2 = 'Cancel' - icon_button_2 = 'ICON_CANCEL' - default_button = '2' - display_cancel_button = abap_false ). "#EC NOTEXT + DATA: ls_remote_file TYPE zif_abapgit_definitions=>ty_file, + lo_remote_version TYPE REF TO zcl_abapgit_xml_input, + lv_count TYPE i, + lo_comparison_result TYPE REF TO zif_abapgit_comparison_result. - IF lv_answer = '2'. - rv_cancel = abap_true. + + FIND ALL OCCURRENCES OF '.' IN is_result-filename MATCH COUNT lv_count. + + IF is_result-filename CS '.XML' AND lv_count = 2. + IF io_object->exists( ) = abap_false. + RETURN. ENDIF. + READ TABLE it_remote WITH KEY filename = is_result-filename INTO ls_remote_file. + + "if file does not exist in remote, we don't need to validate + IF sy-subrc = 0. + CREATE OBJECT lo_remote_version + EXPORTING + iv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( ls_remote_file-data ). + lo_comparison_result = io_object->compare_to_remote_version( lo_remote_version ). + lo_comparison_result->show_confirmation_dialog( ). + + IF lo_comparison_result->is_result_complete_halt( ) = abap_true. + zcx_abapgit_exception=>raise( 'Deserialization aborted by user' ). + ENDIF. + ENDIF. ENDIF. - ENDMETHOD. "check_warning + ENDMETHOD. - METHOD update_package_tree. - - DATA: lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt, - lv_package LIKE LINE OF lt_packages, - lv_tree TYPE dirtree-tname. - - - lt_packages = zcl_abapgit_sap_package=>get( iv_package )->list_subpackages( ). - APPEND iv_package TO lt_packages. - - LOOP AT lt_packages INTO lv_package. -* update package tree for SE80 - lv_tree = 'EU_' && lv_package. - CALL FUNCTION 'WB_TREE_ACTUALIZE' - EXPORTING - tree_name = lv_tree - without_crossreference = abap_true - with_tcode_index = abap_true. - ENDLOOP. - - ENDMETHOD. "update_package_tree METHOD create_object. @@ -162,7 +246,7 @@ CLASS lcl_objects IMPLEMENTATION. lv_message = |Object type { is_item-obj_type } not supported, serialize|. "#EC NOTEXT IF iv_native_only = abap_false. TRY. " 2nd step, try looking for plugins - CREATE OBJECT ri_obj TYPE lcl_objects_bridge + CREATE OBJECT ri_obj TYPE zcl_abapgit_objects_bridge EXPORTING is_item = is_item. CATCH cx_sy_create_object_error. @@ -175,123 +259,6 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "create_object - METHOD has_changed_since. - rv_changed = abap_true. " Assume changed - - IF is_supported( is_item ) = abap_false. - RETURN. " Will requre serialize which will log the error - ENDIF. - - rv_changed = create_object( - is_item = is_item - iv_language = zif_abapgit_definitions=>gc_english )->has_changed_since( iv_timestamp ). - - ENDMETHOD. "has_changed_since - - METHOD is_supported. - - TRY. - create_object( is_item = is_item - iv_language = zif_abapgit_definitions=>gc_english - iv_native_only = iv_native_only ). - rv_bool = abap_true. - CATCH zcx_abapgit_exception. - rv_bool = abap_false. - ENDTRY. - - ENDMETHOD. "is_supported - - METHOD supported_list. - - DATA: lv_type LIKE LINE OF rt_types, - lt_snode TYPE TABLE OF snode. - - FIELD-SYMBOLS: LIKE LINE OF lt_snode. - - - CALL FUNCTION 'WB_TREE_ACTUALIZE' - EXPORTING - tree_name = 'PG_ZABAPGIT' - without_crossreference = abap_true - with_tcode_index = abap_true - TABLES - p_tree = lt_snode. - - DELETE lt_snode WHERE type <> 'OPL' - OR name NP 'LCL_OBJECT_++++'. - - LOOP AT lt_snode ASSIGNING . - lv_type = -name+11. - APPEND lv_type TO rt_types. - ENDLOOP. - - ENDMETHOD. "supported_list - - METHOD exists. - - DATA: li_obj TYPE REF TO zif_abapgit_object. - - - TRY. - li_obj = create_object( is_item = is_item - iv_language = zif_abapgit_definitions=>gc_english ). - rv_bool = li_obj->exists( ). - CATCH zcx_abapgit_exception. -* ignore all errors and assume the object exists - rv_bool = abap_true. - ENDTRY. - - ENDMETHOD. "exists - - METHOD class_name. - - CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type INTO rv_class_name. "#EC NOTEXT - - ENDMETHOD. "class_name - - METHOD jump. - - DATA: li_obj TYPE REF TO zif_abapgit_object, - lv_adt_jump_enabled TYPE abap_bool. - - li_obj = create_object( is_item = is_item - iv_language = zif_abapgit_definitions=>gc_english ). - - lv_adt_jump_enabled = zcl_abapgit_persist_settings=>get_instance( )->read( )->get_adt_jump_enabled( ). - - IF lv_adt_jump_enabled = abap_true. - TRY. - zcl_abapgit_objects_super=>jump_adt( - i_obj_name = is_item-obj_name - i_obj_type = is_item-obj_type ). - CATCH zcx_abapgit_exception. - li_obj->jump( ). - ENDTRY. - ELSE. - li_obj->jump( ). - ENDIF. - - ENDMETHOD. "jump - - METHOD changed_by. - - DATA: li_obj TYPE REF TO zif_abapgit_object. - - - IF is_item IS INITIAL. -* eg. ".abapgit.xml" file - rv_user = zcl_abapgit_objects_super=>c_user_unknown. - ELSE. - li_obj = create_object( is_item = is_item - iv_language = zif_abapgit_definitions=>gc_english ). - rv_user = li_obj->changed_by( ). - ENDIF. - - ASSERT NOT rv_user IS INITIAL. - -* todo, fallback to looking at transports if rv_user = 'UNKNOWN'? - - ENDMETHOD. METHOD delete. @@ -324,6 +291,7 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "delete + METHOD delete_obj. DATA: li_obj TYPE REF TO zif_abapgit_object. @@ -348,87 +316,6 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "delete - METHOD serialize. - - DATA: li_obj TYPE REF TO zif_abapgit_object, - lo_xml TYPE REF TO zcl_abapgit_xml_output, - lo_files TYPE REF TO zcl_abapgit_objects_files. - - - IF is_supported( is_item ) = abap_false. - IF NOT io_log IS INITIAL. - io_log->add( iv_msg = |Object type ignored, not supported: { is_item-obj_type - }-{ is_item-obj_name }| - iv_type = 'E' ). - ENDIF. - RETURN. - ENDIF. - - CREATE OBJECT lo_files - EXPORTING - is_item = is_item. - - li_obj = create_object( is_item = is_item - iv_language = iv_language ). - li_obj->mo_files = lo_files. - CREATE OBJECT lo_xml. - li_obj->serialize( lo_xml ). - lo_files->add_xml( io_xml = lo_xml - is_metadata = li_obj->get_metadata( ) ). - - rt_files = lo_files->get_files( ). - - check_duplicates( rt_files ). - - ENDMETHOD. "serialize - - METHOD check_duplicates. - - DATA: lt_files TYPE zif_abapgit_definitions=>ty_files_tt. - - - lt_files[] = it_files[]. - SORT lt_files BY path ASCENDING filename ASCENDING. - DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path filename. - IF lines( lt_files ) <> lines( it_files ). - zcx_abapgit_exception=>raise( 'Duplicates' ). - ENDIF. - - ENDMETHOD. - - METHOD prioritize_deser. - - FIELD-SYMBOLS: LIKE LINE OF it_results. - -* XSLT has to be handled before CLAS/PROG - LOOP AT it_results ASSIGNING WHERE obj_type = 'XSLT'. - APPEND TO rt_results. - ENDLOOP. - -* PROG before internet services, as the services might use the screens - LOOP AT it_results ASSIGNING WHERE obj_type = 'PROG'. - APPEND TO rt_results. - ENDLOOP. - -* ISAP has to be handled before ISRP - LOOP AT it_results ASSIGNING WHERE obj_type = 'IASP'. - APPEND TO rt_results. - ENDLOOP. - -* PINF has to be handled before DEVC for package interface usage - LOOP AT it_results ASSIGNING WHERE obj_type = 'PINF'. - APPEND TO rt_results. - ENDLOOP. - - LOOP AT it_results ASSIGNING - WHERE obj_type <> 'IASP' - AND obj_type <> 'PROG' - AND obj_type <> 'XSLT' - AND obj_type <> 'PINF'. - APPEND TO rt_results. - ENDLOOP. - - ENDMETHOD. "prioritize_deser METHOD deserialize. @@ -457,7 +344,7 @@ CLASS lcl_objects IMPLEMENTATION. lt_remote = io_repo->get_files_remote( ). - lt_results = lcl_file_status=>status( io_repo ). + lt_results = zcl_abapgit_file_status=>status( io_repo ). DELETE lt_results WHERE match = abap_true. " Full match SORT lt_results BY obj_type ASCENDING obj_name ASCENDING. DELETE ADJACENT DUPLICATES FROM lt_results COMPARING obj_type obj_name. @@ -555,6 +442,7 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "deserialize + METHOD deserialize_objects. DATA: lo_progress TYPE REF TO zcl_abapgit_progress. @@ -582,40 +470,279 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. - METHOD compare_remote_to_local. -* this method is used for comparing local with remote objects -* before pull, this is useful eg. when overwriting a TABL object. -* only the main XML file is used for comparison - DATA: ls_remote_file TYPE zif_abapgit_definitions=>ty_file, - lo_remote_version TYPE REF TO zcl_abapgit_xml_input, - lv_count TYPE i, - lo_comparison_result TYPE REF TO zif_abapgit_comparison_result. + METHOD exists. + + DATA: li_obj TYPE REF TO zif_abapgit_object. - FIND ALL OCCURRENCES OF '.' IN is_result-filename MATCH COUNT lv_count. + TRY. + li_obj = create_object( is_item = is_item + iv_language = zif_abapgit_definitions=>gc_english ). + rv_bool = li_obj->exists( ). + CATCH zcx_abapgit_exception. +* ignore all errors and assume the object exists + rv_bool = abap_true. + ENDTRY. - IF is_result-filename CS '.XML' AND lv_count = 2. - IF io_object->exists( ) = abap_false. - RETURN. + ENDMETHOD. "exists + + + METHOD has_changed_since. + rv_changed = abap_true. " Assume changed + + IF is_supported( is_item ) = abap_false. + RETURN. " Will requre serialize which will log the error + ENDIF. + + rv_changed = create_object( + is_item = is_item + iv_language = zif_abapgit_definitions=>gc_english )->has_changed_since( iv_timestamp ). + + ENDMETHOD. "has_changed_since + + + METHOD is_supported. + + TRY. + create_object( is_item = is_item + iv_language = zif_abapgit_definitions=>gc_english + iv_native_only = iv_native_only ). + rv_bool = abap_true. + CATCH zcx_abapgit_exception. + rv_bool = abap_false. + ENDTRY. + + ENDMETHOD. "is_supported + + + METHOD jump. + + DATA: li_obj TYPE REF TO zif_abapgit_object, + lv_adt_jump_enabled TYPE abap_bool. + + li_obj = create_object( is_item = is_item + iv_language = zif_abapgit_definitions=>gc_english ). + + lv_adt_jump_enabled = zcl_abapgit_persist_settings=>get_instance( )->read( )->get_adt_jump_enabled( ). + + IF lv_adt_jump_enabled = abap_true. + TRY. + zcl_abapgit_objects_super=>jump_adt( + i_obj_name = is_item-obj_name + i_obj_type = is_item-obj_type ). + CATCH zcx_abapgit_exception. + li_obj->jump( ). + ENDTRY. + ELSE. + li_obj->jump( ). + ENDIF. + + ENDMETHOD. "jump + + + METHOD prioritize_deser. + + FIELD-SYMBOLS: LIKE LINE OF it_results. + +* XSLT has to be handled before CLAS/PROG + LOOP AT it_results ASSIGNING WHERE obj_type = 'XSLT'. + APPEND TO rt_results. + ENDLOOP. + +* PROG before internet services, as the services might use the screens + LOOP AT it_results ASSIGNING WHERE obj_type = 'PROG'. + APPEND TO rt_results. + ENDLOOP. + +* ISAP has to be handled before ISRP + LOOP AT it_results ASSIGNING WHERE obj_type = 'IASP'. + APPEND TO rt_results. + ENDLOOP. + +* PINF has to be handled before DEVC for package interface usage + LOOP AT it_results ASSIGNING WHERE obj_type = 'PINF'. + APPEND TO rt_results. + ENDLOOP. + + LOOP AT it_results ASSIGNING + WHERE obj_type <> 'IASP' + AND obj_type <> 'PROG' + AND obj_type <> 'XSLT' + AND obj_type <> 'PINF'. + APPEND TO rt_results. + ENDLOOP. + + ENDMETHOD. "prioritize_deser + + + METHOD serialize. + + DATA: li_obj TYPE REF TO zif_abapgit_object, + lo_xml TYPE REF TO zcl_abapgit_xml_output, + lo_files TYPE REF TO zcl_abapgit_objects_files. + + + IF is_supported( is_item ) = abap_false. + IF NOT io_log IS INITIAL. + io_log->add( iv_msg = |Object type ignored, not supported: { is_item-obj_type + }-{ is_item-obj_name }| + iv_type = 'E' ). + ENDIF. + RETURN. + ENDIF. + + CREATE OBJECT lo_files + EXPORTING + is_item = is_item. + + li_obj = create_object( is_item = is_item + iv_language = iv_language ). + li_obj->mo_files = lo_files. + CREATE OBJECT lo_xml. + li_obj->serialize( lo_xml ). + lo_files->add_xml( io_xml = lo_xml + is_metadata = li_obj->get_metadata( ) ). + + rt_files = lo_files->get_files( ). + + check_duplicates( rt_files ). + + ENDMETHOD. "serialize + + + METHOD supported_list. + + DATA: lv_type LIKE LINE OF rt_types, + lt_snode TYPE TABLE OF snode. + + FIELD-SYMBOLS: LIKE LINE OF lt_snode. + + + CALL FUNCTION 'WB_TREE_ACTUALIZE' + EXPORTING + tree_name = 'PG_ZABAPGIT' + without_crossreference = abap_true + with_tcode_index = abap_true + TABLES + p_tree = lt_snode. + + DELETE lt_snode WHERE type <> 'OPL' + OR name NP 'LCL_OBJECT_++++'. + + LOOP AT lt_snode ASSIGNING . + lv_type = -name+11. + APPEND lv_type TO rt_types. + ENDLOOP. + + ENDMETHOD. "supported_list + + + METHOD update_package_tree. + + DATA: lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt, + lv_package LIKE LINE OF lt_packages, + lv_tree TYPE dirtree-tname. + + + lt_packages = zcl_abapgit_sap_package=>get( iv_package )->list_subpackages( ). + APPEND iv_package TO lt_packages. + + LOOP AT lt_packages INTO lv_package. +* update package tree for SE80 + lv_tree = 'EU_' && lv_package. + CALL FUNCTION 'WB_TREE_ACTUALIZE' + EXPORTING + tree_name = lv_tree + without_crossreference = abap_true + with_tcode_index = abap_true. + ENDLOOP. + + ENDMETHOD. "update_package_tree + + + METHOD warning_overwrite. + + DATA: lt_results_overwrite LIKE ct_results, + lt_confirmed_overwrite LIKE ct_results, + lt_columns TYPE stringtab. + + FIELD-SYMBOLS: LIKE LINE OF ct_results. + + LOOP AT ct_results ASSIGNING + WHERE NOT obj_type IS INITIAL. + + IF -lstate IS NOT INITIAL + AND -lstate <> zif_abapgit_definitions=>gc_state-deleted + AND NOT ( -lstate = zif_abapgit_definitions=>gc_state-added + AND -rstate IS INITIAL ). + + "current object has been modified locally, add to table for popup + APPEND TO lt_results_overwrite. ENDIF. - READ TABLE it_remote WITH KEY filename = is_result-filename INTO ls_remote_file. + ENDLOOP. - "if file does not exist in remote, we don't need to validate - IF sy-subrc = 0. - CREATE OBJECT lo_remote_version - EXPORTING - iv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( ls_remote_file-data ). - lo_comparison_result = io_object->compare_to_remote_version( lo_remote_version ). - lo_comparison_result->show_confirmation_dialog( ). + IF lines( lt_results_overwrite ) > 0. - IF lo_comparison_result->is_result_complete_halt( ) = abap_true. - zcx_abapgit_exception=>raise( 'Deserialization aborted by user' ). + INSERT `OBJ_TYPE` INTO TABLE lt_columns. + INSERT `OBJ_NAME` INTO TABLE lt_columns. + + "all returned objects will be overwritten + zcl_abapgit_popups=>popup_to_select_from_list( + EXPORTING + it_list = lt_results_overwrite + i_header_text = |The following Objects have been modified locally.| + && | Select the Objects which should be overwritten.| + i_select_column_text = 'Overwrite?' + it_columns_to_display = lt_columns + IMPORTING + et_list = lt_confirmed_overwrite ). + + LOOP AT lt_results_overwrite ASSIGNING . + READ TABLE lt_confirmed_overwrite TRANSPORTING NO FIELDS + WITH KEY obj_type = -obj_type + obj_name = -obj_name. + IF sy-subrc <> 0. + DELETE TABLE ct_results FROM . ENDIF. - ENDIF. + ENDLOOP. ENDIF. ENDMETHOD. -ENDCLASS. "lcl_objects IMPLEMENTATION + + METHOD warning_package. + + DATA: lv_question TYPE c LENGTH 200, + lv_answer TYPE c, + ls_tadir TYPE tadir. + + + ls_tadir = zcl_abapgit_tadir=>read_single( + iv_object = is_item-obj_type + iv_obj_name = is_item-obj_name ). + + IF NOT ls_tadir IS INITIAL AND ls_tadir-devclass <> iv_package. + CONCATENATE 'Overwrite object' is_item-obj_type is_item-obj_name + 'from package' ls_tadir-devclass + INTO lv_question SEPARATED BY space. "#EC NOTEXT + + lv_answer = zcl_abapgit_popups=>popup_to_confirm( + titlebar = 'Warning' + text_question = lv_question + text_button_1 = 'Ok' + icon_button_1 = 'ICON_DELETE' + text_button_2 = 'Cancel' + icon_button_2 = 'ICON_CANCEL' + default_button = '2' + display_cancel_button = abap_false ). "#EC NOTEXT + + IF lv_answer = '2'. + rv_cancel = abap_true. + ENDIF. + + ENDIF. + + ENDMETHOD. "check_warning +ENDCLASS. diff --git a/src/zcl_abapgit_objects.clas.xml b/src/zcl_abapgit_objects.clas.xml new file mode 100644 index 000000000..bf6ddc6a9 --- /dev/null +++ b/src/zcl_abapgit_objects.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_OBJECTS + 1 + E + Objects + 2 + 1 + X + X + X + + + + diff --git a/src/zcl_abapgit_objects_bridge.clas.abap b/src/zcl_abapgit_objects_bridge.clas.abap new file mode 100644 index 000000000..0c5de88eb --- /dev/null +++ b/src/zcl_abapgit_objects_bridge.clas.abap @@ -0,0 +1,192 @@ +CLASS zcl_abapgit_objects_bridge DEFINITION PUBLIC FINAL CREATE PUBLIC INHERITING FROM zcl_abapgit_objects_super. + + PUBLIC SECTION. + + CLASS-METHODS class_constructor. + + METHODS constructor + IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + RAISING cx_sy_create_object_error. + + INTERFACES zif_abapgit_object. + ALIASES mo_files FOR zif_abapgit_object~mo_files. + + PRIVATE SECTION. + DATA: mo_plugin TYPE REF TO object. + + TYPES: BEGIN OF ty_s_objtype_map, + obj_typ TYPE trobjtype, + plugin_class TYPE seoclsname, + END OF ty_s_objtype_map, + ty_t_objtype_map TYPE SORTED TABLE OF ty_s_objtype_map WITH UNIQUE KEY obj_typ. + + CLASS-DATA gt_objtype_map TYPE ty_t_objtype_map. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECTS_BRIDGE IMPLEMENTATION. + + + METHOD class_constructor. + + DATA lt_plugin_class TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY. + DATA lv_plugin_class LIKE LINE OF lt_plugin_class. + DATA lo_plugin TYPE REF TO object. + DATA lt_plugin_obj_type TYPE objtyptable. + DATA ls_objtype_map LIKE LINE OF gt_objtype_map. + + + SELECT ext~clsname + FROM vseoextend AS ext + INTO TABLE lt_plugin_class + WHERE ext~refclsname LIKE 'ZCL_ABAPGITP_OBJECT%' + AND ext~version = '1'. "#EC CI_SUBRC + + CLEAR gt_objtype_map. + LOOP AT lt_plugin_class INTO lv_plugin_class + WHERE table_line <> 'ZCL_ABAPGITP_OBJECT_BY_SOBJ'. +* have the generic plugin only as fallback + TRY. + CREATE OBJECT lo_plugin TYPE (lv_plugin_class). + CATCH cx_sy_create_object_error. + CONTINUE. ">>>>>>>>>>>>>> + ENDTRY. + + CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES') + IMPORTING + rt_obj_type = lt_plugin_obj_type. + + ls_objtype_map-plugin_class = lv_plugin_class. + LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ. + INSERT ls_objtype_map INTO TABLE gt_objtype_map. + IF sy-subrc <> 0. +* No exception in class-contructor possible. +* Anyway, a shortdump is more appropriate in this case + ASSERT 'There must not be' = + |multiple abapGit-Plugins for the same object type { + ls_objtype_map-obj_typ }|. + ENDIF. + ENDLOOP. + ENDLOOP. "at plugins + +* and the same for the generic plugin if exists +* have the generic plugin only as fallback + LOOP AT lt_plugin_class INTO lv_plugin_class + WHERE table_line = 'ZCL_ABAPGITP_OBJECT_BY_SOBJ'. + CREATE OBJECT lo_plugin TYPE (lv_plugin_class). + + CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES') + RECEIVING + rt_obj_type = lt_plugin_obj_type. + + ls_objtype_map-plugin_class = lv_plugin_class. + LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ. + INSERT ls_objtype_map INTO TABLE gt_objtype_map. "knowingly ignore the subrc + ENDLOOP. + ENDLOOP. "at plugins + + ENDMETHOD. "class_constructor + + + METHOD constructor. + + DATA ls_objtype_map LIKE LINE OF gt_objtype_map. + + super->constructor( is_item = is_item + iv_language = zif_abapgit_definitions=>gc_english ). + +* determine the responsible plugin + READ TABLE gt_objtype_map INTO ls_objtype_map + WITH TABLE KEY obj_typ = is_item-obj_type. + IF sy-subrc = 0. + CREATE OBJECT mo_plugin TYPE (ls_objtype_map-plugin_class). + + CALL METHOD mo_plugin->('SET_ITEM') + EXPORTING + iv_obj_type = is_item-obj_type + iv_obj_name = is_item-obj_name. + ELSE. + RAISE EXCEPTION TYPE cx_sy_create_object_error + EXPORTING + classname = 'LCL_OBJECTS_BRIDGE'. + ENDIF. + ENDMETHOD. "constructor + + + METHOD zif_abapgit_object~changed_by. + rv_user = c_user_unknown. " todo + ENDMETHOD. + + + METHOD zif_abapgit_object~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. + ENDMETHOD. + + + METHOD zif_abapgit_object~delete. + DATA lx_plugin TYPE REF TO cx_static_check. + + TRY. + CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~DELETE'). + CATCH cx_static_check INTO lx_plugin. + zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ). + ENDTRY. + + ENDMETHOD. "lif_object~delete + + + METHOD zif_abapgit_object~deserialize. + + DATA: lx_plugin TYPE REF TO cx_static_check. + + TRY. + CALL METHOD mo_plugin->('WRAP_DESERIALIZE') + EXPORTING + iv_package = iv_package + io_xml = io_xml. + CATCH cx_static_check INTO lx_plugin. + zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ). + ENDTRY. + ENDMETHOD. "lif_object~deserialize + + + METHOD zif_abapgit_object~exists. + + CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~EXISTS') + RECEIVING + rv_bool = rv_bool. + + ENDMETHOD. "lif_object~exists + + + METHOD zif_abapgit_object~get_metadata. + + CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~GET_METADATA') + RECEIVING + rs_metadata = rs_metadata. + + ENDMETHOD. "lif_object~get_metadata + + + METHOD zif_abapgit_object~has_changed_since. + rv_changed = abap_true. + ENDMETHOD. "lif_object~has_changed_since + + + METHOD zif_abapgit_object~jump. + + CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~JUMP'). + + ENDMETHOD. "lif_object~jump + + + METHOD zif_abapgit_object~serialize. + + CALL METHOD mo_plugin->('WRAP_SERIALIZE') + EXPORTING + io_xml = io_xml. + + ENDMETHOD. "lif_object~serialize +ENDCLASS. diff --git a/src/zcl_abapgit_objects_bridge.clas.xml b/src/zcl_abapgit_objects_bridge.clas.xml new file mode 100644 index 000000000..af3ba5380 --- /dev/null +++ b/src/zcl_abapgit_objects_bridge.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_OBJECTS_BRIDGE + 1 + E + Bridge to abapGit-Plugins + 2 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_repo.clas.abap b/src/zcl_abapgit_repo.clas.abap new file mode 100644 index 000000000..76dec196a --- /dev/null +++ b/src/zcl_abapgit_repo.clas.abap @@ -0,0 +1,576 @@ +CLASS zcl_abapgit_repo DEFINITION + PUBLIC + ABSTRACT + CREATE PUBLIC + GLOBAL FRIENDS zcl_abapgit_repo_srv . + + PUBLIC SECTION. + + METHODS constructor + IMPORTING + !is_data TYPE zcl_abapgit_persistence_repo=>ty_repo . + METHODS get_key + RETURNING + VALUE(rv_key) TYPE zif_abapgit_persistence=>ty_value . + METHODS get_name + RETURNING + VALUE(rv_name) TYPE string + RAISING + zcx_abapgit_exception . + METHODS get_files_local + IMPORTING + !io_log TYPE REF TO zcl_abapgit_log OPTIONAL + !it_filter TYPE scts_tadir OPTIONAL + RETURNING + VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_item_tt + RAISING + zcx_abapgit_exception . + METHODS get_local_checksums + RETURNING + VALUE(rt_checksums) TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt . + METHODS get_local_checksums_per_file + RETURNING + VALUE(rt_checksums) TYPE zif_abapgit_definitions=>ty_file_signatures_tt . + METHODS get_files_remote + RETURNING + VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt + RAISING + zcx_abapgit_exception . + METHODS get_package + RETURNING + VALUE(rv_package) TYPE zcl_abapgit_persistence_repo=>ty_repo-package . + METHODS get_master_language + RETURNING + VALUE(rv_language) TYPE spras . + METHODS is_write_protected + RETURNING + VALUE(rv_yes) TYPE sap_bool . + METHODS ignore_subpackages + RETURNING + VALUE(rv_yes) TYPE sap_bool . + METHODS delete + RAISING + zcx_abapgit_exception . + METHODS get_dot_abapgit + RETURNING + VALUE(ro_dot_abapgit) TYPE REF TO zcl_abapgit_dot_abapgit . + METHODS set_dot_abapgit + IMPORTING + !io_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit + RAISING + zcx_abapgit_exception . + METHODS deserialize + RAISING + zcx_abapgit_exception . + METHODS refresh + IMPORTING + !iv_drop_cache TYPE abap_bool DEFAULT abap_false + RAISING + zcx_abapgit_exception . + METHODS refresh_local . + METHODS update_local_checksums + IMPORTING + !it_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt + RAISING + zcx_abapgit_exception . + METHODS rebuild_local_checksums + RAISING + zcx_abapgit_exception . + METHODS find_remote_dot_abapgit + RETURNING + VALUE(ro_dot) TYPE REF TO zcl_abapgit_dot_abapgit + RAISING + zcx_abapgit_exception . + METHODS is_offline + RETURNING + VALUE(rv_offline) TYPE abap_bool + RAISING + zcx_abapgit_exception . + METHODS set_files_remote + IMPORTING + !it_files TYPE zif_abapgit_definitions=>ty_files_tt + RAISING + zcx_abapgit_exception . + PROTECTED SECTION. + DATA: mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + mt_remote TYPE zif_abapgit_definitions=>ty_files_tt, + mv_do_local_refresh TYPE abap_bool, + mv_last_serialization TYPE timestamp, + ms_data TYPE zcl_abapgit_persistence_repo=>ty_repo. + + METHODS: + set + IMPORTING iv_sha1 TYPE zif_abapgit_definitions=>ty_sha1 OPTIONAL + it_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt OPTIONAL + iv_url TYPE zcl_abapgit_persistence_repo=>ty_repo-url OPTIONAL + iv_branch_name TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name OPTIONAL + iv_head_branch TYPE zcl_abapgit_persistence_repo=>ty_repo-head_branch OPTIONAL + iv_offline TYPE zcl_abapgit_persistence_repo=>ty_repo-offline OPTIONAL + is_dot_abapgit TYPE zcl_abapgit_persistence_repo=>ty_repo-dot_abapgit OPTIONAL + RAISING zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION. + + + METHOD constructor. + + ASSERT NOT is_data-key IS INITIAL. + + ms_data = is_data. + + ENDMETHOD. "constructor + + + METHOD delete. + + DATA: lo_persistence TYPE REF TO zcl_abapgit_persistence_repo. + + + CREATE OBJECT lo_persistence. + + lo_persistence->delete( ms_data-key ). + + ENDMETHOD. "delete + + + METHOD deserialize. + + DATA: lt_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt, + lt_requirements TYPE STANDARD TABLE OF zif_abapgit_dot_abapgit=>ty_requirement, + lx_error TYPE REF TO zcx_abapgit_exception. + + find_remote_dot_abapgit( ). + + IF get_dot_abapgit( )->get_master_language( ) <> sy-langu. + zcx_abapgit_exception=>raise( 'Current login language does not match master language' ). + ENDIF. + + lt_requirements = get_dot_abapgit( )->get_data( )-requirements. + IF lt_requirements IS NOT INITIAL. + zcl_abapgit_requirement_helper=>check_requirements( it_requirements = lt_requirements + iv_show_popup = abap_true ). + ENDIF. + + TRY. + lt_updated_files = zcl_abapgit_objects=>deserialize( me ). + + CATCH zcx_abapgit_exception INTO lx_error. + + " ensure to reset default transport request task + zcl_abapgit_default_task=>get_instance( )->reset( ). + zcx_abapgit_exception=>raise( lx_error->text ). + + ENDTRY. + + APPEND get_dot_abapgit( )->get_signature( ) TO lt_updated_files. + + CLEAR: mt_local, mv_last_serialization. + + update_local_checksums( lt_updated_files ). + + ENDMETHOD. + + + METHOD find_remote_dot_abapgit. + + FIELD-SYMBOLS: LIKE LINE OF mt_remote. + + + READ TABLE mt_remote ASSIGNING + WITH KEY path = zif_abapgit_definitions=>gc_root_dir + filename = zif_abapgit_definitions=>gc_dot_abapgit. + IF sy-subrc = 0. + ro_dot = zcl_abapgit_dot_abapgit=>deserialize( -data ). + set_dot_abapgit( ro_dot ). + ENDIF. + + ENDMETHOD. + + + METHOD get_dot_abapgit. + CREATE OBJECT ro_dot_abapgit + EXPORTING + is_data = ms_data-dot_abapgit. + ENDMETHOD. + + + METHOD get_files_local. + + DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, + ls_item TYPE zif_abapgit_definitions=>ty_item, + lt_files TYPE zif_abapgit_definitions=>ty_files_tt, + lo_progress TYPE REF TO zcl_abapgit_progress, + lt_cache TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_file_item + WITH NON-UNIQUE KEY item. + + DATA: lt_filter TYPE SORTED TABLE OF tadir + WITH NON-UNIQUE KEY object obj_name, + lv_filter_exist TYPE abap_bool. + + FIELD-SYMBOLS: LIKE LINE OF lt_files, + LIKE LINE OF rt_files, + LIKE LINE OF lt_cache, + LIKE LINE OF lt_tadir. + + + " Serialization happened before and no refresh request + IF mv_last_serialization IS NOT INITIAL AND mv_do_local_refresh = abap_false. + rt_files = mt_local. + RETURN. + ENDIF. + + APPEND INITIAL LINE TO rt_files ASSIGNING . + -file-path = zif_abapgit_definitions=>gc_root_dir. + -file-filename = zif_abapgit_definitions=>gc_dot_abapgit. + -file-data = get_dot_abapgit( )->serialize( ). + -file-sha1 = zcl_abapgit_hash=>sha1( iv_type = zif_abapgit_definitions=>gc_type-blob + iv_data = -file-data ). + + lt_cache = mt_local. + lt_tadir = zcl_abapgit_tadir=>read( + iv_package = get_package( ) + iv_ignore_subpackages = ignore_subpackages( ) + io_dot = get_dot_abapgit( ) + io_log = io_log ). + + lt_filter = it_filter. + lv_filter_exist = boolc( lines( lt_filter ) > 0 ). + + CREATE OBJECT lo_progress + EXPORTING + iv_total = lines( lt_tadir ). + + LOOP AT lt_tadir ASSIGNING . + IF lv_filter_exist = abap_true. + READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY object = -object + obj_name = -obj_name + BINARY SEARCH. + IF sy-subrc <> 0. + CONTINUE. + ENDIF. + ENDIF. + + lo_progress->show( + iv_current = sy-tabix + iv_text = |Serialize { -obj_name }| ) ##NO_TEXT. + + ls_item-obj_type = -object. + ls_item-obj_name = -obj_name. + ls_item-devclass = -devclass. + + IF mv_last_serialization IS NOT INITIAL. " Try to fetch from cache + READ TABLE lt_cache TRANSPORTING NO FIELDS + WITH KEY item = ls_item. " type+name+package key + " There is something in cache and the object is unchanged + IF sy-subrc = 0 + AND abap_false = zcl_abapgit_objects=>has_changed_since( + is_item = ls_item + iv_timestamp = mv_last_serialization ). + LOOP AT lt_cache ASSIGNING WHERE item = ls_item. + APPEND TO rt_files. + ENDLOOP. + + CONTINUE. + ENDIF. + ENDIF. + + lt_files = zcl_abapgit_objects=>serialize( + is_item = ls_item + iv_language = get_master_language( ) + io_log = io_log ). + LOOP AT lt_files ASSIGNING . + -path = -path. + -sha1 = zcl_abapgit_hash=>sha1( + iv_type = zif_abapgit_definitions=>gc_type-blob + iv_data = -data ). + + APPEND INITIAL LINE TO rt_files ASSIGNING . + -file = . + -item = ls_item. + ENDLOOP. + ENDLOOP. + + GET TIME STAMP FIELD mv_last_serialization. + mt_local = rt_files. + mv_do_local_refresh = abap_false. " Fulfill refresh + + ENDMETHOD. + + + METHOD get_files_remote. + rt_files = mt_remote. + ENDMETHOD. + + + METHOD get_key. + rv_key = ms_data-key. + ENDMETHOD. "get_key + + + METHOD get_local_checksums. + rt_checksums = ms_data-local_checksums. + ENDMETHOD. + + + METHOD get_local_checksums_per_file. + + FIELD-SYMBOLS LIKE LINE OF ms_data-local_checksums. + + LOOP AT ms_data-local_checksums ASSIGNING . + APPEND LINES OF -files TO rt_checksums. + ENDLOOP. + + ENDMETHOD. + + + METHOD get_master_language. + rv_language = ms_data-dot_abapgit-master_language. + ENDMETHOD. + + + METHOD get_name. + + IF ms_data-offline = abap_true. + rv_name = ms_data-url. + ELSE. + rv_name = zcl_abapgit_url=>name( ms_data-url ). + rv_name = cl_http_utility=>if_http_utility~unescape_url( rv_name ). + ENDIF. + + ENDMETHOD. "get_name + + + METHOD get_package. + rv_package = ms_data-package. + ENDMETHOD. "get_package + + + METHOD ignore_subpackages. + rv_yes = ms_data-ignore_subpackages. + ENDMETHOD. + + + METHOD is_offline. + rv_offline = ms_data-offline. + ENDMETHOD. + + + METHOD is_write_protected. + rv_yes = ms_data-write_protect. + ENDMETHOD. "is_write_protected + + + METHOD rebuild_local_checksums. "LOCAL (BASE) + + DATA: lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + ls_last_item TYPE zif_abapgit_definitions=>ty_item, + lt_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_checksums, + LIKE LINE OF -files, + LIKE LINE OF lt_local. + + + lt_local = get_files_local( ). + + DELETE lt_local " Remove non-code related files except .abapgit + WHERE item IS INITIAL + AND NOT ( file-path = zif_abapgit_definitions=>gc_root_dir + AND file-filename = zif_abapgit_definitions=>gc_dot_abapgit ). + + SORT lt_local BY item. + + LOOP AT lt_local ASSIGNING . + IF ls_last_item <> -item OR sy-tabix = 1. " First or New item reached ? + APPEND INITIAL LINE TO lt_checksums ASSIGNING . + -item = -item. + ls_last_item = -item. + ENDIF. + + APPEND INITIAL LINE TO -files ASSIGNING . + MOVE-CORRESPONDING -file TO . + + ENDLOOP. + + set( it_checksums = lt_checksums ). + + ENDMETHOD. " rebuild_local_checksums. + + + METHOD refresh. + + mv_do_local_refresh = abap_true. + + IF iv_drop_cache = abap_true. + CLEAR: mv_last_serialization, mt_local. + ENDIF. + + ENDMETHOD. "refresh + + + METHOD refresh_local. " For testing purposes, maybe removed later + mv_do_local_refresh = abap_true. + ENDMETHOD. "refresh_local + + + METHOD set. + + DATA: lo_persistence TYPE REF TO zcl_abapgit_persistence_repo. + + + ASSERT iv_sha1 IS SUPPLIED + OR it_checksums IS SUPPLIED + OR iv_url IS SUPPLIED + OR iv_branch_name IS SUPPLIED + OR iv_head_branch IS SUPPLIED + OR iv_offline IS SUPPLIED + OR is_dot_abapgit IS SUPPLIED. + + CREATE OBJECT lo_persistence. + + IF iv_sha1 IS SUPPLIED. + lo_persistence->update_sha1( + iv_key = ms_data-key + iv_branch_sha1 = iv_sha1 ). + ms_data-sha1 = iv_sha1. + ENDIF. + + IF it_checksums IS SUPPLIED. + lo_persistence->update_local_checksums( + iv_key = ms_data-key + it_checksums = it_checksums ). + ms_data-local_checksums = it_checksums. + ENDIF. + + IF iv_url IS SUPPLIED. + lo_persistence->update_url( + iv_key = ms_data-key + iv_url = iv_url ). + ms_data-url = iv_url. + ENDIF. + + IF iv_branch_name IS SUPPLIED. + lo_persistence->update_branch_name( + iv_key = ms_data-key + iv_branch_name = iv_branch_name ). + ms_data-branch_name = iv_branch_name. + ENDIF. + + IF iv_head_branch IS SUPPLIED. + lo_persistence->update_head_branch( + iv_key = ms_data-key + iv_head_branch = iv_head_branch ). + ms_data-head_branch = iv_head_branch. + ENDIF. + + IF iv_offline IS SUPPLIED. + lo_persistence->update_offline( + iv_key = ms_data-key + iv_offline = iv_offline ). + ms_data-offline = iv_offline. + ENDIF. + + IF is_dot_abapgit IS SUPPLIED. + lo_persistence->update_dot_abapgit( + iv_key = ms_data-key + is_dot_abapgit = is_dot_abapgit ). + ms_data-dot_abapgit = is_dot_abapgit. + ENDIF. + + ENDMETHOD. + + + METHOD set_dot_abapgit. + set( is_dot_abapgit = io_dot_abapgit->get_data( ) ). + ENDMETHOD. + + + METHOD set_files_remote. + + mt_remote = it_files. + + ENDMETHOD. + + + METHOD update_local_checksums. + + " ASSUMTION: SHA1 in param is actual and correct. + " Push fills it from local files before pushing, deserialize from remote + " If this is not true that there is an error somewhere but not here + + DATA: lt_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt, + lt_files_idx TYPE zif_abapgit_definitions=>ty_file_signatures_tt, + lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + lv_chks_row TYPE i, + lv_file_row TYPE i. + + FIELD-SYMBOLS: LIKE LINE OF lt_checksums, + LIKE LINE OF -files, + LIKE LINE OF lt_local, + LIKE LINE OF it_files. + + lt_checksums = get_local_checksums( ). + lt_files_idx = it_files. + SORT lt_files_idx BY path filename. " Sort for binary search + + " Loop through current chacksum state, update sha1 for common files + LOOP AT lt_checksums ASSIGNING . + lv_chks_row = sy-tabix. + + LOOP AT -files ASSIGNING . + lv_file_row = sy-tabix. + + READ TABLE lt_files_idx ASSIGNING + WITH KEY path = -path filename = -filename + BINARY SEARCH. + CHECK sy-subrc = 0. " Missing in param table, skip + + IF -sha1 IS INITIAL. " Empty input sha1 is a deletion marker + DELETE -files INDEX lv_file_row. + ELSE. + -sha1 = -sha1. " Update sha1 + CLEAR -sha1. " Mark as processed + ENDIF. + ENDLOOP. + + IF lines( -files ) = 0. " Remove empty objects + DELETE lt_checksums INDEX lv_chks_row. + ENDIF. + ENDLOOP. + + DELETE lt_files_idx WHERE sha1 IS INITIAL. " Remove processed + IF lines( lt_files_idx ) > 0. + lt_local = get_files_local( ). + SORT lt_local BY file-path file-filename. " Sort for binary search + ENDIF. + + " Add new files - not deleted and not marked as processed above + LOOP AT lt_files_idx ASSIGNING . + + READ TABLE lt_local ASSIGNING + WITH KEY file-path = -path file-filename = -filename + BINARY SEARCH. + IF sy-subrc <> 0. +* if the deserialization fails, the local file might not be there + CONTINUE. + ENDIF. + + READ TABLE lt_checksums ASSIGNING " TODO Optimize + WITH KEY item = -item. + IF sy-subrc > 0. + APPEND INITIAL LINE TO lt_checksums ASSIGNING . + -item = -item. + ENDIF. + + APPEND TO -files. + ENDLOOP. + + SORT lt_checksums BY item. + set( it_checksums = lt_checksums ). + + ENDMETHOD. " update_local_checksums +ENDCLASS. diff --git a/src/zcl_abapgit_repo.clas.xml b/src/zcl_abapgit_repo.clas.xml new file mode 100644 index 000000000..a4cb82f01 --- /dev/null +++ b/src/zcl_abapgit_repo.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_REPO + 1 + E + Repository + 2 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_repo_offline.clas.abap b/src/zcl_abapgit_repo_offline.clas.abap new file mode 100644 index 000000000..f4c452f69 --- /dev/null +++ b/src/zcl_abapgit_repo_offline.clas.abap @@ -0,0 +1,15 @@ +CLASS zcl_abapgit_repo_offline DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_repo + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_REPO_OFFLINE IMPLEMENTATION. +ENDCLASS. diff --git a/src/zcl_abapgit_repo_offline.clas.xml b/src/zcl_abapgit_repo_offline.clas.xml new file mode 100644 index 000000000..028e67b32 --- /dev/null +++ b/src/zcl_abapgit_repo_offline.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_REPO_OFFLINE + 1 + E + Offline repository + 2 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_repo_online.clas.abap b/src/zcl_abapgit_repo_online.clas.abap new file mode 100644 index 000000000..6efbc7966 --- /dev/null +++ b/src/zcl_abapgit_repo_online.clas.abap @@ -0,0 +1,465 @@ +CLASS zcl_abapgit_repo_online DEFINITION PUBLIC INHERITING FROM zcl_abapgit_repo FINAL CREATE PUBLIC. + + PUBLIC SECTION. + METHODS: + refresh REDEFINITION, + constructor + IMPORTING is_data TYPE zcl_abapgit_persistence_repo=>ty_repo + RAISING zcx_abapgit_exception, + get_url + RETURNING VALUE(rv_url) TYPE zcl_abapgit_persistence_repo=>ty_repo-url, + get_branch_name + RETURNING VALUE(rv_name) TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name, + get_head_branch_name + RETURNING VALUE(rv_name) TYPE zcl_abapgit_persistence_repo=>ty_repo-head_branch, + get_branches + RETURNING VALUE(ro_branches) TYPE REF TO zcl_abapgit_git_branch_list + RAISING zcx_abapgit_exception, + set_url + IMPORTING iv_url TYPE zcl_abapgit_persistence_repo=>ty_repo-url + RAISING zcx_abapgit_exception, + set_branch_name + IMPORTING iv_branch_name TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name + RAISING zcx_abapgit_exception, + set_new_remote + IMPORTING iv_url TYPE zcl_abapgit_persistence_repo=>ty_repo-url + iv_branch_name TYPE zcl_abapgit_persistence_repo=>ty_repo-branch_name + RAISING zcx_abapgit_exception, + get_sha1_local + RETURNING VALUE(rv_sha1) TYPE zcl_abapgit_persistence_repo=>ty_repo-sha1, + get_sha1_remote + RETURNING VALUE(rv_sha1) TYPE zcl_abapgit_persistence_repo=>ty_repo-sha1 + RAISING zcx_abapgit_exception, + get_files_remote REDEFINITION, + get_objects + RETURNING VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING zcx_abapgit_exception, + deserialize REDEFINITION, + status + IMPORTING io_log TYPE REF TO zcl_abapgit_log OPTIONAL + RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt + RAISING zcx_abapgit_exception, + reset_status, + set_objects + IMPORTING it_objects TYPE zif_abapgit_definitions=>ty_objects_tt + RAISING zcx_abapgit_exception, + initialize + RAISING zcx_abapgit_exception, + rebuild_local_checksums REDEFINITION, + push + IMPORTING is_comment TYPE zif_abapgit_definitions=>ty_comment + io_stage TYPE REF TO zcl_abapgit_stage + RAISING zcx_abapgit_exception, + get_unnecessary_local_objs + RETURNING VALUE(rt_unnecessary_local_objects) TYPE zif_abapgit_definitions=>ty_tadir_tt + RAISING zcx_abapgit_exception. + + PRIVATE SECTION. + DATA: + mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt, + mv_branch TYPE zif_abapgit_definitions=>ty_sha1, + mv_initialized TYPE abap_bool, + mo_branches TYPE REF TO zcl_abapgit_git_branch_list, + mt_status TYPE zif_abapgit_definitions=>ty_results_tt. + + METHODS: + handle_stage_ignore + IMPORTING io_stage TYPE REF TO zcl_abapgit_stage + RAISING zcx_abapgit_exception, + actualize_head_branch + RAISING zcx_abapgit_exception, + delete_initial_online_repo + IMPORTING iv_commit TYPE flag + RAISING zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. + + + METHOD actualize_head_branch. + DATA lv_branch_name TYPE string. + lv_branch_name = mo_branches->get_head( )-name. + + IF lv_branch_name <> ms_data-head_branch. + set( iv_head_branch = lv_branch_name ). + ENDIF. + + ENDMETHOD. "actualize_head_branch + + + METHOD constructor. + + super->constructor( is_data ). + + mv_initialized = abap_false. + + ENDMETHOD. "constructor + + + METHOD delete_initial_online_repo. + + IF me->is_offline( ) = abap_false AND me->get_sha1_local( ) IS INITIAL. + + zcl_abapgit_repo_srv=>get_instance( )->delete( me ). + + IF iv_commit = abap_true. + COMMIT WORK. + ENDIF. + + ENDIF. + + ENDMETHOD. " delete_initial_online_repo + + + METHOD deserialize. + + IF ms_data-write_protect = abap_true. + zcx_abapgit_exception=>raise( 'Cannot deserialize. Local code is write-protected by repo config' ). + ENDIF. + + initialize( ). + + super->deserialize( ). + + set( iv_sha1 = mv_branch ). + + reset_status( ). + + COMMIT WORK AND WAIT. + + ENDMETHOD. "deserialize + + + METHOD get_branches. + IF mo_branches IS NOT BOUND. + mo_branches = zcl_abapgit_git_transport=>branches( get_url( ) ). + ENDIF. + ro_branches = mo_branches. + ENDMETHOD. "get_branches + + + METHOD get_branch_name. + rv_name = ms_data-branch_name. + ENDMETHOD. "get_branch_name + + + METHOD get_files_remote. + initialize( ). + + rt_files = mt_remote. + ENDMETHOD. "get_files + + + METHOD get_head_branch_name. + rv_name = ms_data-head_branch. + ENDMETHOD. "get_head_branch_name + + + METHOD get_objects. + initialize( ). + + rt_objects = mt_objects. + ENDMETHOD. "get_objects + + + METHOD get_sha1_local. + rv_sha1 = ms_data-sha1. + ENDMETHOD. "get_sha1_local + + + METHOD get_sha1_remote. + initialize( ). + + rv_sha1 = mv_branch. + ENDMETHOD. "get_sha1_remote + + + METHOD get_unnecessary_local_objs. + + DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, + lt_tadir_unique TYPE HASHED TABLE OF zif_abapgit_definitions=>ty_tadir + WITH UNIQUE KEY pgmid object obj_name, + lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, + lt_status TYPE zif_abapgit_definitions=>ty_results_tt, + lv_package TYPE zcl_abapgit_persistence_repo=>ty_repo-package. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result, + TYPE zif_abapgit_definitions=>ty_tadir. + + " delete objects which are added locally but are not in remote repo + lt_local = me->get_files_local( ). + lt_remote = me->get_files_remote( ). + lt_status = me->status( ). + + lv_package = me->get_package( ). + lt_tadir = zcl_abapgit_tadir=>read( lv_package ). + SORT lt_tadir BY pgmid ASCENDING object ASCENDING obj_name ASCENDING devclass ASCENDING. + + LOOP AT lt_status ASSIGNING + WHERE lstate = zif_abapgit_definitions=>gc_state-added. + + READ TABLE lt_tadir ASSIGNING + WITH KEY pgmid = 'R3TR' + object = -obj_type + obj_name = -obj_name + devclass = -package + BINARY SEARCH. + IF sy-subrc <> 0. +* skip objects that does not exist locally + CONTINUE. + ENDIF. + + INSERT INTO TABLE lt_tadir_unique. + + ENDLOOP. + + rt_unnecessary_local_objects = lt_tadir_unique. + + ENDMETHOD. + + + METHOD get_url. + rv_url = ms_data-url. + ENDMETHOD. "get_url + + + METHOD handle_stage_ignore. + + DATA: lv_add TYPE abap_bool, + lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit, + lt_stage TYPE zcl_abapgit_stage=>ty_stage_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_stage. + + + lo_dot_abapgit = get_dot_abapgit( ). + lt_stage = io_stage->get_all( ). + LOOP AT lt_stage ASSIGNING WHERE method = zcl_abapgit_stage=>c_method-ignore. + + lo_dot_abapgit->add_ignore( + iv_path = -file-path + iv_filename = -file-filename ). + + " remove it from the staging object, as the action is handled here + io_stage->reset( iv_path = -file-path + iv_filename = -file-filename ). + + lv_add = abap_true. + + ENDLOOP. + + IF lv_add = abap_true. + io_stage->add( + iv_path = zif_abapgit_definitions=>gc_root_dir + iv_filename = zif_abapgit_definitions=>gc_dot_abapgit + iv_data = lo_dot_abapgit->serialize( ) ). + + set_dot_abapgit( lo_dot_abapgit ). + ENDIF. + + ENDMETHOD. + + + METHOD initialize. + IF mv_initialized = abap_false. + refresh( ). + ENDIF. + ENDMETHOD. + + + METHOD push. + + DATA: lv_branch TYPE zif_abapgit_definitions=>ty_sha1, + lt_updated_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt, + lv_text TYPE string. + + IF ms_data-branch_name CP 'refs/tags*'. + lv_text = |You're working on a tag. Currently it's not | + && |possible to push on tags. Consider creating a branch instead|. + zcx_abapgit_exception=>raise( lv_text ). + ENDIF. + + handle_stage_ignore( io_stage ). + + zcl_abapgit_git_porcelain=>push( EXPORTING is_comment = is_comment + io_repo = me + io_stage = io_stage + IMPORTING ev_branch = lv_branch + et_updated_files = lt_updated_files ). + + IF io_stage->get_branch_sha1( ) = get_sha1_local( ). +* pushing to the branch currently represented by this repository object + mv_branch = lv_branch. + set( iv_sha1 = lv_branch ). + ELSE. + refresh( ). + ENDIF. + + update_local_checksums( lt_updated_files ). + + IF zcl_abapgit_stage_logic=>count( me ) = 0. + set( iv_sha1 = lv_branch ). + ENDIF. + + ENDMETHOD. "push + + + METHOD rebuild_local_checksums. "REMOTE + + DATA: lt_remote TYPE zif_abapgit_definitions=>ty_files_tt, + lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt, + ls_last_item TYPE zif_abapgit_definitions=>ty_item, + lv_branch_equal TYPE abap_bool, + lt_checksums TYPE zcl_abapgit_persistence_repo=>ty_local_checksum_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_checksums, + LIKE LINE OF -files, + LIKE LINE OF lt_remote, + LIKE LINE OF lt_local. + + lt_remote = get_files_remote( ). + lt_local = get_files_local( ). + lv_branch_equal = boolc( get_sha1_remote( ) = get_sha1_local( ) ). + + DELETE lt_local " Remove non-code related files except .abapgit + WHERE item IS INITIAL + AND NOT ( file-path = zif_abapgit_definitions=>gc_root_dir + AND file-filename = zif_abapgit_definitions=>gc_dot_abapgit ). + + SORT lt_local BY item. + SORT lt_remote BY path filename. + + LOOP AT lt_local ASSIGNING . + IF ls_last_item <> -item OR sy-tabix = 1. " First or New item reached ? + APPEND INITIAL LINE TO lt_checksums ASSIGNING . + -item = -item. + ls_last_item = -item. + ENDIF. + + READ TABLE lt_remote ASSIGNING + WITH KEY path = -file-path filename = -file-filename + BINARY SEARCH. + CHECK sy-subrc = 0. " Ignore new ones + + APPEND INITIAL LINE TO -files ASSIGNING . + MOVE-CORRESPONDING -file TO . + + " If hashes are equal -> local sha1 is OK + " Else if R-branch is ahead -> assume changes were remote, state - local sha1 + " Else (branches equal) -> assume changes were local, state - remote sha1 + IF -file-sha1 <> -sha1 AND lv_branch_equal = abap_true. + -sha1 = -sha1. + ENDIF. + ENDLOOP. + + set( it_checksums = lt_checksums ). + reset_status( ). + + ENDMETHOD. " rebuild_local_checksums. + + + METHOD refresh. + + DATA: lo_progress TYPE REF TO zcl_abapgit_progress, + lx_exception TYPE REF TO zcx_abapgit_exception. + + super->refresh( iv_drop_cache ). + reset_status( ). + + CREATE OBJECT lo_progress + EXPORTING + iv_total = 1. + + lo_progress->show( iv_current = 1 + iv_text = 'Fetch remote files' ) ##NO_TEXT. + + TRY. + zcl_abapgit_git_porcelain=>pull( + EXPORTING + io_repo = me + IMPORTING + et_files = mt_remote + et_objects = mt_objects + ev_branch = mv_branch ). + + CATCH zcx_abapgit_exception INTO lx_exception. + + delete_initial_online_repo( abap_true ). + + RAISE EXCEPTION lx_exception. + + ENDTRY. + + mo_branches = zcl_abapgit_git_transport=>branches( get_url( ) ). + actualize_head_branch( ). + + mv_initialized = abap_true. + + ENDMETHOD. "refresh + + + METHOD reset_status. + CLEAR mt_status. + ENDMETHOD. " reset_status. + + + METHOD set_branch_name. + + IF ms_data-write_protect = abap_true. + zcx_abapgit_exception=>raise( 'Cannot switch branch. Local code is write-protected by repo config' ). + ENDIF. + + mv_initialized = abap_false. + set( iv_branch_name = iv_branch_name ). + + ENDMETHOD. + + + METHOD set_new_remote. + + IF ms_data-write_protect = abap_true. + zcx_abapgit_exception=>raise( 'Cannot change remote. Local code is write-protected by repo config' ). + ENDIF. + + mv_initialized = abap_false. + set( iv_url = iv_url + iv_branch_name = iv_branch_name + iv_head_branch = '' + iv_sha1 = '' ). + + ENDMETHOD. "set_new_remote + + + METHOD set_objects. + mt_objects = it_objects. + ENDMETHOD. + + + METHOD set_url. + + IF ms_data-write_protect = abap_true. + zcx_abapgit_exception=>raise( 'Cannot change URL. Local code is write-protected by repo config' ). + ENDIF. + + mv_initialized = abap_false. + set( iv_url = iv_url ). + + ENDMETHOD. + + + METHOD status. + + initialize( ). + + IF lines( mt_status ) = 0. + mt_status = zcl_abapgit_file_status=>status( io_repo = me + io_log = io_log ). + ENDIF. + rt_results = mt_status. + + ENDMETHOD. "status +ENDCLASS. diff --git a/src/zcl_abapgit_repo_online.clas.xml b/src/zcl_abapgit_repo_online.clas.xml new file mode 100644 index 000000000..419f71945 --- /dev/null +++ b/src/zcl_abapgit_repo_online.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_REPO_ONLINE + 1 + E + Online Repository + 2 + 1 + X + X + X + X + + + + diff --git a/src/zcl_abapgit_repo_srv.clas.abap b/src/zcl_abapgit_repo_srv.clas.abap new file mode 100644 index 000000000..e3d4d08de --- /dev/null +++ b/src/zcl_abapgit_repo_srv.clas.abap @@ -0,0 +1,352 @@ +CLASS zcl_abapgit_repo_srv DEFINITION PUBLIC FINAL CREATE PRIVATE. + + PUBLIC SECTION. + + CLASS-METHODS: get_instance + RETURNING VALUE(rv_srv) TYPE REF TO zcl_abapgit_repo_srv. + + TYPES: ty_repo_tt TYPE STANDARD TABLE OF REF TO zcl_abapgit_repo WITH DEFAULT KEY. + + METHODS list + RETURNING VALUE(rt_list) TYPE ty_repo_tt + RAISING zcx_abapgit_exception. + + METHODS refresh + RAISING zcx_abapgit_exception. + + METHODS new_online + IMPORTING iv_url TYPE string + iv_branch_name TYPE string + iv_package TYPE devclass + RETURNING VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_online + RAISING zcx_abapgit_exception. + + METHODS new_offline + IMPORTING iv_url TYPE string + iv_package TYPE devclass + RETURNING VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_offline + RAISING zcx_abapgit_exception. + + METHODS delete + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo + RAISING zcx_abapgit_exception. + + METHODS get + IMPORTING iv_key TYPE zif_abapgit_persistence=>ty_value + RETURNING VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo + RAISING zcx_abapgit_exception. + + METHODS is_repo_installed + IMPORTING iv_url TYPE string + iv_target_package TYPE devclass OPTIONAL + RETURNING VALUE(rv_installed) TYPE abap_bool + RAISING zcx_abapgit_exception. + + METHODS switch_repo_type + IMPORTING iv_key TYPE zif_abapgit_persistence=>ty_value + iv_offline TYPE abap_bool + RAISING zcx_abapgit_exception. + + METHODS validate_package + IMPORTING iv_package TYPE devclass + RAISING zcx_abapgit_exception. + PRIVATE SECTION. + + CLASS-DATA: go_ref TYPE REF TO zcl_abapgit_repo_srv. + + METHODS constructor. + + DATA: mv_init TYPE abap_bool VALUE abap_false, + mo_persistence TYPE REF TO zcl_abapgit_persistence_repo, + mt_list TYPE ty_repo_tt. + + METHODS is_sap_object_allowed + RETURNING + VALUE(rv_allowed) TYPE abap_bool. + + METHODS add + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo + RAISING zcx_abapgit_exception. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. + + + METHOD add. + + DATA: lo_repo LIKE LINE OF mt_list. + + + LOOP AT mt_list INTO lo_repo. + IF lo_repo->get_key( ) = io_repo->get_key( ). + IF lo_repo = io_repo. + RETURN. + ENDIF. + zcx_abapgit_exception=>raise( 'identical keys' ). + ENDIF. + ENDLOOP. + + APPEND io_repo TO mt_list. + + ENDMETHOD. "add + + + METHOD constructor. + CREATE OBJECT mo_persistence. + ENDMETHOD. "class_constructor + + + METHOD delete. + + io_repo->delete( ). + + DELETE TABLE mt_list FROM io_repo. + ASSERT sy-subrc = 0. + + ENDMETHOD. "delete + + + METHOD get. + + FIELD-SYMBOLS: LIKE LINE OF mt_list. + + + IF mv_init = abap_false. + refresh( ). + ENDIF. + + LOOP AT mt_list ASSIGNING . + IF ->get_key( ) = iv_key. + ro_repo = . + RETURN. + ENDIF. + ENDLOOP. + + zcx_abapgit_exception=>raise( 'repo not found, get' ). + + ENDMETHOD. "get + + + METHOD get_instance. + IF go_ref IS INITIAL. + CREATE OBJECT go_ref. + ENDIF. + rv_srv = go_ref. + ENDMETHOD. + + + METHOD is_repo_installed. + + DATA: lt_repo TYPE zcl_abapgit_repo_srv=>ty_repo_tt, + lo_repo TYPE REF TO zcl_abapgit_repo, + lv_url TYPE string, + lv_package TYPE devclass, + lo_repo_online TYPE REF TO zcl_abapgit_repo_online, + lv_err TYPE string. + + lt_repo = list( ). + + LOOP AT lt_repo INTO lo_repo. + CHECK lo_repo->is_offline( ) = abap_false. + lo_repo_online ?= lo_repo. + + lv_url = lo_repo_online->get_url( ). + lv_package = lo_repo_online->get_package( ). + CHECK to_upper( lv_url ) = to_upper( iv_url ). + + " Validate bindings + "TODO refactor: move this message out of this method + IF iv_target_package IS NOT INITIAL AND iv_target_package <> lv_package. + lv_err = |Installation to package { lv_package } detected. | + && |Cancelling installation|. + zcx_abapgit_exception=>raise( lv_err ). + ENDIF. + + rv_installed = abap_true. + EXIT. + ENDLOOP. + + ENDMETHOD. "is_repo_installed + + + METHOD is_sap_object_allowed. + + rv_allowed = cl_enh_badi_def_utility=>is_sap_system( ). + IF rv_allowed = abap_true. + RETURN. + ENDIF. + + rv_allowed = zcl_abapgit_exit=>get_instance( )->allow_sap_objects( ). + + ENDMETHOD. + + + METHOD list. + + IF mv_init = abap_false. + refresh( ). + ENDIF. + + rt_list = mt_list. + + ENDMETHOD. "list + + + METHOD new_offline. + + DATA: ls_repo TYPE zcl_abapgit_persistence_repo=>ty_repo, + lv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key. + + + validate_package( iv_package ). + + lv_key = mo_persistence->add( + iv_url = iv_url + iv_branch_name = '' + iv_package = iv_package + iv_offline = abap_true + is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). + + TRY. + ls_repo = mo_persistence->read( lv_key ). + CATCH zcx_abapgit_not_found. + zcx_abapgit_exception=>raise( 'new_offline not found' ). + ENDTRY. + + CREATE OBJECT ro_repo + EXPORTING + is_data = ls_repo. + + add( ro_repo ). + + ENDMETHOD. "new_offline + + + METHOD new_online. + + DATA: ls_repo TYPE zcl_abapgit_persistence_repo=>ty_repo, + lv_key TYPE zcl_abapgit_persistence_repo=>ty_repo-key. + + + validate_package( iv_package ). + + lv_key = mo_persistence->add( + iv_url = iv_url + iv_branch_name = iv_branch_name + iv_package = iv_package + iv_offline = abap_false + is_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ) ). + TRY. + ls_repo = mo_persistence->read( lv_key ). + CATCH zcx_abapgit_not_found. + zcx_abapgit_exception=>raise( 'new_online not found' ). + ENDTRY. + + CREATE OBJECT ro_repo + EXPORTING + is_data = ls_repo. + + add( ro_repo ). + + ENDMETHOD. "new_online + + + METHOD refresh. + + DATA: lt_list TYPE zcl_abapgit_persistence_repo=>tt_repo, + lo_online TYPE REF TO zcl_abapgit_repo_online, + lo_offline TYPE REF TO zcl_abapgit_repo_offline. + + FIELD-SYMBOLS: LIKE LINE OF lt_list. + + + CLEAR mt_list. + + lt_list = mo_persistence->list( ). + LOOP AT lt_list ASSIGNING . + IF -offline = abap_false. + CREATE OBJECT lo_online + EXPORTING + is_data = . + APPEND lo_online TO mt_list. + ELSE. + CREATE OBJECT lo_offline + EXPORTING + is_data = . + APPEND lo_offline TO mt_list. + ENDIF. + ENDLOOP. + + mv_init = abap_true. + + ENDMETHOD. "refresh + + + METHOD switch_repo_type. + + DATA lo_repo TYPE REF TO zcl_abapgit_repo. + + FIELD-SYMBOLS LIKE LINE OF mt_list. + + lo_repo = get( iv_key ). + READ TABLE mt_list ASSIGNING FROM lo_repo. + ASSERT sy-subrc IS INITIAL. + ASSERT iv_offline <> lo_repo->ms_data-offline. + + IF iv_offline = abap_true. " On-line -> OFFline + lo_repo->set( + iv_url = zcl_abapgit_url=>name( lo_repo->ms_data-url ) + iv_branch_name = '' + iv_sha1 = '' + iv_head_branch = '' + iv_offline = abap_true ). + CREATE OBJECT TYPE zcl_abapgit_repo_offline + EXPORTING + is_data = lo_repo->ms_data. + ELSE. " OFFline -> On-line + lo_repo->set( iv_offline = abap_false ). + CREATE OBJECT TYPE zcl_abapgit_repo_online + EXPORTING + is_data = lo_repo->ms_data. + ENDIF. + + ENDMETHOD. "switch_repo_type + + + METHOD validate_package. + + DATA: ls_devclass TYPE tdevc, + lt_repos TYPE zcl_abapgit_persistence_repo=>tt_repo. + + IF iv_package IS INITIAL. + zcx_abapgit_exception=>raise( 'add, package empty' ). + ENDIF. + + IF iv_package = '$TMP'. + zcx_abapgit_exception=>raise( 'not possible to use $TMP, create new (local) package' ). + ENDIF. + + SELECT SINGLE * + FROM tdevc + INTO ls_devclass + WHERE devclass = iv_package. "#EC CI_GENBUFF + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Package { iv_package } not found| ). + ENDIF. + + IF is_sap_object_allowed( ) = abap_false AND ls_devclass-as4user = 'SAP'. + zcx_abapgit_exception=>raise( |Package { iv_package } not allowed| ). + ENDIF. + + " make sure its not already in use for a different repository + lt_repos = mo_persistence->list( ). + READ TABLE lt_repos WITH KEY package = iv_package TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + zcx_abapgit_exception=>raise( |Package { iv_package } already in use| ). + ENDIF. + + ENDMETHOD. "validate_package +ENDCLASS. diff --git a/src/zcl_abapgit_repo_srv.clas.xml b/src/zcl_abapgit_repo_srv.clas.xml new file mode 100644 index 000000000..7ff571ee7 --- /dev/null +++ b/src/zcl_abapgit_repo_srv.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_REPO_SRV + 1 + E + Repo services + 1 + X + X + X + X + + + + diff --git a/src/zabapgit_stage_logic.prog.abap b/src/zcl_abapgit_stage_logic.clas.abap similarity index 81% rename from src/zabapgit_stage_logic.prog.abap rename to src/zcl_abapgit_stage_logic.clas.abap index 3964608d3..9be1057c5 100644 --- a/src/zabapgit_stage_logic.prog.abap +++ b/src/zcl_abapgit_stage_logic.clas.abap @@ -1,43 +1,33 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_STAGE_LOGIC -*&---------------------------------------------------------------------* - -"! Class is used to compare the files on remote local -"! ie. list possible files to stage -CLASS lcl_stage_logic DEFINITION FINAL. +class ZCL_ABAPGIT_STAGE_LOGIC definition + public + final + create public . PUBLIC SECTION. CLASS-METHODS: get - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online RETURNING VALUE(rs_files) TYPE zif_abapgit_definitions=>ty_stage_files RAISING zcx_abapgit_exception, count - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online RETURNING VALUE(rv_count) TYPE i RAISING zcx_abapgit_exception. PRIVATE SECTION. CLASS-METHODS: remove_ignored - IMPORTING io_repo TYPE REF TO lcl_repo_online + IMPORTING io_repo TYPE REF TO zcl_abapgit_repo_online CHANGING cs_files TYPE zif_abapgit_definitions=>ty_stage_files, remove_identical CHANGING cs_files TYPE zif_abapgit_definitions=>ty_stage_files. ENDCLASS. -CLASS lcl_stage_logic IMPLEMENTATION. - METHOD get. - rs_files-local = io_repo->get_files_local( ). - rs_files-remote = io_repo->get_files_remote( ). - remove_identical( CHANGING cs_files = rs_files ). - remove_ignored( EXPORTING io_repo = io_repo - CHANGING cs_files = rs_files ). +CLASS ZCL_ABAPGIT_STAGE_LOGIC IMPLEMENTATION. - ENDMETHOD. METHOD count. @@ -49,30 +39,18 @@ CLASS lcl_stage_logic IMPLEMENTATION. ENDMETHOD. - METHOD remove_ignored. - DATA: lv_index TYPE i. + METHOD get. - FIELD-SYMBOLS: LIKE LINE OF cs_files-remote. - - - LOOP AT cs_files-remote ASSIGNING . - lv_index = sy-tabix. - - IF io_repo->get_dot_abapgit( )->is_ignored( - iv_path = -path - iv_filename = -filename ) = abap_true. - DELETE cs_files-remote INDEX lv_index. - ELSEIF -path = zif_abapgit_definitions=>gc_root_dir - AND -filename = zif_abapgit_definitions=>gc_dot_abapgit. - " Remove .abapgit from remotes - it cannot be removed or ignored - DELETE cs_files-remote INDEX lv_index. - ENDIF. - - ENDLOOP. + rs_files-local = io_repo->get_files_local( ). + rs_files-remote = io_repo->get_files_remote( ). + remove_identical( CHANGING cs_files = rs_files ). + remove_ignored( EXPORTING io_repo = io_repo + CHANGING cs_files = rs_files ). ENDMETHOD. + METHOD remove_identical. DATA: lv_index TYPE i, @@ -98,4 +76,28 @@ CLASS lcl_stage_logic IMPLEMENTATION. ENDMETHOD. + + METHOD remove_ignored. + + DATA: lv_index TYPE i. + + FIELD-SYMBOLS: LIKE LINE OF cs_files-remote. + + + LOOP AT cs_files-remote ASSIGNING . + lv_index = sy-tabix. + + IF io_repo->get_dot_abapgit( )->is_ignored( + iv_path = -path + iv_filename = -filename ) = abap_true. + DELETE cs_files-remote INDEX lv_index. + ELSEIF -path = zif_abapgit_definitions=>gc_root_dir + AND -filename = zif_abapgit_definitions=>gc_dot_abapgit. + " Remove .abapgit from remotes - it cannot be removed or ignored + DELETE cs_files-remote INDEX lv_index. + ENDIF. + + ENDLOOP. + + ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_stage_logic.clas.xml b/src/zcl_abapgit_stage_logic.clas.xml new file mode 100644 index 000000000..e7ad0dc89 --- /dev/null +++ b/src/zcl_abapgit_stage_logic.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_STAGE_LOGIC + 1 + E + Stage logic + 2 + 1 + X + X + X + X + + + + diff --git a/src/zabapgit_tadir.prog.abap b/src/zcl_abapgit_tadir.clas.abap similarity index 87% rename from src/zabapgit_tadir.prog.abap rename to src/zcl_abapgit_tadir.clas.abap index 4bf5bc377..b7c8dca13 100644 --- a/src/zabapgit_tadir.prog.abap +++ b/src/zcl_abapgit_tadir.clas.abap @@ -1,14 +1,4 @@ -*&---------------------------------------------------------------------* -*& Include ZABAPGIT_TADIR -*&---------------------------------------------------------------------* - -*----------------------------------------------------------------------* -* CLASS lcl_tadir DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* - -CLASS lcl_tadir DEFINITION FINAL. +class ZCL_ABAPGIT_TADIR definition public final create public. PUBLIC SECTION. CLASS-METHODS: @@ -47,97 +37,12 @@ CLASS lcl_tadir DEFINITION FINAL. RETURNING VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception. -ENDCLASS. "lcl_tadir DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_tadir IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_tadir IMPLEMENTATION. - - METHOD read_single. - - IF iv_object = 'SICF'. - rs_tadir = zcl_abapgit_object_sicf=>read_tadir_sicf( - iv_pgmid = iv_pgmid - iv_obj_name = iv_obj_name ). - ELSE. - SELECT SINGLE * FROM tadir INTO rs_tadir - WHERE pgmid = iv_pgmid - AND object = iv_object - AND obj_name = iv_obj_name. "#EC CI_SUBRC - ENDIF. - - ENDMETHOD. "read_single - - METHOD get_object_package. - - DATA ls_tadir TYPE tadir. - - ls_tadir = read_single( iv_pgmid = iv_pgmid - iv_object = iv_object - iv_obj_name = iv_obj_name ). - - IF ls_tadir-delflag = 'X'. - RETURN. "Mark for deletion -> return nothing - ENDIF. - - rv_devclass = ls_tadir-devclass. - - ENDMETHOD. "get_object_package. - - METHOD check_exists. - - DATA: lv_exists TYPE abap_bool, - lo_progress TYPE REF TO zcl_abapgit_progress, - ls_item TYPE zif_abapgit_definitions=>ty_item. - - FIELD-SYMBOLS: LIKE LINE OF it_tadir. +ENDCLASS. - CREATE OBJECT lo_progress - EXPORTING - iv_total = lines( it_tadir ). -* rows from database table TADIR are not removed for -* transportable objects until the transport is released - LOOP AT it_tadir ASSIGNING . - IF sy-tabix MOD 200 = 0. - lo_progress->show( - iv_current = sy-tabix - iv_text = |Check object exists { -object } { -obj_name }| ). - ENDIF. +CLASS ZCL_ABAPGIT_TADIR IMPLEMENTATION. - ls_item-obj_type = -object. - ls_item-obj_name = -obj_name. - ls_item-devclass = -devclass. - - IF lcl_objects=>is_supported( ls_item ) = abap_true. - lv_exists = lcl_objects=>exists( ls_item ). - IF lv_exists = abap_true. - APPEND TO rt_tadir. - ENDIF. - ELSE. - APPEND TO rt_tadir. - ENDIF. - ENDLOOP. - - ENDMETHOD. "check_exists - - METHOD read. - -* start recursion -* hmm, some problems here, should TADIR also build path? - rt_tadir = build( iv_package = iv_package - iv_top = iv_package - io_dot = io_dot - iv_ignore_subpackages = iv_ignore_subpackages - io_log = io_log ). - - rt_tadir = check_exists( rt_tadir ). - - ENDMETHOD. "read METHOD build. @@ -219,4 +124,90 @@ CLASS lcl_tadir IMPLEMENTATION. ENDMETHOD. "build -ENDCLASS. "lcl_tadir IMPLEMENTATION + + METHOD check_exists. + + DATA: lv_exists TYPE abap_bool, + lo_progress TYPE REF TO zcl_abapgit_progress, + ls_item TYPE zif_abapgit_definitions=>ty_item. + + FIELD-SYMBOLS: LIKE LINE OF it_tadir. + + + CREATE OBJECT lo_progress + EXPORTING + iv_total = lines( it_tadir ). + +* rows from database table TADIR are not removed for +* transportable objects until the transport is released + LOOP AT it_tadir ASSIGNING . + IF sy-tabix MOD 200 = 0. + lo_progress->show( + iv_current = sy-tabix + iv_text = |Check object exists { -object } { -obj_name }| ). + ENDIF. + + ls_item-obj_type = -object. + ls_item-obj_name = -obj_name. + ls_item-devclass = -devclass. + + IF zcl_abapgit_objects=>is_supported( ls_item ) = abap_true. + lv_exists = zcl_abapgit_objects=>exists( ls_item ). + IF lv_exists = abap_true. + APPEND TO rt_tadir. + ENDIF. + ELSE. + APPEND TO rt_tadir. + ENDIF. + ENDLOOP. + + ENDMETHOD. "check_exists + + + METHOD get_object_package. + + DATA ls_tadir TYPE tadir. + + ls_tadir = read_single( iv_pgmid = iv_pgmid + iv_object = iv_object + iv_obj_name = iv_obj_name ). + + IF ls_tadir-delflag = 'X'. + RETURN. "Mark for deletion -> return nothing + ENDIF. + + rv_devclass = ls_tadir-devclass. + + ENDMETHOD. "get_object_package. + + + METHOD read. + +* start recursion +* hmm, some problems here, should TADIR also build path? + rt_tadir = build( iv_package = iv_package + iv_top = iv_package + io_dot = io_dot + iv_ignore_subpackages = iv_ignore_subpackages + io_log = io_log ). + + rt_tadir = check_exists( rt_tadir ). + + ENDMETHOD. "read + + + METHOD read_single. + + IF iv_object = 'SICF'. + rs_tadir = zcl_abapgit_object_sicf=>read_tadir_sicf( + iv_pgmid = iv_pgmid + iv_obj_name = iv_obj_name ). + ELSE. + SELECT SINGLE * FROM tadir INTO rs_tadir + WHERE pgmid = iv_pgmid + AND object = iv_object + AND obj_name = iv_obj_name. "#EC CI_SUBRC + ENDIF. + + ENDMETHOD. "read_single +ENDCLASS. diff --git a/src/zcl_abapgit_tadir.clas.xml b/src/zcl_abapgit_tadir.clas.xml new file mode 100644 index 000000000..8c7c92231 --- /dev/null +++ b/src/zcl_abapgit_tadir.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_TADIR + 1 + E + TADIR access + 2 + 1 + X + X + X + X + + + +