diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap
index f74915c1a..4f74cad64 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( '@LOCAL | ' ). "#EC NOTEXT
- ro_html->add( ' | ' ). "#EC NOTEXT
- ro_html->add( '@REMOTE | ' ). "#EC NOTEXT
- ro_html->add( '
' ). "#EC NOTEXT
- ro_html->add( render_lines( ) ).
- ro_html->add( '
' ). "#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.prog.abap b/src/zabapgit_object.prog.abap
deleted file mode 100644
index afca7e156..000000000
--- a/src/zabapgit_object.prog.abap
+++ /dev/null
@@ -1,2401 +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.
-
-
- 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.
-
-* 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 =