This commit is contained in:
larshp 2016-07-02 12:58:08 +00:00
parent 7fe86f3769
commit 7ea64a5cf7
5 changed files with 941 additions and 893 deletions

View File

@ -312,904 +312,19 @@ INCLUDE zabapgit_stage.
INCLUDE zabapgit_git.
INCLUDE zabapgit_objects.
INCLUDE zabapgit_tadir.
INCLUDE zabapgit_object.
INCLUDE zabapgit_file_status.
INCLUDE zabapgit_object.
INCLUDE zabapgit_repo_impl.
INCLUDE zabapgit_background.
INCLUDE zabapgit_zip.
INCLUDE zabapgit_gui.
INCLUDE zabapgit_app_impl.
INCLUDE zabapgit_unit_test.
INCLUDE zabapgit_forms.
START-OF-SELECTION.
PERFORM run.
*----------------------------------------------------------------------*
* CLASS lcl_object IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_objects IMPLEMENTATION.
METHOD warning_overwrite.
DATA: lv_index TYPE i,
lv_answer TYPE c,
lv_question TYPE string,
lt_before TYPE lcl_persistence_repo=>ty_local_checksum_tt,
lt_current TYPE lcl_persistence_repo=>ty_local_checksum_tt.
FIELD-SYMBOLS: <ls_before> LIKE LINE OF lt_before,
<ls_current> LIKE LINE OF lt_current,
<ls_result> LIKE LINE OF ct_results.
lt_before = io_repo->get_local_checksums( ).
lt_current = io_repo->build_local_checksums( ).
LOOP AT ct_results ASSIGNING <ls_result>.
lv_index = sy-tabix.
READ TABLE lt_before ASSIGNING <ls_before>
WITH KEY item-obj_type = <ls_result>-obj_type
item-obj_name = <ls_result>-obj_name.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_current ASSIGNING <ls_current>
WITH KEY item-obj_type = <ls_result>-obj_type
item-obj_name = <ls_result>-obj_name.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
IF <ls_before>-sha1 <> <ls_current>-sha1.
lv_question = |It looks like object { <ls_result>-obj_type
} { <ls_result>-obj_name
} has been modified locally, overwrite object?|.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Warning'
text_question = lv_question
display_cancel_button = abap_false
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2 ##NO_TEXT.
IF sy-subrc <> 0.
_raise 'error from POPUP_TO_CONFIRM'.
ENDIF.
IF lv_answer = '2'.
DELETE ct_results INDEX lv_index.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD warning_package.
DATA: lv_question TYPE c LENGTH 200,
lv_answer TYPE c,
ls_tadir TYPE tadir.
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
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
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
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2. "#EC NOTEXT
IF sy-subrc <> 0.
_raise 'error from POPUP_TO_CONFIRM'.
ENDIF.
IF lv_answer = '2'.
rv_cancel = abap_true.
ENDIF.
ENDIF.
ENDMETHOD. "check_warning
METHOD update_package_tree.
DATA: lt_packages TYPE lcl_sap_package=>ty_devclass_tt,
lv_package LIKE LINE OF lt_packages,
lv_tree TYPE dirtree-tname.
lt_packages = lcl_sap_package=>list_subpackages( iv_package ).
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.
TYPES: BEGIN OF ty_obj_serializer_map,
item LIKE is_item,
metadata LIKE is_metadata,
END OF ty_obj_serializer_map.
STATICS st_obj_serializer_map
TYPE SORTED TABLE OF ty_obj_serializer_map WITH UNIQUE KEY item.
DATA: lv_message TYPE string,
lv_class_name TYPE string,
ls_obj_serializer_map LIKE LINE OF st_obj_serializer_map.
READ TABLE st_obj_serializer_map
INTO ls_obj_serializer_map WITH KEY item = is_item.
IF sy-subrc = 0.
lv_class_name = ls_obj_serializer_map-metadata-class.
ELSEIF is_metadata IS NOT INITIAL.
* Metadata is provided only on serialization
* Once this has been triggered, the same serializer shall be used
* for subsequent processes.
* Thus, buffer the metadata afterwards
ls_obj_serializer_map-item = is_item.
ls_obj_serializer_map-metadata = is_metadata.
INSERT ls_obj_serializer_map INTO TABLE st_obj_serializer_map.
lv_class_name = is_metadata-class.
ELSE.
lv_class_name = class_name( is_item ).
ENDIF.
TRY.
CREATE OBJECT ri_obj TYPE (lv_class_name)
EXPORTING
is_item = is_item
iv_language = iv_language.
CATCH cx_sy_create_object_error.
TRY.
* 2nd step, try looking for plugins
CREATE OBJECT ri_obj TYPE lcl_objects_bridge
EXPORTING
is_item = is_item.
CATCH cx_sy_create_object_error.
CONCATENATE 'Object type' is_item-obj_type 'not supported, serialize'
INTO lv_message
SEPARATED BY space. "#EC NOTEXT
_raise lv_message.
ENDTRY.
ENDTRY.
ENDMETHOD. "create_object
METHOD is_supported.
TRY.
create_object( is_item = is_item
iv_language = gc_english ).
rv_bool = abap_true.
CATCH lcx_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: <ls_snode> 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 <ls_snode>.
lv_type = <ls_snode>-name+11.
APPEND lv_type TO rt_types.
ENDLOOP.
ENDMETHOD. "supported_list
METHOD exists.
DATA: li_obj TYPE REF TO lif_object.
TRY.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
rv_bool = li_obj->exists( ).
CATCH lcx_exception.
* ignore all errors and assume the object exists
rv_bool = abap_true.
ENDTRY.
ENDMETHOD. "exists
METHOD path_to_package.
DATA: lv_length TYPE i,
lv_path TYPE string.
lv_length = strlen( iv_start ) - 1.
lv_path = iv_path+lv_length.
CONCATENATE iv_top lv_path INTO rv_package.
TRANSLATE rv_package USING '/_'.
lv_length = strlen( rv_package ) - 1.
rv_package = rv_package(lv_length).
TRANSLATE rv_package TO UPPER CASE.
IF lcl_sap_package=>exists( rv_package ) = abap_false.
lcl_sap_package=>create_child( iv_parent = iv_top
iv_child = rv_package ).
ENDIF.
ENDMETHOD.
METHOD class_name.
CONCATENATE 'LCL_OBJECT_' is_item-obj_type INTO rv_class_name. "#EC NOTEXT
ENDMETHOD. "class_name
METHOD jump.
DATA: li_obj TYPE REF TO lif_object.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
li_obj->jump( ).
ENDMETHOD. "jump
METHOD delete.
DATA: ls_item TYPE ty_item,
lt_tadir LIKE it_tadir.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
* misuse field KORRNUM to fix deletion sequence
lt_tadir[] = it_tadir[].
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
CASE <ls_tadir>-object.
WHEN 'IATU'.
<ls_tadir>-korrnum = '5500'.
WHEN 'IARP'.
<ls_tadir>-korrnum = '5510'.
WHEN 'IASP'.
<ls_tadir>-korrnum = '5520'.
WHEN 'SUSC'.
<ls_tadir>-korrnum = '5000'.
WHEN 'TTYP' OR 'TABL' OR 'VIEW'.
<ls_tadir>-korrnum = '7000'.
WHEN 'DTEL'.
<ls_tadir>-korrnum = '8000'.
WHEN 'DOMA'.
<ls_tadir>-korrnum = '9000'.
WHEN 'PROG'.
* delete includes after main programs
SELECT COUNT(*) FROM reposrc
WHERE progname = <ls_tadir>-obj_name
AND r3state = 'A'
AND subc = 'I'.
IF sy-subrc = 0.
<ls_tadir>-korrnum = '2000'.
ELSE.
<ls_tadir>-korrnum = '1000'.
ENDIF.
WHEN OTHERS.
<ls_tadir>-korrnum = '1000'.
ENDCASE.
ENDLOOP.
resolve_ddic( CHANGING ct_tadir = lt_tadir ).
SORT lt_tadir BY korrnum ASCENDING.
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
lcl_progress=>show( iv_key = 'Delete'
iv_current = sy-tabix
iv_total = lines( lt_tadir )
iv_text = <ls_tadir>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_tadir>-object.
ls_item-obj_name = <ls_tadir>-obj_name.
delete_obj( ls_item ).
ENDLOOP.
ENDMETHOD. "delete
METHOD resolve_ddic.
* this will make sure the deletion sequence of structures/tables work
* in case they have dependencies with .INCLUDE
TYPES: BEGIN OF ty_edge,
from TYPE ty_item,
to TYPE ty_item,
END OF ty_edge.
DATA: lt_nodes TYPE TABLE OF ty_item,
lt_edges TYPE TABLE OF ty_edge,
lt_findstrings TYPE TABLE OF rsfind,
lv_plus TYPE i VALUE 1,
lv_find_obj_cls TYPE euobj-id,
lv_index TYPE i,
lv_before TYPE i,
lt_founds TYPE TABLE OF rsfindlst,
lt_scope TYPE STANDARD TABLE OF seu_obj.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir,
<ls_edge> LIKE LINE OF lt_edges,
<ls_found> LIKE LINE OF lt_founds,
<ls_node> LIKE LINE OF lt_nodes.
* build nodes
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE object = 'TABL'
OR object = 'TTYP'.
APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
<ls_node>-obj_name = <ls_tadir>-obj_name.
<ls_node>-obj_type = <ls_tadir>-object.
ENDLOOP.
APPEND 'TABL' TO lt_scope.
APPEND 'STRU' TO lt_scope.
APPEND 'TTYP' TO lt_scope.
* build edges
LOOP AT lt_nodes ASSIGNING <ls_node>.
CLEAR lt_findstrings.
APPEND <ls_node>-obj_name TO lt_findstrings.
lv_find_obj_cls = <ls_node>-obj_type.
CALL FUNCTION 'RS_EU_CROSSREF'
EXPORTING
i_find_obj_cls = lv_find_obj_cls
TABLES
i_findstrings = lt_findstrings
o_founds = lt_founds
i_scope_object_cls = lt_scope
EXCEPTIONS
not_executed = 1
not_found = 2
illegal_object = 3
no_cross_for_this_object = 4
batch = 5
batchjob_error = 6
wrong_type = 7
object_not_exist = 8
OTHERS = 9.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
LOOP AT lt_founds ASSIGNING <ls_found>.
APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
<ls_edge>-from = <ls_node>.
<ls_edge>-to-obj_name = <ls_found>-object.
CASE <ls_found>-object_cls.
WHEN 'DS'
OR 'DT'.
<ls_edge>-to-obj_type = 'TABL'.
WHEN 'DA'.
<ls_edge>-to-obj_type = 'TTYP'.
WHEN OTHERS.
_raise 'resolve_ddic, unknown object_cls'.
ENDCASE.
ENDLOOP.
ENDLOOP.
DO.
lv_before = lines( lt_nodes ).
LOOP AT lt_nodes ASSIGNING <ls_node>.
lv_index = sy-tabix.
READ TABLE lt_edges WITH KEY
from-obj_name = <ls_node>-obj_name
from-obj_type = <ls_node>-obj_type
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE obj_name = <ls_node>-obj_name
AND object = <ls_node>-obj_type.
<ls_tadir>-korrnum = <ls_tadir>-korrnum + lv_plus.
CONDENSE <ls_tadir>-korrnum.
ENDLOOP.
DELETE lt_edges
WHERE to-obj_name = <ls_node>-obj_name
AND to-obj_type = <ls_node>-obj_type.
DELETE lt_nodes INDEX lv_index.
EXIT. " make sure the sequence is fixed
ENDIF.
ENDLOOP.
IF lv_before = lines( lt_nodes ).
EXIT.
ENDIF.
lv_plus = lv_plus + 1.
ENDDO.
ENDMETHOD. "resolve_ddic
METHOD delete_obj.
DATA: li_obj TYPE REF TO lif_object.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
li_obj->delete( ).
ENDMETHOD. "delete
METHOD serialize.
DATA: lt_files TYPE ty_files_tt,
li_obj TYPE REF TO lif_object,
lo_xml TYPE REF TO lcl_xml_output,
lo_files TYPE REF TO lcl_objects_files.
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 for duplicates
lt_files[] = rt_files[].
SORT lt_files BY path ASCENDING filename ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path filename.
IF lines( lt_files ) <> lines( rt_files ).
_raise 'Duplicates'.
ENDIF.
ENDMETHOD. "serialize
METHOD prioritize_deser.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
* PROG before internet services, as the services might use the screens
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ISAP has to be handled before ISRP
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IASP'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
LOOP AT it_results ASSIGNING <ls_result>
WHERE obj_type <> 'IASP' AND obj_type <> 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
ENDMETHOD. "prioritize_deser
METHOD deserialize.
TYPES: BEGIN OF ty_late,
obj TYPE REF TO lif_object,
xml TYPE REF TO lcl_xml_input,
package TYPE devclass,
END OF ty_late.
DATA: ls_item TYPE ty_item,
lv_cancel TYPE abap_bool,
li_obj TYPE REF TO lif_object,
lt_remote TYPE ty_files_tt,
lv_package TYPE devclass,
lo_files TYPE REF TO lcl_objects_files,
lo_xml TYPE REF TO lcl_xml_input,
lt_results TYPE ty_results_tt,
lt_late TYPE TABLE OF ty_late.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF lt_results,
<ls_late> LIKE LINE OF lt_late.
lcl_objects_activation=>clear( ).
lt_remote = io_repo->get_files_remote( ).
lt_results = lcl_file_status=>status( io_repo ).
DELETE lt_results WHERE match = abap_true.
SORT lt_results BY obj_type ASCENDING obj_name ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_results COMPARING obj_type obj_name.
lt_results = prioritize_deser( lt_results ).
warning_overwrite( EXPORTING io_repo = io_repo
CHANGING ct_results = lt_results ).
LOOP AT lt_results ASSIGNING <ls_result>.
lcl_progress=>show( iv_key = 'Deserialize'
iv_current = sy-tabix
iv_total = lines( lt_results )
iv_text = <ls_result>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_result>-obj_type.
ls_item-obj_name = <ls_result>-obj_name.
* handle namespaces
REPLACE ALL OCCURRENCES OF '#' IN ls_item-obj_name WITH '/'.
lv_package = path_to_package(
iv_top = io_repo->get_package( )
iv_start = io_repo->get_dot_abapgit( )->get_starting_folder( )
iv_path = <ls_result>-path ).
lv_cancel = warning_package( is_item = ls_item
iv_package = lv_package ).
IF lv_cancel = abap_true.
_raise 'cancelled'.
ENDIF.
CREATE OBJECT lo_files
EXPORTING
is_item = ls_item.
lo_files->set_files( lt_remote ).
* Analyze XML in order to instantiate the proper serializer
lo_xml = lo_files->read_xml( ).
li_obj = create_object( is_item = ls_item
iv_language = io_repo->get_master_language( )
is_metadata = lo_xml->get_metadata( ) ).
li_obj->mo_files = lo_files.
IF li_obj->get_metadata( )-late_deser = abap_true.
APPEND INITIAL LINE TO lt_late ASSIGNING <ls_late>.
<ls_late>-obj = li_obj.
<ls_late>-xml = lo_xml.
<ls_late>-package = lv_package.
CONTINUE.
ENDIF.
li_obj->deserialize( iv_package = lv_package
io_xml = lo_xml ).
ENDLOOP.
lcl_objects_activation=>activate( ).
LOOP AT lt_late ASSIGNING <ls_late>.
<ls_late>-obj->deserialize( iv_package = <ls_late>-package
io_xml = <ls_late>-xml ).
ENDLOOP.
update_package_tree( io_repo->get_package( ) ).
ENDMETHOD. "deserialize
ENDCLASS. "lcl_object IMPLEMENTATION
*----------------------------------------------------------------------*
* INTERFACE lif_gui_page DEFINITION
*----------------------------------------------------------------------*
INTERFACE lif_gui_page.
METHODS on_event
IMPORTING iv_action TYPE clike
iv_frame TYPE clike
iv_getdata TYPE clike
it_postdata TYPE cnht_post_data_tab
it_query_table TYPE cnht_query_table
RETURNING VALUE(rv_state) TYPE i
RAISING lcx_exception.
METHODS render
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception.
METHODS get_assets
RETURNING VALUE(rt_assets) TYPE tt_web_assets.
ENDINTERFACE.
*----------------------------------------------------------------------*
* CLASS lcl_gui_router DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_gui_router DEFINITION FINAL.
PUBLIC SECTION.
METHODS on_event
IMPORTING iv_action TYPE clike
iv_getdata TYPE clike OPTIONAL
it_postdata TYPE cnht_post_data_tab OPTIONAL
EXPORTING ei_page TYPE REF TO lif_gui_page
ev_state TYPE i
RAISING lcx_exception.
PRIVATE SECTION.
TYPES: BEGIN OF ty_popup,
url TYPE string,
package TYPE devclass,
branch_name TYPE string,
cancel TYPE abap_bool,
END OF ty_popup.
METHODS get_page_by_name
IMPORTING iv_name TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS repo_popup
IMPORTING iv_url TYPE string
iv_package TYPE devclass OPTIONAL
iv_branch TYPE string DEFAULT 'refs/heads/master'
RETURNING VALUE(rs_popup) TYPE ty_popup
RAISING lcx_exception.
METHODS get_page_diff
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_branch_overview
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_stage
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_commit
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_db_by_name
IMPORTING iv_name TYPE clike
iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS abapgit_installation
RAISING lcx_exception.
METHODS repo_clone
IMPORTING iv_url TYPE string
RAISING lcx_exception.
METHODS repo_purge
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS repo_remove
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS repo_new_offline
RAISING lcx_exception.
METHODS repo_package_zip
RAISING lcx_exception.
METHODS repo_pull
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS switch_branch
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS reset
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS create_branch_popup
EXPORTING ev_name TYPE string
ev_cancel TYPE abap_bool
RAISING lcx_exception.
METHODS create_branch
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS db_delete
IMPORTING iv_getdata TYPE clike
RAISING lcx_exception.
METHODS db_save
IMPORTING it_postdata TYPE cnht_post_data_tab
RAISING lcx_exception.
METHODS commit_push
IMPORTING it_postdata TYPE cnht_post_data_tab
RAISING lcx_exception.
METHODS stage_handle_action
IMPORTING iv_getdata TYPE clike
iv_action TYPE clike
RAISING lcx_exception.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_gui DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
PUBLIC SECTION.
METHODS go_home
RAISING lcx_exception.
METHODS back
IMPORTING iv_to_bookmark TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rv_exit) TYPE xfeld
RAISING lcx_exception.
METHODS on_event FOR EVENT sapevent OF cl_gui_html_viewer
IMPORTING action frame getdata postdata query_table. "#EC NEEDED
PRIVATE SECTION.
TYPES: BEGIN OF ty_page_stack,
page TYPE REF TO lif_gui_page,
bookmark TYPE abap_bool,
END OF ty_page_stack.
DATA: mi_cur_page TYPE REF TO lif_gui_page,
mt_stack TYPE TABLE OF ty_page_stack,
mt_assets TYPE tt_w3urls,
mo_router TYPE REF TO lcl_gui_router,
mo_html_viewer TYPE REF TO cl_gui_html_viewer.
METHODS constructor
RAISING lcx_exception.
METHODS startup
RAISING lcx_exception.
METHODS cache_image
IMPORTING iv_url TYPE w3url
iv_base64 TYPE string.
METHODS cache_html
IMPORTING iv_html TYPE string
RETURNING VALUE(rv_url) TYPE w3url.
METHODS render
RAISING lcx_exception.
METHODS call_page
IMPORTING ii_page TYPE REF TO lif_gui_page
iv_with_bookmark TYPE abap_bool DEFAULT abap_false
RAISING lcx_exception.
ENDCLASS. "lcl_gui DEFINITION
INCLUDE zabapgit_repo_impl.
INCLUDE zabapgit_background.
*----------------------------------------------------------------------*
* CLASS lcl_app IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_app IMPLEMENTATION.
METHOD run.
IF sy-batch = abap_true.
lcl_background=>run( ).
ELSE.
gui( )->go_home( ).
CALL SELECTION-SCREEN 1001. " trigger screen
ENDIF.
ENDMETHOD. "run
METHOD gui.
IF go_gui IS NOT BOUND.
CREATE OBJECT go_gui.
ENDIF.
ro_gui = go_gui.
ENDMETHOD. "gui
METHOD user.
IF iv_user = sy-uname ##USER_OK.
IF go_current_user IS NOT BOUND.
CREATE OBJECT go_current_user.
ENDIF.
ro_user = go_current_user.
ELSE.
CREATE OBJECT ro_user
EXPORTING
iv_user = iv_user.
ENDIF.
ENDMETHOD. "user
METHOD repo_srv.
IF go_repo_srv IS NOT BOUND.
CREATE OBJECT go_repo_srv.
ENDIF.
ro_repo_srv = go_repo_srv.
ENDMETHOD. "repo_srv
METHOD db.
IF go_db IS NOT BOUND.
CREATE OBJECT go_db.
ENDIF.
ro_db = go_db.
ENDMETHOD. "repo_srv
ENDCLASS. "lcl_app
INCLUDE zabapgit_zip.
INCLUDE zabapgit_gui.
INCLUDE zabapgit_unit_test.
INCLUDE zabapgit_forms.
* Hide Execute button from screen
AT SELECTION-SCREEN OUTPUT.
PERFORM output.

View File

@ -0,0 +1,63 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_APP_IMPL
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_app IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_app IMPLEMENTATION.
METHOD run.
IF sy-batch = abap_true.
lcl_background=>run( ).
ELSE.
gui( )->go_home( ).
CALL SELECTION-SCREEN 1001. " trigger screen
ENDIF.
ENDMETHOD. "run
METHOD gui.
IF go_gui IS NOT BOUND.
CREATE OBJECT go_gui.
ENDIF.
ro_gui = go_gui.
ENDMETHOD. "gui
METHOD user.
IF iv_user = sy-uname ##USER_OK.
IF go_current_user IS NOT BOUND.
CREATE OBJECT go_current_user.
ENDIF.
ro_user = go_current_user.
ELSE.
CREATE OBJECT ro_user
EXPORTING
iv_user = iv_user.
ENDIF.
ENDMETHOD. "user
METHOD repo_srv.
IF go_repo_srv IS NOT BOUND.
CREATE OBJECT go_repo_srv.
ENDIF.
ro_repo_srv = go_repo_srv.
ENDMETHOD. "repo_srv
METHOD db.
IF go_db IS NOT BOUND.
CREATE OBJECT go_db.
ENDIF.
ro_db = go_db.
ENDMETHOD. "repo_srv
ENDCLASS. "lcl_app

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_APP_IMPL</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_APP_IMPL</ENTRY>
<LENGTH>25</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -2,6 +2,206 @@
*& Include ZABAPGIT_GUI
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* INTERFACE lif_gui_page DEFINITION
*----------------------------------------------------------------------*
INTERFACE lif_gui_page.
METHODS on_event
IMPORTING iv_action TYPE clike
iv_frame TYPE clike
iv_getdata TYPE clike
it_postdata TYPE cnht_post_data_tab
it_query_table TYPE cnht_query_table
RETURNING VALUE(rv_state) TYPE i
RAISING lcx_exception.
METHODS render
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception.
METHODS get_assets
RETURNING VALUE(rt_assets) TYPE tt_web_assets.
ENDINTERFACE.
*----------------------------------------------------------------------*
* CLASS lcl_gui_router DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_gui_router DEFINITION FINAL.
PUBLIC SECTION.
METHODS on_event
IMPORTING iv_action TYPE clike
iv_getdata TYPE clike OPTIONAL
it_postdata TYPE cnht_post_data_tab OPTIONAL
EXPORTING ei_page TYPE REF TO lif_gui_page
ev_state TYPE i
RAISING lcx_exception.
PRIVATE SECTION.
TYPES: BEGIN OF ty_popup,
url TYPE string,
package TYPE devclass,
branch_name TYPE string,
cancel TYPE abap_bool,
END OF ty_popup.
METHODS get_page_by_name
IMPORTING iv_name TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS repo_popup
IMPORTING iv_url TYPE string
iv_package TYPE devclass OPTIONAL
iv_branch TYPE string DEFAULT 'refs/heads/master'
RETURNING VALUE(rs_popup) TYPE ty_popup
RAISING lcx_exception.
METHODS get_page_diff
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_branch_overview
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_stage
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_commit
IMPORTING iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS get_page_db_by_name
IMPORTING iv_name TYPE clike
iv_getdata TYPE clike
RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page
RAISING lcx_exception.
METHODS abapgit_installation
RAISING lcx_exception.
METHODS repo_clone
IMPORTING iv_url TYPE string
RAISING lcx_exception.
METHODS repo_purge
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS repo_remove
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS repo_new_offline
RAISING lcx_exception.
METHODS repo_package_zip
RAISING lcx_exception.
METHODS repo_pull
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS switch_branch
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS reset
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS create_branch_popup
EXPORTING ev_name TYPE string
ev_cancel TYPE abap_bool
RAISING lcx_exception.
METHODS create_branch
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
METHODS db_delete
IMPORTING iv_getdata TYPE clike
RAISING lcx_exception.
METHODS db_save
IMPORTING it_postdata TYPE cnht_post_data_tab
RAISING lcx_exception.
METHODS commit_push
IMPORTING it_postdata TYPE cnht_post_data_tab
RAISING lcx_exception.
METHODS stage_handle_action
IMPORTING iv_getdata TYPE clike
iv_action TYPE clike
RAISING lcx_exception.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_gui DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
PUBLIC SECTION.
METHODS go_home
RAISING lcx_exception.
METHODS back
IMPORTING iv_to_bookmark TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rv_exit) TYPE xfeld
RAISING lcx_exception.
METHODS on_event FOR EVENT sapevent OF cl_gui_html_viewer
IMPORTING action frame getdata postdata query_table. "#EC NEEDED
PRIVATE SECTION.
TYPES: BEGIN OF ty_page_stack,
page TYPE REF TO lif_gui_page,
bookmark TYPE abap_bool,
END OF ty_page_stack.
DATA: mi_cur_page TYPE REF TO lif_gui_page,
mt_stack TYPE TABLE OF ty_page_stack,
mt_assets TYPE tt_w3urls,
mo_router TYPE REF TO lcl_gui_router,
mo_html_viewer TYPE REF TO cl_gui_html_viewer.
METHODS constructor
RAISING lcx_exception.
METHODS startup
RAISING lcx_exception.
METHODS cache_image
IMPORTING iv_url TYPE w3url
iv_base64 TYPE string.
METHODS cache_html
IMPORTING iv_html TYPE string
RETURNING VALUE(rv_url) TYPE w3url.
METHODS render
RAISING lcx_exception.
METHODS call_page
IMPORTING ii_page TYPE REF TO lif_gui_page
iv_with_bookmark TYPE abap_bool DEFAULT abap_false
RAISING lcx_exception.
ENDCLASS. "lcl_gui DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_view IMPLEMENTATION
*----------------------------------------------------------------------*

View File

@ -2,6 +2,628 @@
*& Include ZABAPGIT_OBJECT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_objects IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_objects IMPLEMENTATION.
METHOD warning_overwrite.
DATA: lv_index TYPE i,
lv_answer TYPE c,
lv_question TYPE string,
lt_before TYPE lcl_persistence_repo=>ty_local_checksum_tt,
lt_current TYPE lcl_persistence_repo=>ty_local_checksum_tt.
FIELD-SYMBOLS: <ls_before> LIKE LINE OF lt_before,
<ls_current> LIKE LINE OF lt_current,
<ls_result> LIKE LINE OF ct_results.
lt_before = io_repo->get_local_checksums( ).
lt_current = io_repo->build_local_checksums( ).
LOOP AT ct_results ASSIGNING <ls_result>.
lv_index = sy-tabix.
READ TABLE lt_before ASSIGNING <ls_before>
WITH KEY item-obj_type = <ls_result>-obj_type
item-obj_name = <ls_result>-obj_name.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_current ASSIGNING <ls_current>
WITH KEY item-obj_type = <ls_result>-obj_type
item-obj_name = <ls_result>-obj_name.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
IF <ls_before>-sha1 <> <ls_current>-sha1.
lv_question = |It looks like object { <ls_result>-obj_type
} { <ls_result>-obj_name
} has been modified locally, overwrite object?|.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Warning'
text_question = lv_question
display_cancel_button = abap_false
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2 ##NO_TEXT.
IF sy-subrc <> 0.
_raise 'error from POPUP_TO_CONFIRM'.
ENDIF.
IF lv_answer = '2'.
DELETE ct_results INDEX lv_index.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD warning_package.
DATA: lv_question TYPE c LENGTH 200,
lv_answer TYPE c,
ls_tadir TYPE tadir.
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
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
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
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2. "#EC NOTEXT
IF sy-subrc <> 0.
_raise 'error from POPUP_TO_CONFIRM'.
ENDIF.
IF lv_answer = '2'.
rv_cancel = abap_true.
ENDIF.
ENDIF.
ENDMETHOD. "check_warning
METHOD update_package_tree.
DATA: lt_packages TYPE lcl_sap_package=>ty_devclass_tt,
lv_package LIKE LINE OF lt_packages,
lv_tree TYPE dirtree-tname.
lt_packages = lcl_sap_package=>list_subpackages( iv_package ).
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.
TYPES: BEGIN OF ty_obj_serializer_map,
item LIKE is_item,
metadata LIKE is_metadata,
END OF ty_obj_serializer_map.
STATICS st_obj_serializer_map
TYPE SORTED TABLE OF ty_obj_serializer_map WITH UNIQUE KEY item.
DATA: lv_message TYPE string,
lv_class_name TYPE string,
ls_obj_serializer_map LIKE LINE OF st_obj_serializer_map.
READ TABLE st_obj_serializer_map
INTO ls_obj_serializer_map WITH KEY item = is_item.
IF sy-subrc = 0.
lv_class_name = ls_obj_serializer_map-metadata-class.
ELSEIF is_metadata IS NOT INITIAL.
* Metadata is provided only on serialization
* Once this has been triggered, the same serializer shall be used
* for subsequent processes.
* Thus, buffer the metadata afterwards
ls_obj_serializer_map-item = is_item.
ls_obj_serializer_map-metadata = is_metadata.
INSERT ls_obj_serializer_map INTO TABLE st_obj_serializer_map.
lv_class_name = is_metadata-class.
ELSE.
lv_class_name = class_name( is_item ).
ENDIF.
TRY.
CREATE OBJECT ri_obj TYPE (lv_class_name)
EXPORTING
is_item = is_item
iv_language = iv_language.
CATCH cx_sy_create_object_error.
TRY.
* 2nd step, try looking for plugins
CREATE OBJECT ri_obj TYPE lcl_objects_bridge
EXPORTING
is_item = is_item.
CATCH cx_sy_create_object_error.
CONCATENATE 'Object type' is_item-obj_type 'not supported, serialize'
INTO lv_message
SEPARATED BY space. "#EC NOTEXT
_raise lv_message.
ENDTRY.
ENDTRY.
ENDMETHOD. "create_object
METHOD is_supported.
TRY.
create_object( is_item = is_item
iv_language = gc_english ).
rv_bool = abap_true.
CATCH lcx_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: <ls_snode> 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 <ls_snode>.
lv_type = <ls_snode>-name+11.
APPEND lv_type TO rt_types.
ENDLOOP.
ENDMETHOD. "supported_list
METHOD exists.
DATA: li_obj TYPE REF TO lif_object.
TRY.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
rv_bool = li_obj->exists( ).
CATCH lcx_exception.
* ignore all errors and assume the object exists
rv_bool = abap_true.
ENDTRY.
ENDMETHOD. "exists
METHOD path_to_package.
DATA: lv_length TYPE i,
lv_path TYPE string.
lv_length = strlen( iv_start ) - 1.
lv_path = iv_path+lv_length.
CONCATENATE iv_top lv_path INTO rv_package.
TRANSLATE rv_package USING '/_'.
lv_length = strlen( rv_package ) - 1.
rv_package = rv_package(lv_length).
TRANSLATE rv_package TO UPPER CASE.
IF lcl_sap_package=>exists( rv_package ) = abap_false.
lcl_sap_package=>create_child( iv_parent = iv_top
iv_child = rv_package ).
ENDIF.
ENDMETHOD.
METHOD class_name.
CONCATENATE 'LCL_OBJECT_' is_item-obj_type INTO rv_class_name. "#EC NOTEXT
ENDMETHOD. "class_name
METHOD jump.
DATA: li_obj TYPE REF TO lif_object.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
li_obj->jump( ).
ENDMETHOD. "jump
METHOD delete.
DATA: ls_item TYPE ty_item,
lt_tadir LIKE it_tadir.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
* misuse field KORRNUM to fix deletion sequence
lt_tadir[] = it_tadir[].
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
CASE <ls_tadir>-object.
WHEN 'IATU'.
<ls_tadir>-korrnum = '5500'.
WHEN 'IARP'.
<ls_tadir>-korrnum = '5510'.
WHEN 'IASP'.
<ls_tadir>-korrnum = '5520'.
WHEN 'SUSC'.
<ls_tadir>-korrnum = '5000'.
WHEN 'TTYP' OR 'TABL' OR 'VIEW'.
<ls_tadir>-korrnum = '7000'.
WHEN 'DTEL'.
<ls_tadir>-korrnum = '8000'.
WHEN 'DOMA'.
<ls_tadir>-korrnum = '9000'.
WHEN 'PROG'.
* delete includes after main programs
SELECT COUNT(*) FROM reposrc
WHERE progname = <ls_tadir>-obj_name
AND r3state = 'A'
AND subc = 'I'.
IF sy-subrc = 0.
<ls_tadir>-korrnum = '2000'.
ELSE.
<ls_tadir>-korrnum = '1000'.
ENDIF.
WHEN OTHERS.
<ls_tadir>-korrnum = '1000'.
ENDCASE.
ENDLOOP.
resolve_ddic( CHANGING ct_tadir = lt_tadir ).
SORT lt_tadir BY korrnum ASCENDING.
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
lcl_progress=>show( iv_key = 'Delete'
iv_current = sy-tabix
iv_total = lines( lt_tadir )
iv_text = <ls_tadir>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_tadir>-object.
ls_item-obj_name = <ls_tadir>-obj_name.
delete_obj( ls_item ).
ENDLOOP.
ENDMETHOD. "delete
METHOD resolve_ddic.
* this will make sure the deletion sequence of structures/tables work
* in case they have dependencies with .INCLUDE
TYPES: BEGIN OF ty_edge,
from TYPE ty_item,
to TYPE ty_item,
END OF ty_edge.
DATA: lt_nodes TYPE TABLE OF ty_item,
lt_edges TYPE TABLE OF ty_edge,
lt_findstrings TYPE TABLE OF rsfind,
lv_plus TYPE i VALUE 1,
lv_find_obj_cls TYPE euobj-id,
lv_index TYPE i,
lv_before TYPE i,
lt_founds TYPE TABLE OF rsfindlst,
lt_scope TYPE STANDARD TABLE OF seu_obj.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir,
<ls_edge> LIKE LINE OF lt_edges,
<ls_found> LIKE LINE OF lt_founds,
<ls_node> LIKE LINE OF lt_nodes.
* build nodes
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE object = 'TABL'
OR object = 'TTYP'.
APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
<ls_node>-obj_name = <ls_tadir>-obj_name.
<ls_node>-obj_type = <ls_tadir>-object.
ENDLOOP.
APPEND 'TABL' TO lt_scope.
APPEND 'STRU' TO lt_scope.
APPEND 'TTYP' TO lt_scope.
* build edges
LOOP AT lt_nodes ASSIGNING <ls_node>.
CLEAR lt_findstrings.
APPEND <ls_node>-obj_name TO lt_findstrings.
lv_find_obj_cls = <ls_node>-obj_type.
CALL FUNCTION 'RS_EU_CROSSREF'
EXPORTING
i_find_obj_cls = lv_find_obj_cls
TABLES
i_findstrings = lt_findstrings
o_founds = lt_founds
i_scope_object_cls = lt_scope
EXCEPTIONS
not_executed = 1
not_found = 2
illegal_object = 3
no_cross_for_this_object = 4
batch = 5
batchjob_error = 6
wrong_type = 7
object_not_exist = 8
OTHERS = 9.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
LOOP AT lt_founds ASSIGNING <ls_found>.
APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
<ls_edge>-from = <ls_node>.
<ls_edge>-to-obj_name = <ls_found>-object.
CASE <ls_found>-object_cls.
WHEN 'DS'
OR 'DT'.
<ls_edge>-to-obj_type = 'TABL'.
WHEN 'DA'.
<ls_edge>-to-obj_type = 'TTYP'.
WHEN OTHERS.
_raise 'resolve_ddic, unknown object_cls'.
ENDCASE.
ENDLOOP.
ENDLOOP.
DO.
lv_before = lines( lt_nodes ).
LOOP AT lt_nodes ASSIGNING <ls_node>.
lv_index = sy-tabix.
READ TABLE lt_edges WITH KEY
from-obj_name = <ls_node>-obj_name
from-obj_type = <ls_node>-obj_type
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE obj_name = <ls_node>-obj_name
AND object = <ls_node>-obj_type.
<ls_tadir>-korrnum = <ls_tadir>-korrnum + lv_plus.
CONDENSE <ls_tadir>-korrnum.
ENDLOOP.
DELETE lt_edges
WHERE to-obj_name = <ls_node>-obj_name
AND to-obj_type = <ls_node>-obj_type.
DELETE lt_nodes INDEX lv_index.
EXIT. " make sure the sequence is fixed
ENDIF.
ENDLOOP.
IF lv_before = lines( lt_nodes ).
EXIT.
ENDIF.
lv_plus = lv_plus + 1.
ENDDO.
ENDMETHOD. "resolve_ddic
METHOD delete_obj.
DATA: li_obj TYPE REF TO lif_object.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
li_obj->delete( ).
ENDMETHOD. "delete
METHOD serialize.
DATA: lt_files TYPE ty_files_tt,
li_obj TYPE REF TO lif_object,
lo_xml TYPE REF TO lcl_xml_output,
lo_files TYPE REF TO lcl_objects_files.
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 for duplicates
lt_files[] = rt_files[].
SORT lt_files BY path ASCENDING filename ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path filename.
IF lines( lt_files ) <> lines( rt_files ).
_raise 'Duplicates'.
ENDIF.
ENDMETHOD. "serialize
METHOD prioritize_deser.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
* PROG before internet services, as the services might use the screens
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ISAP has to be handled before ISRP
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IASP'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
LOOP AT it_results ASSIGNING <ls_result>
WHERE obj_type <> 'IASP' AND obj_type <> 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
ENDMETHOD. "prioritize_deser
METHOD deserialize.
TYPES: BEGIN OF ty_late,
obj TYPE REF TO lif_object,
xml TYPE REF TO lcl_xml_input,
package TYPE devclass,
END OF ty_late.
DATA: ls_item TYPE ty_item,
lv_cancel TYPE abap_bool,
li_obj TYPE REF TO lif_object,
lt_remote TYPE ty_files_tt,
lv_package TYPE devclass,
lo_files TYPE REF TO lcl_objects_files,
lo_xml TYPE REF TO lcl_xml_input,
lt_results TYPE ty_results_tt,
lt_late TYPE TABLE OF ty_late.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF lt_results,
<ls_late> LIKE LINE OF lt_late.
lcl_objects_activation=>clear( ).
lt_remote = io_repo->get_files_remote( ).
lt_results = lcl_file_status=>status( io_repo ).
DELETE lt_results WHERE match = abap_true.
SORT lt_results BY obj_type ASCENDING obj_name ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_results COMPARING obj_type obj_name.
lt_results = prioritize_deser( lt_results ).
warning_overwrite( EXPORTING io_repo = io_repo
CHANGING ct_results = lt_results ).
LOOP AT lt_results ASSIGNING <ls_result>.
lcl_progress=>show( iv_key = 'Deserialize'
iv_current = sy-tabix
iv_total = lines( lt_results )
iv_text = <ls_result>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_result>-obj_type.
ls_item-obj_name = <ls_result>-obj_name.
* handle namespaces
REPLACE ALL OCCURRENCES OF '#' IN ls_item-obj_name WITH '/'.
lv_package = path_to_package(
iv_top = io_repo->get_package( )
iv_start = io_repo->get_dot_abapgit( )->get_starting_folder( )
iv_path = <ls_result>-path ).
lv_cancel = warning_package( is_item = ls_item
iv_package = lv_package ).
IF lv_cancel = abap_true.
_raise 'cancelled'.
ENDIF.
CREATE OBJECT lo_files
EXPORTING
is_item = ls_item.
lo_files->set_files( lt_remote ).
* Analyze XML in order to instantiate the proper serializer
lo_xml = lo_files->read_xml( ).
li_obj = create_object( is_item = ls_item
iv_language = io_repo->get_master_language( )
is_metadata = lo_xml->get_metadata( ) ).
li_obj->mo_files = lo_files.
IF li_obj->get_metadata( )-late_deser = abap_true.
APPEND INITIAL LINE TO lt_late ASSIGNING <ls_late>.
<ls_late>-obj = li_obj.
<ls_late>-xml = lo_xml.
<ls_late>-package = lv_package.
CONTINUE.
ENDIF.
li_obj->deserialize( iv_package = lv_package
io_xml = lo_xml ).
ENDLOOP.
lcl_objects_activation=>activate( ).
LOOP AT lt_late ASSIGNING <ls_late>.
<ls_late>-obj->deserialize( iv_package = <ls_late>-package
io_xml = <ls_late>-xml ).
ENDLOOP.
update_package_tree( io_repo->get_package( ) ).
ENDMETHOD. "deserialize
ENDCLASS. "lcl_objects IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_object_acid DEFINITION
*----------------------------------------------------------------------*