From e00cd36bf14239e3db6fa2968f7bdf23d3f5d6f2 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Thu, 8 Sep 2016 15:07:02 +0300 Subject: [PATCH 1/4] #329 reorg includes --- src/zabapgit_object.prog.abap | 2397 --------------------------------- src/zabapgit_object.prog.xml | 48 - 2 files changed, 2445 deletions(-) delete mode 100644 src/zabapgit_object.prog.abap delete mode 100644 src/zabapgit_object.prog.xml diff --git a/src/zabapgit_object.prog.abap b/src/zabapgit_object.prog.abap deleted file mode 100644 index 97581478e..000000000 --- a/src/zabapgit_object.prog.abap +++ /dev/null @@ -1,2397 +0,0 @@ -*&---------------------------------------------------------------------* -*& 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: LIKE LINE OF lt_before, - LIKE LINE OF lt_current, - LIKE LINE OF ct_results. - - - lt_before = io_repo->get_local_checksums( ). - lt_current = io_repo->build_local_checksums( ). - - LOOP AT ct_results ASSIGNING . - lv_index = sy-tabix. - - READ TABLE lt_before ASSIGNING - WITH KEY item-obj_type = -obj_type - item-obj_name = -obj_name. - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - - READ TABLE lt_current ASSIGNING - WITH KEY item-obj_type = -obj_type - item-obj_name = -obj_name. - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - - IF -sha1 <> -sha1. - lv_question = |It looks like object { -obj_type - } { -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. - lcx_exception=>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. - lcx_exception=>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 - lcx_exception=>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: 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 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 changed_by. - - DATA: li_obj TYPE REF TO lif_object. - - - li_obj = create_object( is_item = is_item - iv_language = gc_english ). - - rv_user = li_obj->changed_by( ). - - ASSERT NOT rv_user IS INITIAL. - -* todo, fallback to looking at transports if rv_user = 'UNKNOWN'? - - ENDMETHOD. - - METHOD delete. - - DATA: ls_item TYPE ty_item, - lv_tabclass TYPE dd02l-tabclass, - lt_tadir LIKE it_tadir. - - FIELD-SYMBOLS: LIKE LINE OF it_tadir. - - -* misuse field KORRNUM to fix deletion sequence - - lt_tadir[] = it_tadir[]. - - LOOP AT lt_tadir ASSIGNING . - CASE -object. - WHEN 'IATU'. - -korrnum = '5500'. - WHEN 'IARP'. - -korrnum = '5510'. - WHEN 'IASP'. - -korrnum = '5520'. - WHEN 'SUSC'. - -korrnum = '5000'. - WHEN 'TTYP' OR 'TABL' OR 'VIEW'. - SELECT SINGLE tabclass FROM dd02l - INTO lv_tabclass - WHERE tabname = -obj_name - AND as4local = 'A' - AND as4vers = '0000'. - IF sy-subrc = 0 AND lv_tabclass = 'APPEND'. -* delete append structures before database tables - -korrnum = '6500'. - ELSE. - -korrnum = '7000'. - ENDIF. - WHEN 'DTEL'. - -korrnum = '8000'. - WHEN 'DOMA'. - -korrnum = '9000'. - WHEN 'PROG'. -* delete includes after main programs - SELECT COUNT(*) FROM reposrc - WHERE progname = -obj_name - AND r3state = 'A' - AND subc = 'I'. - IF sy-subrc = 0. - -korrnum = '2000'. - ELSE. - -korrnum = '1000'. - ENDIF. - WHEN OTHERS. - -korrnum = '1000'. - ENDCASE. - ENDLOOP. - - resolve_ddic( CHANGING ct_tadir = lt_tadir ). - - SORT lt_tadir BY korrnum ASCENDING. - - LOOP AT lt_tadir ASSIGNING . - lcl_progress=>show( iv_key = 'Delete' - iv_current = sy-tabix - iv_total = lines( lt_tadir ) - iv_text = -obj_name ) ##NO_TEXT. - - CLEAR ls_item. - ls_item-obj_type = -object. - ls_item-obj_name = -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: LIKE LINE OF ct_tadir, - LIKE LINE OF lt_edges, - LIKE LINE OF lt_founds, - LIKE LINE OF lt_nodes. - - -* build nodes - LOOP AT ct_tadir ASSIGNING - WHERE object = 'TABL' - OR object = 'TTYP'. - APPEND INITIAL LINE TO lt_nodes ASSIGNING . - -obj_name = -obj_name. - -obj_type = -object. - ENDLOOP. - - APPEND 'TABL' TO lt_scope. - APPEND 'STRU' TO lt_scope. - APPEND 'TTYP' TO lt_scope. - -* build edges - LOOP AT lt_nodes ASSIGNING . - - CLEAR lt_findstrings. - APPEND -obj_name TO lt_findstrings. - lv_find_obj_cls = -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 . - APPEND INITIAL LINE TO lt_edges ASSIGNING . - -from = . - - -to-obj_name = -object. - CASE -object_cls. - WHEN 'DS' - OR 'DT'. - -to-obj_type = 'TABL'. - WHEN 'DA'. - -to-obj_type = 'TTYP'. - WHEN OTHERS. - lcx_exception=>raise( 'resolve_ddic, unknown object_cls' ). - ENDCASE. - ENDLOOP. - - ENDLOOP. - - DO. - lv_before = lines( lt_nodes ). - LOOP AT lt_nodes ASSIGNING . - lv_index = sy-tabix. - READ TABLE lt_edges WITH KEY - from-obj_name = -obj_name - from-obj_type = -obj_type - TRANSPORTING NO FIELDS. - IF sy-subrc <> 0. - LOOP AT ct_tadir ASSIGNING - WHERE obj_name = -obj_name - AND object = -obj_type. - -korrnum = -korrnum + lv_plus. - CONDENSE -korrnum. - ENDLOOP. - DELETE lt_edges - WHERE to-obj_name = -obj_name - AND to-obj_type = -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. - - - IF is_supported( is_item ) = abap_true. - li_obj = create_object( is_item = is_item - iv_language = gc_english ). - li_obj->delete( ). - ENDIF. - - ENDMETHOD. "delete - - METHOD serialize. - - DATA: li_obj TYPE REF TO lif_object, - lo_xml TYPE REF TO lcl_xml_output, - lo_files TYPE REF TO lcl_objects_files. - - - IF is_supported( is_item ) = abap_false. - IF NOT io_log IS INITIAL. - io_log->add( iv_msgv1 = 'Object type ignored, not supported:' - iv_msgv2 = is_item-obj_type - iv_msgv3 = '-' - iv_msgv4 = is_item-obj_name ) ##no_text. - 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 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 ). - lcx_exception=>raise( 'Duplicates' ). - ENDIF. - - ENDMETHOD. - - METHOD prioritize_deser. - - FIELD-SYMBOLS: LIKE LINE OF it_results. - -* 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. - - LOOP AT it_results ASSIGNING - WHERE obj_type <> 'IASP' AND obj_type <> 'PROG'. - APPEND 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: LIKE LINE OF lt_results, - 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 . - lcl_progress=>show( iv_key = 'Deserialize' - iv_current = sy-tabix - iv_total = lines( lt_results ) - iv_text = -obj_name ) ##NO_TEXT. - - CLEAR ls_item. - ls_item-obj_type = -obj_type. - ls_item-obj_name = -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 = -path ). - - lv_cancel = warning_package( is_item = ls_item - iv_package = lv_package ). - IF lv_cancel = abap_true. - lcx_exception=>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 . - -obj = li_obj. - -xml = lo_xml. - -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 . - -obj->deserialize( iv_package = -package - io_xml = -xml ). - ENDLOOP. - - update_package_tree( io_repo->get_package( ) ). - - ENDMETHOD. "deserialize - -ENDCLASS. "lcl_objects IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_object_clas DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. - - PUBLIC SECTION. - INTERFACES lif_object. - ALIASES mo_files FOR lif_object~mo_files. - - PRIVATE SECTION. - TYPES: BEGIN OF ty_sotr, - header TYPE sotr_head, - entries TYPE sotr_text_tt, - END OF ty_sotr. - - TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY. - - DATA mv_skip_testclass TYPE abap_bool. - - METHODS deserialize_abap - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - - METHODS deserialize_textpool - IMPORTING io_xml TYPE REF TO lcl_xml_input - RAISING lcx_exception. - - METHODS deserialize_docu - IMPORTING io_xml TYPE REF TO lcl_xml_input - RAISING lcx_exception. - - METHODS deserialize_sotr - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - - METHODS serialize_abap_old - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS deserialize_abap_source_old - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt - RAISING lcx_exception. - - METHODS deserialize_abap_source_new - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt - RAISING lcx_exception - cx_sy_dyn_call_error. - - METHODS serialize_abap_new - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception - cx_sy_dyn_call_error. - - METHODS serialize_locals_imp - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS serialize_locals_def - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS read_include - IMPORTING is_clskey TYPE seoclskey - iv_type TYPE seop_include_ext_app - RETURNING VALUE(rt_source) TYPE seop_source_string. - - METHODS serialize_testclasses - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS serialize_macros - IMPORTING is_clskey TYPE seoclskey - RETURNING VALUE(rt_source) TYPE ty_string_tt - RAISING lcx_exception. - - METHODS serialize_xml - IMPORTING io_xml TYPE REF TO lcl_xml_output - RAISING lcx_exception. - - METHODS read_sotr - RETURNING VALUE(rt_sotr) TYPE ty_sotr_tt - RAISING lcx_exception. - - METHODS remove_signatures - CHANGING ct_source TYPE ty_string_tt. - - METHODS reduce - CHANGING ct_source TYPE ty_string_tt. - -ENDCLASS. "lcl_object_dtel DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_object_intf DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. -* todo, CLAS + INTF to be refactored, see: -* https://github.com/larshp/abapGit/issues/21 -ENDCLASS. "lcl_object_intf DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_object_clas IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_clas IMPLEMENTATION. - - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. "lif_object~get_metadata - - METHOD lif_object~changed_by. -* todo, not sure this is correct, to be tested - SELECT SINGLE changedby FROM seoclassdf INTO rv_user - WHERE clsname = ms_item-obj_name - AND version = '1'. "#EC CI_GENBUFF - IF sy-subrc = 0 AND rv_user IS INITIAL. - SELECT SINGLE author FROM seoclassdf INTO rv_user - WHERE clsname = ms_item-obj_name - AND version = '1'. "#EC CI_GENBUFF - ENDIF. - IF sy-subrc <> 0. - rv_user = c_user_unknown. - ENDIF. - ENDMETHOD. - - METHOD lif_object~exists. - - DATA: ls_clskey TYPE seoclskey. - - - ls_clskey-clsname = ms_item-obj_name. - - CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK' - EXPORTING - clskey = ls_clskey - EXCEPTIONS - not_specified = 1 - not_existing = 2 - is_interface = 3 - no_text = 4 - inconsistent = 5 - OTHERS = 6. - rv_bool = boolc( sy-subrc <> 2 ). - - ENDMETHOD. "lif_object~exists - - METHOD lif_object~jump. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = 'CLAS' - in_new_window = abap_true. - - ENDMETHOD. "jump - - METHOD lif_object~delete. - - DATA: ls_clskey TYPE seoclskey. - - - ls_clskey-clsname = ms_item-obj_name. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' - EXPORTING - clskey = ls_clskey - EXCEPTIONS - not_existing = 1 - is_interface = 2 - db_error = 3 - no_access = 4 - other = 5 - OTHERS = 6. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ). - ENDIF. - WHEN 'INTF'. - CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE' - EXPORTING - intkey = ls_clskey - EXCEPTIONS - not_existing = 1 - is_class = 2 - db_error = 3 - no_access = 4 - other = 5 - OTHERS = 6. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_INTERFACE_DELETE_COMPLETE' ). - ENDIF. - WHEN OTHERS. - lcx_exception=>raise( 'class delete, unknown type' ). - ENDCASE. - - ENDMETHOD. "delete - - METHOD reduce. - - DATA: lv_source LIKE LINE OF ct_source, - lv_found TYPE sap_bool. - - -* skip files that only contain the standard comments - lv_found = abap_false. - LOOP AT ct_source INTO lv_source. - IF strlen( lv_source ) >= 3 AND lv_source(3) <> '*"*'. - lv_found = abap_true. - ENDIF. - ENDLOOP. - IF lv_found = abap_false. - CLEAR ct_source[]. - ENDIF. - - ENDMETHOD. "reduce - - METHOD serialize_locals_imp. - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_locals_imp ). - - reduce( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_local - - METHOD serialize_locals_def. - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_locals_def ). - - reduce( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_locals_def - - METHOD read_include. - - DATA: ls_include TYPE progstruc. - - - ASSERT iv_type = seop_ext_class_locals_def - OR iv_type = seop_ext_class_locals_imp - OR iv_type = seop_ext_class_macros - OR iv_type = seop_ext_class_testclasses. - - ls_include-rootname = is_clskey-clsname. - TRANSLATE ls_include-rootname USING ' ='. - ls_include-categorya = iv_type(1). - ls_include-codea = iv_type+1(4). - -* it looks like there is an issue in function module SEO_CLASS_GET_INCLUDE_SOURCE -* on 750 kernels, where the READ REPORT without STATE addition does not -* return the active version, this method is a workaround for this issue - READ REPORT ls_include INTO rt_source STATE 'A'. - - ENDMETHOD. - - METHOD serialize_testclasses. - - DATA: lv_line1 LIKE LINE OF rt_source, - lv_line2 LIKE LINE OF rt_source. - - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_testclasses ). - -* when creating classes in Eclipse it automatically generates the -* testclass include, but it is not needed, so skip to avoid -* creating an extra file in the repository. -* Also remove it if the content is manually removed, but -* the class still thinks it contains tests - mv_skip_testclass = abap_false. - IF lines( rt_source ) = 2. - READ TABLE rt_source INDEX 1 INTO lv_line1. - ASSERT sy-subrc = 0. - READ TABLE rt_source INDEX 2 INTO lv_line2. - ASSERT sy-subrc = 0. - IF lv_line1(3) = '*"*' AND lv_line2 IS INITIAL. - mv_skip_testclass = abap_true. - ENDIF. - ELSEIF lines( rt_source ) = 1. - READ TABLE rt_source INDEX 1 INTO lv_line1. - ASSERT sy-subrc = 0. - IF lv_line1(3) = '*"*' OR lv_line1 IS INITIAL. - mv_skip_testclass = abap_true. - ENDIF. - ELSEIF lines( rt_source ) = 0. - mv_skip_testclass = abap_true. - ENDIF. - - ENDMETHOD. "serialize_test - - METHOD serialize_macros. - - rt_source = read_include( is_clskey = is_clskey - iv_type = seop_ext_class_macros ). - - reduce( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_macro - - METHOD serialize_abap_old. -* for old ABAP AS versions - DATA: lo_source TYPE REF TO cl_oo_source. - - - CREATE OBJECT lo_source - EXPORTING - clskey = is_clskey - EXCEPTIONS - class_not_existing = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from CL_OO_SOURCE' ). - ENDIF. - - lo_source->read( 'A' ). - rt_source = lo_source->get_old_source( ). - remove_signatures( CHANGING ct_source = rt_source ). - - ENDMETHOD. "serialize_abap - - METHOD serialize_abap_new. - - DATA: lo_source TYPE REF TO object, - lo_instance TYPE REF TO object. - -* do not call the class/methods statically, as it will -* give syntax errors on old versions - CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') - RECEIVING - result = lo_instance. - - CALL METHOD lo_instance->('CREATE_CLIF_SOURCE') - EXPORTING - clif_name = is_clskey-clsname - version = 'A' - RECEIVING - result = lo_source. - - CALL METHOD lo_source->('GET_SOURCE') - IMPORTING - source = rt_source. - - ENDMETHOD. - - METHOD remove_signatures. - -* signatures messes up in CL_OO_SOURCE when deserializing and serializing -* within same session - - DATA: lv_begin TYPE string, - lv_end TYPE string, - lv_remove TYPE sap_bool, - lv_source LIKE LINE OF ct_source. - - - CONCATENATE '* ------------------------------------' - '---------------------------------------------------+' - INTO lv_begin. - - CONCATENATE '* +------------------------------------------------' - '--------------------------------------' - INTO lv_end. - - lv_remove = abap_false. - LOOP AT ct_source INTO lv_source. - IF lv_source = lv_begin. - lv_remove = abap_true. - ENDIF. - IF lv_remove = abap_true. - DELETE ct_source INDEX sy-tabix. - ENDIF. - IF lv_source = lv_end. - lv_remove = abap_false. - ENDIF. - ENDLOOP. - - ENDMETHOD. "remove_signatures - - METHOD lif_object~serialize. - - DATA: lt_source TYPE seop_source_string, - ls_clskey TYPE seoclskey. - - - ls_clskey-clsname = ms_item-obj_name. - - IF lif_object~exists( ) = abap_false. - RETURN. - ENDIF. - - CALL FUNCTION 'SEO_BUFFER_REFRESH' - EXPORTING - version = seoc_version_active - force = seox_true. - CALL FUNCTION 'SEO_BUFFER_REFRESH' - EXPORTING - version = seoc_version_inactive - force = seox_true. - - TRY. - lt_source = serialize_abap_new( ls_clskey ). - CATCH cx_sy_dyn_call_error. - lt_source = serialize_abap_old( ls_clskey ). - ENDTRY. - - mo_files->add_abap( lt_source ). - - IF ms_item-obj_type = 'CLAS'. - lt_source = serialize_locals_def( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'locals_def' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - - lt_source = serialize_locals_imp( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'locals_imp' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - - lt_source = serialize_testclasses( ls_clskey ). - IF NOT lt_source[] IS INITIAL AND mv_skip_testclass = abap_false. - mo_files->add_abap( iv_extra = 'testclasses' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - - lt_source = serialize_macros( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'macros' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. - ENDIF. - - serialize_xml( io_xml ). - - ENDMETHOD. "serialize - - METHOD read_sotr. - - DATA: lv_concept TYPE sotr_head-concept, - lt_seocompodf TYPE STANDARD TABLE OF seocompodf WITH DEFAULT KEY, - ls_header TYPE sotr_head, - lt_entries TYPE sotr_text_tt. - - FIELD-SYMBOLS: LIKE LINE OF rt_sotr, - LIKE LINE OF lt_seocompodf, - LIKE LINE OF lt_entries. - - - SELECT * FROM seocompodf - INTO TABLE lt_seocompodf - WHERE clsname = ms_item-obj_name - AND version = '1' - AND exposure = '2' - AND attdecltyp = '2' - AND type = 'SOTR_CONC' - ORDER BY PRIMARY KEY. - - LOOP AT lt_seocompodf ASSIGNING . - - lv_concept = translate( val = -attvalue from = '''' to = '' ). - - CALL FUNCTION 'SOTR_GET_CONCEPT' - EXPORTING - concept = lv_concept - IMPORTING - header = ls_header - TABLES - entries = lt_entries - EXCEPTIONS - no_entry_found = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_GET_CONCEPT' ). - ENDIF. - - CLEAR: ls_header-paket, - ls_header-crea_name, - ls_header-crea_tstut, - ls_header-chan_name, - ls_header-chan_tstut. - - LOOP AT lt_entries ASSIGNING . - CLEAR: -crea_name, - -crea_tstut, - -chan_name, - -chan_tstut. - ENDLOOP. - - APPEND INITIAL LINE TO rt_sotr ASSIGNING . - -header = ls_header. - -entries = lt_entries. - - ENDLOOP. - - ENDMETHOD. - - METHOD serialize_xml. - - DATA: ls_vseoclass TYPE vseoclass, - lv_cp TYPE program, - lt_tpool TYPE textpool_table, - lv_object TYPE dokhl-object, - lv_state TYPE dokhl-dokstate, - ls_vseointerf TYPE vseointerf, - ls_clskey TYPE seoclskey, - lt_sotr TYPE ty_sotr_tt, - lt_lines TYPE tlinetab. - - - ls_clskey-clsname = ms_item-obj_name. - - CALL FUNCTION 'SEO_CLIF_GET' - EXPORTING - cifkey = ls_clskey - version = seoc_version_active - IMPORTING - class = ls_vseoclass - interface = ls_vseointerf - EXCEPTIONS - not_existing = 1 - deleted = 2 - model_only = 3 - OTHERS = 4. - IF sy-subrc = 1. - RETURN. " in case only inactive version exists - ELSEIF sy-subrc <> 0. - lcx_exception=>raise( 'error from seo_clif_get' ). - ENDIF. - - CLEAR: ls_vseoclass-uuid, - ls_vseoclass-author, - ls_vseoclass-createdon, - ls_vseoclass-changedby, - ls_vseoclass-changedon, - ls_vseoclass-r3release, - ls_vseoclass-chgdanyby, - ls_vseoclass-chgdanyon. - - IF mv_skip_testclass = abap_true. - CLEAR ls_vseoclass-with_unit_tests. - ENDIF. - - CLEAR: ls_vseointerf-uuid, - ls_vseointerf-author, - ls_vseointerf-createdon, - ls_vseointerf-changedby, - ls_vseointerf-changedon, - ls_vseointerf-r3release. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - io_xml->add( iv_name = 'VSEOCLASS' - ig_data = ls_vseoclass ). - - lv_cp = cl_oo_classname_service=>get_classpool_name( ls_clskey-clsname ). - READ TEXTPOOL lv_cp INTO lt_tpool LANGUAGE mv_language. "#EC CI_READ_REP - io_xml->add( iv_name = 'TPOOL' - ig_data = add_tpool( lt_tpool ) ). - - IF ls_vseoclass-category = seoc_category_exception. - lt_sotr = read_sotr( ). - IF lines( lt_sotr ) > 0. - io_xml->add( iv_name = 'SOTR' - ig_data = lt_sotr ). - ENDIF. - ENDIF. - WHEN 'INTF'. - io_xml->add( iv_name = 'VSEOINTERF' - ig_data = ls_vseointerf ). - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - lv_object = ls_clskey-clsname. - CALL FUNCTION 'DOCU_GET' - EXPORTING - id = 'CL' - langu = mv_language - object = lv_object - IMPORTING - dokstate = lv_state - TABLES - line = lt_lines - EXCEPTIONS - no_docu_on_screen = 1 - no_docu_self_def = 2 - no_docu_temp = 3 - ret_code = 4 - OTHERS = 5. - IF sy-subrc = 0 AND lv_state = 'R'. - io_xml->add( iv_name = 'LINES' - ig_data = lt_lines ). - ENDIF. - - ENDMETHOD. "serialize_xml - - METHOD lif_object~deserialize. - -* function group SEOK -* function group SEOQ -* function group SEOP -* class CL_OO_CLASSNAME_SERVICE -* class CL_OO_SOURCE - - deserialize_abap( io_xml = io_xml - iv_package = iv_package ). - - IF ms_item-obj_type = 'CLAS'. - deserialize_textpool( io_xml ). - - deserialize_sotr( io_xml = io_xml - iv_package = iv_package ). - ENDIF. - - deserialize_docu( io_xml ). - - ENDMETHOD. "deserialize - - METHOD deserialize_sotr. - - DATA: lt_sotr TYPE ty_sotr_tt, - lt_objects TYPE sotr_objects, - ls_paket TYPE sotr_pack, - lv_object LIKE LINE OF lt_objects. - - FIELD-SYMBOLS: LIKE LINE OF lt_sotr. - - - io_xml->read( EXPORTING iv_name = 'SOTR' - CHANGING cg_data = lt_sotr ). - - IF lines( lt_sotr ) = 0. - RETURN. - ENDIF. - - LOOP AT lt_sotr ASSIGNING . - CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS' - EXPORTING - object_vector = -header-objid_vec - IMPORTING - objects = lt_objects - EXCEPTIONS - object_not_found = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_OBJECT_GET_OBJECTS' ). - ENDIF. - - READ TABLE lt_objects INDEX 1 INTO lv_object. - ASSERT sy-subrc = 0. - - ls_paket-paket = iv_package. - - CALL FUNCTION 'SOTR_CREATE_CONCEPT' - EXPORTING - paket = ls_paket - crea_lan = -header-crea_lan - alias_name = -header-alias_name - object = lv_object - entries = -entries - concept_default = -header-concept - EXCEPTIONS - package_missing = 1 - crea_lan_missing = 2 - object_missing = 3 - paket_does_not_exist = 4 - alias_already_exist = 5 - object_type_not_found = 6 - langu_missing = 7 - identical_context_not_allowed = 8 - text_too_long = 9 - error_in_update = 10 - no_master_langu = 11 - error_in_concept_id = 12 - alias_not_allowed = 13 - tadir_entry_creation_failed = 14 - internal_error = 15 - error_in_correction = 16 - user_cancelled = 17 - no_entry_found = 18 - OTHERS = 19. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_CREATE_CONCEPT' ). - ENDIF. - - ENDLOOP. - - ENDMETHOD. - - METHOD deserialize_docu. - - DATA: lt_lines TYPE tlinetab, - lv_object TYPE dokhl-object. - - - io_xml->read( EXPORTING iv_name = 'LINES' - CHANGING cg_data = lt_lines ). - - IF lt_lines[] IS INITIAL. - RETURN. - ENDIF. - - lv_object = ms_item-obj_name. - CALL FUNCTION 'DOCU_UPD' - EXPORTING - id = 'CL' - langu = mv_language - object = lv_object - TABLES - line = lt_lines - EXCEPTIONS - ret_code = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from DOCU_UPD' ). - ENDIF. - - ENDMETHOD. "deserialize_doku - - METHOD deserialize_textpool. - - DATA: lv_cp TYPE program, - lv_clsname TYPE seoclsname, - lt_tpool_ext TYPE ty_tpool_tt, - lt_tpool TYPE textpool_table. - - - io_xml->read( EXPORTING iv_name = 'TPOOL' - CHANGING cg_data = lt_tpool_ext ). - lt_tpool = read_tpool( lt_tpool_ext ). - - IF lt_tpool[] IS INITIAL. - RETURN. - ENDIF. - - lv_clsname = ms_item-obj_name. - lv_cp = cl_oo_classname_service=>get_classpool_name( lv_clsname ). - - INSERT TEXTPOOL lv_cp - FROM lt_tpool - LANGUAGE mv_language - STATE 'I'. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). - ENDIF. - - lcl_objects_activation=>add( iv_type = 'REPT' - iv_name = lv_cp ). - - ENDMETHOD. "deserialize_textpool - - METHOD deserialize_abap. - - DATA: ls_vseoclass TYPE vseoclass, - ls_vseointerf TYPE vseointerf, - lt_source TYPE seop_source_string, - lt_locals_def TYPE seop_source_string, - lt_locals_imp TYPE seop_source_string, - lt_locals_mac TYPE seop_source_string, - lt_testclasses TYPE seop_source_string, - ls_clskey TYPE seoclskey. - - - lt_source = mo_files->read_abap( ). - - lt_locals_def = mo_files->read_abap( iv_extra = 'locals_def' - iv_error = abap_false ). "#EC NOTEXT - - lt_locals_imp = mo_files->read_abap( iv_extra = 'locals_imp' - iv_error = abap_false ). "#EC NOTEXT - - lt_locals_mac = mo_files->read_abap( iv_extra = 'macros' - iv_error = abap_false ). "#EC NOTEXT - - lt_testclasses = mo_files->read_abap( iv_extra = 'testclasses' - iv_error = abap_false ). "#EC NOTEXT - - ls_clskey-clsname = ms_item-obj_name. - - - CASE ms_item-obj_type. - WHEN 'CLAS'. - io_xml->read( EXPORTING iv_name = 'VSEOCLASS' - CHANGING cg_data = ls_vseoclass ). - - CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' - EXPORTING - devclass = iv_package - overwrite = seox_true - CHANGING - class = ls_vseoclass - EXCEPTIONS - existing = 1 - is_interface = 2 - db_error = 3 - component_error = 4 - no_access = 5 - other = 6 - OTHERS = 7. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). - ENDIF. - - WHEN 'INTF'. - io_xml->read( EXPORTING iv_name = 'VSEOINTERF' - CHANGING cg_data = ls_vseointerf ). - - CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE' - EXPORTING - devclass = iv_package - overwrite = seox_true - CHANGING - interface = ls_vseointerf - EXCEPTIONS - existing = 1 - is_class = 2 - db_error = 3 - component_error = 4 - no_access = 5 - other = 6 - OTHERS = 7. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). - ENDIF. - - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - IF ms_item-obj_type = 'CLAS'. - CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' - EXPORTING - clskey = ls_clskey - force = seox_true - locals_def = lt_locals_def - locals_imp = lt_locals_imp - locals_mac = lt_locals_mac - locals_testclasses = lt_testclasses - EXCEPTIONS - not_existing = 1 - model_only = 2 - locals_not_generated = 3 - locals_not_initialised = 4 - OTHERS = 5. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from generate_locals' ). - ENDIF. - ENDIF. - - TRY. - deserialize_abap_source_new( - is_clskey = ls_clskey - it_source = lt_source ). - CATCH cx_sy_dyn_call_error. - deserialize_abap_source_old( - is_clskey = ls_clskey - it_source = lt_source ). - ENDTRY. - - lcl_objects_activation=>add_item( ms_item ). - - ENDMETHOD. "deserialize - - METHOD deserialize_abap_source_old. -* for backwards compatability down to 702 - - DATA: lo_source TYPE REF TO cl_oo_source. - - - CREATE OBJECT lo_source - EXPORTING - clskey = is_clskey - EXCEPTIONS - class_not_existing = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from CL_OO_SOURCE' ). - ENDIF. - - TRY. - lo_source->access_permission( seok_access_modify ). - lo_source->set_source( it_source ). - lo_source->save( ). - lo_source->access_permission( seok_access_free ). - CATCH cx_oo_access_permission. - lcx_exception=>raise( 'permission error' ). - CATCH cx_oo_source_save_failure. - lcx_exception=>raise( 'save failure' ). - ENDTRY. - - ENDMETHOD. - - METHOD deserialize_abap_source_new. - - DATA: lo_factory TYPE REF TO object, - lo_source TYPE REF TO object. - - - CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') - RECEIVING - result = lo_factory. - - CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') - EXPORTING - clif_name = is_clskey-clsname - RECEIVING - result = lo_source. - - TRY. - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK'). - CATCH cx_oo_access_permission. - lcx_exception=>raise( 'source_new, access permission exception' ). - ENDTRY. - - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE') - EXPORTING - source = it_source. - - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE'). - - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK'). - - ENDMETHOD. - -ENDCLASS. "lcl_object_CLAS IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_object_fugr DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL. - - PUBLIC SECTION. - INTERFACES lif_object. - ALIASES mo_files FOR lif_object~mo_files. - - PRIVATE SECTION. - TYPES: ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY. - - TYPES: BEGIN OF ty_function, - funcname TYPE rs38l_fnam, - include TYPE progname, - global_flag TYPE rs38l-global, - remote_call TYPE rs38l-remote, - update_task TYPE rs38l-utask, - short_text TYPE tftit-stext, - remote_basxml TYPE rs38l-basxml_enabled, - import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY, - changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY, - export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY, - tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY, - exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY, - documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY, - END OF ty_function. - - TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY. - - METHODS main_name - RETURNING VALUE(rv_program) TYPE program - RAISING lcx_exception. - - METHODS functions - RETURNING VALUE(rt_functab) TYPE ty_rs38l_incl_tt - RAISING lcx_exception. - - METHODS includes - RETURNING VALUE(rt_includes) TYPE rso_t_objnm - RAISING lcx_exception. - - METHODS serialize_functions - RETURNING VALUE(rt_functions) TYPE ty_function_tt - RAISING lcx_exception. - - METHODS deserialize_functions - IMPORTING it_functions TYPE ty_function_tt - RAISING lcx_exception. - - METHODS serialize_xml - IMPORTING io_xml TYPE REF TO lcl_xml_output - RAISING lcx_exception. - - METHODS deserialize_xml - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - - METHODS serialize_includes - RAISING lcx_exception. - - METHODS deserialize_includes - IMPORTING io_xml TYPE REF TO lcl_xml_input - iv_package TYPE devclass - RAISING lcx_exception. - -* METHODS deserialize_dynpros -* IMPORTING it_dynpros TYPE ty_dynpro_tt -* RAISING lcx_exception. -* -* METHODS deserialize_cua -* IMPORTING is_cua TYPE ty_cua -* RAISING lcx_exception. - -ENDCLASS. "lcl_object_fugr DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_object_dtel IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_fugr IMPLEMENTATION. - -* function group SEUF -* function group SIFP -* function group SUNI - - METHOD lif_object~changed_by. - rv_user = c_user_unknown. " todo - ENDMETHOD. - - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. "lif_object~get_metadata - - METHOD lif_object~exists. - - DATA: lv_pool TYPE tlibg-area. - - - lv_pool = ms_item-obj_name. - CALL FUNCTION 'RS_FUNCTION_POOL_EXISTS' - EXPORTING - function_pool = lv_pool - EXCEPTIONS - pool_not_exists = 1. - rv_bool = boolc( sy-subrc <> 1 ). - - ENDMETHOD. "lif_object~exists - - METHOD deserialize_functions. - - DATA: lv_include TYPE rs38l-include, - lv_area TYPE rs38l-area, - lt_source TYPE TABLE OF abaptxt255. - - FIELD-SYMBOLS: LIKE LINE OF it_functions. - - - LOOP AT it_functions ASSIGNING . - - lt_source = mo_files->read_abap( iv_extra = -funcname ). - - lv_area = ms_item-obj_name. - - CALL FUNCTION 'FUNCTION_EXISTS' - EXPORTING - funcname = -funcname - IMPORTING - include = lv_include - EXCEPTIONS - function_not_exist = 1. - IF sy-subrc = 0. -* delete the function module to make sure the parameters are updated -* havent found a nice way to update the paramters - CALL FUNCTION 'FUNCTION_DELETE' - EXPORTING - funcname = -funcname - suppress_success_message = abap_true - EXCEPTIONS - error_message = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from FUNCTION_DELETE' ). - ENDIF. - ENDIF. - - CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT' - EXPORTING - funcname = -funcname - function_pool = lv_area - interface_global = -global_flag - remote_call = -remote_call - short_text = -short_text -* NAMESPACE = ' ' todo - remote_basxml_supported = -remote_basxml - IMPORTING - function_include = lv_include - TABLES - import_parameter = -import - export_parameter = -export - tables_parameter = -tables - changing_parameter = -changing - exception_list = -exception - parameter_docu = -documentation - EXCEPTIONS - double_task = 1 - error_message = 2 - function_already_exists = 3 - invalid_function_pool = 4 - invalid_name = 5 - too_many_functions = 6 - no_modify_permission = 7 - no_show_permission = 8 - enqueue_system_failure = 9 - canceled_in_corr = 10 - OTHERS = 11. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from RS_FUNCTIONMODULE_INSERT' ). - ENDIF. - - INSERT REPORT lv_include FROM lt_source. - -* lcl_objects_activation=>add( iv_type = 'FUNC' -* iv_name = -funcname ). - - ENDLOOP. - - ENDMETHOD. "deserialize_functions - - METHOD deserialize_includes. - - DATA: lo_xml TYPE REF TO lcl_xml_input, - ls_progdir TYPE ty_progdir, - lt_includes TYPE rso_t_objnm, - lt_tpool TYPE textpool_table, - lt_tpool_ext TYPE ty_tpool_tt, - lt_source TYPE TABLE OF abaptxt255. - - FIELD-SYMBOLS: LIKE LINE OF lt_includes. - - - io_xml->read( EXPORTING iv_name = 'INCLUDES' - CHANGING cg_data = lt_includes ). - - LOOP AT lt_includes ASSIGNING . - - lt_source = mo_files->read_abap( iv_extra = ). - - lo_xml = mo_files->read_xml( ). - - lo_xml->read( EXPORTING iv_name = 'PROGDIR' - CHANGING cg_data = ls_progdir ). - - lo_xml->read( EXPORTING iv_name = 'TPOOL' - CHANGING cg_data = lt_tpool_ext ). - lt_tpool = read_tpool( lt_tpool_ext ). - - deserialize_program( is_progdir = ls_progdir - it_source = lt_source - it_tpool = lt_tpool - iv_package = iv_package ). - - ENDLOOP. - - ENDMETHOD. "deserialize_includes - - METHOD deserialize_xml. - - DATA: lv_complete TYPE rs38l-area, - lv_namespace TYPE rs38l-namespace, - lv_areat TYPE tlibt-areat, - lv_stext TYPE tftit-stext, - lv_group TYPE rs38l-area. - - - lv_complete = ms_item-obj_name. - - CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT' - EXPORTING - complete_area = lv_complete - IMPORTING - namespace = lv_namespace - group = lv_group - EXCEPTIONS - include_not_exists = 1 - group_not_exists = 2 - no_selections = 3 - no_function_include = 4 - no_function_pool = 5 - delimiter_wrong_position = 6 - no_customer_function_group = 7 - no_customer_function_include = 8 - reserved_name_customer = 9 - namespace_too_long = 10 - area_length_error = 11 - OTHERS = 12. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ). - ENDIF. - - io_xml->read( EXPORTING iv_name = 'AREAT' - CHANGING cg_data = lv_areat ). - lv_stext = lv_areat. - - CALL FUNCTION 'RS_FUNCTION_POOL_INSERT' - EXPORTING - function_pool = lv_group - short_text = lv_stext - namespace = lv_namespace - devclass = iv_package - EXCEPTIONS - name_already_exists = 1 - name_not_correct = 2 - function_already_exists = 3 - invalid_function_pool = 4 - invalid_name = 5 - too_many_functions = 6 - no_modify_permission = 7 - no_show_permission = 8 - enqueue_system_failure = 9 - canceled_in_corr = 10 - undefined_error = 11 - OTHERS = 12. - IF sy-subrc <> 0 AND sy-subrc <> 1 AND sy-subrc <> 3. -* todo, change description - lcx_exception=>raise( 'error from RS_FUNCTION_POOL_INSERT' ). - ENDIF. - - ENDMETHOD. "deserialize_xml - - METHOD serialize_xml. - - DATA: lt_functab TYPE ty_rs38l_incl_tt, - lt_includes TYPE rso_t_objnm, - lv_areat TYPE tlibt-areat. - - - SELECT SINGLE areat INTO lv_areat - FROM tlibt - WHERE spras = mv_language - AND area = ms_item-obj_name. "#EC CI_GENBUFF - IF sy-subrc <> 0. - lcx_exception=>raise( 'not found in TLIBT' ). - ENDIF. - - lt_functab = functions( ). - lt_includes = includes( ). - -* todo, dynpros - - io_xml->add( iv_name = 'AREAT' - ig_data = lv_areat ). - io_xml->add( iv_name = 'INCLUDES' - ig_data = lt_includes ). - - ENDMETHOD. "serialize_xml - - METHOD includes. - - DATA: lv_program TYPE program, - lv_cnam TYPE reposrc-cnam, - lv_tabix LIKE sy-tabix, - lt_functab TYPE ty_rs38l_incl_tt. - - FIELD-SYMBOLS: LIKE LINE OF rt_includes, - LIKE LINE OF lt_functab. - - - lv_program = main_name( ). - lt_functab = functions( ). - - CALL FUNCTION 'RS_GET_ALL_INCLUDES' - EXPORTING - program = lv_program -* WITH_RESERVED_INCLUDES = -* WITH_CLASS_INCLUDES = ' ' hmm, todo - TABLES - includetab = rt_includes - EXCEPTIONS - not_existent = 1 - no_program = 2 - OTHERS = 3. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from RS_GET_ALL_INCLUDES' ). - ENDIF. - - LOOP AT lt_functab ASSIGNING . - DELETE TABLE rt_includes FROM -include. - ENDLOOP. - - - LOOP AT rt_includes ASSIGNING . - lv_tabix = sy-tabix. - -* skip SAP standard includes - SELECT SINGLE cnam FROM reposrc INTO lv_cnam - WHERE progname = - AND r3state = 'A' - AND cnam = 'SAP'. - IF sy-subrc = 0. - DELETE rt_includes INDEX lv_tabix. - CONTINUE. - ENDIF. - -* also make sure the include exists - SELECT SINGLE cnam FROM reposrc INTO lv_cnam - WHERE progname = - AND r3state = 'A'. - IF sy-subrc <> 0. - DELETE rt_includes INDEX lv_tabix. - ENDIF. - - ENDLOOP. - - APPEND lv_program TO rt_includes. - - ENDMETHOD. "includes - - METHOD functions. - - DATA: lv_area TYPE rs38l-area. - - - lv_area = ms_item-obj_name. - - CALL FUNCTION 'RS_FUNCTION_POOL_CONTENTS' - EXPORTING - function_pool = lv_area - TABLES - functab = rt_functab - EXCEPTIONS - function_pool_not_found = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ). - ENDIF. - - ENDMETHOD. "functions - - METHOD main_name. - - DATA: lv_area TYPE rs38l-area, - lv_namespace TYPE rs38l-namespace, - lv_group TYPE rs38l-area. - - - lv_area = ms_item-obj_name. - - CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT' - EXPORTING - complete_area = lv_area - IMPORTING - namespace = lv_namespace - group = lv_group - EXCEPTIONS - include_not_exists = 1 - group_not_exists = 2 - no_selections = 3 - no_function_include = 4 - no_function_pool = 5 - delimiter_wrong_position = 6 - no_customer_function_group = 7 - no_customer_function_include = 8 - reserved_name_customer = 9 - namespace_too_long = 10 - area_length_error = 11 - OTHERS = 12. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from FUNCTION_INCLUDE_SPLIT' ). - ENDIF. - - CONCATENATE lv_namespace 'SAPL' lv_group INTO rv_program. - - ENDMETHOD. "main_name - - METHOD serialize_functions. - - DATA: - lt_source TYPE TABLE OF rssource, - lt_functab TYPE ty_rs38l_incl_tt, - lt_new_source TYPE rsfb_source. - - FIELD-SYMBOLS: LIKE LINE OF lt_functab, - LIKE LINE OF rt_functions. - - - lt_functab = functions( ). - - LOOP AT lt_functab ASSIGNING . -* fm RPY_FUNCTIONMODULE_READ does not support source code -* lines longer than 72 characters - APPEND INITIAL LINE TO rt_functions ASSIGNING . - MOVE-CORRESPONDING TO . - - CALL FUNCTION 'RPY_FUNCTIONMODULE_READ_NEW' - EXPORTING - functionname = -funcname - IMPORTING - global_flag = -global_flag - remote_call = -remote_call - update_task = -update_task - short_text = -short_text - remote_basxml_supported = -remote_basxml - TABLES - import_parameter = -import - changing_parameter = -changing - export_parameter = -export - tables_parameter = -tables - exception_list = -exception - documentation = -documentation - source = lt_source - CHANGING - new_source = lt_new_source - EXCEPTIONS - error_message = 1 - function_not_found = 2 - invalid_name = 3 - OTHERS = 4. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ). - ENDIF. - - IF NOT lt_new_source IS INITIAL. - mo_files->add_abap( iv_extra = -funcname - it_abap = lt_new_source ). - ELSE. - mo_files->add_abap( iv_extra = -funcname - it_abap = lt_source ). - ENDIF. - - ENDLOOP. - - ENDMETHOD. "serialize_functions - - METHOD serialize_includes. - - DATA: lt_includes TYPE rso_t_objnm. - - FIELD-SYMBOLS: LIKE LINE OF lt_includes. - - - lt_includes = includes( ). - - LOOP AT lt_includes ASSIGNING . - -* todo, filename is not correct, a include can be used in several programs - serialize_program( is_item = ms_item - io_files = mo_files - iv_program = - iv_extra = ). - - ENDLOOP. - - ENDMETHOD. "serialize_includes - - METHOD lif_object~serialize. - - DATA: lt_functions TYPE ty_function_tt, - ls_progdir TYPE ty_progdir, - lv_program_name TYPE programm, - lt_dynpros TYPE ty_dynpro_tt, - ls_cua TYPE ty_cua. - - IF lif_object~exists( ) = abap_false. - RETURN. - ENDIF. - - serialize_xml( io_xml ). - - lt_functions = serialize_functions( ). - io_xml->add( iv_name = 'FUNCTIONS' - ig_data = lt_functions ). - - serialize_includes( ). - - lv_program_name = main_name( ). - ls_progdir = read_progdir( lv_program_name ). - - IF ls_progdir-subc = 'F'. - lt_dynpros = serialize_dynpros( lv_program_name ). - io_xml->add( iv_name = 'DYNPROS' - ig_data = lt_dynpros ). - - ls_cua = serialize_cua( lv_program_name ). - io_xml->add( iv_name = 'CUA' - ig_data = ls_cua ). - ENDIF. - - ENDMETHOD. "serialize - - METHOD lif_object~deserialize. - - DATA: lv_program_name TYPE programm, - lt_functions TYPE ty_function_tt, - lt_dynpros TYPE ty_dynpro_tt, - ls_cua TYPE ty_cua. - - - deserialize_xml( - io_xml = io_xml - iv_package = iv_package ). - - io_xml->read( EXPORTING iv_name = 'FUNCTIONS' - CHANGING cg_data = lt_functions ). - deserialize_functions( lt_functions ). - - deserialize_includes( - io_xml = io_xml - iv_package = iv_package ). - - lv_program_name = main_name( ). - - io_xml->read( EXPORTING iv_name = 'DYNPROS' - CHANGING cg_data = lt_dynpros ). - deserialize_dynpros( it_dynpros = lt_dynpros ). - - io_xml->read( EXPORTING iv_name = 'CUA' - CHANGING cg_data = ls_cua ). - deserialize_cua( iv_program_name = lv_program_name - is_cua = ls_cua ). - - ENDMETHOD. "deserialize - - METHOD lif_object~delete. - - DATA: lv_area TYPE rs38l-area. - - - lv_area = ms_item-obj_name. - - CALL FUNCTION 'RS_FUNCTION_POOL_DELETE' - EXPORTING - area = lv_area - suppress_popups = abap_true - skip_progress_ind = abap_true - EXCEPTIONS - canceled_in_corr = 1 - enqueue_system_failure = 2 - function_exist = 3 - not_executed = 4 - no_modify_permission = 5 - no_show_permission = 6 - permission_failure = 7 - pool_not_exist = 8 - cancelled = 9 - OTHERS = 10. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from RS_FUNCTION_POOL_DELETE' ). - ENDIF. - - ENDMETHOD. "delete - - METHOD lif_object~jump. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = 'FUGR' - in_new_window = abap_true. - - ENDMETHOD. "jump - -ENDCLASS. "lcl_object_fugr IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_object_prog DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_prog DEFINITION INHERITING FROM lcl_objects_program FINAL. - - PUBLIC SECTION. - INTERFACES lif_object. - ALIASES mo_files FOR lif_object~mo_files. - - PRIVATE SECTION. - - METHODS deserialize_textpool - IMPORTING it_tpool TYPE textpool_table - RAISING lcx_exception. - -ENDCLASS. "lcl_object_prog DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_object_prog IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_prog IMPLEMENTATION. - - METHOD lif_object~changed_by. - SELECT SINGLE unam FROM reposrc INTO rv_user - WHERE progname = ms_item-obj_name - AND r3state = 'A'. - IF sy-subrc <> 0. - rv_user = c_user_unknown. - ENDIF. - ENDMETHOD. - - METHOD lif_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. "lif_object~get_metadata - - METHOD lif_object~exists. - - DATA: lv_progname TYPE reposrc-progname. - - - SELECT SINGLE progname FROM reposrc INTO lv_progname - WHERE progname = ms_item-obj_name - AND r3state = 'A'. - rv_bool = boolc( sy-subrc = 0 ). - - ENDMETHOD. "lif_object~exists - - METHOD lif_object~jump. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = 'PROG' - in_new_window = abap_true. - - ENDMETHOD. "jump - - METHOD lif_object~delete. - - DATA: lv_program LIKE sy-repid. - - - lv_program = ms_item-obj_name. - - CALL FUNCTION 'RS_DELETE_PROGRAM' - EXPORTING - program = lv_program - suppress_popup = abap_true - EXCEPTIONS - enqueue_lock = 1 - object_not_found = 2 - permission_failure = 3 - reject_deletion = 4 - OTHERS = 5. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from RS_DELETE_PROGRAM' ). - ENDIF. - - ENDMETHOD. "delete - - METHOD deserialize_textpool. - - READ TABLE it_tpool WITH KEY id = 'R' TRANSPORTING NO FIELDS. - IF ( sy-subrc = 0 AND lines( it_tpool ) = 1 ) OR lines( it_tpool ) = 0. - RETURN. " no action for includes - ENDIF. - - INSERT TEXTPOOL ms_item-obj_name - FROM it_tpool - LANGUAGE mv_language - STATE 'I'. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). - ENDIF. - - lcl_objects_activation=>add( iv_type = 'REPT' - iv_name = ms_item-obj_name ). - - ENDMETHOD. "deserialize_textpool - - METHOD lif_object~serialize. - - serialize_program( io_xml = io_xml - is_item = ms_item - io_files = mo_files ). - - ENDMETHOD. "lif_serialize~serialize - - METHOD lif_object~deserialize. - - DATA: lv_program_name TYPE programm, - ls_progdir TYPE ty_progdir, - lt_tpool TYPE textpool_table, - lt_dynpros TYPE ty_dynpro_tt, - lt_tpool_ext TYPE ty_tpool_tt, - ls_cua TYPE ty_cua, - lt_source TYPE abaptxt255_tab. - - lv_program_name = ms_item-obj_name. - - lt_source = mo_files->read_abap( ). - - io_xml->read( EXPORTING iv_name = 'TPOOL' - CHANGING cg_data = lt_tpool_ext ). - lt_tpool = read_tpool( lt_tpool_ext ). - - io_xml->read( EXPORTING iv_name = 'PROGDIR' - CHANGING cg_data = ls_progdir ). - deserialize_program( is_progdir = ls_progdir - it_source = lt_source - it_tpool = lt_tpool - iv_package = iv_package ). - - io_xml->read( EXPORTING iv_name = 'DYNPROS' - CHANGING cg_data = lt_dynpros ). - deserialize_dynpros( it_dynpros = lt_dynpros ). - - io_xml->read( EXPORTING iv_name = 'CUA' - CHANGING cg_data = ls_cua ). - deserialize_cua( iv_program_name = lv_program_name - is_cua = ls_cua ). - - deserialize_textpool( lt_tpool ). - - ENDMETHOD. "lif_serialize~deserialize - -ENDCLASS. "lcl_object_prog IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_object.prog.xml b/src/zabapgit_object.prog.xml deleted file mode 100644 index a49cedadd..000000000 --- a/src/zabapgit_object.prog.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - ZABAPGIT_OBJECT - A - - - X - - - - - - I - - - - 0000-00-00 - - 0000-00-00 - - - - - E - - - 0000-00-00 - - 0000-00-00 - - - X - - - - R - - Include ZABAPGIT_OBJECT - 23 - - - - - - From 0cf7800dafe94b9f6b72c35cb6c152e8284bc1d4 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Thu, 8 Sep 2016 15:08:55 +0300 Subject: [PATCH 2/4] #329 reorg includes 2 --- src/zabapgit.prog.abap | 71 +- src/zabapgit_app.prog.abap | 5 + src/zabapgit_forms.prog.abap | 1 - src/zabapgit_gui.prog.abap | 904 +-------------------- src/zabapgit_gui_pages.prog.abap | 17 + src/zabapgit_gui_pages.prog.xml | 48 ++ src/zabapgit_gui_router.prog.abap | 647 +++++++++++++++ src/zabapgit_gui_router.prog.xml | 48 ++ src/zabapgit_html.prog.abap | 339 +------- src/zabapgit_html_action_utils.prog.abap | 260 ++++++ src/zabapgit_html_action_utils.prog.xml | 48 ++ src/zabapgit_object_clas.prog.abap | 946 ++++++++++++++++++++++ src/zabapgit_object_clas.prog.xml | 48 ++ src/zabapgit_object_fugr.prog.abap | 632 +++++++++++++++ src/zabapgit_object_fugr.prog.xml | 48 ++ src/zabapgit_object_prog.prog.abap | 156 ++++ src/zabapgit_object_prog.prog.xml | 48 ++ src/zabapgit_object_serializing.prog.abap | 50 ++ src/zabapgit_object_serializing.prog.xml | 48 ++ src/zabapgit_objects_impl.prog.abap | 672 +++++++++++++++ src/zabapgit_objects_impl.prog.xml | 48 ++ src/zabapgit_page_diff.prog.abap | 240 ++++++ src/zabapgit_page_diff.prog.xml | 48 ++ src/zabapgit_page_explore.prog.abap | 20 + src/zabapgit_page_explore.prog.xml | 48 ++ src/zabapgit_persistence.prog.abap | 564 ------------- src/zabapgit_persistence_old.prog.abap | 569 +++++++++++++ src/zabapgit_persistence_old.prog.xml | 48 ++ src/zabapgit_repo.prog.abap | 7 +- src/zabapgit_util.prog.abap | 80 ++ 30 files changed, 4838 insertions(+), 1870 deletions(-) create mode 100644 src/zabapgit_gui_pages.prog.abap create mode 100644 src/zabapgit_gui_pages.prog.xml create mode 100644 src/zabapgit_gui_router.prog.abap create mode 100644 src/zabapgit_gui_router.prog.xml create mode 100644 src/zabapgit_html_action_utils.prog.abap create mode 100644 src/zabapgit_html_action_utils.prog.xml create mode 100644 src/zabapgit_object_clas.prog.abap create mode 100644 src/zabapgit_object_clas.prog.xml create mode 100644 src/zabapgit_object_fugr.prog.abap create mode 100644 src/zabapgit_object_fugr.prog.xml create mode 100644 src/zabapgit_object_prog.prog.abap create mode 100644 src/zabapgit_object_prog.prog.xml create mode 100644 src/zabapgit_object_serializing.prog.abap create mode 100644 src/zabapgit_object_serializing.prog.xml create mode 100644 src/zabapgit_objects_impl.prog.abap create mode 100644 src/zabapgit_objects_impl.prog.xml create mode 100644 src/zabapgit_page_diff.prog.abap create mode 100644 src/zabapgit_page_diff.prog.xml create mode 100644 src/zabapgit_page_explore.prog.abap create mode 100644 src/zabapgit_page_explore.prog.xml create mode 100644 src/zabapgit_persistence_old.prog.abap create mode 100644 src/zabapgit_persistence_old.prog.xml diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index d75ad836b..4bc8966d6 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -38,72 +38,27 @@ INCLUDE zabapgit_password_dialog. " !!! Contains SELECTION SCREEN INCLUDE zabapgit_definitions. INCLUDE zabapgit_exceptions. INCLUDE zabapgit_zlib. +INCLUDE zabapgit_html. INCLUDE zabapgit_util. INCLUDE zabapgit_xml. -CLASS lcl_gui DEFINITION DEFERRED. -CLASS lcl_persistence_user DEFINITION DEFERRED. -CLASS lcl_repo_srv DEFINITION DEFERRED. -CLASS lcl_persistence_db DEFINITION DEFERRED. - -INCLUDE zabapgit_app. +INCLUDE zabapgit_app. " Some deferred definitions here +INCLUDE zabapgit_persistence_old. INCLUDE zabapgit_persistence. -INCLUDE zabapgit_html. INCLUDE zabapgit_dot_abapgit. INCLUDE zabapgit_sap_package. -CLASS lcl_repo_online DEFINITION DEFERRED. - INCLUDE zabapgit_stage. INCLUDE zabapgit_git_helpers. INCLUDE zabapgit_repo. -INCLUDE zabapgit_git. INCLUDE zabapgit_stage_logic. +INCLUDE zabapgit_git. INCLUDE zabapgit_objects. INCLUDE zabapgit_tadir. INCLUDE zabapgit_file_status. -INCLUDE zabapgit_object. -INCLUDE zabapgit_object_acid. -INCLUDE zabapgit_object_auth. -INCLUDE zabapgit_object_doct. -INCLUDE zabapgit_object_docv. -INCLUDE zabapgit_object_doma. -INCLUDE zabapgit_object_dtel. -INCLUDE zabapgit_object_enho. -INCLUDE zabapgit_object_enhs. -INCLUDE zabapgit_object_enqu. -INCLUDE zabapgit_object_ensc. -INCLUDE zabapgit_object_iarp. -INCLUDE zabapgit_object_iasp. -INCLUDE zabapgit_object_iatu. -INCLUDE zabapgit_object_msag. -INCLUDE zabapgit_object_nrob. -INCLUDE zabapgit_object_para. -INCLUDE zabapgit_object_pinf. -INCLUDE zabapgit_object_sfbf. -INCLUDE zabapgit_object_sfbs. -INCLUDE zabapgit_object_sfsw. -INCLUDE zabapgit_object_shi3. -INCLUDE zabapgit_object_shlp. -INCLUDE zabapgit_object_sicf. -INCLUDE zabapgit_object_smim. -INCLUDE zabapgit_object_splo. -INCLUDE zabapgit_object_ssfo. -INCLUDE zabapgit_object_ssst. -INCLUDE zabapgit_object_susc. -INCLUDE zabapgit_object_suso. -INCLUDE zabapgit_object_tabl. -INCLUDE zabapgit_object_tobj. -INCLUDE zabapgit_object_tran. -INCLUDE zabapgit_object_ttyp. -INCLUDE zabapgit_object_type. -INCLUDE zabapgit_object_vcls. -INCLUDE zabapgit_object_view. -INCLUDE zabapgit_object_w3xx. -INCLUDE zabapgit_object_wdya. -INCLUDE zabapgit_object_wdyn. -INCLUDE zabapgit_object_webi. -INCLUDE zabapgit_object_xslt. +INCLUDE zabapgit_objects_impl. + +INCLUDE zabapgit_object_serializing. " All serializing classes here INCLUDE zabapgit_repo_impl. INCLUDE zabapgit_background. @@ -111,19 +66,15 @@ INCLUDE zabapgit_zip. INCLUDE zabapgit_transport. INCLUDE zabapgit_popups. -INCLUDE zabapgit_page. -INCLUDE zabapgit_page_commit. -INCLUDE zabapgit_page_merge. -INCLUDE zabapgit_page_branch_overview. -INCLUDE zabapgit_page_stage. -INCLUDE zabapgit_page_db. -INCLUDE zabapgit_page_main. -INCLUDE zabapgit_page_background. +INCLUDE zabapgit_gui_pages. " All GUI pages here +INCLUDE zabapgit_gui_router. INCLUDE zabapgit_gui. + INCLUDE zabapgit_app_impl. INCLUDE zabapgit_unit_test. INCLUDE zabapgit_forms. +********************************************************************** INITIALIZATION. lcl_password_dialog=>on_screen_init( ). diff --git a/src/zabapgit_app.prog.abap b/src/zabapgit_app.prog.abap index 0588a81f1..639cddca6 100644 --- a/src/zabapgit_app.prog.abap +++ b/src/zabapgit_app.prog.abap @@ -2,6 +2,11 @@ *& Include ZABAPGIT_APP *&---------------------------------------------------------------------* +CLASS lcl_gui DEFINITION DEFERRED. +CLASS lcl_persistence_user DEFINITION DEFERRED. +CLASS lcl_repo_srv DEFINITION DEFERRED. +CLASS lcl_persistence_db DEFINITION DEFERRED. + *----------------------------------------------------------------------* * CLASS lcl_app DEFINITION *----------------------------------------------------------------------* diff --git a/src/zabapgit_forms.prog.abap b/src/zabapgit_forms.prog.abap index cd8359a13..4e5ae98ca 100644 --- a/src/zabapgit_forms.prog.abap +++ b/src/zabapgit_forms.prog.abap @@ -2,7 +2,6 @@ *& Include ZABAPGIT_FORMS *&---------------------------------------------------------------------* - *&---------------------------------------------------------------------* *& Form run *&---------------------------------------------------------------------* diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index 899d2c947..400aab6ae 100644 --- a/src/zabapgit_gui.prog.abap +++ b/src/zabapgit_gui.prog.abap @@ -2,81 +2,6 @@ *& Include ZABAPGIT_GUI *&---------------------------------------------------------------------* -*----------------------------------------------------------------------* -* 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. - - METHODS get_page_by_name - IMPORTING iv_name TYPE clike - RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page - 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_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_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_pull - 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 - 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. - -ENDCLASS. - *----------------------------------------------------------------------* * CLASS lcl_gui DEFINITION *----------------------------------------------------------------------* @@ -133,9 +58,7 @@ CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. ENDCLASS. "lcl_gui DEFINITION *----------------------------------------------------------------------* -* CLASS lcl_view IMPLEMENTATION -*----------------------------------------------------------------------* -* +* CLASS lcl_gui IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_gui IMPLEMENTATION. @@ -347,827 +270,4 @@ CLASS lcl_gui IMPLEMENTATION. ENDMETHOD. "cache_image -ENDCLASS. "lcl_gui IMPLEMENTATION - -CLASS lcl_gui_page_explore DEFINITION FINAL INHERITING FROM lcl_gui_page_super. - PUBLIC SECTION. - METHODS lif_gui_page~render REDEFINITION. - -ENDCLASS. "lcl_gui_page_explore DEFINITION - -CLASS lcl_gui_page_explore IMPLEMENTATION. - - METHOD lif_gui_page~render. - - CREATE OBJECT ro_html. - ro_html->add( redirect( 'http://larshp.github.io/abapGit/explore.html' ) ). - - ENDMETHOD. - -ENDCLASS. "lcl_gui_page_explore IMPLEMENTATION - -CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super. - - PUBLIC SECTION. - METHODS: constructor - IMPORTING - is_local TYPE ty_file - is_remote TYPE ty_file. - - METHODS lif_gui_page~render REDEFINITION. - - PRIVATE SECTION. - DATA: mv_filename TYPE string, - mo_diff TYPE REF TO lcl_diff. - - METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS render_head RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS render_diff RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS render_lines RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - -ENDCLASS. - -CLASS lcl_gui_page_diff IMPLEMENTATION. - - METHOD constructor. - super->constructor( ). - - mv_filename = is_local-filename. - - CREATE OBJECT mo_diff - EXPORTING - iv_local = is_local-data - iv_remote = is_remote-data. - - ENDMETHOD. - - METHOD styles. - DATA lo_html TYPE REF TO lcl_html_helper. - CREATE OBJECT lo_html. - - lo_html->add( '/* DIFF */' ). "#EC NOTEXT - lo_html->add( 'div.diff {' ). "#EC NOTEXT - lo_html->add( ' background-color: #f2f2f2;' ). "#EC NOTEXT - lo_html->add( ' padding: 0.7em ' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'div.diff_head {' ). "#EC NOTEXT - lo_html->add( ' border-bottom: 1px solid #DDD;' ). "#EC NOTEXT - lo_html->add( ' padding-bottom: 0.7em;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'span.diff_name {' ). "#EC NOTEXT - lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT - lo_html->add( ' color: grey;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'span.diff_name strong {' ). "#EC NOTEXT - lo_html->add( ' color: #333;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'span.diff_banner {' ). "#EC NOTEXT - lo_html->add( ' border-style: solid;' ). "#EC NOTEXT - lo_html->add( ' border-width: 1px;' ). "#EC NOTEXT - lo_html->add( ' border-radius: 3px;' ). "#EC NOTEXT - lo_html->add( ' padding-left: 0.3em;' ). "#EC NOTEXT - lo_html->add( ' padding-right: 0.3em;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( '.diff_ins {' ). "#EC NOTEXT - lo_html->add( ' border-color: #38e038;' ). "#EC NOTEXT - lo_html->add( ' background-color: #91ee91 !important;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( '.diff_del {' ). "#EC NOTEXT - lo_html->add( ' border-color: #ff8093;' ). "#EC NOTEXT - lo_html->add( ' background-color: #ffb3be !important;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( '.diff_upd {' ). "#EC NOTEXT - lo_html->add( ' border-color: #dada00;' ). "#EC NOTEXT - lo_html->add( ' background-color: #ffffb3 !important;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'div.diff_content {' ). "#EC NOTEXT - lo_html->add( ' background: #fff;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - - " Table part - lo_html->add( '/* DIFF TABLE */' ). "#EC NOTEXT - lo_html->add( 'table.diff_tab {' ). "#EC NOTEXT - lo_html->add( ' font-family: Consolas, Courier, monospace;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'table.diff_tab th {' ). "#EC NOTEXT - lo_html->add( ' color: grey;' ). "#EC NOTEXT - lo_html->add( ' text-align: left;' ). "#EC NOTEXT - lo_html->add( ' font-weight: normal;' ). "#EC NOTEXT - lo_html->add( ' padding: 0.5em;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'table.diff_tab td {' ). "#EC NOTEXT - lo_html->add( ' color: #444;' ). "#EC NOTEXT - lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT - lo_html->add( ' padding-right: 0.5em;' ). "#EC NOTEXT - lo_html->add( ' font-size: 12pt;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'table.diff_tab td.num, th.num {' ). "#EC NOTEXT - lo_html->add( ' text-align: right;' ). "#EC NOTEXT - lo_html->add( ' color: #ccc;' ). "#EC NOTEXT - lo_html->add( ' border-left: 1px solid #eee;' ). "#EC NOTEXT - lo_html->add( ' border-right: 1px solid #eee;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'table.diff_tab td.cmd, th.cmd {' ). "#EC NOTEXT - lo_html->add( ' text-align: center !important;' ). "#EC NOTEXT - lo_html->add( ' white-space: nowrap;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - lo_html->add( 'table.diff_tab tr.diff_nav_line {'). "#EC NOTEXT - lo_html->add( ' background-color: #edf2f9;'). "#EC NOTEXT - lo_html->add( '}'). "#EC NOTEXT - lo_html->add( 'table.diff_tab tr.diff_nav_line td {'). "#EC NOTEXT - lo_html->add( ' color: #ccc;'). "#EC NOTEXT - lo_html->add( '}'). "#EC NOTEXT - lo_html->add( 'table.diff_tab code {' ). "#EC NOTEXT - lo_html->add( ' font-family: inherit;' ). "#EC NOTEXT - lo_html->add( ' white-space: pre;' ). "#EC NOTEXT - lo_html->add( '}' ). "#EC NOTEXT - - ro_html = lo_html. - ENDMETHOD. - - METHOD render_head. - DATA: lo_html TYPE REF TO lcl_html_helper, - ls_stats TYPE lcl_diff=>ty_count. - - CREATE OBJECT lo_html. - - ls_stats = mo_diff->stats( ). - - lo_html->add( '
' ). "#EC NOTEXT - lo_html->add( |+ { ls_stats-insert }| ). - lo_html->add( |- { ls_stats-delete }| ). - lo_html->add( |~ { ls_stats-update }| ). - lo_html->add( '' ). "#EC NOTEXT - lo_html->add( |{ mv_filename }| ). - lo_html->add( '' ). "#EC NOTEXT - lo_html->add( '
' ). "#EC NOTEXT - - ro_html = lo_html. - ENDMETHOD. - - METHOD render_diff. - - CREATE OBJECT ro_html. - - ro_html->add( '
' ). "#EC NOTEXT - ro_html->add( render_head( ) ). - - " Content - ro_html->add( '
' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( render_lines( ) ). - ro_html->add( '
@LOCAL@REMOTE
' ). "#EC NOTEXT - ro_html->add( '
' ). "#EC NOTEXT - - ro_html->add( '
' ). "#EC NOTEXT - - ENDMETHOD. - - METHOD render_lines. - - DATA: lt_diffs TYPE lcl_diff=>ty_diffs_tt, - lv_local TYPE string, - lv_remote TYPE string, - lv_attr_local TYPE string, - lv_attr_remote TYPE string, - lv_beacon TYPE string, - lv_insert_nav TYPE abap_bool. - - FIELD-SYMBOLS LIKE LINE OF lt_diffs. - - - CREATE OBJECT ro_html. - lt_diffs = mo_diff->get( ). - - LOOP AT lt_diffs ASSIGNING . - IF -short = abap_false. - lv_insert_nav = abap_true. - CONTINUE. - ENDIF. - - IF lv_insert_nav = abap_true. " Insert separator line with navigation - IF -beacon > 0. - READ TABLE mo_diff->mt_beacons INTO lv_beacon INDEX -beacon. - ELSE. - lv_beacon = '---'. - ENDIF. - - ro_html->add( ''). - ro_html->add( '' ). - ro_html->add( |@@ { -local_line } @@ { lv_beacon }| ). - ro_html->add( '' ). - lv_insert_nav = abap_false. - ENDIF. - - lv_local = escape( val = -local format = cl_abap_format=>e_html_attr ). - lv_remote = escape( val = -remote format = cl_abap_format=>e_html_attr ). - - CLEAR: lv_attr_local, lv_attr_remote. " Class for changed lines - CASE -result. - WHEN lcl_diff=>c_diff-insert. - lv_attr_local = ' class="diff_ins"'. "#EC NOTEXT - WHEN lcl_diff=>c_diff-delete. - lv_attr_remote = ' class="diff_del"'. "#EC NOTEXT - WHEN lcl_diff=>c_diff-update. - lv_attr_local = ' class="diff_upd"'. "#EC NOTEXT - lv_attr_remote = ' class="diff_upd"'. "#EC NOTEXT - ENDCASE. - - ro_html->add( '' ). "#EC NOTEXT - ro_html->add( |{ -local_line }| ). "#EC NOTEXT - ro_html->add( |{ lv_local }| ). "#EC NOTEXT - ro_html->add( |{ -remote_line }| ). "#EC NOTEXT - ro_html->add( |{ lv_remote }| ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT - - ENDLOOP. - - ENDMETHOD. - - METHOD lif_gui_page~render. - - CREATE OBJECT ro_html. - - ro_html->add( header( io_include_style = styles( ) ) ). - ro_html->add( title( 'DIFF' ) ). - ro_html->add( render_diff( ) ). - ro_html->add( footer( ) ). - - ENDMETHOD. - -ENDCLASS. - -*----------------------------------------------------------------------* -* CLASS lcl_gui_router IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_gui_router IMPLEMENTATION. - - METHOD on_event. - - DATA: lv_url TYPE string, - lv_key TYPE lcl_persistence_repo=>ty_repo-key, - ls_item TYPE ty_item. - - - CASE iv_action. - " General routing - WHEN 'main' - OR 'explore' - OR 'db' - OR 'background_run'. - ei_page = get_page_by_name( iv_action ). - ev_state = gc_event_state-new_page. - WHEN 'background'. - lv_key = iv_getdata. - CREATE OBJECT ei_page TYPE lcl_gui_page_background - EXPORTING - iv_key = lv_key. - ev_state = gc_event_state-new_page. - WHEN 'abapgithome'. - cl_gui_frontend_services=>execute( EXPORTING document = gc_abapgit_homepage - EXCEPTIONS OTHERS = 1 ). - IF sy-subrc <> 0. - lcx_exception=>raise( 'Opening page in external browser failed.' ). - ENDIF. - ev_state = gc_event_state-no_more_act. - WHEN 'abapgit_installation'. - abapgit_installation( ). - ev_state = gc_event_state-re_render. - WHEN 'jump'. - lcl_html_action_utils=>jump_decode( 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 ). - ev_state = gc_event_state-no_more_act. - WHEN 'diff'. - ei_page = get_page_diff( iv_getdata ). - ev_state = gc_event_state-new_page. - - " DB actions - WHEN 'db_display' OR 'db_edit'. - ei_page = get_page_db_by_name( iv_name = iv_action iv_getdata = iv_getdata ). - ev_state = gc_event_state-new_page. - WHEN 'db_delete'. - db_delete( iv_getdata = iv_getdata ). - ev_state = gc_event_state-re_render. - WHEN 'db_save'. - db_save( it_postdata ). - ev_state = gc_event_state-go_back. - - " Repository state actions - WHEN 'uninstall'. - lv_key = iv_getdata. - repo_purge( lv_key ). - ev_state = gc_event_state-re_render. - WHEN 'remove'. - lv_key = iv_getdata. - repo_remove( lv_key ). - ev_state = gc_event_state-re_render. - WHEN 'zipimport'. - lv_key = iv_getdata. - lcl_zip=>import( lv_key ). - ev_state = gc_event_state-re_render. - WHEN 'zipexport'. - lv_key = iv_getdata. - lcl_zip=>export( lcl_app=>repo_srv( )->get( lv_key ) ). - ev_state = gc_event_state-no_more_act. - WHEN 'files_commit'. "TODO refactor name ? - lv_key = iv_getdata. - lcl_zip=>export( io_repo = lcl_app=>repo_srv( )->get( lv_key ) - iv_zip = abap_false ). - ev_state = gc_event_state-no_more_act. - WHEN 'packagezip'. - lcl_popups=>repo_package_zip( ). - ev_state = gc_event_state-no_more_act. - WHEN 'transportzip'. - lcl_transport=>zip( ). - ev_state = gc_event_state-no_more_act. - WHEN 'refresh'. - lv_key = iv_getdata. - lcl_app=>repo_srv( )->get( lv_key )->refresh( ). - ev_state = gc_event_state-re_render. - - " explore page - WHEN 'install'. - lv_url = iv_getdata. - lcl_popups=>repo_clone( lv_url ). - ev_state = gc_event_state-re_render. - - " Repository online actions - WHEN 'pull'. - lv_key = iv_getdata. - repo_pull( lv_key ). - ev_state = gc_event_state-re_render. - WHEN 'stage'. - lv_key = iv_getdata. - ei_page = get_page_stage( lv_key ). - ev_state = gc_event_state-new_page_w_bookmark. - WHEN 'reset'. - lv_key = iv_getdata. - reset( lv_key ). - ev_state = gc_event_state-re_render. - WHEN 'create_branch'. - lv_key = iv_getdata. - create_branch( lv_key ). - ev_state = gc_event_state-re_render. - WHEN 'branch_overview'. - ei_page = get_page_branch_overview( iv_getdata ). - ev_state = gc_event_state-new_page. - WHEN OTHERS. - ev_state = gc_event_state-not_handled. - ENDCASE. - ENDMETHOD. " on_event - - METHOD get_page_by_name. - - DATA: lv_page_class TYPE string, - lv_message TYPE string. - - lv_page_class = |LCL_GUI_PAGE_{ to_upper( iv_name ) }|. - - TRY. - CREATE OBJECT ri_page TYPE (lv_page_class). - CATCH cx_sy_create_object_error. - lv_message = |Cannot create page class { lv_page_class }|. - lcx_exception=>raise( lv_message ). - ENDTRY. - - ENDMETHOD. " get_page_by_name - - METHOD get_page_db_by_name. - - DATA: lv_page_class TYPE string, - lv_message TYPE string, - ls_key TYPE lcl_persistence_db=>ty_content. - - lv_page_class = |LCL_GUI_PAGE_{ to_upper( iv_name ) }|. - ls_key = lcl_html_action_utils=>dbkey_decode( iv_getdata ). - - TRY. - CREATE OBJECT ri_page TYPE (lv_page_class) - EXPORTING - is_key = ls_key. - - CATCH cx_sy_create_object_error. - lv_message = |Cannot create page class { lv_page_class }|. - lcx_exception=>raise( lv_message ). - ENDTRY. - - ENDMETHOD. " get_page_db_by_name - - METHOD get_page_branch_overview. - - DATA: lo_repo TYPE REF TO lcl_repo_online, - lo_page TYPE REF TO lcl_gui_page_branch_overview, - lv_key TYPE lcl_persistence_repo=>ty_repo-key. - - - lv_key = iv_getdata. - - lo_repo ?= lcl_app=>repo_srv( )->get( lv_key ). - - CREATE OBJECT lo_page - EXPORTING - io_repo = lo_repo. - - ri_page = lo_page. - - ENDMETHOD. - - METHOD get_page_diff. - - DATA: lt_remote TYPE ty_files_tt, - lt_local TYPE ty_files_item_tt, - lo_page TYPE REF TO lcl_gui_page_diff, - lo_repo TYPE REF TO lcl_repo_online, - ls_file TYPE ty_repo_file, - lv_key TYPE lcl_persistence_repo=>ty_repo-key. - - FIELD-SYMBOLS: LIKE LINE OF lt_remote, - LIKE LINE OF lt_local. - - lcl_html_action_utils=>file_decode( EXPORTING iv_string = iv_getdata - IMPORTING ev_key = lv_key - eg_file = ls_file ). - - lo_repo ?= lcl_app=>repo_srv( )->get( lv_key ). - lt_remote = lo_repo->get_files_remote( ). - lt_local = lo_repo->get_files_local( ). - - READ TABLE lt_remote ASSIGNING - WITH KEY filename = ls_file-filename - path = ls_file-path. - IF sy-subrc <> 0. - lcx_exception=>raise( 'file not found remotely' ). - ENDIF. - - READ TABLE lt_local ASSIGNING - WITH KEY file-filename = ls_file-filename - file-path = ls_file-path. - IF sy-subrc <> 0. - lcx_exception=>raise( 'file not found locally' ). - ENDIF. - - CREATE OBJECT lo_page - EXPORTING - is_local = -file - is_remote = . - - ri_page = lo_page. - - ENDMETHOD. - - METHOD abapgit_installation. - - CONSTANTS lc_package_abapgit TYPE devclass VALUE '$ABAPGIT'. - CONSTANTS lc_package_plugins TYPE devclass VALUE '$ABAPGIT_PLUGINS'. - - DATA lv_text TYPE c LENGTH 100. - DATA lv_answer TYPE c LENGTH 1. - DATA lo_repo TYPE REF TO lcl_repo_online. - DATA lv_url TYPE string. - DATA lv_target_package TYPE devclass. - - lv_text = |Installing current version ABAPGit to package { lc_package_abapgit } | - && |and plugins to { lc_package_plugins }|. - - CALL FUNCTION 'POPUP_TO_CONFIRM' - EXPORTING - titlebar = 'Install abapGit' - text_question = lv_text - text_button_1 = 'Continue' - text_button_2 = 'Cancel' - default_button = '2' - display_cancel_button = abap_false - IMPORTING - answer = lv_answer ##no_text. - IF lv_answer <> '1'. - RETURN. ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - ENDIF. - - DO 2 TIMES. - CASE sy-index. - WHEN 1. - lv_url = 'https://github.com/larshp/abapGit.git'. - lv_target_package = lc_package_abapgit. - WHEN 2. - lv_url = 'https://github.com/larshp/abapGit-plugins.git' ##no_text. - lv_target_package = lc_package_plugins. - ENDCASE. - - IF abap_false = lcl_app=>repo_srv( )->is_repo_installed( - iv_url = lv_url - iv_target_package = lv_target_package ). - - lcl_sap_package=>create_local( lv_target_package ). - - lo_repo = lcl_app=>repo_srv( )->new_online( - iv_url = lv_url - iv_branch_name = 'refs/heads/master' "TODO replace with HEAD ? - iv_package = lv_target_package ) ##NO_TEXT. - - lo_repo->status( ). " check for errors - lo_repo->deserialize( ). - ENDIF. - ENDDO. - - COMMIT WORK. - - ENDMETHOD. "abapgit_installation - - METHOD repo_purge. - - DATA: lt_tadir TYPE ty_tadir_tt, - lv_count TYPE c LENGTH 3, - lv_answer TYPE c LENGTH 1, - lo_repo TYPE REF TO lcl_repo, - lv_package TYPE devclass, - lv_question TYPE c LENGTH 100. - - - lo_repo = lcl_app=>repo_srv( )->get( iv_key ). - - IF lo_repo->is_write_protected( ) = abap_true. - lcx_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 ). - - IF lines( lt_tadir ) > 0. - lv_count = lines( lt_tadir ). - - CONCATENATE 'This will delete all objects in package' lv_package - INTO lv_question - SEPARATED BY space. "#EC NOTEXT - - CONCATENATE lv_question '(' lv_count 'objects)' - INTO lv_question - SEPARATED BY space. "#EC NOTEXT - - CALL FUNCTION 'POPUP_TO_CONFIRM' - EXPORTING - titlebar = 'Uninstall' - text_question = lv_question - text_button_1 = 'Delete' - 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. - lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). - ENDIF. - - IF lv_answer = '2'. - RETURN. - ENDIF. - - lcl_objects=>delete( lt_tadir ). - - ENDIF. - - lcl_app=>repo_srv( )->delete( lo_repo ). - - COMMIT WORK. - - ENDMETHOD. "repo_purge - - METHOD repo_remove. - - DATA: lv_answer TYPE c LENGTH 1, - lo_repo TYPE REF TO lcl_repo, - lv_package TYPE devclass, - lv_question TYPE c LENGTH 100. - - - lo_repo = lcl_app=>repo_srv( )->get( iv_key ). - lv_package = lo_repo->get_package( ). - - CONCATENATE 'This will remove the repository reference to the package' - lv_package - INTO lv_question - SEPARATED BY space. "#EC NOTEXT - - CALL FUNCTION 'POPUP_TO_CONFIRM' - EXPORTING - titlebar = 'Remove' - text_question = lv_question - text_button_1 = 'Remove' - icon_button_1 = 'ICON_WF_UNLINK' - 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. - lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). - ENDIF. - - IF lv_answer = '2'. - RETURN. - ENDIF. - - lcl_app=>repo_srv( )->delete( lo_repo ). - - COMMIT WORK. - - ENDMETHOD. "repo_remove - - METHOD reset. - - DATA: lo_repo TYPE REF TO lcl_repo_online, - lv_answer TYPE c LENGTH 1. - - - lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). - - IF lo_repo->is_write_protected( ) = abap_true. - lcx_exception=>raise( 'Cannot reset. Local code is write-protected by repo config' ). - ENDIF. - - CALL FUNCTION 'POPUP_TO_CONFIRM' - EXPORTING - titlebar = 'Warning' - text_question = 'Reset local objects?' - text_button_1 = 'Ok' - icon_button_1 = 'ICON_OKAY' - 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. - lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). - ENDIF. - - IF lv_answer = '2'. - RETURN. - ENDIF. - - lo_repo->deserialize( ). - - ENDMETHOD. - - METHOD create_branch. - - DATA: lv_name TYPE string, - lv_cancel TYPE abap_bool, - lo_repo TYPE REF TO lcl_repo_online. - - - lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). - - lcl_popups=>create_branch_popup( - IMPORTING - ev_name = lv_name - ev_cancel = lv_cancel ). - IF lv_cancel = abap_true. - RETURN. - ENDIF. - - ASSERT lv_name CP 'refs/heads/+*'. - - lcl_git_porcelain=>create_branch( - io_repo = lo_repo - iv_name = lv_name - iv_from = lo_repo->get_sha1_local( ) ). - -* automatically switch to new branch - lo_repo->set_branch_name( lv_name ). - - MESSAGE 'Switched to new branch' TYPE 'S' ##NO_TEXT. - - ENDMETHOD. - - METHOD repo_pull. - - DATA: lo_repo TYPE REF TO lcl_repo_online. - - lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). - - IF lo_repo->is_write_protected( ) = abap_true. - lcx_exception=>raise( 'Cannot pull. Local code is write-protected by repo config' ). - ENDIF. - - lo_repo->refresh( ). - lo_repo->deserialize( ). - - COMMIT WORK. - - ENDMETHOD. "pull - - METHOD get_page_stage. - - DATA: lo_repo TYPE REF TO lcl_repo_online, - lo_stage_page TYPE REF TO lcl_gui_page_stage. - - - lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). - - " force refresh on stage, to make sure the latest local and remote files are used - lo_repo->refresh( ). - - CREATE OBJECT lo_stage_page - EXPORTING - io_repo = lo_repo. - - ri_page = lo_stage_page. - - ENDMETHOD. - - METHOD db_delete. - - DATA: lv_answer TYPE c LENGTH 1, - ls_key TYPE lcl_persistence_db=>ty_content. - - - ls_key = lcl_html_action_utils=>dbkey_decode( iv_getdata ). - - CALL FUNCTION 'POPUP_TO_CONFIRM' - EXPORTING - titlebar = 'Warning' - text_question = 'Delete?' - 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. - lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). - ENDIF. - - IF lv_answer = '2'. - RETURN. - ENDIF. - - lcl_app=>db( )->delete( - iv_type = ls_key-type - iv_value = ls_key-value ). - - COMMIT WORK. - - ENDMETHOD. - - METHOD db_save. - - DATA: lv_string TYPE string, - ls_content TYPE lcl_persistence_db=>ty_content, - lt_fields TYPE tihttpnvp. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - CONCATENATE LINES OF it_postdata INTO lv_string. - - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'type' ##NO_TEXT. - ASSERT sy-subrc = 0. - ls_content-type = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'value' ##NO_TEXT. - ASSERT sy-subrc = 0. - ls_content-value = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'xmldata' ##NO_TEXT. - ASSERT sy-subrc = 0. - IF -value(1) <> '<'. - ls_content-data_str = -value+1. " hmm - ENDIF. - - lcl_app=>db( )->update( - iv_type = ls_content-type - iv_value = ls_content-value - iv_data = ls_content-data_str ). - - COMMIT WORK. - - ENDMETHOD. - -ENDCLASS. " lcl_gui_router \ No newline at end of file +ENDCLASS. "lcl_gui IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_gui_pages.prog.abap b/src/zabapgit_gui_pages.prog.abap new file mode 100644 index 000000000..2ca2f2a09 --- /dev/null +++ b/src/zabapgit_gui_pages.prog.abap @@ -0,0 +1,17 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_GUI_PAGES +*&---------------------------------------------------------------------* + +* All UI pages + +INCLUDE zabapgit_html_action_utils. +INCLUDE zabapgit_page. +INCLUDE zabapgit_page_commit. +INCLUDE zabapgit_page_merge. +INCLUDE zabapgit_page_branch_overview. +INCLUDE zabapgit_page_stage. +INCLUDE zabapgit_page_db. +INCLUDE zabapgit_page_main. +INCLUDE zabapgit_page_background. +INCLUDE zabapgit_page_diff. +INCLUDE zabapgit_page_explore. \ No newline at end of file diff --git a/src/zabapgit_gui_pages.prog.xml b/src/zabapgit_gui_pages.prog.xml new file mode 100644 index 000000000..068beb75a --- /dev/null +++ b/src/zabapgit_gui_pages.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_GUI_PAGES + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_GUI_PAGES + 26 + + + + + + diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap new file mode 100644 index 000000000..569f0b184 --- /dev/null +++ b/src/zabapgit_gui_router.prog.abap @@ -0,0 +1,647 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_GUI_ROUTER +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* 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. + + METHODS get_page_by_name + IMPORTING iv_name TYPE clike + RETURNING VALUE(ri_page) TYPE REF TO lif_gui_page + 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_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_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_pull + 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 + 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. + +ENDCLASS. + +*----------------------------------------------------------------------* +* CLASS lcl_gui_router IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS lcl_gui_router IMPLEMENTATION. + + METHOD on_event. + + DATA: lv_url TYPE string, + lv_key TYPE lcl_persistence_repo=>ty_repo-key, + ls_item TYPE ty_item. + + + CASE iv_action. + " General routing + WHEN 'main' + OR 'explore' + OR 'db' + OR 'background_run'. + ei_page = get_page_by_name( iv_action ). + ev_state = gc_event_state-new_page. + WHEN 'background'. + lv_key = iv_getdata. + CREATE OBJECT ei_page TYPE lcl_gui_page_background + EXPORTING + iv_key = lv_key. + ev_state = gc_event_state-new_page. + WHEN 'abapgithome'. + cl_gui_frontend_services=>execute( EXPORTING document = gc_abapgit_homepage + EXCEPTIONS OTHERS = 1 ). + IF sy-subrc <> 0. + lcx_exception=>raise( 'Opening page in external browser failed.' ). + ENDIF. + ev_state = gc_event_state-no_more_act. + WHEN 'abapgit_installation'. + abapgit_installation( ). + ev_state = gc_event_state-re_render. + WHEN 'jump'. + lcl_html_action_utils=>jump_decode( 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 ). + ev_state = gc_event_state-no_more_act. + WHEN 'diff'. + ei_page = get_page_diff( iv_getdata ). + ev_state = gc_event_state-new_page. + + " DB actions + WHEN 'db_display' OR 'db_edit'. + ei_page = get_page_db_by_name( iv_name = iv_action iv_getdata = iv_getdata ). + ev_state = gc_event_state-new_page. + WHEN 'db_delete'. + db_delete( iv_getdata = iv_getdata ). + ev_state = gc_event_state-re_render. + WHEN 'db_save'. + db_save( it_postdata ). + ev_state = gc_event_state-go_back. + + " Repository state actions + WHEN 'uninstall'. + lv_key = iv_getdata. + repo_purge( lv_key ). + ev_state = gc_event_state-re_render. + WHEN 'remove'. + lv_key = iv_getdata. + repo_remove( lv_key ). + ev_state = gc_event_state-re_render. + WHEN 'zipimport'. + lv_key = iv_getdata. + lcl_zip=>import( lv_key ). + ev_state = gc_event_state-re_render. + WHEN 'zipexport'. + lv_key = iv_getdata. + lcl_zip=>export( lcl_app=>repo_srv( )->get( lv_key ) ). + ev_state = gc_event_state-no_more_act. + WHEN 'files_commit'. "TODO refactor name ? + lv_key = iv_getdata. + lcl_zip=>export( io_repo = lcl_app=>repo_srv( )->get( lv_key ) + iv_zip = abap_false ). + ev_state = gc_event_state-no_more_act. + WHEN 'packagezip'. + lcl_popups=>repo_package_zip( ). + ev_state = gc_event_state-no_more_act. + WHEN 'transportzip'. + lcl_transport=>zip( ). + ev_state = gc_event_state-no_more_act. + WHEN 'refresh'. + lv_key = iv_getdata. + lcl_app=>repo_srv( )->get( lv_key )->refresh( ). + ev_state = gc_event_state-re_render. + + " explore page + WHEN 'install'. + lv_url = iv_getdata. + lcl_popups=>repo_clone( lv_url ). + ev_state = gc_event_state-re_render. + + " Repository online actions + WHEN 'pull'. + lv_key = iv_getdata. + repo_pull( lv_key ). + ev_state = gc_event_state-re_render. + WHEN 'stage'. + lv_key = iv_getdata. + ei_page = get_page_stage( lv_key ). + ev_state = gc_event_state-new_page_w_bookmark. + WHEN 'reset'. + lv_key = iv_getdata. + reset( lv_key ). + ev_state = gc_event_state-re_render. + WHEN 'create_branch'. + lv_key = iv_getdata. + create_branch( lv_key ). + ev_state = gc_event_state-re_render. + WHEN 'branch_overview'. + ei_page = get_page_branch_overview( iv_getdata ). + ev_state = gc_event_state-new_page. + WHEN OTHERS. + ev_state = gc_event_state-not_handled. + ENDCASE. + ENDMETHOD. " on_event + + METHOD get_page_by_name. + + DATA: lv_page_class TYPE string, + lv_message TYPE string. + + lv_page_class = |LCL_GUI_PAGE_{ to_upper( iv_name ) }|. + + TRY. + CREATE OBJECT ri_page TYPE (lv_page_class). + CATCH cx_sy_create_object_error. + lv_message = |Cannot create page class { lv_page_class }|. + lcx_exception=>raise( lv_message ). + ENDTRY. + + ENDMETHOD. " get_page_by_name + + METHOD get_page_db_by_name. + + DATA: lv_page_class TYPE string, + lv_message TYPE string, + ls_key TYPE lcl_persistence_db=>ty_content. + + lv_page_class = |LCL_GUI_PAGE_{ to_upper( iv_name ) }|. + ls_key = lcl_html_action_utils=>dbkey_decode( iv_getdata ). + + TRY. + CREATE OBJECT ri_page TYPE (lv_page_class) + EXPORTING + is_key = ls_key. + + CATCH cx_sy_create_object_error. + lv_message = |Cannot create page class { lv_page_class }|. + lcx_exception=>raise( lv_message ). + ENDTRY. + + ENDMETHOD. " get_page_db_by_name + + METHOD get_page_branch_overview. + + DATA: lo_repo TYPE REF TO lcl_repo_online, + lo_page TYPE REF TO lcl_gui_page_branch_overview, + lv_key TYPE lcl_persistence_repo=>ty_repo-key. + + + lv_key = iv_getdata. + + lo_repo ?= lcl_app=>repo_srv( )->get( lv_key ). + + CREATE OBJECT lo_page + EXPORTING + io_repo = lo_repo. + + ri_page = lo_page. + + ENDMETHOD. + + METHOD get_page_diff. + + DATA: lt_remote TYPE ty_files_tt, + lt_local TYPE ty_files_item_tt, + lo_page TYPE REF TO lcl_gui_page_diff, + lo_repo TYPE REF TO lcl_repo_online, + ls_file TYPE ty_repo_file, + lv_key TYPE lcl_persistence_repo=>ty_repo-key. + + FIELD-SYMBOLS: LIKE LINE OF lt_remote, + LIKE LINE OF lt_local. + + lcl_html_action_utils=>file_decode( EXPORTING iv_string = iv_getdata + IMPORTING ev_key = lv_key + eg_file = ls_file ). + + lo_repo ?= lcl_app=>repo_srv( )->get( lv_key ). + lt_remote = lo_repo->get_files_remote( ). + lt_local = lo_repo->get_files_local( ). + + READ TABLE lt_remote ASSIGNING + WITH KEY filename = ls_file-filename + path = ls_file-path. + IF sy-subrc <> 0. + lcx_exception=>raise( 'file not found remotely' ). + ENDIF. + + READ TABLE lt_local ASSIGNING + WITH KEY file-filename = ls_file-filename + file-path = ls_file-path. + IF sy-subrc <> 0. + lcx_exception=>raise( 'file not found locally' ). + ENDIF. + + CREATE OBJECT lo_page + EXPORTING + is_local = -file + is_remote = . + + ri_page = lo_page. + + ENDMETHOD. + + METHOD abapgit_installation. + + CONSTANTS lc_package_abapgit TYPE devclass VALUE '$ABAPGIT'. + CONSTANTS lc_package_plugins TYPE devclass VALUE '$ABAPGIT_PLUGINS'. + + DATA lv_text TYPE c LENGTH 100. + DATA lv_answer TYPE c LENGTH 1. + DATA lo_repo TYPE REF TO lcl_repo_online. + DATA lv_url TYPE string. + DATA lv_target_package TYPE devclass. + + lv_text = |Installing current version ABAPGit to package { lc_package_abapgit } | + && |and plugins to { lc_package_plugins }|. + + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + titlebar = 'Install abapGit' + text_question = lv_text + text_button_1 = 'Continue' + text_button_2 = 'Cancel' + default_button = '2' + display_cancel_button = abap_false + IMPORTING + answer = lv_answer ##no_text. + IF lv_answer <> '1'. + RETURN. ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + ENDIF. + + DO 2 TIMES. + CASE sy-index. + WHEN 1. + lv_url = 'https://github.com/larshp/abapGit.git'. + lv_target_package = lc_package_abapgit. + WHEN 2. + lv_url = 'https://github.com/larshp/abapGit-plugins.git' ##no_text. + lv_target_package = lc_package_plugins. + ENDCASE. + + IF abap_false = lcl_app=>repo_srv( )->is_repo_installed( + iv_url = lv_url + iv_target_package = lv_target_package ). + + lcl_sap_package=>create_local( lv_target_package ). + + lo_repo = lcl_app=>repo_srv( )->new_online( + iv_url = lv_url + iv_branch_name = 'refs/heads/master' "TODO replace with HEAD ? + iv_package = lv_target_package ) ##NO_TEXT. + + lo_repo->status( ). " check for errors + lo_repo->deserialize( ). + ENDIF. + ENDDO. + + COMMIT WORK. + + ENDMETHOD. "abapgit_installation + + METHOD repo_purge. + + DATA: lt_tadir TYPE ty_tadir_tt, + lv_count TYPE c LENGTH 3, + lv_answer TYPE c LENGTH 1, + lo_repo TYPE REF TO lcl_repo, + lv_package TYPE devclass, + lv_question TYPE c LENGTH 100. + + + lo_repo = lcl_app=>repo_srv( )->get( iv_key ). + + IF lo_repo->is_write_protected( ) = abap_true. + lcx_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 ). + + IF lines( lt_tadir ) > 0. + lv_count = lines( lt_tadir ). + + CONCATENATE 'This will delete all objects in package' lv_package + INTO lv_question + SEPARATED BY space. "#EC NOTEXT + + CONCATENATE lv_question '(' lv_count 'objects)' + INTO lv_question + SEPARATED BY space. "#EC NOTEXT + + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + titlebar = 'Uninstall' + text_question = lv_question + text_button_1 = 'Delete' + 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. + lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). + ENDIF. + + IF lv_answer = '2'. + RETURN. + ENDIF. + + lcl_objects=>delete( lt_tadir ). + + ENDIF. + + lcl_app=>repo_srv( )->delete( lo_repo ). + + COMMIT WORK. + + ENDMETHOD. "repo_purge + + METHOD repo_remove. + + DATA: lv_answer TYPE c LENGTH 1, + lo_repo TYPE REF TO lcl_repo, + lv_package TYPE devclass, + lv_question TYPE c LENGTH 100. + + + lo_repo = lcl_app=>repo_srv( )->get( iv_key ). + lv_package = lo_repo->get_package( ). + + CONCATENATE 'This will remove the repository reference to the package' + lv_package + INTO lv_question + SEPARATED BY space. "#EC NOTEXT + + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + titlebar = 'Remove' + text_question = lv_question + text_button_1 = 'Remove' + icon_button_1 = 'ICON_WF_UNLINK' + 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. + lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). + ENDIF. + + IF lv_answer = '2'. + RETURN. + ENDIF. + + lcl_app=>repo_srv( )->delete( lo_repo ). + + COMMIT WORK. + + ENDMETHOD. "repo_remove + + METHOD reset. + + DATA: lo_repo TYPE REF TO lcl_repo_online, + lv_answer TYPE c LENGTH 1. + + + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + + IF lo_repo->is_write_protected( ) = abap_true. + lcx_exception=>raise( 'Cannot reset. Local code is write-protected by repo config' ). + ENDIF. + + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + titlebar = 'Warning' + text_question = 'Reset local objects?' + text_button_1 = 'Ok' + icon_button_1 = 'ICON_OKAY' + 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. + lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). + ENDIF. + + IF lv_answer = '2'. + RETURN. + ENDIF. + + lo_repo->deserialize( ). + + ENDMETHOD. + + METHOD create_branch. + + DATA: lv_name TYPE string, + lv_cancel TYPE abap_bool, + lo_repo TYPE REF TO lcl_repo_online. + + + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + + lcl_popups=>create_branch_popup( + IMPORTING + ev_name = lv_name + ev_cancel = lv_cancel ). + IF lv_cancel = abap_true. + RETURN. + ENDIF. + + ASSERT lv_name CP 'refs/heads/+*'. + + lcl_git_porcelain=>create_branch( + io_repo = lo_repo + iv_name = lv_name + iv_from = lo_repo->get_sha1_local( ) ). + +* automatically switch to new branch + lo_repo->set_branch_name( lv_name ). + + MESSAGE 'Switched to new branch' TYPE 'S' ##NO_TEXT. + + ENDMETHOD. + + METHOD repo_pull. + + DATA: lo_repo TYPE REF TO lcl_repo_online. + + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + + IF lo_repo->is_write_protected( ) = abap_true. + lcx_exception=>raise( 'Cannot pull. Local code is write-protected by repo config' ). + ENDIF. + + lo_repo->refresh( ). + lo_repo->deserialize( ). + + COMMIT WORK. + + ENDMETHOD. "pull + + METHOD get_page_stage. + + DATA: lo_repo TYPE REF TO lcl_repo_online, + lo_stage_page TYPE REF TO lcl_gui_page_stage. + + + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + + " force refresh on stage, to make sure the latest local and remote files are used + lo_repo->refresh( ). + + CREATE OBJECT lo_stage_page + EXPORTING + io_repo = lo_repo. + + ri_page = lo_stage_page. + + ENDMETHOD. + + METHOD db_delete. + + DATA: lv_answer TYPE c LENGTH 1, + ls_key TYPE lcl_persistence_db=>ty_content. + + + ls_key = lcl_html_action_utils=>dbkey_decode( iv_getdata ). + + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + titlebar = 'Warning' + text_question = 'Delete?' + 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. + lcx_exception=>raise( 'error from POPUP_TO_CONFIRM' ). + ENDIF. + + IF lv_answer = '2'. + RETURN. + ENDIF. + + lcl_app=>db( )->delete( + iv_type = ls_key-type + iv_value = ls_key-value ). + + COMMIT WORK. + + ENDMETHOD. + + METHOD db_save. + + DATA: lv_string TYPE string, + ls_content TYPE lcl_persistence_db=>ty_content, + lt_fields TYPE tihttpnvp. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + CONCATENATE LINES OF it_postdata INTO lv_string. + + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'type' ##NO_TEXT. + ASSERT sy-subrc = 0. + ls_content-type = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'value' ##NO_TEXT. + ASSERT sy-subrc = 0. + ls_content-value = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'xmldata' ##NO_TEXT. + ASSERT sy-subrc = 0. + IF -value(1) <> '<'. + ls_content-data_str = -value+1. " hmm + ENDIF. + + lcl_app=>db( )->update( + iv_type = ls_content-type + iv_value = ls_content-value + iv_data = ls_content-data_str ). + + COMMIT WORK. + + ENDMETHOD. + +ENDCLASS. " lcl_gui_router \ No newline at end of file diff --git a/src/zabapgit_gui_router.prog.xml b/src/zabapgit_gui_router.prog.xml new file mode 100644 index 000000000..554bbc558 --- /dev/null +++ b/src/zabapgit_gui_router.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_GUI_ROUTER + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_GUI_ROUTER + 27 + + + + + + diff --git a/src/zabapgit_html.prog.abap b/src/zabapgit_html.prog.abap index a252cac6f..d684f4949 100644 --- a/src/zabapgit_html.prog.abap +++ b/src/zabapgit_html.prog.abap @@ -6,263 +6,6 @@ DEFINE _add. ro_html->add( &1 ) ##NO_TEXT. END-OF-DEFINITION. -*----------------------------------------------------------------------* -* CLASS lcl_html_action_utils DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_html_action_utils DEFINITION FINAL. - PUBLIC SECTION. - - TYPES: BEGIN OF ty_commit_fields, "TODO refactor ! Move to normal place - repo_key TYPE lcl_persistence_repo=>ty_repo-key, - username TYPE string, - email TYPE string, - comment TYPE string, - body TYPE string, - END OF ty_commit_fields. - - CLASS-METHODS jump_encode - IMPORTING iv_obj_type TYPE tadir-object - iv_obj_name TYPE tadir-obj_name - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS jump_decode - IMPORTING iv_string TYPE clike - EXPORTING ev_obj_type TYPE tadir-object - ev_obj_name TYPE tadir-obj_name - RAISING lcx_exception. - - CLASS-METHODS file_encode - IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key - ig_file TYPE any "ty_repo_file - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS file_decode - IMPORTING iv_string TYPE clike - EXPORTING ev_key TYPE lcl_persistence_repo=>ty_repo-key - eg_file TYPE any "ty_repo_file - RAISING lcx_exception. - - CLASS-METHODS dbkey_encode - IMPORTING is_key TYPE lcl_persistence_db=>ty_content - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS dbkey_decode - IMPORTING iv_string TYPE clike - RETURNING VALUE(rs_key) TYPE lcl_persistence_db=>ty_content. - - CLASS-METHODS parse_commit_request - IMPORTING it_postdata TYPE cnht_post_data_tab - RETURNING VALUE(rs_fields) TYPE ty_commit_fields. - - CLASS-METHODS repo_key_encode - IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key - RETURNING VALUE(rv_string) TYPE string. - -ENDCLASS. "lcl_html_action_utils DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_html_action_utils IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_html_action_utils IMPLEMENTATION. - - METHOD jump_encode. - - DATA: lt_fields TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. - - - ls_field-name = 'TYPE'. - ls_field-value = iv_obj_type. - APPEND ls_field TO lt_fields. - - ls_field-name = 'NAME'. - ls_field-value = iv_obj_name. - APPEND ls_field TO lt_fields. - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "jump_encode - - METHOD jump_decode. - - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - lv_string = iv_string. " type conversion - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'TYPE'. - IF sy-subrc = 0. - ev_obj_type = -value. - ELSE. - CLEAR ev_obj_type. - ENDIF. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'NAME'. - IF sy-subrc = 0. - ev_obj_name = -value. - ELSE. - CLEAR ev_obj_name. - ENDIF. - - ENDMETHOD. "jump_decode - - METHOD file_encode. - - DATA: lt_fields TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. - - FIELD-SYMBOLS TYPE string. - - ls_field-name = 'KEY'. - ls_field-value = iv_key. - APPEND ls_field TO lt_fields. - - ls_field-name = 'PATH'. - ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO . - ASSERT IS ASSIGNED. - ls_field-value = . - APPEND ls_field TO lt_fields. - - ls_field-name = 'FILENAME'. - ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO . - ASSERT IS ASSIGNED. - ls_field-value = . - APPEND ls_field TO lt_fields. - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "file_encode - - METHOD file_decode. - - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields, - TYPE string. - - CLEAR: ev_key, eg_file. - lv_string = iv_string. " type conversion - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'KEY'. - IF sy-subrc = 0. - ev_key = -value. - ENDIF. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'PATH'. - IF sy-subrc = 0. - ASSIGN COMPONENT 'PATH' OF STRUCTURE eg_file TO . - ASSERT IS ASSIGNED. - = -value. - ENDIF. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'FILENAME'. - IF sy-subrc = 0. - ASSIGN COMPONENT 'FILENAME' OF STRUCTURE eg_file TO . - ASSERT IS ASSIGNED. - = -value. - ENDIF. - - ENDMETHOD. "file_decode - - METHOD dbkey_encode. - - DATA: lt_fields TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. - - ls_field-name = 'TYPE'. - ls_field-value = is_key-type. - APPEND ls_field TO lt_fields. - - ls_field-name = 'VALUE'. - ls_field-value = is_key-value. - APPEND ls_field TO lt_fields. - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "dbkey_encode - - METHOD dbkey_decode. - - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - lv_string = iv_string. " type conversion - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'TYPE'. - IF sy-subrc = 0. - rs_key-type = -value. - ENDIF. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'VALUE'. - IF sy-subrc = 0. - rs_key-value = -value. - ENDIF. - - ENDMETHOD. "dbkey_decode - - METHOD parse_commit_request. - - CONSTANTS: lc_replace TYPE string VALUE '<>'. - - DATA: lv_string TYPE string, - lt_fields TYPE tihttpnvp. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - CONCATENATE LINES OF it_postdata INTO lv_string. - - REPLACE ALL OCCURRENCES OF gc_newline IN lv_string WITH lc_replace. - - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'key' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-repo_key = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'username' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-username = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'email' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-email = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'comment' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-comment = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'body' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-body = -value. - REPLACE ALL OCCURRENCES OF lc_replace IN rs_fields-body WITH gc_newline. - - ENDMETHOD. "parse_commit_request - - METHOD repo_key_encode. - - DATA: lt_fields TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. - - ls_field-name = 'KEY'. - ls_field-value = iv_key. - APPEND ls_field TO lt_fields. - - rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). - - ENDMETHOD. "repo_key_encode - -ENDCLASS. "lcl_html_action_utils IMPLEMENTATION - *----------------------------------------------------------------------* * CLASS lcl_html_helper DEFINITION *----------------------------------------------------------------------* @@ -558,84 +301,4 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDMETHOD. "render -ENDCLASS. "lcl_html_toolbar IMPLEMENTATION - -CLASS lcl_log DEFINITION FINAL. - - PUBLIC SECTION. - METHODS: - add - IMPORTING - iv_msgv1 TYPE csequence - iv_msgv2 TYPE csequence OPTIONAL - iv_msgv3 TYPE csequence OPTIONAL - iv_msgv4 TYPE csequence OPTIONAL, - count - RETURNING VALUE(rv_count) TYPE i, - to_html - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, - show. - - PRIVATE SECTION. - DATA: mt_log TYPE rs_t_msg. - -ENDCLASS. - -CLASS lcl_log IMPLEMENTATION. - - METHOD to_html. - - DATA: lv_string TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF mt_log. - - CREATE OBJECT ro_html. - - IF count( ) = 0. - RETURN. - ENDIF. - - ro_html->add( '
' ). - LOOP AT mt_log ASSIGNING . - CONCATENATE -msgv1 - -msgv2 - -msgv3 - -msgv4 INTO lv_string SEPARATED BY space. - ro_html->add( lv_string ). - ro_html->add( '
' ). - ENDLOOP. - ro_html->add( '
' ). - - ENDMETHOD. - - METHOD add. - - FIELD-SYMBOLS: LIKE LINE OF mt_log. - - APPEND INITIAL LINE TO mt_log ASSIGNING . - -msgty = 'W'. - -msgid = '00'. - -msgno = '001'. - -msgv1 = iv_msgv1. - -msgv2 = iv_msgv2. - -msgv3 = iv_msgv3. - -msgv4 = iv_msgv4. - - ENDMETHOD. - - METHOD show. - CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP' - EXPORTING - i_t_msg = mt_log - i_txt = 'Warning' - i_with_s_on_empty = abap_false - i_one_msg_direct = abap_false - i_one_msg_type_s = abap_false - ##no_text. - ENDMETHOD. - - METHOD count. - rv_count = lines( mt_log ). - ENDMETHOD. - -ENDCLASS. \ No newline at end of file +ENDCLASS. "lcl_html_toolbar IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap new file mode 100644 index 000000000..221f4cfcc --- /dev/null +++ b/src/zabapgit_html_action_utils.prog.abap @@ -0,0 +1,260 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_HTML_ACTION_UTILS +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_html_action_utils DEFINITION +*----------------------------------------------------------------------* +CLASS lcl_html_action_utils DEFINITION FINAL. + PUBLIC SECTION. + + TYPES: BEGIN OF ty_commit_fields, "TODO refactor ! Move to normal place + repo_key TYPE lcl_persistence_repo=>ty_repo-key, + username TYPE string, + email TYPE string, + comment TYPE string, + body TYPE string, + END OF ty_commit_fields. + + CLASS-METHODS jump_encode + IMPORTING iv_obj_type TYPE tadir-object + iv_obj_name TYPE tadir-obj_name + RETURNING VALUE(rv_string) TYPE string. + + CLASS-METHODS jump_decode + IMPORTING iv_string TYPE clike + EXPORTING ev_obj_type TYPE tadir-object + ev_obj_name TYPE tadir-obj_name + RAISING lcx_exception. + + CLASS-METHODS file_encode + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + ig_file TYPE any "ty_repo_file + RETURNING VALUE(rv_string) TYPE string. + + CLASS-METHODS file_decode + IMPORTING iv_string TYPE clike + EXPORTING ev_key TYPE lcl_persistence_repo=>ty_repo-key + eg_file TYPE any "ty_repo_file + RAISING lcx_exception. + + CLASS-METHODS dbkey_encode + IMPORTING is_key TYPE lcl_persistence_db=>ty_content + RETURNING VALUE(rv_string) TYPE string. + + CLASS-METHODS dbkey_decode + IMPORTING iv_string TYPE clike + RETURNING VALUE(rs_key) TYPE lcl_persistence_db=>ty_content. + + CLASS-METHODS parse_commit_request + IMPORTING it_postdata TYPE cnht_post_data_tab + RETURNING VALUE(rs_fields) TYPE ty_commit_fields. + + CLASS-METHODS repo_key_encode + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + RETURNING VALUE(rv_string) TYPE string. + +ENDCLASS. "lcl_html_action_utils DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_html_action_utils IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS lcl_html_action_utils IMPLEMENTATION. + + METHOD jump_encode. + + DATA: lt_fields TYPE tihttpnvp, + ls_field LIKE LINE OF lt_fields. + + + ls_field-name = 'TYPE'. + ls_field-value = iv_obj_type. + APPEND ls_field TO lt_fields. + + ls_field-name = 'NAME'. + ls_field-value = iv_obj_name. + APPEND ls_field TO lt_fields. + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "jump_encode + + METHOD jump_decode. + + DATA: lt_fields TYPE tihttpnvp, + lv_string TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + lv_string = iv_string. " type conversion + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'TYPE'. + IF sy-subrc = 0. + ev_obj_type = -value. + ELSE. + CLEAR ev_obj_type. + ENDIF. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'NAME'. + IF sy-subrc = 0. + ev_obj_name = -value. + ELSE. + CLEAR ev_obj_name. + ENDIF. + + ENDMETHOD. "jump_decode + + METHOD file_encode. + + DATA: lt_fields TYPE tihttpnvp, + ls_field LIKE LINE OF lt_fields. + + FIELD-SYMBOLS TYPE string. + + ls_field-name = 'KEY'. + ls_field-value = iv_key. + APPEND ls_field TO lt_fields. + + ls_field-name = 'PATH'. + ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO . + ASSERT IS ASSIGNED. + ls_field-value = . + APPEND ls_field TO lt_fields. + + ls_field-name = 'FILENAME'. + ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO . + ASSERT IS ASSIGNED. + ls_field-value = . + APPEND ls_field TO lt_fields. + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "file_encode + + METHOD file_decode. + + DATA: lt_fields TYPE tihttpnvp, + lv_string TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields, + TYPE string. + + CLEAR: ev_key, eg_file. + lv_string = iv_string. " type conversion + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'KEY'. + IF sy-subrc = 0. + ev_key = -value. + ENDIF. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'PATH'. + IF sy-subrc = 0. + ASSIGN COMPONENT 'PATH' OF STRUCTURE eg_file TO . + ASSERT IS ASSIGNED. + = -value. + ENDIF. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'FILENAME'. + IF sy-subrc = 0. + ASSIGN COMPONENT 'FILENAME' OF STRUCTURE eg_file TO . + ASSERT IS ASSIGNED. + = -value. + ENDIF. + + ENDMETHOD. "file_decode + + METHOD dbkey_encode. + + DATA: lt_fields TYPE tihttpnvp, + ls_field LIKE LINE OF lt_fields. + + ls_field-name = 'TYPE'. + ls_field-value = is_key-type. + APPEND ls_field TO lt_fields. + + ls_field-name = 'VALUE'. + ls_field-value = is_key-value. + APPEND ls_field TO lt_fields. + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "dbkey_encode + + METHOD dbkey_decode. + + DATA: lt_fields TYPE tihttpnvp, + lv_string TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + lv_string = iv_string. " type conversion + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'TYPE'. + IF sy-subrc = 0. + rs_key-type = -value. + ENDIF. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'VALUE'. + IF sy-subrc = 0. + rs_key-value = -value. + ENDIF. + + ENDMETHOD. "dbkey_decode + + METHOD parse_commit_request. + + CONSTANTS: lc_replace TYPE string VALUE '<>'. + + DATA: lv_string TYPE string, + lt_fields TYPE tihttpnvp. + + FIELD-SYMBOLS: LIKE LINE OF lt_fields. + + + CONCATENATE LINES OF it_postdata INTO lv_string. + + REPLACE ALL OCCURRENCES OF gc_newline IN lv_string WITH lc_replace. + + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'key' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-repo_key = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'username' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-username = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'email' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-email = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'comment' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-comment = -value. + + READ TABLE lt_fields ASSIGNING WITH KEY name = 'body' ##NO_TEXT. + ASSERT sy-subrc = 0. + rs_fields-body = -value. + REPLACE ALL OCCURRENCES OF lc_replace IN rs_fields-body WITH gc_newline. + + ENDMETHOD. "parse_commit_request + + METHOD repo_key_encode. + + DATA: lt_fields TYPE tihttpnvp, + ls_field LIKE LINE OF lt_fields. + + ls_field-name = 'KEY'. + ls_field-value = iv_key. + APPEND ls_field TO lt_fields. + + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "repo_key_encode + +ENDCLASS. "lcl_html_action_utils IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_html_action_utils.prog.xml b/src/zabapgit_html_action_utils.prog.xml new file mode 100644 index 000000000..a83a04c8a --- /dev/null +++ b/src/zabapgit_html_action_utils.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_HTML_ACTION_UTILS + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_HTML_ACTION_UTILS + 34 + + + + + + diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap new file mode 100644 index 000000000..cb39c08af --- /dev/null +++ b/src/zabapgit_object_clas.prog.abap @@ -0,0 +1,946 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_CLAS +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_object_clas DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. + + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + + PRIVATE SECTION. + TYPES: BEGIN OF ty_sotr, + header TYPE sotr_head, + entries TYPE sotr_text_tt, + END OF ty_sotr. + + TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY. + + DATA mv_skip_testclass TYPE abap_bool. + + METHODS deserialize_abap + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception. + + METHODS deserialize_textpool + IMPORTING io_xml TYPE REF TO lcl_xml_input + RAISING lcx_exception. + + METHODS deserialize_docu + IMPORTING io_xml TYPE REF TO lcl_xml_input + RAISING lcx_exception. + + METHODS deserialize_sotr + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception. + + METHODS serialize_abap_old + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS deserialize_abap_source_old + IMPORTING is_clskey TYPE seoclskey + it_source TYPE ty_string_tt + RAISING lcx_exception. + + METHODS deserialize_abap_source_new + IMPORTING is_clskey TYPE seoclskey + it_source TYPE ty_string_tt + RAISING lcx_exception + cx_sy_dyn_call_error. + + METHODS serialize_abap_new + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception + cx_sy_dyn_call_error. + + METHODS serialize_locals_imp + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS serialize_locals_def + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS read_include + IMPORTING is_clskey TYPE seoclskey + iv_type TYPE seop_include_ext_app + RETURNING VALUE(rt_source) TYPE seop_source_string. + + METHODS serialize_testclasses + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS serialize_macros + IMPORTING is_clskey TYPE seoclskey + RETURNING VALUE(rt_source) TYPE ty_string_tt + RAISING lcx_exception. + + METHODS serialize_xml + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception. + + METHODS read_sotr + RETURNING VALUE(rt_sotr) TYPE ty_sotr_tt + RAISING lcx_exception. + + METHODS remove_signatures + CHANGING ct_source TYPE ty_string_tt. + + METHODS reduce + CHANGING ct_source TYPE ty_string_tt. + +ENDCLASS. "lcl_object_dtel DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_intf DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. +* todo, CLAS + INTF to be refactored, see: +* https://github.com/larshp/abapGit/issues/21 +ENDCLASS. "lcl_object_intf DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_clas IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_clas IMPLEMENTATION. + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~changed_by. +* todo, not sure this is correct, to be tested + SELECT SINGLE changedby FROM seoclassdf INTO rv_user + WHERE clsname = ms_item-obj_name + AND version = '1'. "#EC CI_GENBUFF + IF sy-subrc = 0 AND rv_user IS INITIAL. + SELECT SINGLE author FROM seoclassdf INTO rv_user + WHERE clsname = ms_item-obj_name + AND version = '1'. "#EC CI_GENBUFF + ENDIF. + IF sy-subrc <> 0. + rv_user = c_user_unknown. + ENDIF. + ENDMETHOD. + + METHOD lif_object~exists. + + DATA: ls_clskey TYPE seoclskey. + + + ls_clskey-clsname = ms_item-obj_name. + + CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK' + EXPORTING + clskey = ls_clskey + EXCEPTIONS + not_specified = 1 + not_existing = 2 + is_interface = 3 + no_text = 4 + inconsistent = 5 + OTHERS = 6. + rv_bool = boolc( sy-subrc <> 2 ). + + ENDMETHOD. "lif_object~exists + + METHOD lif_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = 'CLAS' + in_new_window = abap_true. + + ENDMETHOD. "jump + + METHOD lif_object~delete. + + DATA: ls_clskey TYPE seoclskey. + + + ls_clskey-clsname = ms_item-obj_name. + + CASE ms_item-obj_type. + WHEN 'CLAS'. + CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' + EXPORTING + clskey = ls_clskey + EXCEPTIONS + not_existing = 1 + is_interface = 2 + db_error = 3 + no_access = 4 + other = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ). + ENDIF. + WHEN 'INTF'. + CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE' + EXPORTING + intkey = ls_clskey + EXCEPTIONS + not_existing = 1 + is_class = 2 + db_error = 3 + no_access = 4 + other = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_INTERFACE_DELETE_COMPLETE' ). + ENDIF. + WHEN OTHERS. + lcx_exception=>raise( 'class delete, unknown type' ). + ENDCASE. + + ENDMETHOD. "delete + + METHOD reduce. + + DATA: lv_source LIKE LINE OF ct_source, + lv_found TYPE sap_bool. + + +* skip files that only contain the standard comments + lv_found = abap_false. + LOOP AT ct_source INTO lv_source. + IF strlen( lv_source ) >= 3 AND lv_source(3) <> '*"*'. + lv_found = abap_true. + ENDIF. + ENDLOOP. + IF lv_found = abap_false. + CLEAR ct_source[]. + ENDIF. + + ENDMETHOD. "reduce + + METHOD serialize_locals_imp. + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_locals_imp ). + + reduce( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_local + + METHOD serialize_locals_def. + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_locals_def ). + + reduce( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_locals_def + + METHOD read_include. + + DATA: ls_include TYPE progstruc. + + + ASSERT iv_type = seop_ext_class_locals_def + OR iv_type = seop_ext_class_locals_imp + OR iv_type = seop_ext_class_macros + OR iv_type = seop_ext_class_testclasses. + + ls_include-rootname = is_clskey-clsname. + TRANSLATE ls_include-rootname USING ' ='. + ls_include-categorya = iv_type(1). + ls_include-codea = iv_type+1(4). + +* it looks like there is an issue in function module SEO_CLASS_GET_INCLUDE_SOURCE +* on 750 kernels, where the READ REPORT without STATE addition does not +* return the active version, this method is a workaround for this issue + READ REPORT ls_include INTO rt_source STATE 'A'. + + ENDMETHOD. + + METHOD serialize_testclasses. + + DATA: lv_line1 LIKE LINE OF rt_source, + lv_line2 LIKE LINE OF rt_source. + + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_testclasses ). + +* when creating classes in Eclipse it automatically generates the +* testclass include, but it is not needed, so skip to avoid +* creating an extra file in the repository. +* Also remove it if the content is manually removed, but +* the class still thinks it contains tests + mv_skip_testclass = abap_false. + IF lines( rt_source ) = 2. + READ TABLE rt_source INDEX 1 INTO lv_line1. + ASSERT sy-subrc = 0. + READ TABLE rt_source INDEX 2 INTO lv_line2. + ASSERT sy-subrc = 0. + IF lv_line1(3) = '*"*' AND lv_line2 IS INITIAL. + mv_skip_testclass = abap_true. + ENDIF. + ELSEIF lines( rt_source ) = 1. + READ TABLE rt_source INDEX 1 INTO lv_line1. + ASSERT sy-subrc = 0. + IF lv_line1(3) = '*"*' OR lv_line1 IS INITIAL. + mv_skip_testclass = abap_true. + ENDIF. + ELSEIF lines( rt_source ) = 0. + mv_skip_testclass = abap_true. + ENDIF. + + ENDMETHOD. "serialize_test + + METHOD serialize_macros. + + rt_source = read_include( is_clskey = is_clskey + iv_type = seop_ext_class_macros ). + + reduce( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_macro + + METHOD serialize_abap_old. +* for old ABAP AS versions + DATA: lo_source TYPE REF TO cl_oo_source. + + + CREATE OBJECT lo_source + EXPORTING + clskey = is_clskey + EXCEPTIONS + class_not_existing = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from CL_OO_SOURCE' ). + ENDIF. + + lo_source->read( 'A' ). + rt_source = lo_source->get_old_source( ). + remove_signatures( CHANGING ct_source = rt_source ). + + ENDMETHOD. "serialize_abap + + METHOD serialize_abap_new. + + DATA: lo_source TYPE REF TO object, + lo_instance TYPE REF TO object. + +* do not call the class/methods statically, as it will +* give syntax errors on old versions + CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') + RECEIVING + result = lo_instance. + + CALL METHOD lo_instance->('CREATE_CLIF_SOURCE') + EXPORTING + clif_name = is_clskey-clsname + version = 'A' + RECEIVING + result = lo_source. + + CALL METHOD lo_source->('GET_SOURCE') + IMPORTING + source = rt_source. + + ENDMETHOD. + + METHOD remove_signatures. + +* signatures messes up in CL_OO_SOURCE when deserializing and serializing +* within same session + + DATA: lv_begin TYPE string, + lv_end TYPE string, + lv_remove TYPE sap_bool, + lv_source LIKE LINE OF ct_source. + + + CONCATENATE '* ------------------------------------' + '---------------------------------------------------+' + INTO lv_begin. + + CONCATENATE '* +------------------------------------------------' + '--------------------------------------' + INTO lv_end. + + lv_remove = abap_false. + LOOP AT ct_source INTO lv_source. + IF lv_source = lv_begin. + lv_remove = abap_true. + ENDIF. + IF lv_remove = abap_true. + DELETE ct_source INDEX sy-tabix. + ENDIF. + IF lv_source = lv_end. + lv_remove = abap_false. + ENDIF. + ENDLOOP. + + ENDMETHOD. "remove_signatures + + METHOD lif_object~serialize. + + DATA: lt_source TYPE seop_source_string, + ls_clskey TYPE seoclskey. + + + ls_clskey-clsname = ms_item-obj_name. + + IF lif_object~exists( ) = abap_false. + RETURN. + ENDIF. + + CALL FUNCTION 'SEO_BUFFER_REFRESH' + EXPORTING + version = seoc_version_active + force = seox_true. + CALL FUNCTION 'SEO_BUFFER_REFRESH' + EXPORTING + version = seoc_version_inactive + force = seox_true. + + TRY. + lt_source = serialize_abap_new( ls_clskey ). + CATCH cx_sy_dyn_call_error. + lt_source = serialize_abap_old( ls_clskey ). + ENDTRY. + + mo_files->add_abap( lt_source ). + + IF ms_item-obj_type = 'CLAS'. + lt_source = serialize_locals_def( ls_clskey ). + IF NOT lt_source[] IS INITIAL. + mo_files->add_abap( iv_extra = 'locals_def' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + + lt_source = serialize_locals_imp( ls_clskey ). + IF NOT lt_source[] IS INITIAL. + mo_files->add_abap( iv_extra = 'locals_imp' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + + lt_source = serialize_testclasses( ls_clskey ). + IF NOT lt_source[] IS INITIAL AND mv_skip_testclass = abap_false. + mo_files->add_abap( iv_extra = 'testclasses' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + + lt_source = serialize_macros( ls_clskey ). + IF NOT lt_source[] IS INITIAL. + mo_files->add_abap( iv_extra = 'macros' + it_abap = lt_source ). "#EC NOTEXT + ENDIF. + ENDIF. + + serialize_xml( io_xml ). + + ENDMETHOD. "serialize + + METHOD read_sotr. + + DATA: lv_concept TYPE sotr_head-concept, + lt_seocompodf TYPE STANDARD TABLE OF seocompodf WITH DEFAULT KEY, + ls_header TYPE sotr_head, + lt_entries TYPE sotr_text_tt. + + FIELD-SYMBOLS: LIKE LINE OF rt_sotr, + LIKE LINE OF lt_seocompodf, + LIKE LINE OF lt_entries. + + + SELECT * FROM seocompodf + INTO TABLE lt_seocompodf + WHERE clsname = ms_item-obj_name + AND version = '1' + AND exposure = '2' + AND attdecltyp = '2' + AND type = 'SOTR_CONC' + ORDER BY PRIMARY KEY. + + LOOP AT lt_seocompodf ASSIGNING . + + lv_concept = translate( val = -attvalue from = '''' to = '' ). + + CALL FUNCTION 'SOTR_GET_CONCEPT' + EXPORTING + concept = lv_concept + IMPORTING + header = ls_header + TABLES + entries = lt_entries + EXCEPTIONS + no_entry_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SOTR_GET_CONCEPT' ). + ENDIF. + + CLEAR: ls_header-paket, + ls_header-crea_name, + ls_header-crea_tstut, + ls_header-chan_name, + ls_header-chan_tstut. + + LOOP AT lt_entries ASSIGNING . + CLEAR: -crea_name, + -crea_tstut, + -chan_name, + -chan_tstut. + ENDLOOP. + + APPEND INITIAL LINE TO rt_sotr ASSIGNING . + -header = ls_header. + -entries = lt_entries. + + ENDLOOP. + + ENDMETHOD. + + METHOD serialize_xml. + + DATA: ls_vseoclass TYPE vseoclass, + lv_cp TYPE program, + lt_tpool TYPE textpool_table, + lv_object TYPE dokhl-object, + lv_state TYPE dokhl-dokstate, + ls_vseointerf TYPE vseointerf, + ls_clskey TYPE seoclskey, + lt_sotr TYPE ty_sotr_tt, + lt_lines TYPE tlinetab. + + + ls_clskey-clsname = ms_item-obj_name. + + CALL FUNCTION 'SEO_CLIF_GET' + EXPORTING + cifkey = ls_clskey + version = seoc_version_active + IMPORTING + class = ls_vseoclass + interface = ls_vseointerf + EXCEPTIONS + not_existing = 1 + deleted = 2 + model_only = 3 + OTHERS = 4. + IF sy-subrc = 1. + RETURN. " in case only inactive version exists + ELSEIF sy-subrc <> 0. + lcx_exception=>raise( 'error from seo_clif_get' ). + ENDIF. + + CLEAR: ls_vseoclass-uuid, + ls_vseoclass-author, + ls_vseoclass-createdon, + ls_vseoclass-changedby, + ls_vseoclass-changedon, + ls_vseoclass-r3release, + ls_vseoclass-chgdanyby, + ls_vseoclass-chgdanyon. + + IF mv_skip_testclass = abap_true. + CLEAR ls_vseoclass-with_unit_tests. + ENDIF. + + CLEAR: ls_vseointerf-uuid, + ls_vseointerf-author, + ls_vseointerf-createdon, + ls_vseointerf-changedby, + ls_vseointerf-changedon, + ls_vseointerf-r3release. + + CASE ms_item-obj_type. + WHEN 'CLAS'. + io_xml->add( iv_name = 'VSEOCLASS' + ig_data = ls_vseoclass ). + + lv_cp = cl_oo_classname_service=>get_classpool_name( ls_clskey-clsname ). + READ TEXTPOOL lv_cp INTO lt_tpool LANGUAGE mv_language. "#EC CI_READ_REP + io_xml->add( iv_name = 'TPOOL' + ig_data = add_tpool( lt_tpool ) ). + + IF ls_vseoclass-category = seoc_category_exception. + lt_sotr = read_sotr( ). + IF lines( lt_sotr ) > 0. + io_xml->add( iv_name = 'SOTR' + ig_data = lt_sotr ). + ENDIF. + ENDIF. + WHEN 'INTF'. + io_xml->add( iv_name = 'VSEOINTERF' + ig_data = ls_vseointerf ). + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + + lv_object = ls_clskey-clsname. + CALL FUNCTION 'DOCU_GET' + EXPORTING + id = 'CL' + langu = mv_language + object = lv_object + IMPORTING + dokstate = lv_state + TABLES + line = lt_lines + EXCEPTIONS + no_docu_on_screen = 1 + no_docu_self_def = 2 + no_docu_temp = 3 + ret_code = 4 + OTHERS = 5. + IF sy-subrc = 0 AND lv_state = 'R'. + io_xml->add( iv_name = 'LINES' + ig_data = lt_lines ). + ENDIF. + + ENDMETHOD. "serialize_xml + + METHOD lif_object~deserialize. + +* function group SEOK +* function group SEOQ +* function group SEOP +* class CL_OO_CLASSNAME_SERVICE +* class CL_OO_SOURCE + + deserialize_abap( io_xml = io_xml + iv_package = iv_package ). + + IF ms_item-obj_type = 'CLAS'. + deserialize_textpool( io_xml ). + + deserialize_sotr( io_xml = io_xml + iv_package = iv_package ). + ENDIF. + + deserialize_docu( io_xml ). + + ENDMETHOD. "deserialize + + METHOD deserialize_sotr. + + DATA: lt_sotr TYPE ty_sotr_tt, + lt_objects TYPE sotr_objects, + ls_paket TYPE sotr_pack, + lv_object LIKE LINE OF lt_objects. + + FIELD-SYMBOLS: LIKE LINE OF lt_sotr. + + + io_xml->read( EXPORTING iv_name = 'SOTR' + CHANGING cg_data = lt_sotr ). + + IF lines( lt_sotr ) = 0. + RETURN. + ENDIF. + + LOOP AT lt_sotr ASSIGNING . + CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS' + EXPORTING + object_vector = -header-objid_vec + IMPORTING + objects = lt_objects + EXCEPTIONS + object_not_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SOTR_OBJECT_GET_OBJECTS' ). + ENDIF. + + READ TABLE lt_objects INDEX 1 INTO lv_object. + ASSERT sy-subrc = 0. + + ls_paket-paket = iv_package. + + CALL FUNCTION 'SOTR_CREATE_CONCEPT' + EXPORTING + paket = ls_paket + crea_lan = -header-crea_lan + alias_name = -header-alias_name + object = lv_object + entries = -entries + concept_default = -header-concept + EXCEPTIONS + package_missing = 1 + crea_lan_missing = 2 + object_missing = 3 + paket_does_not_exist = 4 + alias_already_exist = 5 + object_type_not_found = 6 + langu_missing = 7 + identical_context_not_allowed = 8 + text_too_long = 9 + error_in_update = 10 + no_master_langu = 11 + error_in_concept_id = 12 + alias_not_allowed = 13 + tadir_entry_creation_failed = 14 + internal_error = 15 + error_in_correction = 16 + user_cancelled = 17 + no_entry_found = 18 + OTHERS = 19. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SOTR_CREATE_CONCEPT' ). + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + METHOD deserialize_docu. + + DATA: lt_lines TYPE tlinetab, + lv_object TYPE dokhl-object. + + + io_xml->read( EXPORTING iv_name = 'LINES' + CHANGING cg_data = lt_lines ). + + IF lt_lines[] IS INITIAL. + RETURN. + ENDIF. + + lv_object = ms_item-obj_name. + CALL FUNCTION 'DOCU_UPD' + EXPORTING + id = 'CL' + langu = mv_language + object = lv_object + TABLES + line = lt_lines + EXCEPTIONS + ret_code = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from DOCU_UPD' ). + ENDIF. + + ENDMETHOD. "deserialize_doku + + METHOD deserialize_textpool. + + DATA: lv_cp TYPE program, + lv_clsname TYPE seoclsname, + lt_tpool_ext TYPE ty_tpool_tt, + lt_tpool TYPE textpool_table. + + + io_xml->read( EXPORTING iv_name = 'TPOOL' + CHANGING cg_data = lt_tpool_ext ). + lt_tpool = read_tpool( lt_tpool_ext ). + + IF lt_tpool[] IS INITIAL. + RETURN. + ENDIF. + + lv_clsname = ms_item-obj_name. + lv_cp = cl_oo_classname_service=>get_classpool_name( lv_clsname ). + + INSERT TEXTPOOL lv_cp + FROM lt_tpool + LANGUAGE mv_language + STATE 'I'. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). + ENDIF. + + lcl_objects_activation=>add( iv_type = 'REPT' + iv_name = lv_cp ). + + ENDMETHOD. "deserialize_textpool + + METHOD deserialize_abap. + + DATA: ls_vseoclass TYPE vseoclass, + ls_vseointerf TYPE vseointerf, + lt_source TYPE seop_source_string, + lt_locals_def TYPE seop_source_string, + lt_locals_imp TYPE seop_source_string, + lt_locals_mac TYPE seop_source_string, + lt_testclasses TYPE seop_source_string, + ls_clskey TYPE seoclskey. + + + lt_source = mo_files->read_abap( ). + + lt_locals_def = mo_files->read_abap( iv_extra = 'locals_def' + iv_error = abap_false ). "#EC NOTEXT + + lt_locals_imp = mo_files->read_abap( iv_extra = 'locals_imp' + iv_error = abap_false ). "#EC NOTEXT + + lt_locals_mac = mo_files->read_abap( iv_extra = 'macros' + iv_error = abap_false ). "#EC NOTEXT + + lt_testclasses = mo_files->read_abap( iv_extra = 'testclasses' + iv_error = abap_false ). "#EC NOTEXT + + ls_clskey-clsname = ms_item-obj_name. + + + CASE ms_item-obj_type. + WHEN 'CLAS'. + io_xml->read( EXPORTING iv_name = 'VSEOCLASS' + CHANGING cg_data = ls_vseoclass ). + + CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' + EXPORTING + devclass = iv_package + overwrite = seox_true + CHANGING + class = ls_vseoclass + EXCEPTIONS + existing = 1 + is_interface = 2 + db_error = 3 + component_error = 4 + no_access = 5 + other = 6 + OTHERS = 7. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). + ENDIF. + + WHEN 'INTF'. + io_xml->read( EXPORTING iv_name = 'VSEOINTERF' + CHANGING cg_data = ls_vseointerf ). + + CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE' + EXPORTING + devclass = iv_package + overwrite = seox_true + CHANGING + interface = ls_vseointerf + EXCEPTIONS + existing = 1 + is_class = 2 + db_error = 3 + component_error = 4 + no_access = 5 + other = 6 + OTHERS = 7. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). + ENDIF. + + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + + IF ms_item-obj_type = 'CLAS'. + CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' + EXPORTING + clskey = ls_clskey + force = seox_true + locals_def = lt_locals_def + locals_imp = lt_locals_imp + locals_mac = lt_locals_mac + locals_testclasses = lt_testclasses + EXCEPTIONS + not_existing = 1 + model_only = 2 + locals_not_generated = 3 + locals_not_initialised = 4 + OTHERS = 5. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from generate_locals' ). + ENDIF. + ENDIF. + + TRY. + deserialize_abap_source_new( + is_clskey = ls_clskey + it_source = lt_source ). + CATCH cx_sy_dyn_call_error. + deserialize_abap_source_old( + is_clskey = ls_clskey + it_source = lt_source ). + ENDTRY. + + lcl_objects_activation=>add_item( ms_item ). + + ENDMETHOD. "deserialize + + METHOD deserialize_abap_source_old. +* for backwards compatability down to 702 + + DATA: lo_source TYPE REF TO cl_oo_source. + + + CREATE OBJECT lo_source + EXPORTING + clskey = is_clskey + EXCEPTIONS + class_not_existing = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from CL_OO_SOURCE' ). + ENDIF. + + TRY. + lo_source->access_permission( seok_access_modify ). + lo_source->set_source( it_source ). + lo_source->save( ). + lo_source->access_permission( seok_access_free ). + CATCH cx_oo_access_permission. + lcx_exception=>raise( 'permission error' ). + CATCH cx_oo_source_save_failure. + lcx_exception=>raise( 'save failure' ). + ENDTRY. + + ENDMETHOD. + + METHOD deserialize_abap_source_new. + + DATA: lo_factory TYPE REF TO object, + lo_source TYPE REF TO object. + + + CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') + RECEIVING + result = lo_factory. + + CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') + EXPORTING + clif_name = is_clskey-clsname + RECEIVING + result = lo_source. + + TRY. + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK'). + CATCH cx_oo_access_permission. + lcx_exception=>raise( 'source_new, access permission exception' ). + ENDTRY. + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE') + EXPORTING + source = it_source. + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE'). + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK'). + + ENDMETHOD. + +ENDCLASS. "lcl_object_CLAS IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_object_clas.prog.xml b/src/zabapgit_object_clas.prog.xml new file mode 100644 index 000000000..5b52c65de --- /dev/null +++ b/src/zabapgit_object_clas.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_OBJECT_CLAS + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_OBJECT_CLAS + 28 + + + + + + diff --git a/src/zabapgit_object_fugr.prog.abap b/src/zabapgit_object_fugr.prog.abap new file mode 100644 index 000000000..d87ed5816 --- /dev/null +++ b/src/zabapgit_object_fugr.prog.abap @@ -0,0 +1,632 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_FUGR +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_object_fugr DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + + PRIVATE SECTION. + TYPES: ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY. + + TYPES: BEGIN OF ty_function, + funcname TYPE rs38l_fnam, + include TYPE progname, + global_flag TYPE rs38l-global, + remote_call TYPE rs38l-remote, + update_task TYPE rs38l-utask, + short_text TYPE tftit-stext, + remote_basxml TYPE rs38l-basxml_enabled, + import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY, + changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY, + export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY, + tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY, + exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY, + documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY, + END OF ty_function. + + TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY. + + METHODS main_name + RETURNING VALUE(rv_program) TYPE program + RAISING lcx_exception. + + METHODS functions + RETURNING VALUE(rt_functab) TYPE ty_rs38l_incl_tt + RAISING lcx_exception. + + METHODS includes + RETURNING VALUE(rt_includes) TYPE rso_t_objnm + RAISING lcx_exception. + + METHODS serialize_functions + RETURNING VALUE(rt_functions) TYPE ty_function_tt + RAISING lcx_exception. + + METHODS deserialize_functions + IMPORTING it_functions TYPE ty_function_tt + RAISING lcx_exception. + + METHODS serialize_xml + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception. + + METHODS deserialize_xml + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception. + + METHODS serialize_includes + RAISING lcx_exception. + + METHODS deserialize_includes + IMPORTING io_xml TYPE REF TO lcl_xml_input + iv_package TYPE devclass + RAISING lcx_exception. + +* METHODS deserialize_dynpros +* IMPORTING it_dynpros TYPE ty_dynpro_tt +* RAISING lcx_exception. +* +* METHODS deserialize_cua +* IMPORTING is_cua TYPE ty_cua +* RAISING lcx_exception. + +ENDCLASS. "lcl_object_fugr DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_dtel IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_fugr IMPLEMENTATION. + +* function group SEUF +* function group SIFP +* function group SUNI + + METHOD lif_object~changed_by. + rv_user = c_user_unknown. " todo + ENDMETHOD. + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~exists. + + DATA: lv_pool TYPE tlibg-area. + + + lv_pool = ms_item-obj_name. + CALL FUNCTION 'RS_FUNCTION_POOL_EXISTS' + EXPORTING + function_pool = lv_pool + EXCEPTIONS + pool_not_exists = 1. + rv_bool = boolc( sy-subrc <> 1 ). + + ENDMETHOD. "lif_object~exists + + METHOD deserialize_functions. + + DATA: lv_include TYPE rs38l-include, + lv_area TYPE rs38l-area, + lt_source TYPE TABLE OF abaptxt255. + + FIELD-SYMBOLS: LIKE LINE OF it_functions. + + + LOOP AT it_functions ASSIGNING . + + lt_source = mo_files->read_abap( iv_extra = -funcname ). + + lv_area = ms_item-obj_name. + + CALL FUNCTION 'FUNCTION_EXISTS' + EXPORTING + funcname = -funcname + IMPORTING + include = lv_include + EXCEPTIONS + function_not_exist = 1. + IF sy-subrc = 0. +* delete the function module to make sure the parameters are updated +* havent found a nice way to update the paramters + CALL FUNCTION 'FUNCTION_DELETE' + EXPORTING + funcname = -funcname + suppress_success_message = abap_true + EXCEPTIONS + error_message = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from FUNCTION_DELETE' ). + ENDIF. + ENDIF. + + CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT' + EXPORTING + funcname = -funcname + function_pool = lv_area + interface_global = -global_flag + remote_call = -remote_call + short_text = -short_text +* NAMESPACE = ' ' todo + remote_basxml_supported = -remote_basxml + IMPORTING + function_include = lv_include + TABLES + import_parameter = -import + export_parameter = -export + tables_parameter = -tables + changing_parameter = -changing + exception_list = -exception + parameter_docu = -documentation + EXCEPTIONS + double_task = 1 + error_message = 2 + function_already_exists = 3 + invalid_function_pool = 4 + invalid_name = 5 + too_many_functions = 6 + no_modify_permission = 7 + no_show_permission = 8 + enqueue_system_failure = 9 + canceled_in_corr = 10 + OTHERS = 11. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from RS_FUNCTIONMODULE_INSERT' ). + ENDIF. + + INSERT REPORT lv_include FROM lt_source. + +* lcl_objects_activation=>add( iv_type = 'FUNC' +* iv_name = -funcname ). + + ENDLOOP. + + ENDMETHOD. "deserialize_functions + + METHOD deserialize_includes. + + DATA: lo_xml TYPE REF TO lcl_xml_input, + ls_progdir TYPE ty_progdir, + lt_includes TYPE rso_t_objnm, + lt_tpool TYPE textpool_table, + lt_tpool_ext TYPE ty_tpool_tt, + lt_source TYPE TABLE OF abaptxt255. + + FIELD-SYMBOLS: LIKE LINE OF lt_includes. + + + io_xml->read( EXPORTING iv_name = 'INCLUDES' + CHANGING cg_data = lt_includes ). + + LOOP AT lt_includes ASSIGNING . + + lt_source = mo_files->read_abap( iv_extra = ). + + lo_xml = mo_files->read_xml( ). + + lo_xml->read( EXPORTING iv_name = 'PROGDIR' + CHANGING cg_data = ls_progdir ). + + lo_xml->read( EXPORTING iv_name = 'TPOOL' + CHANGING cg_data = lt_tpool_ext ). + lt_tpool = read_tpool( lt_tpool_ext ). + + deserialize_program( is_progdir = ls_progdir + it_source = lt_source + it_tpool = lt_tpool + iv_package = iv_package ). + + ENDLOOP. + + ENDMETHOD. "deserialize_includes + + METHOD deserialize_xml. + + DATA: lv_complete TYPE rs38l-area, + lv_namespace TYPE rs38l-namespace, + lv_areat TYPE tlibt-areat, + lv_stext TYPE tftit-stext, + lv_group TYPE rs38l-area. + + + lv_complete = ms_item-obj_name. + + CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT' + EXPORTING + complete_area = lv_complete + IMPORTING + namespace = lv_namespace + group = lv_group + EXCEPTIONS + include_not_exists = 1 + group_not_exists = 2 + no_selections = 3 + no_function_include = 4 + no_function_pool = 5 + delimiter_wrong_position = 6 + no_customer_function_group = 7 + no_customer_function_include = 8 + reserved_name_customer = 9 + namespace_too_long = 10 + area_length_error = 11 + OTHERS = 12. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ). + ENDIF. + + io_xml->read( EXPORTING iv_name = 'AREAT' + CHANGING cg_data = lv_areat ). + lv_stext = lv_areat. + + CALL FUNCTION 'RS_FUNCTION_POOL_INSERT' + EXPORTING + function_pool = lv_group + short_text = lv_stext + namespace = lv_namespace + devclass = iv_package + EXCEPTIONS + name_already_exists = 1 + name_not_correct = 2 + function_already_exists = 3 + invalid_function_pool = 4 + invalid_name = 5 + too_many_functions = 6 + no_modify_permission = 7 + no_show_permission = 8 + enqueue_system_failure = 9 + canceled_in_corr = 10 + undefined_error = 11 + OTHERS = 12. + IF sy-subrc <> 0 AND sy-subrc <> 1 AND sy-subrc <> 3. +* todo, change description + lcx_exception=>raise( 'error from RS_FUNCTION_POOL_INSERT' ). + ENDIF. + + ENDMETHOD. "deserialize_xml + + METHOD serialize_xml. + + DATA: lt_functab TYPE ty_rs38l_incl_tt, + lt_includes TYPE rso_t_objnm, + lv_areat TYPE tlibt-areat. + + + SELECT SINGLE areat INTO lv_areat + FROM tlibt + WHERE spras = mv_language + AND area = ms_item-obj_name. "#EC CI_GENBUFF + IF sy-subrc <> 0. + lcx_exception=>raise( 'not found in TLIBT' ). + ENDIF. + + lt_functab = functions( ). + lt_includes = includes( ). + +* todo, dynpros + + io_xml->add( iv_name = 'AREAT' + ig_data = lv_areat ). + io_xml->add( iv_name = 'INCLUDES' + ig_data = lt_includes ). + + ENDMETHOD. "serialize_xml + + METHOD includes. + + DATA: lv_program TYPE program, + lv_cnam TYPE reposrc-cnam, + lv_tabix LIKE sy-tabix, + lt_functab TYPE ty_rs38l_incl_tt. + + FIELD-SYMBOLS: LIKE LINE OF rt_includes, + LIKE LINE OF lt_functab. + + + lv_program = main_name( ). + lt_functab = functions( ). + + CALL FUNCTION 'RS_GET_ALL_INCLUDES' + EXPORTING + program = lv_program +* WITH_RESERVED_INCLUDES = +* WITH_CLASS_INCLUDES = ' ' hmm, todo + TABLES + includetab = rt_includes + EXCEPTIONS + not_existent = 1 + no_program = 2 + OTHERS = 3. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from RS_GET_ALL_INCLUDES' ). + ENDIF. + + LOOP AT lt_functab ASSIGNING . + DELETE TABLE rt_includes FROM -include. + ENDLOOP. + + + LOOP AT rt_includes ASSIGNING . + lv_tabix = sy-tabix. + +* skip SAP standard includes + SELECT SINGLE cnam FROM reposrc INTO lv_cnam + WHERE progname = + AND r3state = 'A' + AND cnam = 'SAP'. + IF sy-subrc = 0. + DELETE rt_includes INDEX lv_tabix. + CONTINUE. + ENDIF. + +* also make sure the include exists + SELECT SINGLE cnam FROM reposrc INTO lv_cnam + WHERE progname = + AND r3state = 'A'. + IF sy-subrc <> 0. + DELETE rt_includes INDEX lv_tabix. + ENDIF. + + ENDLOOP. + + APPEND lv_program TO rt_includes. + + ENDMETHOD. "includes + + METHOD functions. + + DATA: lv_area TYPE rs38l-area. + + + lv_area = ms_item-obj_name. + + CALL FUNCTION 'RS_FUNCTION_POOL_CONTENTS' + EXPORTING + function_pool = lv_area + TABLES + functab = rt_functab + EXCEPTIONS + function_pool_not_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ). + ENDIF. + + ENDMETHOD. "functions + + METHOD main_name. + + DATA: lv_area TYPE rs38l-area, + lv_namespace TYPE rs38l-namespace, + lv_group TYPE rs38l-area. + + + lv_area = ms_item-obj_name. + + CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT' + EXPORTING + complete_area = lv_area + IMPORTING + namespace = lv_namespace + group = lv_group + EXCEPTIONS + include_not_exists = 1 + group_not_exists = 2 + no_selections = 3 + no_function_include = 4 + no_function_pool = 5 + delimiter_wrong_position = 6 + no_customer_function_group = 7 + no_customer_function_include = 8 + reserved_name_customer = 9 + namespace_too_long = 10 + area_length_error = 11 + OTHERS = 12. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from FUNCTION_INCLUDE_SPLIT' ). + ENDIF. + + CONCATENATE lv_namespace 'SAPL' lv_group INTO rv_program. + + ENDMETHOD. "main_name + + METHOD serialize_functions. + + DATA: + lt_source TYPE TABLE OF rssource, + lt_functab TYPE ty_rs38l_incl_tt, + lt_new_source TYPE rsfb_source. + + FIELD-SYMBOLS: LIKE LINE OF lt_functab, + LIKE LINE OF rt_functions. + + + lt_functab = functions( ). + + LOOP AT lt_functab ASSIGNING . +* fm RPY_FUNCTIONMODULE_READ does not support source code +* lines longer than 72 characters + APPEND INITIAL LINE TO rt_functions ASSIGNING . + MOVE-CORRESPONDING TO . + + CALL FUNCTION 'RPY_FUNCTIONMODULE_READ_NEW' + EXPORTING + functionname = -funcname + IMPORTING + global_flag = -global_flag + remote_call = -remote_call + update_task = -update_task + short_text = -short_text + remote_basxml_supported = -remote_basxml + TABLES + import_parameter = -import + changing_parameter = -changing + export_parameter = -export + tables_parameter = -tables + exception_list = -exception + documentation = -documentation + source = lt_source + CHANGING + new_source = lt_new_source + EXCEPTIONS + error_message = 1 + function_not_found = 2 + invalid_name = 3 + OTHERS = 4. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ). + ENDIF. + + IF NOT lt_new_source IS INITIAL. + mo_files->add_abap( iv_extra = -funcname + it_abap = lt_new_source ). + ELSE. + mo_files->add_abap( iv_extra = -funcname + it_abap = lt_source ). + ENDIF. + + ENDLOOP. + + ENDMETHOD. "serialize_functions + + METHOD serialize_includes. + + DATA: lt_includes TYPE rso_t_objnm. + + FIELD-SYMBOLS: LIKE LINE OF lt_includes. + + + lt_includes = includes( ). + + LOOP AT lt_includes ASSIGNING . + +* todo, filename is not correct, a include can be used in several programs + serialize_program( is_item = ms_item + io_files = mo_files + iv_program = + iv_extra = ). + + ENDLOOP. + + ENDMETHOD. "serialize_includes + + METHOD lif_object~serialize. + + DATA: lt_functions TYPE ty_function_tt, + ls_progdir TYPE ty_progdir, + lv_program_name TYPE programm, + lt_dynpros TYPE ty_dynpro_tt, + ls_cua TYPE ty_cua. + + IF lif_object~exists( ) = abap_false. + RETURN. + ENDIF. + + serialize_xml( io_xml ). + + lt_functions = serialize_functions( ). + io_xml->add( iv_name = 'FUNCTIONS' + ig_data = lt_functions ). + + serialize_includes( ). + + lv_program_name = main_name( ). + ls_progdir = read_progdir( lv_program_name ). + + IF ls_progdir-subc = 'F'. + lt_dynpros = serialize_dynpros( lv_program_name ). + io_xml->add( iv_name = 'DYNPROS' + ig_data = lt_dynpros ). + + ls_cua = serialize_cua( lv_program_name ). + io_xml->add( iv_name = 'CUA' + ig_data = ls_cua ). + ENDIF. + + ENDMETHOD. "serialize + + METHOD lif_object~deserialize. + + DATA: lv_program_name TYPE programm, + lt_functions TYPE ty_function_tt, + lt_dynpros TYPE ty_dynpro_tt, + ls_cua TYPE ty_cua. + + + deserialize_xml( + io_xml = io_xml + iv_package = iv_package ). + + io_xml->read( EXPORTING iv_name = 'FUNCTIONS' + CHANGING cg_data = lt_functions ). + deserialize_functions( lt_functions ). + + deserialize_includes( + io_xml = io_xml + iv_package = iv_package ). + + lv_program_name = main_name( ). + + io_xml->read( EXPORTING iv_name = 'DYNPROS' + CHANGING cg_data = lt_dynpros ). + deserialize_dynpros( it_dynpros = lt_dynpros ). + + io_xml->read( EXPORTING iv_name = 'CUA' + CHANGING cg_data = ls_cua ). + deserialize_cua( iv_program_name = lv_program_name + is_cua = ls_cua ). + + ENDMETHOD. "deserialize + + METHOD lif_object~delete. + + DATA: lv_area TYPE rs38l-area. + + + lv_area = ms_item-obj_name. + + CALL FUNCTION 'RS_FUNCTION_POOL_DELETE' + EXPORTING + area = lv_area + suppress_popups = abap_true + skip_progress_ind = abap_true + EXCEPTIONS + canceled_in_corr = 1 + enqueue_system_failure = 2 + function_exist = 3 + not_executed = 4 + no_modify_permission = 5 + no_show_permission = 6 + permission_failure = 7 + pool_not_exist = 8 + cancelled = 9 + OTHERS = 10. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from RS_FUNCTION_POOL_DELETE' ). + ENDIF. + + ENDMETHOD. "delete + + METHOD lif_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = 'FUGR' + in_new_window = abap_true. + + ENDMETHOD. "jump + +ENDCLASS. "lcl_object_fugr IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_object_fugr.prog.xml b/src/zabapgit_object_fugr.prog.xml new file mode 100644 index 000000000..1d911fdc1 --- /dev/null +++ b/src/zabapgit_object_fugr.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_OBJECT_FUGR + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_OBJECT_FUGR + 28 + + + + + + diff --git a/src/zabapgit_object_prog.prog.abap b/src/zabapgit_object_prog.prog.abap new file mode 100644 index 000000000..03961ac65 --- /dev/null +++ b/src/zabapgit_object_prog.prog.abap @@ -0,0 +1,156 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_PROG +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_object_prog DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_prog DEFINITION INHERITING FROM lcl_objects_program FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + ALIASES mo_files FOR lif_object~mo_files. + + PRIVATE SECTION. + + METHODS deserialize_textpool + IMPORTING it_tpool TYPE textpool_table + RAISING lcx_exception. + +ENDCLASS. "lcl_object_prog DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_prog IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_prog IMPLEMENTATION. + + METHOD lif_object~changed_by. + SELECT SINGLE unam FROM reposrc INTO rv_user + WHERE progname = ms_item-obj_name + AND r3state = 'A'. + IF sy-subrc <> 0. + rv_user = c_user_unknown. + ENDIF. + ENDMETHOD. + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~exists. + + DATA: lv_progname TYPE reposrc-progname. + + + SELECT SINGLE progname FROM reposrc INTO lv_progname + WHERE progname = ms_item-obj_name + AND r3state = 'A'. + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. "lif_object~exists + + METHOD lif_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = 'PROG' + in_new_window = abap_true. + + ENDMETHOD. "jump + + METHOD lif_object~delete. + + DATA: lv_program LIKE sy-repid. + + + lv_program = ms_item-obj_name. + + CALL FUNCTION 'RS_DELETE_PROGRAM' + EXPORTING + program = lv_program + suppress_popup = abap_true + EXCEPTIONS + enqueue_lock = 1 + object_not_found = 2 + permission_failure = 3 + reject_deletion = 4 + OTHERS = 5. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from RS_DELETE_PROGRAM' ). + ENDIF. + + ENDMETHOD. "delete + + METHOD deserialize_textpool. + + READ TABLE it_tpool WITH KEY id = 'R' TRANSPORTING NO FIELDS. + IF ( sy-subrc = 0 AND lines( it_tpool ) = 1 ) OR lines( it_tpool ) = 0. + RETURN. " no action for includes + ENDIF. + + INSERT TEXTPOOL ms_item-obj_name + FROM it_tpool + LANGUAGE mv_language + STATE 'I'. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). + ENDIF. + + lcl_objects_activation=>add( iv_type = 'REPT' + iv_name = ms_item-obj_name ). + + ENDMETHOD. "deserialize_textpool + + METHOD lif_object~serialize. + + serialize_program( io_xml = io_xml + is_item = ms_item + io_files = mo_files ). + + ENDMETHOD. "lif_serialize~serialize + + METHOD lif_object~deserialize. + + DATA: lv_program_name TYPE programm, + ls_progdir TYPE ty_progdir, + lt_tpool TYPE textpool_table, + lt_dynpros TYPE ty_dynpro_tt, + lt_tpool_ext TYPE ty_tpool_tt, + ls_cua TYPE ty_cua, + lt_source TYPE abaptxt255_tab. + + lv_program_name = ms_item-obj_name. + + lt_source = mo_files->read_abap( ). + + io_xml->read( EXPORTING iv_name = 'TPOOL' + CHANGING cg_data = lt_tpool_ext ). + lt_tpool = read_tpool( lt_tpool_ext ). + + io_xml->read( EXPORTING iv_name = 'PROGDIR' + CHANGING cg_data = ls_progdir ). + deserialize_program( is_progdir = ls_progdir + it_source = lt_source + it_tpool = lt_tpool + iv_package = iv_package ). + + io_xml->read( EXPORTING iv_name = 'DYNPROS' + CHANGING cg_data = lt_dynpros ). + deserialize_dynpros( it_dynpros = lt_dynpros ). + + io_xml->read( EXPORTING iv_name = 'CUA' + CHANGING cg_data = ls_cua ). + deserialize_cua( iv_program_name = lv_program_name + is_cua = ls_cua ). + + deserialize_textpool( lt_tpool ). + + ENDMETHOD. "lif_serialize~deserialize + +ENDCLASS. "lcl_object_prog IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_object_prog.prog.xml b/src/zabapgit_object_prog.prog.xml new file mode 100644 index 000000000..508c79fd4 --- /dev/null +++ b/src/zabapgit_object_prog.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_OBJECT_PROG + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_OBJECT_PROG + 28 + + + + + + diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap new file mode 100644 index 000000000..d40ed907b --- /dev/null +++ b/src/zabapgit_object_serializing.prog.abap @@ -0,0 +1,50 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_SERIALIZATION +*&---------------------------------------------------------------------* + +* All object serializing classes + +INCLUDE zabapgit_object_acid. +INCLUDE zabapgit_object_auth. +INCLUDE zabapgit_object_clas. +INCLUDE zabapgit_object_doct. +INCLUDE zabapgit_object_docv. +INCLUDE zabapgit_object_doma. +INCLUDE zabapgit_object_dtel. +INCLUDE zabapgit_object_enho. +INCLUDE zabapgit_object_enhs. +INCLUDE zabapgit_object_enqu. +INCLUDE zabapgit_object_ensc. +INCLUDE zabapgit_object_fugr. +INCLUDE zabapgit_object_iarp. +INCLUDE zabapgit_object_iasp. +INCLUDE zabapgit_object_iatu. +INCLUDE zabapgit_object_msag. +INCLUDE zabapgit_object_nrob. +INCLUDE zabapgit_object_para. +INCLUDE zabapgit_object_pinf. +INCLUDE zabapgit_object_prog. +INCLUDE zabapgit_object_sfbf. +INCLUDE zabapgit_object_sfbs. +INCLUDE zabapgit_object_sfsw. +INCLUDE zabapgit_object_shi3. +INCLUDE zabapgit_object_shlp. +INCLUDE zabapgit_object_sicf. +INCLUDE zabapgit_object_smim. +INCLUDE zabapgit_object_splo. +INCLUDE zabapgit_object_ssfo. +INCLUDE zabapgit_object_ssst. +INCLUDE zabapgit_object_susc. +INCLUDE zabapgit_object_suso. +INCLUDE zabapgit_object_tabl. +INCLUDE zabapgit_object_tobj. +INCLUDE zabapgit_object_tran. +INCLUDE zabapgit_object_ttyp. +INCLUDE zabapgit_object_type. +INCLUDE zabapgit_object_vcls. +INCLUDE zabapgit_object_view. +INCLUDE zabapgit_object_w3xx. +INCLUDE zabapgit_object_wdya. +INCLUDE zabapgit_object_wdyn. +INCLUDE zabapgit_object_webi. +INCLUDE zabapgit_object_xslt. \ No newline at end of file diff --git a/src/zabapgit_object_serializing.prog.xml b/src/zabapgit_object_serializing.prog.xml new file mode 100644 index 000000000..cfd9247d6 --- /dev/null +++ b/src/zabapgit_object_serializing.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_OBJECT_SERIALIZING + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_OBJECT_SERIALIZATION + 37 + + + + + + diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap new file mode 100644 index 000000000..4d7a57065 --- /dev/null +++ b/src/zabapgit_objects_impl.prog.abap @@ -0,0 +1,672 @@ +*&---------------------------------------------------------------------* +*& 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: LIKE LINE OF lt_before, + LIKE LINE OF lt_current, + LIKE LINE OF ct_results. + + + lt_before = io_repo->get_local_checksums( ). + lt_current = io_repo->build_local_checksums( ). + + LOOP AT ct_results ASSIGNING . + lv_index = sy-tabix. + + READ TABLE lt_before ASSIGNING + WITH KEY item-obj_type = -obj_type + item-obj_name = -obj_name. + IF sy-subrc <> 0. + CONTINUE. + ENDIF. + + READ TABLE lt_current ASSIGNING + WITH KEY item-obj_type = -obj_type + item-obj_name = -obj_name. + IF sy-subrc <> 0. + CONTINUE. + ENDIF. + + IF -sha1 <> -sha1. + lv_question = |It looks like object { -obj_type + } { -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. + lcx_exception=>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. + lcx_exception=>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 + lcx_exception=>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: 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 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 changed_by. + + DATA: li_obj TYPE REF TO lif_object. + + + li_obj = create_object( is_item = is_item + iv_language = gc_english ). + + rv_user = li_obj->changed_by( ). + + ASSERT NOT rv_user IS INITIAL. + +* todo, fallback to looking at transports if rv_user = 'UNKNOWN'? + + ENDMETHOD. + + METHOD delete. + + DATA: ls_item TYPE ty_item, + lv_tabclass TYPE dd02l-tabclass, + lt_tadir LIKE it_tadir. + + FIELD-SYMBOLS: LIKE LINE OF it_tadir. + + +* misuse field KORRNUM to fix deletion sequence + + lt_tadir[] = it_tadir[]. + + LOOP AT lt_tadir ASSIGNING . + CASE -object. + WHEN 'IATU'. + -korrnum = '5500'. + WHEN 'IARP'. + -korrnum = '5510'. + WHEN 'IASP'. + -korrnum = '5520'. + WHEN 'SUSC'. + -korrnum = '5000'. + WHEN 'TTYP' OR 'TABL' OR 'VIEW'. + SELECT SINGLE tabclass FROM dd02l + INTO lv_tabclass + WHERE tabname = -obj_name + AND as4local = 'A' + AND as4vers = '0000'. + IF sy-subrc = 0 AND lv_tabclass = 'APPEND'. +* delete append structures before database tables + -korrnum = '6500'. + ELSE. + -korrnum = '7000'. + ENDIF. + WHEN 'DTEL'. + -korrnum = '8000'. + WHEN 'DOMA'. + -korrnum = '9000'. + WHEN 'PROG'. +* delete includes after main programs + SELECT COUNT(*) FROM reposrc + WHERE progname = -obj_name + AND r3state = 'A' + AND subc = 'I'. + IF sy-subrc = 0. + -korrnum = '2000'. + ELSE. + -korrnum = '1000'. + ENDIF. + WHEN OTHERS. + -korrnum = '1000'. + ENDCASE. + ENDLOOP. + + resolve_ddic( CHANGING ct_tadir = lt_tadir ). + + SORT lt_tadir BY korrnum ASCENDING. + + LOOP AT lt_tadir ASSIGNING . + lcl_progress=>show( iv_key = 'Delete' + iv_current = sy-tabix + iv_total = lines( lt_tadir ) + iv_text = -obj_name ) ##NO_TEXT. + + CLEAR ls_item. + ls_item-obj_type = -object. + ls_item-obj_name = -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: LIKE LINE OF ct_tadir, + LIKE LINE OF lt_edges, + LIKE LINE OF lt_founds, + LIKE LINE OF lt_nodes. + + +* build nodes + LOOP AT ct_tadir ASSIGNING + WHERE object = 'TABL' + OR object = 'TTYP'. + APPEND INITIAL LINE TO lt_nodes ASSIGNING . + -obj_name = -obj_name. + -obj_type = -object. + ENDLOOP. + + APPEND 'TABL' TO lt_scope. + APPEND 'STRU' TO lt_scope. + APPEND 'TTYP' TO lt_scope. + +* build edges + LOOP AT lt_nodes ASSIGNING . + + CLEAR lt_findstrings. + APPEND -obj_name TO lt_findstrings. + lv_find_obj_cls = -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 . + APPEND INITIAL LINE TO lt_edges ASSIGNING . + -from = . + + -to-obj_name = -object. + CASE -object_cls. + WHEN 'DS' + OR 'DT'. + -to-obj_type = 'TABL'. + WHEN 'DA'. + -to-obj_type = 'TTYP'. + WHEN OTHERS. + lcx_exception=>raise( 'resolve_ddic, unknown object_cls' ). + ENDCASE. + ENDLOOP. + + ENDLOOP. + + DO. + lv_before = lines( lt_nodes ). + LOOP AT lt_nodes ASSIGNING . + lv_index = sy-tabix. + READ TABLE lt_edges WITH KEY + from-obj_name = -obj_name + from-obj_type = -obj_type + TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + LOOP AT ct_tadir ASSIGNING + WHERE obj_name = -obj_name + AND object = -obj_type. + -korrnum = -korrnum + lv_plus. + CONDENSE -korrnum. + ENDLOOP. + DELETE lt_edges + WHERE to-obj_name = -obj_name + AND to-obj_type = -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. + + + IF is_supported( is_item ) = abap_true. + li_obj = create_object( is_item = is_item + iv_language = gc_english ). + li_obj->delete( ). + ENDIF. + + ENDMETHOD. "delete + + METHOD serialize. + + DATA: li_obj TYPE REF TO lif_object, + lo_xml TYPE REF TO lcl_xml_output, + lo_files TYPE REF TO lcl_objects_files. + + + IF is_supported( is_item ) = abap_false. + IF NOT io_log IS INITIAL. + io_log->add( iv_msgv1 = 'Object type ignored, not supported:' + iv_msgv2 = is_item-obj_type + iv_msgv3 = '-' + iv_msgv4 = is_item-obj_name ) ##no_text. + 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 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 ). + lcx_exception=>raise( 'Duplicates' ). + ENDIF. + + ENDMETHOD. + + METHOD prioritize_deser. + + FIELD-SYMBOLS: LIKE LINE OF it_results. + +* 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. + + LOOP AT it_results ASSIGNING + WHERE obj_type <> 'IASP' AND obj_type <> 'PROG'. + APPEND 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: LIKE LINE OF lt_results, + 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 . + lcl_progress=>show( iv_key = 'Deserialize' + iv_current = sy-tabix + iv_total = lines( lt_results ) + iv_text = -obj_name ) ##NO_TEXT. + + CLEAR ls_item. + ls_item-obj_type = -obj_type. + ls_item-obj_name = -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 = -path ). + + lv_cancel = warning_package( is_item = ls_item + iv_package = lv_package ). + IF lv_cancel = abap_true. + lcx_exception=>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 . + -obj = li_obj. + -xml = lo_xml. + -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 . + -obj->deserialize( iv_package = -package + io_xml = -xml ). + ENDLOOP. + + update_package_tree( io_repo->get_package( ) ). + + ENDMETHOD. "deserialize + +ENDCLASS. "lcl_objects IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_objects_impl.prog.xml b/src/zabapgit_objects_impl.prog.xml new file mode 100644 index 000000000..f426626b7 --- /dev/null +++ b/src/zabapgit_objects_impl.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_OBJECTS_IMPL + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_OBJECT + 23 + + + + + + diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap new file mode 100644 index 000000000..5d050fec9 --- /dev/null +++ b/src/zabapgit_page_diff.prog.abap @@ -0,0 +1,240 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_PAGE_DIFF +*&---------------------------------------------------------------------* + +CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super. + + PUBLIC SECTION. + METHODS: constructor + IMPORTING + is_local TYPE ty_file + is_remote TYPE ty_file. + + METHODS lif_gui_page~render REDEFINITION. + + PRIVATE SECTION. + DATA: mv_filename TYPE string, + mo_diff TYPE REF TO lcl_diff. + + METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_head RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_diff RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_lines RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + +ENDCLASS. "lcl_gui_page_diff + +CLASS lcl_gui_page_diff IMPLEMENTATION. + + METHOD constructor. + super->constructor( ). + + mv_filename = is_local-filename. + + CREATE OBJECT mo_diff + EXPORTING + iv_local = is_local-data + iv_remote = is_remote-data. + + ENDMETHOD. + + METHOD styles. + DATA lo_html TYPE REF TO lcl_html_helper. + CREATE OBJECT lo_html. + + lo_html->add( '/* DIFF */' ). "#EC NOTEXT + lo_html->add( 'div.diff {' ). "#EC NOTEXT + lo_html->add( ' background-color: #f2f2f2;' ). "#EC NOTEXT + lo_html->add( ' padding: 0.7em ' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'div.diff_head {' ). "#EC NOTEXT + lo_html->add( ' border-bottom: 1px solid #DDD;' ). "#EC NOTEXT + lo_html->add( ' padding-bottom: 0.7em;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'span.diff_name {' ). "#EC NOTEXT + lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT + lo_html->add( ' color: grey;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'span.diff_name strong {' ). "#EC NOTEXT + lo_html->add( ' color: #333;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'span.diff_banner {' ). "#EC NOTEXT + lo_html->add( ' border-style: solid;' ). "#EC NOTEXT + lo_html->add( ' border-width: 1px;' ). "#EC NOTEXT + lo_html->add( ' border-radius: 3px;' ). "#EC NOTEXT + lo_html->add( ' padding-left: 0.3em;' ). "#EC NOTEXT + lo_html->add( ' padding-right: 0.3em;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( '.diff_ins {' ). "#EC NOTEXT + lo_html->add( ' border-color: #38e038;' ). "#EC NOTEXT + lo_html->add( ' background-color: #91ee91 !important;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( '.diff_del {' ). "#EC NOTEXT + lo_html->add( ' border-color: #ff8093;' ). "#EC NOTEXT + lo_html->add( ' background-color: #ffb3be !important;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( '.diff_upd {' ). "#EC NOTEXT + lo_html->add( ' border-color: #dada00;' ). "#EC NOTEXT + lo_html->add( ' background-color: #ffffb3 !important;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'div.diff_content {' ). "#EC NOTEXT + lo_html->add( ' background: #fff;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + + " Table part + lo_html->add( '/* DIFF TABLE */' ). "#EC NOTEXT + lo_html->add( 'table.diff_tab {' ). "#EC NOTEXT + lo_html->add( ' font-family: Consolas, Courier, monospace;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'table.diff_tab th {' ). "#EC NOTEXT + lo_html->add( ' color: grey;' ). "#EC NOTEXT + lo_html->add( ' text-align: left;' ). "#EC NOTEXT + lo_html->add( ' font-weight: normal;' ). "#EC NOTEXT + lo_html->add( ' padding: 0.5em;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'table.diff_tab td {' ). "#EC NOTEXT + lo_html->add( ' color: #444;' ). "#EC NOTEXT + lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT + lo_html->add( ' padding-right: 0.5em;' ). "#EC NOTEXT + lo_html->add( ' font-size: 12pt;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'table.diff_tab td.num, th.num {' ). "#EC NOTEXT + lo_html->add( ' text-align: right;' ). "#EC NOTEXT + lo_html->add( ' color: #ccc;' ). "#EC NOTEXT + lo_html->add( ' border-left: 1px solid #eee;' ). "#EC NOTEXT + lo_html->add( ' border-right: 1px solid #eee;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'table.diff_tab td.cmd, th.cmd {' ). "#EC NOTEXT + lo_html->add( ' text-align: center !important;' ). "#EC NOTEXT + lo_html->add( ' white-space: nowrap;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + lo_html->add( 'table.diff_tab tr.diff_nav_line {'). "#EC NOTEXT + lo_html->add( ' background-color: #edf2f9;'). "#EC NOTEXT + lo_html->add( '}'). "#EC NOTEXT + lo_html->add( 'table.diff_tab tr.diff_nav_line td {'). "#EC NOTEXT + lo_html->add( ' color: #ccc;'). "#EC NOTEXT + lo_html->add( '}'). "#EC NOTEXT + lo_html->add( 'table.diff_tab code {' ). "#EC NOTEXT + lo_html->add( ' font-family: inherit;' ). "#EC NOTEXT + lo_html->add( ' white-space: pre;' ). "#EC NOTEXT + lo_html->add( '}' ). "#EC NOTEXT + + ro_html = lo_html. + ENDMETHOD. + + METHOD render_head. + DATA: lo_html TYPE REF TO lcl_html_helper, + ls_stats TYPE lcl_diff=>ty_count. + + CREATE OBJECT lo_html. + + ls_stats = mo_diff->stats( ). + + lo_html->add( '
' ). "#EC NOTEXT + lo_html->add( |+ { ls_stats-insert }| ). + lo_html->add( |- { ls_stats-delete }| ). + lo_html->add( |~ { ls_stats-update }| ). + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( |{ mv_filename }| ). + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '
' ). "#EC NOTEXT + + ro_html = lo_html. + ENDMETHOD. + + METHOD render_diff. + + CREATE OBJECT ro_html. + + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( render_head( ) ). + + " Content + ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( render_lines( ) ). + ro_html->add( '
@LOCAL@REMOTE
' ). "#EC NOTEXT + ro_html->add( '
' ). "#EC NOTEXT + + ro_html->add( '
' ). "#EC NOTEXT + + ENDMETHOD. + + METHOD render_lines. + + DATA: lt_diffs TYPE lcl_diff=>ty_diffs_tt, + lv_local TYPE string, + lv_remote TYPE string, + lv_attr_local TYPE string, + lv_attr_remote TYPE string, + lv_beacon TYPE string, + lv_insert_nav TYPE abap_bool. + + FIELD-SYMBOLS LIKE LINE OF lt_diffs. + + + CREATE OBJECT ro_html. + lt_diffs = mo_diff->get( ). + + LOOP AT lt_diffs ASSIGNING . + IF -short = abap_false. + lv_insert_nav = abap_true. + CONTINUE. + ENDIF. + + IF lv_insert_nav = abap_true. " Insert separator line with navigation + IF -beacon > 0. + READ TABLE mo_diff->mt_beacons INTO lv_beacon INDEX -beacon. + ELSE. + lv_beacon = '---'. + ENDIF. + + ro_html->add( ''). + ro_html->add( '' ). + ro_html->add( |@@ { -local_line } @@ { lv_beacon }| ). + ro_html->add( '' ). + lv_insert_nav = abap_false. + ENDIF. + + lv_local = escape( val = -local format = cl_abap_format=>e_html_attr ). + lv_remote = escape( val = -remote format = cl_abap_format=>e_html_attr ). + + CLEAR: lv_attr_local, lv_attr_remote. " Class for changed lines + CASE -result. + WHEN lcl_diff=>c_diff-insert. + lv_attr_local = ' class="diff_ins"'. "#EC NOTEXT + WHEN lcl_diff=>c_diff-delete. + lv_attr_remote = ' class="diff_del"'. "#EC NOTEXT + WHEN lcl_diff=>c_diff-update. + lv_attr_local = ' class="diff_upd"'. "#EC NOTEXT + lv_attr_remote = ' class="diff_upd"'. "#EC NOTEXT + ENDCASE. + + ro_html->add( '' ). "#EC NOTEXT + ro_html->add( |{ -local_line }| ). "#EC NOTEXT + ro_html->add( |{ lv_local }| ). "#EC NOTEXT + ro_html->add( |{ -remote_line }| ). "#EC NOTEXT + ro_html->add( |{ lv_remote }| ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT + + ENDLOOP. + + ENDMETHOD. + + METHOD lif_gui_page~render. + + CREATE OBJECT ro_html. + + ro_html->add( header( io_include_style = styles( ) ) ). + ro_html->add( title( 'DIFF' ) ). + ro_html->add( render_diff( ) ). + ro_html->add( footer( ) ). + + ENDMETHOD. + +ENDCLASS. "lcl_gui_page_diff \ No newline at end of file diff --git a/src/zabapgit_page_diff.prog.xml b/src/zabapgit_page_diff.prog.xml new file mode 100644 index 000000000..c4a21410c --- /dev/null +++ b/src/zabapgit_page_diff.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_PAGE_DIFF + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_PAGE_DIFF + 26 + + + + + + diff --git a/src/zabapgit_page_explore.prog.abap b/src/zabapgit_page_explore.prog.abap new file mode 100644 index 000000000..eab5b0c95 --- /dev/null +++ b/src/zabapgit_page_explore.prog.abap @@ -0,0 +1,20 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_PAGE_EXPLORE +*&---------------------------------------------------------------------* + +CLASS lcl_gui_page_explore DEFINITION FINAL INHERITING FROM lcl_gui_page_super. + PUBLIC SECTION. + METHODS lif_gui_page~render REDEFINITION. + +ENDCLASS. "lcl_gui_page_explore DEFINITION + +CLASS lcl_gui_page_explore IMPLEMENTATION. + + METHOD lif_gui_page~render. + + CREATE OBJECT ro_html. + ro_html->add( redirect( 'http://larshp.github.io/abapGit/explore.html' ) ). + + ENDMETHOD. + +ENDCLASS. "lcl_gui_page_explore IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_page_explore.prog.xml b/src/zabapgit_page_explore.prog.xml new file mode 100644 index 000000000..e1a90a7d3 --- /dev/null +++ b/src/zabapgit_page_explore.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_PAGE_EXPLORE + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_PAGE_EXPLORE + 29 + + + + + + diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index 0a9205ca0..1a4fbaa20 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -190,367 +190,6 @@ CLASS lcl_persistence_repo DEFINITION FINAL. ENDCLASS. -*----------------------------------------------------------------------* -* CLASS lcl_persistence DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_persistence DEFINITION FINAL FRIENDS lcl_persistence_migrate. - -* this class is obsolete, use LCL_PERSISTENCE_REPO instead - - PRIVATE SECTION. - TYPES: BEGIN OF ty_repo_persi, - url TYPE string, - branch_name TYPE string, - sha1 TYPE ty_sha1, - package TYPE devclass, - offline TYPE sap_bool, - END OF ty_repo_persi. - TYPES: ty_repos_persi_tt TYPE STANDARD TABLE OF ty_repo_persi WITH DEFAULT KEY. - - METHODS list - RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt - RAISING lcx_exception. - - METHODS update - IMPORTING iv_url TYPE ty_repo_persi-url - iv_branch_name TYPE ty_repo_persi-branch_name - iv_branch TYPE ty_sha1 - RAISING lcx_exception. - - METHODS add - IMPORTING iv_url TYPE string - iv_branch_name TYPE string - iv_branch TYPE ty_sha1 OPTIONAL - iv_package TYPE devclass - iv_offline TYPE sap_bool DEFAULT abap_false - RAISING lcx_exception. - - METHODS delete - IMPORTING iv_url TYPE ty_repo_persi-url - iv_branch_name TYPE ty_repo_persi-branch_name - RAISING lcx_exception. - - METHODS read_text_online - RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt - RAISING lcx_exception. - - METHODS save_text_online - IMPORTING it_repos TYPE ty_repos_persi_tt - RAISING lcx_exception. - - METHODS header_online - RETURNING VALUE(rs_header) TYPE thead. - - METHODS read_text_offline - RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt - RAISING lcx_exception. - - METHODS save_text_offline - IMPORTING it_repos TYPE ty_repos_persi_tt - RAISING lcx_exception. - - METHODS header_offline - RETURNING VALUE(rs_header) TYPE thead. - - METHODS read_text - IMPORTING is_header TYPE thead - RETURNING VALUE(rt_lines) TYPE tlinetab - RAISING lcx_exception. - - METHODS save_text - IMPORTING is_header TYPE thead - it_lines TYPE tlinetab - RAISING lcx_exception. - -ENDCLASS. "lcl_persistence DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_persistence IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_persistence IMPLEMENTATION. - - METHOD save_text. - - CALL FUNCTION 'SAVE_TEXT' - EXPORTING - header = is_header - TABLES - lines = it_lines - EXCEPTIONS - id = 1 - language = 2 - name = 3 - object = 4 - OTHERS = 5. - IF sy-subrc <> 0. - ROLLBACK WORK. "#EC CI_ROLLBACK - lcx_exception=>raise( 'error from SAVE_TEXT' ). - ENDIF. - - ENDMETHOD. "save_text - - METHOD header_online. - rs_header-tdid = 'ST'. - rs_header-tdspras = gc_english. - rs_header-tdname = 'ZABAPGIT'. - rs_header-tdobject = 'TEXT'. - ENDMETHOD. "header - - METHOD header_offline. - rs_header-tdid = 'ST'. - rs_header-tdspras = gc_english. - rs_header-tdname = 'ZABAPGIT_OFFLINE'. - rs_header-tdobject = 'TEXT'. - ENDMETHOD. "header_offline - - METHOD delete. - - DATA: lt_repos TYPE ty_repos_persi_tt. - - - lt_repos = list( ). - - DELETE lt_repos WHERE url = iv_url AND branch_name = iv_branch_name. - IF sy-subrc <> 0. - lcx_exception=>raise( 'repo not found, delete' ). - ENDIF. - - save_text_online( lt_repos ). - save_text_offline( lt_repos ). - - ENDMETHOD. "delete - - METHOD save_text_online. - - DATA: lt_lines TYPE TABLE OF tline. - - FIELD-SYMBOLS: LIKE LINE OF it_repos, - LIKE LINE OF lt_lines. - - - LOOP AT it_repos ASSIGNING WHERE offline = abap_false. - APPEND INITIAL LINE TO lt_lines ASSIGNING . - -tdformat = '*'. - -tdline = -url. - APPEND INITIAL LINE TO lt_lines ASSIGNING . - -tdformat = '*'. - -tdline = -branch_name. - APPEND INITIAL LINE TO lt_lines ASSIGNING . - -tdformat = '*'. - -tdline = -sha1. - APPEND INITIAL LINE TO lt_lines ASSIGNING . - -tdformat = '*'. - -tdline = -package. - ENDLOOP. - - save_text( is_header = header_online( ) - it_lines = lt_lines ). - - COMMIT WORK. - - ENDMETHOD. "save_text - - METHOD save_text_offline. - - DATA: lt_lines TYPE TABLE OF tline. - - FIELD-SYMBOLS: LIKE LINE OF it_repos, - LIKE LINE OF lt_lines. - - - LOOP AT it_repos ASSIGNING WHERE offline = abap_true. - APPEND INITIAL LINE TO lt_lines ASSIGNING . - -tdformat = '*'. - -tdline = -url. - APPEND INITIAL LINE TO lt_lines ASSIGNING . - -tdformat = '*'. - -tdline = -package. - ENDLOOP. - - save_text( is_header = header_offline( ) - it_lines = lt_lines ). - - COMMIT WORK. - - ENDMETHOD. "save_text_offline - - METHOD add. - - DATA: lt_repos TYPE ty_repos_persi_tt. - - FIELD-SYMBOLS: LIKE LINE OF lt_repos. - - - ASSERT NOT iv_url IS INITIAL. - ASSERT NOT iv_package IS INITIAL. - - lt_repos = list( ). - - READ TABLE lt_repos WITH KEY url = iv_url branch_name = iv_branch_name - TRANSPORTING NO FIELDS. - IF sy-subrc = 0. - lcx_exception=>raise( 'already inserted' ). - ENDIF. - - APPEND INITIAL LINE TO lt_repos ASSIGNING . - -url = iv_url. - -branch_name = iv_branch_name. - -sha1 = iv_branch. - -package = iv_package. - -offline = iv_offline. - - save_text_online( lt_repos ). - save_text_offline( lt_repos ). - - ENDMETHOD. "insert - - METHOD update. - - DATA: lt_repos TYPE ty_repos_persi_tt. - - FIELD-SYMBOLS: LIKE LINE OF lt_repos. - - - IF iv_branch IS INITIAL. - lcx_exception=>raise( 'update, sha empty' ). - ENDIF. - - lt_repos = list( ). - - READ TABLE lt_repos ASSIGNING - WITH KEY url = iv_url branch_name = iv_branch_name. - IF sy-subrc <> 0. - lcx_exception=>raise( 'persist update, repo not found' ). - ENDIF. - - -sha1 = iv_branch. - - save_text_online( lt_repos ). - - ENDMETHOD. "update - - METHOD list. - CLEAR rt_repos. - APPEND LINES OF read_text_online( ) TO rt_repos. - APPEND LINES OF read_text_offline( ) TO rt_repos. - ENDMETHOD. "list - - METHOD read_text. - - CALL FUNCTION 'READ_TEXT' - EXPORTING - id = is_header-tdid - language = is_header-tdspras - name = is_header-tdname - object = is_header-tdobject - TABLES - lines = rt_lines - EXCEPTIONS - id = 1 - language = 2 - name = 3 - not_found = 4 - object = 5 - reference_check = 6 - wrong_access_to_archive = 7 - OTHERS = 8. - IF sy-subrc = 4. - RETURN. - ELSEIF sy-subrc <> 0. - lcx_exception=>raise( 'Error from READ_TEXT' ). - ENDIF. - - ENDMETHOD. "read_text - - METHOD read_text_online. - - DATA: lt_lines TYPE TABLE OF tline, - lv_step TYPE i, - ls_repo TYPE ty_repo_persi. - - FIELD-SYMBOLS: LIKE LINE OF lt_lines. - - - lt_lines = read_text( header_online( ) ). - IF lines( lt_lines ) = 0. - RETURN. - ENDIF. - - IF lines( lt_lines ) MOD 4 <> 0. -* if this happens, delete text ZABAPGIT in SO10 or edit the text -* manually, so it contains the right information - lcx_exception=>raise( 'Persistence, text broken' ). - ENDIF. - - CLEAR ls_repo. - LOOP AT lt_lines ASSIGNING . - lv_step = lv_step + 1. - CASE lv_step. - WHEN 4. - ls_repo-package = -tdline. - - IF ls_repo-url IS INITIAL OR ls_repo-branch_name IS INITIAL. - lcx_exception=>raise( 'Persistence, text broken 2' ). - ENDIF. - APPEND ls_repo TO rt_repos. - CLEAR ls_repo. - lv_step = 0. - WHEN 3. - ls_repo-sha1 = -tdline. - WHEN 2. - ls_repo-branch_name = -tdline. - WHEN 1. - ls_repo-url = -tdline. - WHEN OTHERS. - ASSERT 1 = 0. - ENDCASE. - ENDLOOP. - - ENDMETHOD. "list - - METHOD read_text_offline. - - DATA: lt_lines TYPE TABLE OF tline, - ls_repo TYPE ty_repo_persi. - - FIELD-SYMBOLS: LIKE LINE OF lt_lines. - - - lt_lines = read_text( header_offline( ) ). - IF lines( lt_lines ) = 0. - RETURN. - ENDIF. - - IF lines( lt_lines ) MOD 2 <> 0. -* if this happens, delete text ZABAPGIT in SO10 or edit the text -* manually, so it contains the right information - lcx_exception=>raise( 'Persistence, text broken' ). - ENDIF. - - CLEAR ls_repo. - LOOP AT lt_lines ASSIGNING . - IF -tdline IS INITIAL. - lcx_exception=>raise( 'Persistence, text broken' ). - ENDIF. - IF ls_repo-url IS INITIAL. - ls_repo-url = -tdline. - CONTINUE. " current loop - ENDIF. - - ls_repo-package = -tdline. - ls_repo-offline = abap_true. - APPEND ls_repo TO rt_repos. - CLEAR ls_repo. - ENDLOOP. - - ENDMETHOD. "list - -ENDCLASS. "lcl_persistence IMPLEMENTATION - CLASS lcl_persistence_background DEFINITION FINAL. PUBLIC SECTION. @@ -789,209 +428,6 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. ENDCLASS. "lcl_persistence_user DEFINITION -*----------------------------------------------------------------------* -* CLASS lcl_user DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_user DEFINITION FINAL FRIENDS lcl_persistence_migrate. - -* this class is obsolete, use LCL_PERSISTENCE_USER instead - - PRIVATE SECTION. - TYPES: BEGIN OF ty_user, - user LIKE sy-uname, - username TYPE string, - email TYPE string, - END OF ty_user. - - TYPES: ty_user_tt TYPE STANDARD TABLE OF ty_user WITH DEFAULT KEY. - - CLASS-METHODS set_username - IMPORTING iv_user TYPE xubname DEFAULT sy-uname - iv_username TYPE string - RAISING lcx_exception. - - CLASS-METHODS get_username - IMPORTING iv_user TYPE xubname DEFAULT sy-uname - RETURNING VALUE(rv_username) TYPE string - RAISING lcx_exception. - - CLASS-METHODS set_email - IMPORTING iv_user TYPE xubname DEFAULT sy-uname - iv_email TYPE string - RAISING lcx_exception. - - CLASS-METHODS get_email - IMPORTING iv_user TYPE xubname DEFAULT sy-uname - RETURNING VALUE(rv_email) TYPE string - RAISING lcx_exception. - - CLASS-METHODS list - RETURNING VALUE(rt_data) TYPE ty_user_tt - RAISING lcx_exception. - - CLASS-METHODS read - IMPORTING iv_name TYPE tdobname - RETURNING VALUE(rv_value) TYPE string - RAISING lcx_exception. - - CLASS-METHODS save - IMPORTING iv_name TYPE tdobname - iv_value TYPE string - RAISING lcx_exception. - -ENDCLASS. "lcl_user DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_user IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_user IMPLEMENTATION. - -* this class is obsolete, use LCL_PERSISTENCE_USER instead - - METHOD read. - - DATA: lt_lines TYPE TABLE OF tline, - ls_line LIKE LINE OF lt_lines. - - - CALL FUNCTION 'READ_TEXT' - EXPORTING - id = 'ST' - language = gc_english - name = iv_name - object = 'TEXT' - TABLES - lines = lt_lines - EXCEPTIONS - id = 1 - language = 2 - name = 3 - not_found = 4 - object = 5 - reference_check = 6 - wrong_access_to_archive = 7 - OTHERS = 8. - IF sy-subrc <> 4 AND sy-subrc <> 0. - lcx_exception=>raise( 'error from READ_TEXT' ). - ENDIF. - - READ TABLE lt_lines INTO ls_line INDEX 1. - IF sy-subrc = 0. - rv_value = ls_line-tdline. - ENDIF. - - ENDMETHOD. "get_details - - METHOD save. - - DATA: ls_header TYPE thead, - lt_lines TYPE TABLE OF tline, - ls_line LIKE LINE OF lt_lines. - - - ls_line-tdformat = '*'. - ls_line-tdline = iv_value. - APPEND ls_line TO lt_lines. - - ls_header-tdid = 'ST'. - ls_header-tdspras = gc_english. - ls_header-tdname = iv_name. - ls_header-tdobject = 'TEXT'. - - CALL FUNCTION 'SAVE_TEXT' - EXPORTING - header = ls_header - TABLES - lines = lt_lines - EXCEPTIONS - id = 1 - language = 2 - name = 3 - object = 4 - OTHERS = 5. - IF sy-subrc <> 0. - ROLLBACK WORK. "#EC CI_ROLLBACK - lcx_exception=>raise( 'error from SAVE_TEXT' ). - ENDIF. - - COMMIT WORK. - - ENDMETHOD. "change - - METHOD set_username. - - DATA: lv_name TYPE tdobname. - - - CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name. - - save( iv_name = lv_name - iv_value = iv_username ). - - ENDMETHOD. "set_username - - METHOD get_username. - - DATA: lv_name TYPE tdobname. - - - CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name. - - rv_username = read( lv_name ). - - ENDMETHOD. "get_username - - METHOD set_email. - - DATA: lv_name TYPE tdobname. - - - CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name. - - save( iv_name = lv_name - iv_value = iv_email ). - - ENDMETHOD. "set_email - - METHOD list. - - DATA: lt_stxh TYPE STANDARD TABLE OF stxh WITH DEFAULT KEY. - - FIELD-SYMBOLS: LIKE LINE OF rt_data, - LIKE LINE OF lt_stxh. - - - SELECT * FROM stxh INTO TABLE lt_stxh - WHERE tdobject = 'TEXT' - AND tdname LIKE 'ZABAPGIT_USERNAME_%'. - - LOOP AT lt_stxh ASSIGNING . - APPEND INITIAL LINE TO rt_data ASSIGNING . - - -user = -tdname+18. - -username = get_username( -user ). - -email = get_email( -user ). - ENDLOOP. - - ENDMETHOD. - - METHOD get_email. - - DATA: lv_name TYPE tdobname. - - - CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name. - - rv_email = read( lv_name ). - - ENDMETHOD. "get_email - -ENDCLASS. "lcl_user IMPLEMENTATION - CLASS lcl_persistence_user IMPLEMENTATION. METHOD constructor. diff --git a/src/zabapgit_persistence_old.prog.abap b/src/zabapgit_persistence_old.prog.abap new file mode 100644 index 000000000..78b900f2e --- /dev/null +++ b/src/zabapgit_persistence_old.prog.abap @@ -0,0 +1,569 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_PERSISTENCE_OLD +*&---------------------------------------------------------------------* + +CLASS lcl_persistence_migrate DEFINITION DEFERRED. + +*----------------------------------------------------------------------* +* CLASS lcl_persistence DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_persistence DEFINITION FINAL FRIENDS lcl_persistence_migrate. + +* this class is obsolete, use LCL_PERSISTENCE_REPO instead + + PRIVATE SECTION. + TYPES: BEGIN OF ty_repo_persi, + url TYPE string, + branch_name TYPE string, + sha1 TYPE ty_sha1, + package TYPE devclass, + offline TYPE sap_bool, + END OF ty_repo_persi. + TYPES: ty_repos_persi_tt TYPE STANDARD TABLE OF ty_repo_persi WITH DEFAULT KEY. + + METHODS list + RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt + RAISING lcx_exception. + + METHODS update + IMPORTING iv_url TYPE ty_repo_persi-url + iv_branch_name TYPE ty_repo_persi-branch_name + iv_branch TYPE ty_sha1 + RAISING lcx_exception. + + METHODS add + IMPORTING iv_url TYPE string + iv_branch_name TYPE string + iv_branch TYPE ty_sha1 OPTIONAL + iv_package TYPE devclass + iv_offline TYPE sap_bool DEFAULT abap_false + RAISING lcx_exception. + + METHODS delete + IMPORTING iv_url TYPE ty_repo_persi-url + iv_branch_name TYPE ty_repo_persi-branch_name + RAISING lcx_exception. + + METHODS read_text_online + RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt + RAISING lcx_exception. + + METHODS save_text_online + IMPORTING it_repos TYPE ty_repos_persi_tt + RAISING lcx_exception. + + METHODS header_online + RETURNING VALUE(rs_header) TYPE thead. + + METHODS read_text_offline + RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt + RAISING lcx_exception. + + METHODS save_text_offline + IMPORTING it_repos TYPE ty_repos_persi_tt + RAISING lcx_exception. + + METHODS header_offline + RETURNING VALUE(rs_header) TYPE thead. + + METHODS read_text + IMPORTING is_header TYPE thead + RETURNING VALUE(rt_lines) TYPE tlinetab + RAISING lcx_exception. + + METHODS save_text + IMPORTING is_header TYPE thead + it_lines TYPE tlinetab + RAISING lcx_exception. + +ENDCLASS. "lcl_persistence DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_persistence IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_persistence IMPLEMENTATION. + + METHOD save_text. + + CALL FUNCTION 'SAVE_TEXT' + EXPORTING + header = is_header + TABLES + lines = it_lines + EXCEPTIONS + id = 1 + language = 2 + name = 3 + object = 4 + OTHERS = 5. + IF sy-subrc <> 0. + ROLLBACK WORK. "#EC CI_ROLLBACK + lcx_exception=>raise( 'error from SAVE_TEXT' ). + ENDIF. + + ENDMETHOD. "save_text + + METHOD header_online. + rs_header-tdid = 'ST'. + rs_header-tdspras = gc_english. + rs_header-tdname = 'ZABAPGIT'. + rs_header-tdobject = 'TEXT'. + ENDMETHOD. "header + + METHOD header_offline. + rs_header-tdid = 'ST'. + rs_header-tdspras = gc_english. + rs_header-tdname = 'ZABAPGIT_OFFLINE'. + rs_header-tdobject = 'TEXT'. + ENDMETHOD. "header_offline + + METHOD delete. + + DATA: lt_repos TYPE ty_repos_persi_tt. + + + lt_repos = list( ). + + DELETE lt_repos WHERE url = iv_url AND branch_name = iv_branch_name. + IF sy-subrc <> 0. + lcx_exception=>raise( 'repo not found, delete' ). + ENDIF. + + save_text_online( lt_repos ). + save_text_offline( lt_repos ). + + ENDMETHOD. "delete + + METHOD save_text_online. + + DATA: lt_lines TYPE TABLE OF tline. + + FIELD-SYMBOLS: LIKE LINE OF it_repos, + LIKE LINE OF lt_lines. + + + LOOP AT it_repos ASSIGNING WHERE offline = abap_false. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -url. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -branch_name. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -sha1. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -package. + ENDLOOP. + + save_text( is_header = header_online( ) + it_lines = lt_lines ). + + COMMIT WORK. + + ENDMETHOD. "save_text + + METHOD save_text_offline. + + DATA: lt_lines TYPE TABLE OF tline. + + FIELD-SYMBOLS: LIKE LINE OF it_repos, + LIKE LINE OF lt_lines. + + + LOOP AT it_repos ASSIGNING WHERE offline = abap_true. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -url. + APPEND INITIAL LINE TO lt_lines ASSIGNING . + -tdformat = '*'. + -tdline = -package. + ENDLOOP. + + save_text( is_header = header_offline( ) + it_lines = lt_lines ). + + COMMIT WORK. + + ENDMETHOD. "save_text_offline + + METHOD add. + + DATA: lt_repos TYPE ty_repos_persi_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_repos. + + + ASSERT NOT iv_url IS INITIAL. + ASSERT NOT iv_package IS INITIAL. + + lt_repos = list( ). + + READ TABLE lt_repos WITH KEY url = iv_url branch_name = iv_branch_name + TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + lcx_exception=>raise( 'already inserted' ). + ENDIF. + + APPEND INITIAL LINE TO lt_repos ASSIGNING . + -url = iv_url. + -branch_name = iv_branch_name. + -sha1 = iv_branch. + -package = iv_package. + -offline = iv_offline. + + save_text_online( lt_repos ). + save_text_offline( lt_repos ). + + ENDMETHOD. "insert + + METHOD update. + + DATA: lt_repos TYPE ty_repos_persi_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_repos. + + + IF iv_branch IS INITIAL. + lcx_exception=>raise( 'update, sha empty' ). + ENDIF. + + lt_repos = list( ). + + READ TABLE lt_repos ASSIGNING + WITH KEY url = iv_url branch_name = iv_branch_name. + IF sy-subrc <> 0. + lcx_exception=>raise( 'persist update, repo not found' ). + ENDIF. + + -sha1 = iv_branch. + + save_text_online( lt_repos ). + + ENDMETHOD. "update + + METHOD list. + CLEAR rt_repos. + APPEND LINES OF read_text_online( ) TO rt_repos. + APPEND LINES OF read_text_offline( ) TO rt_repos. + ENDMETHOD. "list + + METHOD read_text. + + CALL FUNCTION 'READ_TEXT' + EXPORTING + id = is_header-tdid + language = is_header-tdspras + name = is_header-tdname + object = is_header-tdobject + TABLES + lines = rt_lines + EXCEPTIONS + id = 1 + language = 2 + name = 3 + not_found = 4 + object = 5 + reference_check = 6 + wrong_access_to_archive = 7 + OTHERS = 8. + IF sy-subrc = 4. + RETURN. + ELSEIF sy-subrc <> 0. + lcx_exception=>raise( 'Error from READ_TEXT' ). + ENDIF. + + ENDMETHOD. "read_text + + METHOD read_text_online. + + DATA: lt_lines TYPE TABLE OF tline, + lv_step TYPE i, + ls_repo TYPE ty_repo_persi. + + FIELD-SYMBOLS: LIKE LINE OF lt_lines. + + + lt_lines = read_text( header_online( ) ). + IF lines( lt_lines ) = 0. + RETURN. + ENDIF. + + IF lines( lt_lines ) MOD 4 <> 0. +* if this happens, delete text ZABAPGIT in SO10 or edit the text +* manually, so it contains the right information + lcx_exception=>raise( 'Persistence, text broken' ). + ENDIF. + + CLEAR ls_repo. + LOOP AT lt_lines ASSIGNING . + lv_step = lv_step + 1. + CASE lv_step. + WHEN 4. + ls_repo-package = -tdline. + + IF ls_repo-url IS INITIAL OR ls_repo-branch_name IS INITIAL. + lcx_exception=>raise( 'Persistence, text broken 2' ). + ENDIF. + APPEND ls_repo TO rt_repos. + CLEAR ls_repo. + lv_step = 0. + WHEN 3. + ls_repo-sha1 = -tdline. + WHEN 2. + ls_repo-branch_name = -tdline. + WHEN 1. + ls_repo-url = -tdline. + WHEN OTHERS. + ASSERT 1 = 0. + ENDCASE. + ENDLOOP. + + ENDMETHOD. "list + + METHOD read_text_offline. + + DATA: lt_lines TYPE TABLE OF tline, + ls_repo TYPE ty_repo_persi. + + FIELD-SYMBOLS: LIKE LINE OF lt_lines. + + + lt_lines = read_text( header_offline( ) ). + IF lines( lt_lines ) = 0. + RETURN. + ENDIF. + + IF lines( lt_lines ) MOD 2 <> 0. +* if this happens, delete text ZABAPGIT in SO10 or edit the text +* manually, so it contains the right information + lcx_exception=>raise( 'Persistence, text broken' ). + ENDIF. + + CLEAR ls_repo. + LOOP AT lt_lines ASSIGNING . + IF -tdline IS INITIAL. + lcx_exception=>raise( 'Persistence, text broken' ). + ENDIF. + IF ls_repo-url IS INITIAL. + ls_repo-url = -tdline. + CONTINUE. " current loop + ENDIF. + + ls_repo-package = -tdline. + ls_repo-offline = abap_true. + APPEND ls_repo TO rt_repos. + CLEAR ls_repo. + ENDLOOP. + + ENDMETHOD. "list + +ENDCLASS. "lcl_persistence IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_user DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_user DEFINITION FINAL FRIENDS lcl_persistence_migrate. + +* this class is obsolete, use LCL_PERSISTENCE_USER instead + + PRIVATE SECTION. + TYPES: BEGIN OF ty_user, + user LIKE sy-uname, + username TYPE string, + email TYPE string, + END OF ty_user. + + TYPES: ty_user_tt TYPE STANDARD TABLE OF ty_user WITH DEFAULT KEY. + + CLASS-METHODS set_username + IMPORTING iv_user TYPE xubname DEFAULT sy-uname + iv_username TYPE string + RAISING lcx_exception. + + CLASS-METHODS get_username + IMPORTING iv_user TYPE xubname DEFAULT sy-uname + RETURNING VALUE(rv_username) TYPE string + RAISING lcx_exception. + + CLASS-METHODS set_email + IMPORTING iv_user TYPE xubname DEFAULT sy-uname + iv_email TYPE string + RAISING lcx_exception. + + CLASS-METHODS get_email + IMPORTING iv_user TYPE xubname DEFAULT sy-uname + RETURNING VALUE(rv_email) TYPE string + RAISING lcx_exception. + + CLASS-METHODS list + RETURNING VALUE(rt_data) TYPE ty_user_tt + RAISING lcx_exception. + + CLASS-METHODS read + IMPORTING iv_name TYPE tdobname + RETURNING VALUE(rv_value) TYPE string + RAISING lcx_exception. + + CLASS-METHODS save + IMPORTING iv_name TYPE tdobname + iv_value TYPE string + RAISING lcx_exception. + +ENDCLASS. "lcl_user DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_user IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_user IMPLEMENTATION. + +* this class is obsolete, use LCL_PERSISTENCE_USER instead + + METHOD read. + + DATA: lt_lines TYPE TABLE OF tline, + ls_line LIKE LINE OF lt_lines. + + + CALL FUNCTION 'READ_TEXT' + EXPORTING + id = 'ST' + language = gc_english + name = iv_name + object = 'TEXT' + TABLES + lines = lt_lines + EXCEPTIONS + id = 1 + language = 2 + name = 3 + not_found = 4 + object = 5 + reference_check = 6 + wrong_access_to_archive = 7 + OTHERS = 8. + IF sy-subrc <> 4 AND sy-subrc <> 0. + lcx_exception=>raise( 'error from READ_TEXT' ). + ENDIF. + + READ TABLE lt_lines INTO ls_line INDEX 1. + IF sy-subrc = 0. + rv_value = ls_line-tdline. + ENDIF. + + ENDMETHOD. "get_details + + METHOD save. + + DATA: ls_header TYPE thead, + lt_lines TYPE TABLE OF tline, + ls_line LIKE LINE OF lt_lines. + + + ls_line-tdformat = '*'. + ls_line-tdline = iv_value. + APPEND ls_line TO lt_lines. + + ls_header-tdid = 'ST'. + ls_header-tdspras = gc_english. + ls_header-tdname = iv_name. + ls_header-tdobject = 'TEXT'. + + CALL FUNCTION 'SAVE_TEXT' + EXPORTING + header = ls_header + TABLES + lines = lt_lines + EXCEPTIONS + id = 1 + language = 2 + name = 3 + object = 4 + OTHERS = 5. + IF sy-subrc <> 0. + ROLLBACK WORK. "#EC CI_ROLLBACK + lcx_exception=>raise( 'error from SAVE_TEXT' ). + ENDIF. + + COMMIT WORK. + + ENDMETHOD. "change + + METHOD set_username. + + DATA: lv_name TYPE tdobname. + + + CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name. + + save( iv_name = lv_name + iv_value = iv_username ). + + ENDMETHOD. "set_username + + METHOD get_username. + + DATA: lv_name TYPE tdobname. + + + CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name. + + rv_username = read( lv_name ). + + ENDMETHOD. "get_username + + METHOD set_email. + + DATA: lv_name TYPE tdobname. + + + CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name. + + save( iv_name = lv_name + iv_value = iv_email ). + + ENDMETHOD. "set_email + + METHOD list. + + DATA: lt_stxh TYPE STANDARD TABLE OF stxh WITH DEFAULT KEY. + + FIELD-SYMBOLS: LIKE LINE OF rt_data, + LIKE LINE OF lt_stxh. + + + SELECT * FROM stxh INTO TABLE lt_stxh + WHERE tdobject = 'TEXT' + AND tdname LIKE 'ZABAPGIT_USERNAME_%'. + + LOOP AT lt_stxh ASSIGNING . + APPEND INITIAL LINE TO rt_data ASSIGNING . + + -user = -tdname+18. + -username = get_username( -user ). + -email = get_email( -user ). + ENDLOOP. + + ENDMETHOD. + + METHOD get_email. + + DATA: lv_name TYPE tdobname. + + + CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name. + + rv_email = read( lv_name ). + + ENDMETHOD. "get_email + +ENDCLASS. "lcl_user IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_persistence_old.prog.xml b/src/zabapgit_persistence_old.prog.xml new file mode 100644 index 000000000..5204f19c3 --- /dev/null +++ b/src/zabapgit_persistence_old.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_PERSISTENCE_OLD + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_PERSISTENCE_OLD + 32 + + + + + + diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index 79c66ece0..d0c316c88 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -5,8 +5,6 @@ *----------------------------------------------------------------------* * CLASS lcl_repo DEFINITION *----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* CLASS lcl_repo DEFINITION ABSTRACT. PUBLIC SECTION. @@ -86,7 +84,8 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. get_head_branch_name RETURNING VALUE(rv_name) TYPE lcl_persistence_repo=>ty_repo-head_branch, get_branches - RETURNING VALUE(ro_branches) TYPE REF TO lcl_git_branch_list, + RETURNING VALUE(ro_branches) TYPE REF TO lcl_git_branch_list + RAISING lcx_exception, set_url IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url RAISING lcx_exception, @@ -133,8 +132,6 @@ ENDCLASS. "lcl_repo_online DEFINITION *----------------------------------------------------------------------* * CLASS lcl_repo_offline DEFINITION *----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* CLASS lcl_repo_offline DEFINITION INHERITING FROM lcl_repo FINAL. PUBLIC SECTION. diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index 7c6496d9b..5ad37171b 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -958,4 +958,84 @@ CLASS lcl_progress IMPLEMENTATION. ENDMETHOD. +ENDCLASS. + +CLASS lcl_log DEFINITION FINAL. + + PUBLIC SECTION. + METHODS: + add + IMPORTING + iv_msgv1 TYPE csequence + iv_msgv2 TYPE csequence OPTIONAL + iv_msgv3 TYPE csequence OPTIONAL + iv_msgv4 TYPE csequence OPTIONAL, + count + RETURNING VALUE(rv_count) TYPE i, + to_html + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + show. + + PRIVATE SECTION. + DATA: mt_log TYPE rs_t_msg. + +ENDCLASS. + +CLASS lcl_log IMPLEMENTATION. + + METHOD to_html. + + DATA: lv_string TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF mt_log. + + CREATE OBJECT ro_html. + + IF count( ) = 0. + RETURN. + ENDIF. + + ro_html->add( '
' ). + LOOP AT mt_log ASSIGNING . + CONCATENATE -msgv1 + -msgv2 + -msgv3 + -msgv4 INTO lv_string SEPARATED BY space. + ro_html->add( lv_string ). + ro_html->add( '
' ). + ENDLOOP. + ro_html->add( '
' ). + + ENDMETHOD. + + METHOD add. + + FIELD-SYMBOLS: LIKE LINE OF mt_log. + + APPEND INITIAL LINE TO mt_log ASSIGNING . + -msgty = 'W'. + -msgid = '00'. + -msgno = '001'. + -msgv1 = iv_msgv1. + -msgv2 = iv_msgv2. + -msgv3 = iv_msgv3. + -msgv4 = iv_msgv4. + + ENDMETHOD. + + METHOD show. + CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP' + EXPORTING + i_t_msg = mt_log + i_txt = 'Warning' + i_with_s_on_empty = abap_false + i_one_msg_direct = abap_false + i_one_msg_type_s = abap_false + ##no_text. + ENDMETHOD. + + METHOD count. + rv_count = lines( mt_log ). + ENDMETHOD. + ENDCLASS. \ No newline at end of file From 907743b7ad1a8e56b27addab50eae8465bc1ac25 Mon Sep 17 00:00:00 2001 From: atsy Date: Thu, 8 Sep 2016 15:04:44 +0300 Subject: [PATCH 3/4] #329, import fix from d4d8b3 (bg mode fix dump) --- src/zabapgit_objects_impl.prog.abap | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index 4d7a57065..ef832ec33 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -291,10 +291,14 @@ CLASS lcl_objects IMPLEMENTATION. DATA: li_obj TYPE REF TO lif_object. - li_obj = create_object( is_item = is_item - iv_language = gc_english ). - - rv_user = li_obj->changed_by( ). + IF is_item IS INITIAL. +* eg. ".abapgit.xml" file + rv_user = lcl_objects_super=>c_user_unknown. + ELSE. + li_obj = create_object( is_item = is_item + iv_language = gc_english ). + rv_user = li_obj->changed_by( ). + ENDIF. ASSERT NOT rv_user IS INITIAL. From d18ca4a02c3446ea1dfeb91bda9395a55effec1b Mon Sep 17 00:00:00 2001 From: sbcgua Date: Thu, 8 Sep 2016 15:16:51 +0300 Subject: [PATCH 4/4] #329 some strange diff --- src/zabapgit_objects_impl.prog.abap | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index ef832ec33..31821f0be 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -291,14 +291,14 @@ CLASS lcl_objects IMPLEMENTATION. DATA: li_obj TYPE REF TO lif_object. - IF is_item IS INITIAL. -* eg. ".abapgit.xml" file - rv_user = lcl_objects_super=>c_user_unknown. - ELSE. - li_obj = create_object( is_item = is_item - iv_language = gc_english ). - rv_user = li_obj->changed_by( ). - ENDIF. + IF is_item IS INITIAL. +* eg. ".abapgit.xml" file + rv_user = lcl_objects_super=>c_user_unknown. + ELSE. + li_obj = create_object( is_item = is_item + iv_language = gc_english ). + rv_user = li_obj->changed_by( ). + ENDIF. ASSERT NOT rv_user IS INITIAL.