Merge pull request #331 from sbcgua/master

Re-org includes
This commit is contained in:
Lars Hvam 2016-09-09 18:31:14 +02:00 committed by GitHub
commit 33ce832d5f
31 changed files with 4793 additions and 4271 deletions

View File

@ -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( ).

View File

@ -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
*----------------------------------------------------------------------*

View File

@ -2,7 +2,6 @@
*& Include ZABAPGIT_FORMS
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form run
*&---------------------------------------------------------------------*

View File

@ -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( '<div class="diff_head">' ). "#EC NOTEXT
lo_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
lo_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
lo_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
lo_html->add( '<span class="diff_name">' ). "#EC NOTEXT
lo_html->add( |{ mv_filename }| ).
lo_html->add( '</span>' ). "#EC NOTEXT
lo_html->add( '</div>' ). "#EC NOTEXT
ro_html = lo_html.
ENDMETHOD.
METHOD render_diff.
CREATE OBJECT ro_html.
ro_html->add( '<div class="diff">' ). "#EC NOTEXT
ro_html->add( render_head( ) ).
" Content
ro_html->add( '<div class="diff_content">' ). "#EC NOTEXT
ro_html->add( '<table width="100%" class="diff_tab">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>@LOCAL</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>@REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( render_lines( ) ).
ro_html->add( '</table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#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 <ls_diff> LIKE LINE OF lt_diffs.
CREATE OBJECT ro_html.
lt_diffs = mo_diff->get( ).
LOOP AT lt_diffs ASSIGNING <ls_diff>.
IF <ls_diff>-short = abap_false.
lv_insert_nav = abap_true.
CONTINUE.
ENDIF.
IF lv_insert_nav = abap_true. " Insert separator line with navigation
IF <ls_diff>-beacon > 0.
READ TABLE mo_diff->mt_beacons INTO lv_beacon INDEX <ls_diff>-beacon.
ELSE.
lv_beacon = '---'.
ENDIF.
ro_html->add( '<tr class="diff_nav_line">').
ro_html->add( '<td class="num"></td>' ).
ro_html->add( |<td colspan="3">@@ { <ls_diff>-local_line } @@ { lv_beacon }</td>| ).
ro_html->add( '</tr>' ).
lv_insert_nav = abap_false.
ENDIF.
lv_local = escape( val = <ls_diff>-local format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = <ls_diff>-remote format = cl_abap_format=>e_html_attr ).
CLEAR: lv_attr_local, lv_attr_remote. " Class for changed lines
CASE <ls_diff>-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( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-local_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_attr_local }><code>{ lv_local }</code></td>| ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-remote_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_attr_remote }><code>{ lv_remote }</code></td>| ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#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: <ls_remote> LIKE LINE OF lt_remote,
<ls_local> 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 <ls_remote>
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 <ls_local>
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 = <ls_local>-file
is_remote = <ls_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: <ls_field> 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 <ls_field> WITH KEY name = 'type' ##NO_TEXT.
ASSERT sy-subrc = 0.
ls_content-type = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'value' ##NO_TEXT.
ASSERT sy-subrc = 0.
ls_content-value = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'xmldata' ##NO_TEXT.
ASSERT sy-subrc = 0.
IF <ls_field>-value(1) <> '<'.
ls_content-data_str = <ls_field>-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
ENDCLASS. "lcl_gui IMPLEMENTATION

View File

@ -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.

View File

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

View File

@ -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: <ls_remote> LIKE LINE OF lt_remote,
<ls_local> 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 <ls_remote>
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 <ls_local>
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 = <ls_local>-file
is_remote = <ls_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: <ls_field> 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 <ls_field> WITH KEY name = 'type' ##NO_TEXT.
ASSERT sy-subrc = 0.
ls_content-type = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'value' ##NO_TEXT.
ASSERT sy-subrc = 0.
ls_content-value = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'xmldata' ##NO_TEXT.
ASSERT sy-subrc = 0.
IF <ls_field>-value(1) <> '<'.
ls_content-data_str = <ls_field>-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

View File

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

View File

@ -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: <ls_field> 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 <ls_field> WITH KEY name = 'TYPE'.
IF sy-subrc = 0.
ev_obj_type = <ls_field>-value.
ELSE.
CLEAR ev_obj_type.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'NAME'.
IF sy-subrc = 0.
ev_obj_name = <ls_field>-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 <lv_field> 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 <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
ls_field-value = <lv_field>.
APPEND ls_field TO lt_fields.
ls_field-name = 'FILENAME'.
ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
ls_field-value = <lv_field>.
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: <ls_field> LIKE LINE OF lt_fields,
<lv_field> 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 <ls_field> WITH KEY name = 'KEY'.
IF sy-subrc = 0.
ev_key = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'PATH'.
IF sy-subrc = 0.
ASSIGN COMPONENT 'PATH' OF STRUCTURE eg_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
<lv_field> = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'FILENAME'.
IF sy-subrc = 0.
ASSIGN COMPONENT 'FILENAME' OF STRUCTURE eg_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
<lv_field> = <ls_field>-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: <ls_field> 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 <ls_field> WITH KEY name = 'TYPE'.
IF sy-subrc = 0.
rs_key-type = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'VALUE'.
IF sy-subrc = 0.
rs_key-value = <ls_field>-value.
ENDIF.
ENDMETHOD. "dbkey_decode
METHOD parse_commit_request.
CONSTANTS: lc_replace TYPE string VALUE '<<new>>'.
DATA: lv_string TYPE string,
lt_fields TYPE tihttpnvp.
FIELD-SYMBOLS: <ls_field> 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 <ls_field> WITH KEY name = 'key' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-repo_key = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'username' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-username = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'email' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-email = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'comment' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-comment = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'body' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-body = <ls_field>-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: <ls_log> LIKE LINE OF mt_log.
CREATE OBJECT ro_html.
IF count( ) = 0.
RETURN.
ENDIF.
ro_html->add( '<br>' ).
LOOP AT mt_log ASSIGNING <ls_log>.
CONCATENATE <ls_log>-msgv1
<ls_log>-msgv2
<ls_log>-msgv3
<ls_log>-msgv4 INTO lv_string SEPARATED BY space.
ro_html->add( lv_string ).
ro_html->add( '<br>' ).
ENDLOOP.
ro_html->add( '<br>' ).
ENDMETHOD.
METHOD add.
FIELD-SYMBOLS: <ls_log> LIKE LINE OF mt_log.
APPEND INITIAL LINE TO mt_log ASSIGNING <ls_log>.
<ls_log>-msgty = 'W'.
<ls_log>-msgid = '00'.
<ls_log>-msgno = '001'.
<ls_log>-msgv1 = iv_msgv1.
<ls_log>-msgv2 = iv_msgv2.
<ls_log>-msgv3 = iv_msgv3.
<ls_log>-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.
ENDCLASS. "lcl_html_toolbar IMPLEMENTATION

View File

@ -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: <ls_field> 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 <ls_field> WITH KEY name = 'TYPE'.
IF sy-subrc = 0.
ev_obj_type = <ls_field>-value.
ELSE.
CLEAR ev_obj_type.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'NAME'.
IF sy-subrc = 0.
ev_obj_name = <ls_field>-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 <lv_field> 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 <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
ls_field-value = <lv_field>.
APPEND ls_field TO lt_fields.
ls_field-name = 'FILENAME'.
ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
ls_field-value = <lv_field>.
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: <ls_field> LIKE LINE OF lt_fields,
<lv_field> 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 <ls_field> WITH KEY name = 'KEY'.
IF sy-subrc = 0.
ev_key = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'PATH'.
IF sy-subrc = 0.
ASSIGN COMPONENT 'PATH' OF STRUCTURE eg_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
<lv_field> = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'FILENAME'.
IF sy-subrc = 0.
ASSIGN COMPONENT 'FILENAME' OF STRUCTURE eg_file TO <lv_field>.
ASSERT <lv_field> IS ASSIGNED.
<lv_field> = <ls_field>-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: <ls_field> 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 <ls_field> WITH KEY name = 'TYPE'.
IF sy-subrc = 0.
rs_key-type = <ls_field>-value.
ENDIF.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'VALUE'.
IF sy-subrc = 0.
rs_key-value = <ls_field>-value.
ENDIF.
ENDMETHOD. "dbkey_decode
METHOD parse_commit_request.
CONSTANTS: lc_replace TYPE string VALUE '<<new>>'.
DATA: lv_string TYPE string,
lt_fields TYPE tihttpnvp.
FIELD-SYMBOLS: <ls_field> 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 <ls_field> WITH KEY name = 'key' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-repo_key = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'username' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-username = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'email' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-email = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'comment' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-comment = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'body' ##NO_TEXT.
ASSERT sy-subrc = 0.
rs_fields-body = <ls_field>-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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,946 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_CLAS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_object_clas DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: BEGIN OF ty_sotr,
header TYPE sotr_head,
entries TYPE sotr_text_tt,
END OF ty_sotr.
TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY.
DATA mv_skip_testclass TYPE abap_bool.
METHODS deserialize_abap
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
METHODS deserialize_textpool
IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception.
METHODS deserialize_docu
IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception.
METHODS deserialize_sotr
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
METHODS serialize_abap_old
IMPORTING is_clskey TYPE seoclskey
RETURNING VALUE(rt_source) TYPE ty_string_tt
RAISING lcx_exception.
METHODS deserialize_abap_source_old
IMPORTING is_clskey TYPE seoclskey
it_source TYPE ty_string_tt
RAISING lcx_exception.
METHODS deserialize_abap_source_new
IMPORTING is_clskey TYPE seoclskey
it_source TYPE ty_string_tt
RAISING lcx_exception
cx_sy_dyn_call_error.
METHODS serialize_abap_new
IMPORTING is_clskey TYPE seoclskey
RETURNING VALUE(rt_source) TYPE ty_string_tt
RAISING lcx_exception
cx_sy_dyn_call_error.
METHODS serialize_locals_imp
IMPORTING is_clskey TYPE seoclskey
RETURNING VALUE(rt_source) TYPE ty_string_tt
RAISING lcx_exception.
METHODS serialize_locals_def
IMPORTING is_clskey TYPE seoclskey
RETURNING VALUE(rt_source) TYPE ty_string_tt
RAISING lcx_exception.
METHODS read_include
IMPORTING is_clskey TYPE seoclskey
iv_type TYPE seop_include_ext_app
RETURNING VALUE(rt_source) TYPE seop_source_string.
METHODS serialize_testclasses
IMPORTING is_clskey TYPE seoclskey
RETURNING VALUE(rt_source) TYPE ty_string_tt
RAISING lcx_exception.
METHODS serialize_macros
IMPORTING is_clskey TYPE seoclskey
RETURNING VALUE(rt_source) TYPE ty_string_tt
RAISING lcx_exception.
METHODS serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception.
METHODS read_sotr
RETURNING VALUE(rt_sotr) TYPE ty_sotr_tt
RAISING lcx_exception.
METHODS remove_signatures
CHANGING ct_source TYPE ty_string_tt.
METHODS reduce
CHANGING ct_source TYPE ty_string_tt.
ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_intf DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL.
* todo, CLAS + INTF to be refactored, see:
* https://github.com/larshp/abapGit/issues/21
ENDCLASS. "lcl_object_intf DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_clas IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_clas IMPLEMENTATION.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~changed_by.
* todo, not sure this is correct, to be tested
SELECT SINGLE changedby FROM seoclassdf INTO rv_user
WHERE clsname = ms_item-obj_name
AND version = '1'. "#EC CI_GENBUFF
IF sy-subrc = 0 AND rv_user IS INITIAL.
SELECT SINGLE author FROM seoclassdf INTO rv_user
WHERE clsname = ms_item-obj_name
AND version = '1'. "#EC CI_GENBUFF
ENDIF.
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD.
METHOD lif_object~exists.
DATA: ls_clskey TYPE seoclskey.
ls_clskey-clsname = ms_item-obj_name.
CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK'
EXPORTING
clskey = ls_clskey
EXCEPTIONS
not_specified = 1
not_existing = 2
is_interface = 3
no_text = 4
inconsistent = 5
OTHERS = 6.
rv_bool = boolc( sy-subrc <> 2 ).
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = 'CLAS'
in_new_window = abap_true.
ENDMETHOD. "jump
METHOD lif_object~delete.
DATA: ls_clskey TYPE seoclskey.
ls_clskey-clsname = ms_item-obj_name.
CASE ms_item-obj_type.
WHEN 'CLAS'.
CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE'
EXPORTING
clskey = ls_clskey
EXCEPTIONS
not_existing = 1
is_interface = 2
db_error = 3
no_access = 4
other = 5
OTHERS = 6.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ).
ENDIF.
WHEN 'INTF'.
CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE'
EXPORTING
intkey = ls_clskey
EXCEPTIONS
not_existing = 1
is_class = 2
db_error = 3
no_access = 4
other = 5
OTHERS = 6.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from SEO_INTERFACE_DELETE_COMPLETE' ).
ENDIF.
WHEN OTHERS.
lcx_exception=>raise( 'class delete, unknown type' ).
ENDCASE.
ENDMETHOD. "delete
METHOD reduce.
DATA: lv_source LIKE LINE OF ct_source,
lv_found TYPE sap_bool.
* skip files that only contain the standard comments
lv_found = abap_false.
LOOP AT ct_source INTO lv_source.
IF strlen( lv_source ) >= 3 AND lv_source(3) <> '*"*'.
lv_found = abap_true.
ENDIF.
ENDLOOP.
IF lv_found = abap_false.
CLEAR ct_source[].
ENDIF.
ENDMETHOD. "reduce
METHOD serialize_locals_imp.
rt_source = read_include( is_clskey = is_clskey
iv_type = seop_ext_class_locals_imp ).
reduce( CHANGING ct_source = rt_source ).
ENDMETHOD. "serialize_local
METHOD serialize_locals_def.
rt_source = read_include( is_clskey = is_clskey
iv_type = seop_ext_class_locals_def ).
reduce( CHANGING ct_source = rt_source ).
ENDMETHOD. "serialize_locals_def
METHOD read_include.
DATA: ls_include TYPE progstruc.
ASSERT iv_type = seop_ext_class_locals_def
OR iv_type = seop_ext_class_locals_imp
OR iv_type = seop_ext_class_macros
OR iv_type = seop_ext_class_testclasses.
ls_include-rootname = is_clskey-clsname.
TRANSLATE ls_include-rootname USING ' ='.
ls_include-categorya = iv_type(1).
ls_include-codea = iv_type+1(4).
* it looks like there is an issue in function module SEO_CLASS_GET_INCLUDE_SOURCE
* on 750 kernels, where the READ REPORT without STATE addition does not
* return the active version, this method is a workaround for this issue
READ REPORT ls_include INTO rt_source STATE 'A'.
ENDMETHOD.
METHOD serialize_testclasses.
DATA: lv_line1 LIKE LINE OF rt_source,
lv_line2 LIKE LINE OF rt_source.
rt_source = read_include( is_clskey = is_clskey
iv_type = seop_ext_class_testclasses ).
* when creating classes in Eclipse it automatically generates the
* testclass include, but it is not needed, so skip to avoid
* creating an extra file in the repository.
* Also remove it if the content is manually removed, but
* the class still thinks it contains tests
mv_skip_testclass = abap_false.
IF lines( rt_source ) = 2.
READ TABLE rt_source INDEX 1 INTO lv_line1.
ASSERT sy-subrc = 0.
READ TABLE rt_source INDEX 2 INTO lv_line2.
ASSERT sy-subrc = 0.
IF lv_line1(3) = '*"*' AND lv_line2 IS INITIAL.
mv_skip_testclass = abap_true.
ENDIF.
ELSEIF lines( rt_source ) = 1.
READ TABLE rt_source INDEX 1 INTO lv_line1.
ASSERT sy-subrc = 0.
IF lv_line1(3) = '*"*' OR lv_line1 IS INITIAL.
mv_skip_testclass = abap_true.
ENDIF.
ELSEIF lines( rt_source ) = 0.
mv_skip_testclass = abap_true.
ENDIF.
ENDMETHOD. "serialize_test
METHOD serialize_macros.
rt_source = read_include( is_clskey = is_clskey
iv_type = seop_ext_class_macros ).
reduce( CHANGING ct_source = rt_source ).
ENDMETHOD. "serialize_macro
METHOD serialize_abap_old.
* for old ABAP AS versions
DATA: lo_source TYPE REF TO cl_oo_source.
CREATE OBJECT lo_source
EXPORTING
clskey = is_clskey
EXCEPTIONS
class_not_existing = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from CL_OO_SOURCE' ).
ENDIF.
lo_source->read( 'A' ).
rt_source = lo_source->get_old_source( ).
remove_signatures( CHANGING ct_source = rt_source ).
ENDMETHOD. "serialize_abap
METHOD serialize_abap_new.
DATA: lo_source TYPE REF TO object,
lo_instance TYPE REF TO object.
* do not call the class/methods statically, as it will
* give syntax errors on old versions
CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE')
RECEIVING
result = lo_instance.
CALL METHOD lo_instance->('CREATE_CLIF_SOURCE')
EXPORTING
clif_name = is_clskey-clsname
version = 'A'
RECEIVING
result = lo_source.
CALL METHOD lo_source->('GET_SOURCE')
IMPORTING
source = rt_source.
ENDMETHOD.
METHOD remove_signatures.
* signatures messes up in CL_OO_SOURCE when deserializing and serializing
* within same session
DATA: lv_begin TYPE string,
lv_end TYPE string,
lv_remove TYPE sap_bool,
lv_source LIKE LINE OF ct_source.
CONCATENATE '* <SIGNATURE>------------------------------------'
'---------------------------------------------------+'
INTO lv_begin.
CONCATENATE '* +------------------------------------------------'
'--------------------------------------</SIGNATURE>'
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: <ls_sotr> LIKE LINE OF rt_sotr,
<ls_seocompodf> LIKE LINE OF lt_seocompodf,
<ls_entry> 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 <ls_seocompodf>.
lv_concept = translate( val = <ls_seocompodf>-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 <ls_entry>.
CLEAR: <ls_entry>-crea_name,
<ls_entry>-crea_tstut,
<ls_entry>-chan_name,
<ls_entry>-chan_tstut.
ENDLOOP.
APPEND INITIAL LINE TO rt_sotr ASSIGNING <ls_sotr>.
<ls_sotr>-header = ls_header.
<ls_sotr>-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: <ls_sotr> 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 <ls_sotr>.
CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS'
EXPORTING
object_vector = <ls_sotr>-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 = <ls_sotr>-header-crea_lan
alias_name = <ls_sotr>-header-alias_name
object = lv_object
entries = <ls_sotr>-entries
concept_default = <ls_sotr>-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

View File

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

View File

@ -0,0 +1,632 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_FUGR
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_object_fugr DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY.
TYPES: BEGIN OF ty_function,
funcname TYPE rs38l_fnam,
include TYPE progname,
global_flag TYPE rs38l-global,
remote_call TYPE rs38l-remote,
update_task TYPE rs38l-utask,
short_text TYPE tftit-stext,
remote_basxml TYPE rs38l-basxml_enabled,
import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY,
changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY,
export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY,
tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY,
exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY,
documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY,
END OF ty_function.
TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY.
METHODS main_name
RETURNING VALUE(rv_program) TYPE program
RAISING lcx_exception.
METHODS functions
RETURNING VALUE(rt_functab) TYPE ty_rs38l_incl_tt
RAISING lcx_exception.
METHODS includes
RETURNING VALUE(rt_includes) TYPE rso_t_objnm
RAISING lcx_exception.
METHODS serialize_functions
RETURNING VALUE(rt_functions) TYPE ty_function_tt
RAISING lcx_exception.
METHODS deserialize_functions
IMPORTING it_functions TYPE ty_function_tt
RAISING lcx_exception.
METHODS serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception.
METHODS deserialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
METHODS serialize_includes
RAISING lcx_exception.
METHODS deserialize_includes
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
* METHODS deserialize_dynpros
* IMPORTING it_dynpros TYPE ty_dynpro_tt
* RAISING lcx_exception.
*
* METHODS deserialize_cua
* IMPORTING is_cua TYPE ty_cua
* RAISING lcx_exception.
ENDCLASS. "lcl_object_fugr DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_dtel IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_fugr IMPLEMENTATION.
* function group SEUF
* function group SIFP
* function group SUNI
METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists.
DATA: lv_pool TYPE tlibg-area.
lv_pool = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_EXISTS'
EXPORTING
function_pool = lv_pool
EXCEPTIONS
pool_not_exists = 1.
rv_bool = boolc( sy-subrc <> 1 ).
ENDMETHOD. "lif_object~exists
METHOD deserialize_functions.
DATA: lv_include TYPE rs38l-include,
lv_area TYPE rs38l-area,
lt_source TYPE TABLE OF abaptxt255.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF it_functions.
LOOP AT it_functions ASSIGNING <ls_func>.
lt_source = mo_files->read_abap( iv_extra = <ls_func>-funcname ).
lv_area = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = <ls_func>-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 = <ls_func>-funcname
suppress_success_message = abap_true
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from FUNCTION_DELETE' ).
ENDIF.
ENDIF.
CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT'
EXPORTING
funcname = <ls_func>-funcname
function_pool = lv_area
interface_global = <ls_func>-global_flag
remote_call = <ls_func>-remote_call
short_text = <ls_func>-short_text
* NAMESPACE = ' ' todo
remote_basxml_supported = <ls_func>-remote_basxml
IMPORTING
function_include = lv_include
TABLES
import_parameter = <ls_func>-import
export_parameter = <ls_func>-export
tables_parameter = <ls_func>-tables
changing_parameter = <ls_func>-changing
exception_list = <ls_func>-exception
parameter_docu = <ls_func>-documentation
EXCEPTIONS
double_task = 1
error_message = 2
function_already_exists = 3
invalid_function_pool = 4
invalid_name = 5
too_many_functions = 6
no_modify_permission = 7
no_show_permission = 8
enqueue_system_failure = 9
canceled_in_corr = 10
OTHERS = 11.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_FUNCTIONMODULE_INSERT' ).
ENDIF.
INSERT REPORT lv_include FROM lt_source.
* lcl_objects_activation=>add( iv_type = 'FUNC'
* iv_name = <ls_func>-funcname ).
ENDLOOP.
ENDMETHOD. "deserialize_functions
METHOD deserialize_includes.
DATA: lo_xml TYPE REF TO lcl_xml_input,
ls_progdir TYPE ty_progdir,
lt_includes TYPE rso_t_objnm,
lt_tpool TYPE textpool_table,
lt_tpool_ext TYPE ty_tpool_tt,
lt_source TYPE TABLE OF abaptxt255.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF lt_includes.
io_xml->read( EXPORTING iv_name = 'INCLUDES'
CHANGING cg_data = lt_includes ).
LOOP AT lt_includes ASSIGNING <lv_include>.
lt_source = mo_files->read_abap( iv_extra = <lv_include> ).
lo_xml = mo_files->read_xml( <lv_include> ).
lo_xml->read( EXPORTING iv_name = 'PROGDIR'
CHANGING cg_data = ls_progdir ).
lo_xml->read( EXPORTING iv_name = 'TPOOL'
CHANGING cg_data = lt_tpool_ext ).
lt_tpool = read_tpool( lt_tpool_ext ).
deserialize_program( is_progdir = ls_progdir
it_source = lt_source
it_tpool = lt_tpool
iv_package = iv_package ).
ENDLOOP.
ENDMETHOD. "deserialize_includes
METHOD deserialize_xml.
DATA: lv_complete TYPE rs38l-area,
lv_namespace TYPE rs38l-namespace,
lv_areat TYPE tlibt-areat,
lv_stext TYPE tftit-stext,
lv_group TYPE rs38l-area.
lv_complete = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
complete_area = lv_complete
IMPORTING
namespace = lv_namespace
group = lv_group
EXCEPTIONS
include_not_exists = 1
group_not_exists = 2
no_selections = 3
no_function_include = 4
no_function_pool = 5
delimiter_wrong_position = 6
no_customer_function_group = 7
no_customer_function_include = 8
reserved_name_customer = 9
namespace_too_long = 10
area_length_error = 11
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ).
ENDIF.
io_xml->read( EXPORTING iv_name = 'AREAT'
CHANGING cg_data = lv_areat ).
lv_stext = lv_areat.
CALL FUNCTION 'RS_FUNCTION_POOL_INSERT'
EXPORTING
function_pool = lv_group
short_text = lv_stext
namespace = lv_namespace
devclass = iv_package
EXCEPTIONS
name_already_exists = 1
name_not_correct = 2
function_already_exists = 3
invalid_function_pool = 4
invalid_name = 5
too_many_functions = 6
no_modify_permission = 7
no_show_permission = 8
enqueue_system_failure = 9
canceled_in_corr = 10
undefined_error = 11
OTHERS = 12.
IF sy-subrc <> 0 AND sy-subrc <> 1 AND sy-subrc <> 3.
* todo, change description
lcx_exception=>raise( 'error from RS_FUNCTION_POOL_INSERT' ).
ENDIF.
ENDMETHOD. "deserialize_xml
METHOD serialize_xml.
DATA: lt_functab TYPE ty_rs38l_incl_tt,
lt_includes TYPE rso_t_objnm,
lv_areat TYPE tlibt-areat.
SELECT SINGLE areat INTO lv_areat
FROM tlibt
WHERE spras = mv_language
AND area = ms_item-obj_name. "#EC CI_GENBUFF
IF sy-subrc <> 0.
lcx_exception=>raise( 'not found in TLIBT' ).
ENDIF.
lt_functab = functions( ).
lt_includes = includes( ).
* todo, dynpros
io_xml->add( iv_name = 'AREAT'
ig_data = lv_areat ).
io_xml->add( iv_name = 'INCLUDES'
ig_data = lt_includes ).
ENDMETHOD. "serialize_xml
METHOD includes.
DATA: lv_program TYPE program,
lv_cnam TYPE reposrc-cnam,
lv_tabix LIKE sy-tabix,
lt_functab TYPE ty_rs38l_incl_tt.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF rt_includes,
<ls_func> LIKE LINE OF lt_functab.
lv_program = main_name( ).
lt_functab = functions( ).
CALL FUNCTION 'RS_GET_ALL_INCLUDES'
EXPORTING
program = lv_program
* WITH_RESERVED_INCLUDES =
* WITH_CLASS_INCLUDES = ' ' hmm, todo
TABLES
includetab = rt_includes
EXCEPTIONS
not_existent = 1
no_program = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RS_GET_ALL_INCLUDES' ).
ENDIF.
LOOP AT lt_functab ASSIGNING <ls_func>.
DELETE TABLE rt_includes FROM <ls_func>-include.
ENDLOOP.
LOOP AT rt_includes ASSIGNING <lv_include>.
lv_tabix = sy-tabix.
* skip SAP standard includes
SELECT SINGLE cnam FROM reposrc INTO lv_cnam
WHERE progname = <lv_include>
AND r3state = 'A'
AND cnam = 'SAP'.
IF sy-subrc = 0.
DELETE rt_includes INDEX lv_tabix.
CONTINUE.
ENDIF.
* also make sure the include exists
SELECT SINGLE cnam FROM reposrc INTO lv_cnam
WHERE progname = <lv_include>
AND r3state = 'A'.
IF sy-subrc <> 0.
DELETE rt_includes INDEX lv_tabix.
ENDIF.
ENDLOOP.
APPEND lv_program TO rt_includes.
ENDMETHOD. "includes
METHOD functions.
DATA: lv_area TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_CONTENTS'
EXPORTING
function_pool = lv_area
TABLES
functab = rt_functab
EXCEPTIONS
function_pool_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ).
ENDIF.
ENDMETHOD. "functions
METHOD main_name.
DATA: lv_area TYPE rs38l-area,
lv_namespace TYPE rs38l-namespace,
lv_group TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
complete_area = lv_area
IMPORTING
namespace = lv_namespace
group = lv_group
EXCEPTIONS
include_not_exists = 1
group_not_exists = 2
no_selections = 3
no_function_include = 4
no_function_pool = 5
delimiter_wrong_position = 6
no_customer_function_group = 7
no_customer_function_include = 8
reserved_name_customer = 9
namespace_too_long = 10
area_length_error = 11
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from FUNCTION_INCLUDE_SPLIT' ).
ENDIF.
CONCATENATE lv_namespace 'SAPL' lv_group INTO rv_program.
ENDMETHOD. "main_name
METHOD serialize_functions.
DATA:
lt_source TYPE TABLE OF rssource,
lt_functab TYPE ty_rs38l_incl_tt,
lt_new_source TYPE rsfb_source.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF lt_functab,
<ls_ret> LIKE LINE OF rt_functions.
lt_functab = functions( ).
LOOP AT lt_functab ASSIGNING <ls_func>.
* fm RPY_FUNCTIONMODULE_READ does not support source code
* lines longer than 72 characters
APPEND INITIAL LINE TO rt_functions ASSIGNING <ls_ret>.
MOVE-CORRESPONDING <ls_func> TO <ls_ret>.
CALL FUNCTION 'RPY_FUNCTIONMODULE_READ_NEW'
EXPORTING
functionname = <ls_func>-funcname
IMPORTING
global_flag = <ls_ret>-global_flag
remote_call = <ls_ret>-remote_call
update_task = <ls_ret>-update_task
short_text = <ls_ret>-short_text
remote_basxml_supported = <ls_ret>-remote_basxml
TABLES
import_parameter = <ls_ret>-import
changing_parameter = <ls_ret>-changing
export_parameter = <ls_ret>-export
tables_parameter = <ls_ret>-tables
exception_list = <ls_ret>-exception
documentation = <ls_ret>-documentation
source = lt_source
CHANGING
new_source = lt_new_source
EXCEPTIONS
error_message = 1
function_not_found = 2
invalid_name = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ).
ENDIF.
IF NOT lt_new_source IS INITIAL.
mo_files->add_abap( iv_extra = <ls_func>-funcname
it_abap = lt_new_source ).
ELSE.
mo_files->add_abap( iv_extra = <ls_func>-funcname
it_abap = lt_source ).
ENDIF.
ENDLOOP.
ENDMETHOD. "serialize_functions
METHOD serialize_includes.
DATA: lt_includes TYPE rso_t_objnm.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF lt_includes.
lt_includes = includes( ).
LOOP AT lt_includes ASSIGNING <lv_include>.
* todo, filename is not correct, a include can be used in several programs
serialize_program( is_item = ms_item
io_files = mo_files
iv_program = <lv_include>
iv_extra = <lv_include> ).
ENDLOOP.
ENDMETHOD. "serialize_includes
METHOD lif_object~serialize.
DATA: lt_functions TYPE ty_function_tt,
ls_progdir TYPE ty_progdir,
lv_program_name TYPE programm,
lt_dynpros TYPE ty_dynpro_tt,
ls_cua TYPE ty_cua.
IF lif_object~exists( ) = abap_false.
RETURN.
ENDIF.
serialize_xml( io_xml ).
lt_functions = serialize_functions( ).
io_xml->add( iv_name = 'FUNCTIONS'
ig_data = lt_functions ).
serialize_includes( ).
lv_program_name = main_name( ).
ls_progdir = read_progdir( lv_program_name ).
IF ls_progdir-subc = 'F'.
lt_dynpros = serialize_dynpros( lv_program_name ).
io_xml->add( iv_name = 'DYNPROS'
ig_data = lt_dynpros ).
ls_cua = serialize_cua( lv_program_name ).
io_xml->add( iv_name = 'CUA'
ig_data = ls_cua ).
ENDIF.
ENDMETHOD. "serialize
METHOD lif_object~deserialize.
DATA: lv_program_name TYPE programm,
lt_functions TYPE ty_function_tt,
lt_dynpros TYPE ty_dynpro_tt,
ls_cua TYPE ty_cua.
deserialize_xml(
io_xml = io_xml
iv_package = iv_package ).
io_xml->read( EXPORTING iv_name = 'FUNCTIONS'
CHANGING cg_data = lt_functions ).
deserialize_functions( lt_functions ).
deserialize_includes(
io_xml = io_xml
iv_package = iv_package ).
lv_program_name = main_name( ).
io_xml->read( EXPORTING iv_name = 'DYNPROS'
CHANGING cg_data = lt_dynpros ).
deserialize_dynpros( it_dynpros = lt_dynpros ).
io_xml->read( EXPORTING iv_name = 'CUA'
CHANGING cg_data = ls_cua ).
deserialize_cua( iv_program_name = lv_program_name
is_cua = ls_cua ).
ENDMETHOD. "deserialize
METHOD lif_object~delete.
DATA: lv_area TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_DELETE'
EXPORTING
area = lv_area
suppress_popups = abap_true
skip_progress_ind = abap_true
EXCEPTIONS
canceled_in_corr = 1
enqueue_system_failure = 2
function_exist = 3
not_executed = 4
no_modify_permission = 5
no_show_permission = 6
permission_failure = 7
pool_not_exist = 8
cancelled = 9
OTHERS = 10.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_FUNCTION_POOL_DELETE' ).
ENDIF.
ENDMETHOD. "delete
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = 'FUGR'
in_new_window = abap_true.
ENDMETHOD. "jump
ENDCLASS. "lcl_object_fugr IMPLEMENTATION

View File

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

View File

@ -0,0 +1,156 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_PROG
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_object_prog DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_prog DEFINITION INHERITING FROM lcl_objects_program FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
METHODS deserialize_textpool
IMPORTING it_tpool TYPE textpool_table
RAISING lcx_exception.
ENDCLASS. "lcl_object_prog DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_prog IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_prog IMPLEMENTATION.
METHOD lif_object~changed_by.
SELECT SINGLE unam FROM reposrc INTO rv_user
WHERE progname = ms_item-obj_name
AND r3state = 'A'.
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists.
DATA: lv_progname TYPE reposrc-progname.
SELECT SINGLE progname FROM reposrc INTO lv_progname
WHERE progname = ms_item-obj_name
AND r3state = 'A'.
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = 'PROG'
in_new_window = abap_true.
ENDMETHOD. "jump
METHOD lif_object~delete.
DATA: lv_program LIKE sy-repid.
lv_program = ms_item-obj_name.
CALL FUNCTION 'RS_DELETE_PROGRAM'
EXPORTING
program = lv_program
suppress_popup = abap_true
EXCEPTIONS
enqueue_lock = 1
object_not_found = 2
permission_failure = 3
reject_deletion = 4
OTHERS = 5.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_DELETE_PROGRAM' ).
ENDIF.
ENDMETHOD. "delete
METHOD deserialize_textpool.
READ TABLE it_tpool WITH KEY id = 'R' TRANSPORTING NO FIELDS.
IF ( sy-subrc = 0 AND lines( it_tpool ) = 1 ) OR lines( it_tpool ) = 0.
RETURN. " no action for includes
ENDIF.
INSERT TEXTPOOL ms_item-obj_name
FROM it_tpool
LANGUAGE mv_language
STATE 'I'.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from INSERT TEXTPOOL' ).
ENDIF.
lcl_objects_activation=>add( iv_type = 'REPT'
iv_name = ms_item-obj_name ).
ENDMETHOD. "deserialize_textpool
METHOD lif_object~serialize.
serialize_program( io_xml = io_xml
is_item = ms_item
io_files = mo_files ).
ENDMETHOD. "lif_serialize~serialize
METHOD lif_object~deserialize.
DATA: lv_program_name TYPE programm,
ls_progdir TYPE ty_progdir,
lt_tpool TYPE textpool_table,
lt_dynpros TYPE ty_dynpro_tt,
lt_tpool_ext TYPE ty_tpool_tt,
ls_cua TYPE ty_cua,
lt_source TYPE abaptxt255_tab.
lv_program_name = ms_item-obj_name.
lt_source = mo_files->read_abap( ).
io_xml->read( EXPORTING iv_name = 'TPOOL'
CHANGING cg_data = lt_tpool_ext ).
lt_tpool = read_tpool( lt_tpool_ext ).
io_xml->read( EXPORTING iv_name = 'PROGDIR'
CHANGING cg_data = ls_progdir ).
deserialize_program( is_progdir = ls_progdir
it_source = lt_source
it_tpool = lt_tpool
iv_package = iv_package ).
io_xml->read( EXPORTING iv_name = 'DYNPROS'
CHANGING cg_data = lt_dynpros ).
deserialize_dynpros( it_dynpros = lt_dynpros ).
io_xml->read( EXPORTING iv_name = 'CUA'
CHANGING cg_data = ls_cua ).
deserialize_cua( iv_program_name = lv_program_name
is_cua = ls_cua ).
deserialize_textpool( lt_tpool ).
ENDMETHOD. "lif_serialize~deserialize
ENDCLASS. "lcl_object_prog IMPLEMENTATION

View File

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

View File

@ -0,0 +1,50 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_SERIALIZATION
*&---------------------------------------------------------------------*
* All object serializing classes
INCLUDE zabapgit_object_acid.
INCLUDE zabapgit_object_auth.
INCLUDE zabapgit_object_clas.
INCLUDE zabapgit_object_doct.
INCLUDE zabapgit_object_docv.
INCLUDE zabapgit_object_doma.
INCLUDE zabapgit_object_dtel.
INCLUDE zabapgit_object_enho.
INCLUDE zabapgit_object_enhs.
INCLUDE zabapgit_object_enqu.
INCLUDE zabapgit_object_ensc.
INCLUDE zabapgit_object_fugr.
INCLUDE zabapgit_object_iarp.
INCLUDE zabapgit_object_iasp.
INCLUDE zabapgit_object_iatu.
INCLUDE zabapgit_object_msag.
INCLUDE zabapgit_object_nrob.
INCLUDE zabapgit_object_para.
INCLUDE zabapgit_object_pinf.
INCLUDE zabapgit_object_prog.
INCLUDE zabapgit_object_sfbf.
INCLUDE zabapgit_object_sfbs.
INCLUDE zabapgit_object_sfsw.
INCLUDE zabapgit_object_shi3.
INCLUDE zabapgit_object_shlp.
INCLUDE zabapgit_object_sicf.
INCLUDE zabapgit_object_smim.
INCLUDE zabapgit_object_splo.
INCLUDE zabapgit_object_ssfo.
INCLUDE zabapgit_object_ssst.
INCLUDE zabapgit_object_susc.
INCLUDE zabapgit_object_suso.
INCLUDE zabapgit_object_tabl.
INCLUDE zabapgit_object_tobj.
INCLUDE zabapgit_object_tran.
INCLUDE zabapgit_object_ttyp.
INCLUDE zabapgit_object_type.
INCLUDE zabapgit_object_vcls.
INCLUDE zabapgit_object_view.
INCLUDE zabapgit_object_w3xx.
INCLUDE zabapgit_object_wdya.
INCLUDE zabapgit_object_wdyn.
INCLUDE zabapgit_object_webi.
INCLUDE zabapgit_object_xslt.

View File

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

View File

@ -0,0 +1,676 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_objects IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_objects IMPLEMENTATION.
METHOD warning_overwrite.
DATA: lv_index TYPE i,
lv_answer TYPE c,
lv_question TYPE string,
lt_before TYPE lcl_persistence_repo=>ty_local_checksum_tt,
lt_current TYPE lcl_persistence_repo=>ty_local_checksum_tt.
FIELD-SYMBOLS: <ls_before> LIKE LINE OF lt_before,
<ls_current> LIKE LINE OF lt_current,
<ls_result> LIKE LINE OF ct_results.
lt_before = io_repo->get_local_checksums( ).
lt_current = io_repo->build_local_checksums( ).
LOOP AT ct_results ASSIGNING <ls_result>.
lv_index = sy-tabix.
READ TABLE lt_before ASSIGNING <ls_before>
WITH KEY item-obj_type = <ls_result>-obj_type
item-obj_name = <ls_result>-obj_name.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
READ TABLE lt_current ASSIGNING <ls_current>
WITH KEY item-obj_type = <ls_result>-obj_type
item-obj_name = <ls_result>-obj_name.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
IF <ls_before>-sha1 <> <ls_current>-sha1.
lv_question = |It looks like object { <ls_result>-obj_type
} { <ls_result>-obj_name
} has been modified locally, overwrite object?|.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Warning'
text_question = lv_question
display_cancel_button = abap_false
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2 ##NO_TEXT.
IF sy-subrc <> 0.
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: <ls_snode> LIKE LINE OF lt_snode.
CALL FUNCTION 'WB_TREE_ACTUALIZE'
EXPORTING
tree_name = 'PG_ZABAPGIT'
without_crossreference = abap_true
with_tcode_index = abap_true
TABLES
p_tree = lt_snode.
DELETE lt_snode WHERE type <> 'OPL'
OR name NP 'LCL_OBJECT_++++'.
LOOP AT lt_snode ASSIGNING <ls_snode>.
lv_type = <ls_snode>-name+11.
APPEND lv_type TO rt_types.
ENDLOOP.
ENDMETHOD. "supported_list
METHOD exists.
DATA: li_obj TYPE REF TO lif_object.
TRY.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
rv_bool = li_obj->exists( ).
CATCH lcx_exception.
* ignore all errors and assume the object exists
rv_bool = abap_true.
ENDTRY.
ENDMETHOD. "exists
METHOD path_to_package.
DATA: lv_length TYPE i,
lv_path TYPE string.
lv_length = strlen( iv_start ) - 1.
lv_path = iv_path+lv_length.
CONCATENATE iv_top lv_path INTO rv_package.
TRANSLATE rv_package USING '/_'.
lv_length = strlen( rv_package ) - 1.
rv_package = rv_package(lv_length).
TRANSLATE rv_package TO UPPER CASE.
IF lcl_sap_package=>exists( rv_package ) = abap_false.
lcl_sap_package=>create_child( iv_parent = iv_top
iv_child = rv_package ).
ENDIF.
ENDMETHOD.
METHOD class_name.
CONCATENATE 'LCL_OBJECT_' is_item-obj_type INTO rv_class_name. "#EC NOTEXT
ENDMETHOD. "class_name
METHOD jump.
DATA: li_obj TYPE REF TO lif_object.
li_obj = create_object( is_item = is_item
iv_language = gc_english ).
li_obj->jump( ).
ENDMETHOD. "jump
METHOD 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: <ls_tadir> LIKE LINE OF it_tadir.
* misuse field KORRNUM to fix deletion sequence
lt_tadir[] = it_tadir[].
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
CASE <ls_tadir>-object.
WHEN 'IATU'.
<ls_tadir>-korrnum = '5500'.
WHEN 'IARP'.
<ls_tadir>-korrnum = '5510'.
WHEN 'IASP'.
<ls_tadir>-korrnum = '5520'.
WHEN 'SUSC'.
<ls_tadir>-korrnum = '5000'.
WHEN 'TTYP' OR 'TABL' OR 'VIEW'.
SELECT SINGLE tabclass FROM dd02l
INTO lv_tabclass
WHERE tabname = <ls_tadir>-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
IF sy-subrc = 0 AND lv_tabclass = 'APPEND'.
* delete append structures before database tables
<ls_tadir>-korrnum = '6500'.
ELSE.
<ls_tadir>-korrnum = '7000'.
ENDIF.
WHEN 'DTEL'.
<ls_tadir>-korrnum = '8000'.
WHEN 'DOMA'.
<ls_tadir>-korrnum = '9000'.
WHEN 'PROG'.
* delete includes after main programs
SELECT COUNT(*) FROM reposrc
WHERE progname = <ls_tadir>-obj_name
AND r3state = 'A'
AND subc = 'I'.
IF sy-subrc = 0.
<ls_tadir>-korrnum = '2000'.
ELSE.
<ls_tadir>-korrnum = '1000'.
ENDIF.
WHEN OTHERS.
<ls_tadir>-korrnum = '1000'.
ENDCASE.
ENDLOOP.
resolve_ddic( CHANGING ct_tadir = lt_tadir ).
SORT lt_tadir BY korrnum ASCENDING.
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
lcl_progress=>show( iv_key = 'Delete'
iv_current = sy-tabix
iv_total = lines( lt_tadir )
iv_text = <ls_tadir>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_tadir>-object.
ls_item-obj_name = <ls_tadir>-obj_name.
delete_obj( ls_item ).
ENDLOOP.
ENDMETHOD. "delete
METHOD resolve_ddic.
* this will make sure the deletion sequence of structures/tables work
* in case they have dependencies with .INCLUDE
TYPES: BEGIN OF ty_edge,
from TYPE ty_item,
to TYPE ty_item,
END OF ty_edge.
DATA: lt_nodes TYPE TABLE OF ty_item,
lt_edges TYPE TABLE OF ty_edge,
lt_findstrings TYPE TABLE OF rsfind,
lv_plus TYPE i VALUE 1,
lv_find_obj_cls TYPE euobj-id,
lv_index TYPE i,
lv_before TYPE i,
lt_founds TYPE TABLE OF rsfindlst,
lt_scope TYPE STANDARD TABLE OF seu_obj.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir,
<ls_edge> LIKE LINE OF lt_edges,
<ls_found> LIKE LINE OF lt_founds,
<ls_node> LIKE LINE OF lt_nodes.
* build nodes
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE object = 'TABL'
OR object = 'TTYP'.
APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
<ls_node>-obj_name = <ls_tadir>-obj_name.
<ls_node>-obj_type = <ls_tadir>-object.
ENDLOOP.
APPEND 'TABL' TO lt_scope.
APPEND 'STRU' TO lt_scope.
APPEND 'TTYP' TO lt_scope.
* build edges
LOOP AT lt_nodes ASSIGNING <ls_node>.
CLEAR lt_findstrings.
APPEND <ls_node>-obj_name TO lt_findstrings.
lv_find_obj_cls = <ls_node>-obj_type.
CALL FUNCTION 'RS_EU_CROSSREF'
EXPORTING
i_find_obj_cls = lv_find_obj_cls
TABLES
i_findstrings = lt_findstrings
o_founds = lt_founds
i_scope_object_cls = lt_scope
EXCEPTIONS
not_executed = 1
not_found = 2
illegal_object = 3
no_cross_for_this_object = 4
batch = 5
batchjob_error = 6
wrong_type = 7
object_not_exist = 8
OTHERS = 9.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
LOOP AT lt_founds ASSIGNING <ls_found>.
APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
<ls_edge>-from = <ls_node>.
<ls_edge>-to-obj_name = <ls_found>-object.
CASE <ls_found>-object_cls.
WHEN 'DS'
OR 'DT'.
<ls_edge>-to-obj_type = 'TABL'.
WHEN 'DA'.
<ls_edge>-to-obj_type = 'TTYP'.
WHEN OTHERS.
lcx_exception=>raise( 'resolve_ddic, unknown object_cls' ).
ENDCASE.
ENDLOOP.
ENDLOOP.
DO.
lv_before = lines( lt_nodes ).
LOOP AT lt_nodes ASSIGNING <ls_node>.
lv_index = sy-tabix.
READ TABLE lt_edges WITH KEY
from-obj_name = <ls_node>-obj_name
from-obj_type = <ls_node>-obj_type
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
LOOP AT ct_tadir ASSIGNING <ls_tadir>
WHERE obj_name = <ls_node>-obj_name
AND object = <ls_node>-obj_type.
<ls_tadir>-korrnum = <ls_tadir>-korrnum + lv_plus.
CONDENSE <ls_tadir>-korrnum.
ENDLOOP.
DELETE lt_edges
WHERE to-obj_name = <ls_node>-obj_name
AND to-obj_type = <ls_node>-obj_type.
DELETE lt_nodes INDEX lv_index.
EXIT. " make sure the sequence is fixed
ENDIF.
ENDLOOP.
IF lv_before = lines( lt_nodes ).
EXIT.
ENDIF.
lv_plus = lv_plus + 1.
ENDDO.
ENDMETHOD. "resolve_ddic
METHOD delete_obj.
DATA: li_obj TYPE REF TO lif_object.
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: <ls_result> LIKE LINE OF it_results.
* PROG before internet services, as the services might use the screens
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
* ISAP has to be handled before ISRP
LOOP AT it_results ASSIGNING <ls_result> WHERE obj_type = 'IASP'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
LOOP AT it_results ASSIGNING <ls_result>
WHERE obj_type <> 'IASP' AND obj_type <> 'PROG'.
APPEND <ls_result> TO rt_results.
ENDLOOP.
ENDMETHOD. "prioritize_deser
METHOD deserialize.
TYPES: BEGIN OF ty_late,
obj TYPE REF TO lif_object,
xml TYPE REF TO lcl_xml_input,
package TYPE devclass,
END OF ty_late.
DATA: ls_item TYPE ty_item,
lv_cancel TYPE abap_bool,
li_obj TYPE REF TO lif_object,
lt_remote TYPE ty_files_tt,
lv_package TYPE devclass,
lo_files TYPE REF TO lcl_objects_files,
lo_xml TYPE REF TO lcl_xml_input,
lt_results TYPE ty_results_tt,
lt_late TYPE TABLE OF ty_late.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF lt_results,
<ls_late> LIKE LINE OF lt_late.
lcl_objects_activation=>clear( ).
lt_remote = io_repo->get_files_remote( ).
lt_results = lcl_file_status=>status( io_repo ).
DELETE lt_results WHERE match = abap_true.
SORT lt_results BY obj_type ASCENDING obj_name ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_results COMPARING obj_type obj_name.
lt_results = prioritize_deser( lt_results ).
warning_overwrite( EXPORTING io_repo = io_repo
CHANGING ct_results = lt_results ).
LOOP AT lt_results ASSIGNING <ls_result>.
lcl_progress=>show( iv_key = 'Deserialize'
iv_current = sy-tabix
iv_total = lines( lt_results )
iv_text = <ls_result>-obj_name ) ##NO_TEXT.
CLEAR ls_item.
ls_item-obj_type = <ls_result>-obj_type.
ls_item-obj_name = <ls_result>-obj_name.
* handle namespaces
REPLACE ALL OCCURRENCES OF '#' IN ls_item-obj_name WITH '/'.
lv_package = path_to_package(
iv_top = io_repo->get_package( )
iv_start = io_repo->get_dot_abapgit( )->get_starting_folder( )
iv_path = <ls_result>-path ).
lv_cancel = warning_package( is_item = ls_item
iv_package = lv_package ).
IF lv_cancel = abap_true.
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 <ls_late>.
<ls_late>-obj = li_obj.
<ls_late>-xml = lo_xml.
<ls_late>-package = lv_package.
CONTINUE.
ENDIF.
li_obj->deserialize( iv_package = lv_package
io_xml = lo_xml ).
ENDLOOP.
lcl_objects_activation=>activate( ).
LOOP AT lt_late ASSIGNING <ls_late>.
<ls_late>-obj->deserialize( iv_package = <ls_late>-package
io_xml = <ls_late>-xml ).
ENDLOOP.
update_package_tree( io_repo->get_package( ) ).
ENDMETHOD. "deserialize
ENDCLASS. "lcl_objects IMPLEMENTATION

View File

@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_OBJECT</NAME>
<NAME>ZABAPGIT_OBJECTS_IMPL</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>

View File

@ -0,0 +1,240 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE_DIFF
*&---------------------------------------------------------------------*
CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
is_local TYPE ty_file
is_remote TYPE ty_file.
METHODS lif_gui_page~render REDEFINITION.
PRIVATE SECTION.
DATA: mv_filename TYPE string,
mo_diff TYPE REF TO lcl_diff.
METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_head RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_diff RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_lines RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS. "lcl_gui_page_diff
CLASS lcl_gui_page_diff IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
mv_filename = is_local-filename.
CREATE OBJECT mo_diff
EXPORTING
iv_local = is_local-data
iv_remote = is_remote-data.
ENDMETHOD.
METHOD styles.
DATA lo_html TYPE REF TO lcl_html_helper.
CREATE OBJECT lo_html.
lo_html->add( '/* DIFF */' ). "#EC NOTEXT
lo_html->add( 'div.diff {' ). "#EC NOTEXT
lo_html->add( ' background-color: #f2f2f2;' ). "#EC NOTEXT
lo_html->add( ' padding: 0.7em ' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'div.diff_head {' ). "#EC NOTEXT
lo_html->add( ' border-bottom: 1px solid #DDD;' ). "#EC NOTEXT
lo_html->add( ' padding-bottom: 0.7em;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'span.diff_name {' ). "#EC NOTEXT
lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT
lo_html->add( ' color: grey;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'span.diff_name strong {' ). "#EC NOTEXT
lo_html->add( ' color: #333;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'span.diff_banner {' ). "#EC NOTEXT
lo_html->add( ' border-style: solid;' ). "#EC NOTEXT
lo_html->add( ' border-width: 1px;' ). "#EC NOTEXT
lo_html->add( ' border-radius: 3px;' ). "#EC NOTEXT
lo_html->add( ' padding-left: 0.3em;' ). "#EC NOTEXT
lo_html->add( ' padding-right: 0.3em;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( '.diff_ins {' ). "#EC NOTEXT
lo_html->add( ' border-color: #38e038;' ). "#EC NOTEXT
lo_html->add( ' background-color: #91ee91 !important;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( '.diff_del {' ). "#EC NOTEXT
lo_html->add( ' border-color: #ff8093;' ). "#EC NOTEXT
lo_html->add( ' background-color: #ffb3be !important;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( '.diff_upd {' ). "#EC NOTEXT
lo_html->add( ' border-color: #dada00;' ). "#EC NOTEXT
lo_html->add( ' background-color: #ffffb3 !important;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'div.diff_content {' ). "#EC NOTEXT
lo_html->add( ' background: #fff;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
" Table part
lo_html->add( '/* DIFF TABLE */' ). "#EC NOTEXT
lo_html->add( 'table.diff_tab {' ). "#EC NOTEXT
lo_html->add( ' font-family: Consolas, Courier, monospace;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'table.diff_tab th {' ). "#EC NOTEXT
lo_html->add( ' color: grey;' ). "#EC NOTEXT
lo_html->add( ' text-align: left;' ). "#EC NOTEXT
lo_html->add( ' font-weight: normal;' ). "#EC NOTEXT
lo_html->add( ' padding: 0.5em;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'table.diff_tab td {' ). "#EC NOTEXT
lo_html->add( ' color: #444;' ). "#EC NOTEXT
lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT
lo_html->add( ' padding-right: 0.5em;' ). "#EC NOTEXT
lo_html->add( ' font-size: 12pt;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'table.diff_tab td.num, th.num {' ). "#EC NOTEXT
lo_html->add( ' text-align: right;' ). "#EC NOTEXT
lo_html->add( ' color: #ccc;' ). "#EC NOTEXT
lo_html->add( ' border-left: 1px solid #eee;' ). "#EC NOTEXT
lo_html->add( ' border-right: 1px solid #eee;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'table.diff_tab td.cmd, th.cmd {' ). "#EC NOTEXT
lo_html->add( ' text-align: center !important;' ). "#EC NOTEXT
lo_html->add( ' white-space: nowrap;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
lo_html->add( 'table.diff_tab tr.diff_nav_line {'). "#EC NOTEXT
lo_html->add( ' background-color: #edf2f9;'). "#EC NOTEXT
lo_html->add( '}'). "#EC NOTEXT
lo_html->add( 'table.diff_tab tr.diff_nav_line td {'). "#EC NOTEXT
lo_html->add( ' color: #ccc;'). "#EC NOTEXT
lo_html->add( '}'). "#EC NOTEXT
lo_html->add( 'table.diff_tab code {' ). "#EC NOTEXT
lo_html->add( ' font-family: inherit;' ). "#EC NOTEXT
lo_html->add( ' white-space: pre;' ). "#EC NOTEXT
lo_html->add( '}' ). "#EC NOTEXT
ro_html = lo_html.
ENDMETHOD.
METHOD render_head.
DATA: lo_html TYPE REF TO lcl_html_helper,
ls_stats TYPE lcl_diff=>ty_count.
CREATE OBJECT lo_html.
ls_stats = mo_diff->stats( ).
lo_html->add( '<div class="diff_head">' ). "#EC NOTEXT
lo_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
lo_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
lo_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
lo_html->add( '<span class="diff_name">' ). "#EC NOTEXT
lo_html->add( |{ mv_filename }| ).
lo_html->add( '</span>' ). "#EC NOTEXT
lo_html->add( '</div>' ). "#EC NOTEXT
ro_html = lo_html.
ENDMETHOD.
METHOD render_diff.
CREATE OBJECT ro_html.
ro_html->add( '<div class="diff">' ). "#EC NOTEXT
ro_html->add( render_head( ) ).
" Content
ro_html->add( '<div class="diff_content">' ). "#EC NOTEXT
ro_html->add( '<table width="100%" class="diff_tab">' ). "#EC NOTEXT
ro_html->add( '<tr>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>@LOCAL</th>' ). "#EC NOTEXT
ro_html->add( '<th class="num"></th>' ). "#EC NOTEXT
ro_html->add( '<th>@REMOTE</th>' ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ro_html->add( render_lines( ) ).
ro_html->add( '</table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#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 <ls_diff> LIKE LINE OF lt_diffs.
CREATE OBJECT ro_html.
lt_diffs = mo_diff->get( ).
LOOP AT lt_diffs ASSIGNING <ls_diff>.
IF <ls_diff>-short = abap_false.
lv_insert_nav = abap_true.
CONTINUE.
ENDIF.
IF lv_insert_nav = abap_true. " Insert separator line with navigation
IF <ls_diff>-beacon > 0.
READ TABLE mo_diff->mt_beacons INTO lv_beacon INDEX <ls_diff>-beacon.
ELSE.
lv_beacon = '---'.
ENDIF.
ro_html->add( '<tr class="diff_nav_line">').
ro_html->add( '<td class="num"></td>' ).
ro_html->add( |<td colspan="3">@@ { <ls_diff>-local_line } @@ { lv_beacon }</td>| ).
ro_html->add( '</tr>' ).
lv_insert_nav = abap_false.
ENDIF.
lv_local = escape( val = <ls_diff>-local format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = <ls_diff>-remote format = cl_abap_format=>e_html_attr ).
CLEAR: lv_attr_local, lv_attr_remote. " Class for changed lines
CASE <ls_diff>-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( '<tr>' ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-local_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_attr_local }><code>{ lv_local }</code></td>| ). "#EC NOTEXT
ro_html->add( |<td class="num">{ <ls_diff>-remote_line }</td>| ). "#EC NOTEXT
ro_html->add( |<td{ lv_attr_remote }><code>{ lv_remote }</code></td>| ). "#EC NOTEXT
ro_html->add( '</tr>' ). "#EC NOTEXT
ENDLOOP.
ENDMETHOD.
METHOD lif_gui_page~render.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( title( 'DIFF' ) ).
ro_html->add( render_diff( ) ).
ro_html->add( footer( ) ).
ENDMETHOD.
ENDCLASS. "lcl_gui_page_diff

View File

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

View File

@ -0,0 +1,20 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE_EXPLORE
*&---------------------------------------------------------------------*
CLASS lcl_gui_page_explore DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
METHODS lif_gui_page~render REDEFINITION.
ENDCLASS. "lcl_gui_page_explore DEFINITION
CLASS lcl_gui_page_explore IMPLEMENTATION.
METHOD lif_gui_page~render.
CREATE OBJECT ro_html.
ro_html->add( redirect( 'http://larshp.github.io/abapGit/explore.html' ) ).
ENDMETHOD.
ENDCLASS. "lcl_gui_page_explore IMPLEMENTATION

View File

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

View File

@ -190,367 +190,6 @@ CLASS lcl_persistence_repo DEFINITION FINAL.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_persistence DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_persistence DEFINITION FINAL FRIENDS lcl_persistence_migrate.
* this class is obsolete, use LCL_PERSISTENCE_REPO instead
PRIVATE SECTION.
TYPES: BEGIN OF ty_repo_persi,
url TYPE string,
branch_name TYPE string,
sha1 TYPE ty_sha1,
package TYPE devclass,
offline TYPE sap_bool,
END OF ty_repo_persi.
TYPES: ty_repos_persi_tt TYPE STANDARD TABLE OF ty_repo_persi WITH DEFAULT KEY.
METHODS list
RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS update
IMPORTING iv_url TYPE ty_repo_persi-url
iv_branch_name TYPE ty_repo_persi-branch_name
iv_branch TYPE ty_sha1
RAISING lcx_exception.
METHODS add
IMPORTING iv_url TYPE string
iv_branch_name TYPE string
iv_branch TYPE ty_sha1 OPTIONAL
iv_package TYPE devclass
iv_offline TYPE sap_bool DEFAULT abap_false
RAISING lcx_exception.
METHODS delete
IMPORTING iv_url TYPE ty_repo_persi-url
iv_branch_name TYPE ty_repo_persi-branch_name
RAISING lcx_exception.
METHODS read_text_online
RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS save_text_online
IMPORTING it_repos TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS header_online
RETURNING VALUE(rs_header) TYPE thead.
METHODS read_text_offline
RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS save_text_offline
IMPORTING it_repos TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS header_offline
RETURNING VALUE(rs_header) TYPE thead.
METHODS read_text
IMPORTING is_header TYPE thead
RETURNING VALUE(rt_lines) TYPE tlinetab
RAISING lcx_exception.
METHODS save_text
IMPORTING is_header TYPE thead
it_lines TYPE tlinetab
RAISING lcx_exception.
ENDCLASS. "lcl_persistence DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_persistence IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_persistence IMPLEMENTATION.
METHOD save_text.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = is_header
TABLES
lines = it_lines
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
IF sy-subrc <> 0.
ROLLBACK WORK. "#EC CI_ROLLBACK
lcx_exception=>raise( 'error from SAVE_TEXT' ).
ENDIF.
ENDMETHOD. "save_text
METHOD header_online.
rs_header-tdid = 'ST'.
rs_header-tdspras = gc_english.
rs_header-tdname = 'ZABAPGIT'.
rs_header-tdobject = 'TEXT'.
ENDMETHOD. "header
METHOD header_offline.
rs_header-tdid = 'ST'.
rs_header-tdspras = gc_english.
rs_header-tdname = 'ZABAPGIT_OFFLINE'.
rs_header-tdobject = 'TEXT'.
ENDMETHOD. "header_offline
METHOD delete.
DATA: lt_repos TYPE ty_repos_persi_tt.
lt_repos = list( ).
DELETE lt_repos WHERE url = iv_url AND branch_name = iv_branch_name.
IF sy-subrc <> 0.
lcx_exception=>raise( 'repo not found, delete' ).
ENDIF.
save_text_online( lt_repos ).
save_text_offline( lt_repos ).
ENDMETHOD. "delete
METHOD save_text_online.
DATA: lt_lines TYPE TABLE OF tline.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF it_repos,
<ls_line> LIKE LINE OF lt_lines.
LOOP AT it_repos ASSIGNING <ls_repo> WHERE offline = abap_false.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-url.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-branch_name.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-sha1.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-package.
ENDLOOP.
save_text( is_header = header_online( )
it_lines = lt_lines ).
COMMIT WORK.
ENDMETHOD. "save_text
METHOD save_text_offline.
DATA: lt_lines TYPE TABLE OF tline.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF it_repos,
<ls_line> LIKE LINE OF lt_lines.
LOOP AT it_repos ASSIGNING <ls_repo> WHERE offline = abap_true.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-url.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-package.
ENDLOOP.
save_text( is_header = header_offline( )
it_lines = lt_lines ).
COMMIT WORK.
ENDMETHOD. "save_text_offline
METHOD add.
DATA: lt_repos TYPE ty_repos_persi_tt.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF lt_repos.
ASSERT NOT iv_url IS INITIAL.
ASSERT NOT iv_package IS INITIAL.
lt_repos = list( ).
READ TABLE lt_repos WITH KEY url = iv_url branch_name = iv_branch_name
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
lcx_exception=>raise( 'already inserted' ).
ENDIF.
APPEND INITIAL LINE TO lt_repos ASSIGNING <ls_repo>.
<ls_repo>-url = iv_url.
<ls_repo>-branch_name = iv_branch_name.
<ls_repo>-sha1 = iv_branch.
<ls_repo>-package = iv_package.
<ls_repo>-offline = iv_offline.
save_text_online( lt_repos ).
save_text_offline( lt_repos ).
ENDMETHOD. "insert
METHOD update.
DATA: lt_repos TYPE ty_repos_persi_tt.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF lt_repos.
IF iv_branch IS INITIAL.
lcx_exception=>raise( 'update, sha empty' ).
ENDIF.
lt_repos = list( ).
READ TABLE lt_repos ASSIGNING <ls_repo>
WITH KEY url = iv_url branch_name = iv_branch_name.
IF sy-subrc <> 0.
lcx_exception=>raise( 'persist update, repo not found' ).
ENDIF.
<ls_repo>-sha1 = iv_branch.
save_text_online( lt_repos ).
ENDMETHOD. "update
METHOD list.
CLEAR rt_repos.
APPEND LINES OF read_text_online( ) TO rt_repos.
APPEND LINES OF read_text_offline( ) TO rt_repos.
ENDMETHOD. "list
METHOD read_text.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = is_header-tdid
language = is_header-tdspras
name = is_header-tdname
object = is_header-tdobject
TABLES
lines = rt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 4.
RETURN.
ELSEIF sy-subrc <> 0.
lcx_exception=>raise( 'Error from READ_TEXT' ).
ENDIF.
ENDMETHOD. "read_text
METHOD read_text_online.
DATA: lt_lines TYPE TABLE OF tline,
lv_step TYPE i,
ls_repo TYPE ty_repo_persi.
FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_lines.
lt_lines = read_text( header_online( ) ).
IF lines( lt_lines ) = 0.
RETURN.
ENDIF.
IF lines( lt_lines ) MOD 4 <> 0.
* if this happens, delete text ZABAPGIT in SO10 or edit the text
* manually, so it contains the right information
lcx_exception=>raise( 'Persistence, text broken' ).
ENDIF.
CLEAR ls_repo.
LOOP AT lt_lines ASSIGNING <ls_line>.
lv_step = lv_step + 1.
CASE lv_step.
WHEN 4.
ls_repo-package = <ls_line>-tdline.
IF ls_repo-url IS INITIAL OR ls_repo-branch_name IS INITIAL.
lcx_exception=>raise( 'Persistence, text broken 2' ).
ENDIF.
APPEND ls_repo TO rt_repos.
CLEAR ls_repo.
lv_step = 0.
WHEN 3.
ls_repo-sha1 = <ls_line>-tdline.
WHEN 2.
ls_repo-branch_name = <ls_line>-tdline.
WHEN 1.
ls_repo-url = <ls_line>-tdline.
WHEN OTHERS.
ASSERT 1 = 0.
ENDCASE.
ENDLOOP.
ENDMETHOD. "list
METHOD read_text_offline.
DATA: lt_lines TYPE TABLE OF tline,
ls_repo TYPE ty_repo_persi.
FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_lines.
lt_lines = read_text( header_offline( ) ).
IF lines( lt_lines ) = 0.
RETURN.
ENDIF.
IF lines( lt_lines ) MOD 2 <> 0.
* if this happens, delete text ZABAPGIT in SO10 or edit the text
* manually, so it contains the right information
lcx_exception=>raise( 'Persistence, text broken' ).
ENDIF.
CLEAR ls_repo.
LOOP AT lt_lines ASSIGNING <ls_line>.
IF <ls_line>-tdline IS INITIAL.
lcx_exception=>raise( 'Persistence, text broken' ).
ENDIF.
IF ls_repo-url IS INITIAL.
ls_repo-url = <ls_line>-tdline.
CONTINUE. " current loop
ENDIF.
ls_repo-package = <ls_line>-tdline.
ls_repo-offline = abap_true.
APPEND ls_repo TO rt_repos.
CLEAR ls_repo.
ENDLOOP.
ENDMETHOD. "list
ENDCLASS. "lcl_persistence IMPLEMENTATION
CLASS lcl_persistence_background DEFINITION FINAL.
PUBLIC SECTION.
@ -789,209 +428,6 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
ENDCLASS. "lcl_persistence_user DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_user DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_user DEFINITION FINAL FRIENDS lcl_persistence_migrate.
* this class is obsolete, use LCL_PERSISTENCE_USER instead
PRIVATE SECTION.
TYPES: BEGIN OF ty_user,
user LIKE sy-uname,
username TYPE string,
email TYPE string,
END OF ty_user.
TYPES: ty_user_tt TYPE STANDARD TABLE OF ty_user WITH DEFAULT KEY.
CLASS-METHODS set_username
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
iv_username TYPE string
RAISING lcx_exception.
CLASS-METHODS get_username
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
RETURNING VALUE(rv_username) TYPE string
RAISING lcx_exception.
CLASS-METHODS set_email
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
iv_email TYPE string
RAISING lcx_exception.
CLASS-METHODS get_email
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
RETURNING VALUE(rv_email) TYPE string
RAISING lcx_exception.
CLASS-METHODS list
RETURNING VALUE(rt_data) TYPE ty_user_tt
RAISING lcx_exception.
CLASS-METHODS read
IMPORTING iv_name TYPE tdobname
RETURNING VALUE(rv_value) TYPE string
RAISING lcx_exception.
CLASS-METHODS save
IMPORTING iv_name TYPE tdobname
iv_value TYPE string
RAISING lcx_exception.
ENDCLASS. "lcl_user DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_user IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_user IMPLEMENTATION.
* this class is obsolete, use LCL_PERSISTENCE_USER instead
METHOD read.
DATA: lt_lines TYPE TABLE OF tline,
ls_line LIKE LINE OF lt_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'ST'
language = gc_english
name = iv_name
object = 'TEXT'
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 4 AND sy-subrc <> 0.
lcx_exception=>raise( 'error from READ_TEXT' ).
ENDIF.
READ TABLE lt_lines INTO ls_line INDEX 1.
IF sy-subrc = 0.
rv_value = ls_line-tdline.
ENDIF.
ENDMETHOD. "get_details
METHOD save.
DATA: ls_header TYPE thead,
lt_lines TYPE TABLE OF tline,
ls_line LIKE LINE OF lt_lines.
ls_line-tdformat = '*'.
ls_line-tdline = iv_value.
APPEND ls_line TO lt_lines.
ls_header-tdid = 'ST'.
ls_header-tdspras = gc_english.
ls_header-tdname = iv_name.
ls_header-tdobject = 'TEXT'.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = ls_header
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
IF sy-subrc <> 0.
ROLLBACK WORK. "#EC CI_ROLLBACK
lcx_exception=>raise( 'error from SAVE_TEXT' ).
ENDIF.
COMMIT WORK.
ENDMETHOD. "change
METHOD set_username.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name.
save( iv_name = lv_name
iv_value = iv_username ).
ENDMETHOD. "set_username
METHOD get_username.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name.
rv_username = read( lv_name ).
ENDMETHOD. "get_username
METHOD set_email.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name.
save( iv_name = lv_name
iv_value = iv_email ).
ENDMETHOD. "set_email
METHOD list.
DATA: lt_stxh TYPE STANDARD TABLE OF stxh WITH DEFAULT KEY.
FIELD-SYMBOLS: <ls_output> LIKE LINE OF rt_data,
<ls_stxh> LIKE LINE OF lt_stxh.
SELECT * FROM stxh INTO TABLE lt_stxh
WHERE tdobject = 'TEXT'
AND tdname LIKE 'ZABAPGIT_USERNAME_%'.
LOOP AT lt_stxh ASSIGNING <ls_stxh>.
APPEND INITIAL LINE TO rt_data ASSIGNING <ls_output>.
<ls_output>-user = <ls_stxh>-tdname+18.
<ls_output>-username = get_username( <ls_output>-user ).
<ls_output>-email = get_email( <ls_output>-user ).
ENDLOOP.
ENDMETHOD.
METHOD get_email.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name.
rv_email = read( lv_name ).
ENDMETHOD. "get_email
ENDCLASS. "lcl_user IMPLEMENTATION
CLASS lcl_persistence_user IMPLEMENTATION.
METHOD constructor.

View File

@ -0,0 +1,569 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PERSISTENCE_OLD
*&---------------------------------------------------------------------*
CLASS lcl_persistence_migrate DEFINITION DEFERRED.
*----------------------------------------------------------------------*
* CLASS lcl_persistence DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_persistence DEFINITION FINAL FRIENDS lcl_persistence_migrate.
* this class is obsolete, use LCL_PERSISTENCE_REPO instead
PRIVATE SECTION.
TYPES: BEGIN OF ty_repo_persi,
url TYPE string,
branch_name TYPE string,
sha1 TYPE ty_sha1,
package TYPE devclass,
offline TYPE sap_bool,
END OF ty_repo_persi.
TYPES: ty_repos_persi_tt TYPE STANDARD TABLE OF ty_repo_persi WITH DEFAULT KEY.
METHODS list
RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS update
IMPORTING iv_url TYPE ty_repo_persi-url
iv_branch_name TYPE ty_repo_persi-branch_name
iv_branch TYPE ty_sha1
RAISING lcx_exception.
METHODS add
IMPORTING iv_url TYPE string
iv_branch_name TYPE string
iv_branch TYPE ty_sha1 OPTIONAL
iv_package TYPE devclass
iv_offline TYPE sap_bool DEFAULT abap_false
RAISING lcx_exception.
METHODS delete
IMPORTING iv_url TYPE ty_repo_persi-url
iv_branch_name TYPE ty_repo_persi-branch_name
RAISING lcx_exception.
METHODS read_text_online
RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS save_text_online
IMPORTING it_repos TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS header_online
RETURNING VALUE(rs_header) TYPE thead.
METHODS read_text_offline
RETURNING VALUE(rt_repos) TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS save_text_offline
IMPORTING it_repos TYPE ty_repos_persi_tt
RAISING lcx_exception.
METHODS header_offline
RETURNING VALUE(rs_header) TYPE thead.
METHODS read_text
IMPORTING is_header TYPE thead
RETURNING VALUE(rt_lines) TYPE tlinetab
RAISING lcx_exception.
METHODS save_text
IMPORTING is_header TYPE thead
it_lines TYPE tlinetab
RAISING lcx_exception.
ENDCLASS. "lcl_persistence DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_persistence IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_persistence IMPLEMENTATION.
METHOD save_text.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = is_header
TABLES
lines = it_lines
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
IF sy-subrc <> 0.
ROLLBACK WORK. "#EC CI_ROLLBACK
lcx_exception=>raise( 'error from SAVE_TEXT' ).
ENDIF.
ENDMETHOD. "save_text
METHOD header_online.
rs_header-tdid = 'ST'.
rs_header-tdspras = gc_english.
rs_header-tdname = 'ZABAPGIT'.
rs_header-tdobject = 'TEXT'.
ENDMETHOD. "header
METHOD header_offline.
rs_header-tdid = 'ST'.
rs_header-tdspras = gc_english.
rs_header-tdname = 'ZABAPGIT_OFFLINE'.
rs_header-tdobject = 'TEXT'.
ENDMETHOD. "header_offline
METHOD delete.
DATA: lt_repos TYPE ty_repos_persi_tt.
lt_repos = list( ).
DELETE lt_repos WHERE url = iv_url AND branch_name = iv_branch_name.
IF sy-subrc <> 0.
lcx_exception=>raise( 'repo not found, delete' ).
ENDIF.
save_text_online( lt_repos ).
save_text_offline( lt_repos ).
ENDMETHOD. "delete
METHOD save_text_online.
DATA: lt_lines TYPE TABLE OF tline.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF it_repos,
<ls_line> LIKE LINE OF lt_lines.
LOOP AT it_repos ASSIGNING <ls_repo> WHERE offline = abap_false.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-url.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-branch_name.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-sha1.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-package.
ENDLOOP.
save_text( is_header = header_online( )
it_lines = lt_lines ).
COMMIT WORK.
ENDMETHOD. "save_text
METHOD save_text_offline.
DATA: lt_lines TYPE TABLE OF tline.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF it_repos,
<ls_line> LIKE LINE OF lt_lines.
LOOP AT it_repos ASSIGNING <ls_repo> WHERE offline = abap_true.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-url.
APPEND INITIAL LINE TO lt_lines ASSIGNING <ls_line>.
<ls_line>-tdformat = '*'.
<ls_line>-tdline = <ls_repo>-package.
ENDLOOP.
save_text( is_header = header_offline( )
it_lines = lt_lines ).
COMMIT WORK.
ENDMETHOD. "save_text_offline
METHOD add.
DATA: lt_repos TYPE ty_repos_persi_tt.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF lt_repos.
ASSERT NOT iv_url IS INITIAL.
ASSERT NOT iv_package IS INITIAL.
lt_repos = list( ).
READ TABLE lt_repos WITH KEY url = iv_url branch_name = iv_branch_name
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
lcx_exception=>raise( 'already inserted' ).
ENDIF.
APPEND INITIAL LINE TO lt_repos ASSIGNING <ls_repo>.
<ls_repo>-url = iv_url.
<ls_repo>-branch_name = iv_branch_name.
<ls_repo>-sha1 = iv_branch.
<ls_repo>-package = iv_package.
<ls_repo>-offline = iv_offline.
save_text_online( lt_repos ).
save_text_offline( lt_repos ).
ENDMETHOD. "insert
METHOD update.
DATA: lt_repos TYPE ty_repos_persi_tt.
FIELD-SYMBOLS: <ls_repo> LIKE LINE OF lt_repos.
IF iv_branch IS INITIAL.
lcx_exception=>raise( 'update, sha empty' ).
ENDIF.
lt_repos = list( ).
READ TABLE lt_repos ASSIGNING <ls_repo>
WITH KEY url = iv_url branch_name = iv_branch_name.
IF sy-subrc <> 0.
lcx_exception=>raise( 'persist update, repo not found' ).
ENDIF.
<ls_repo>-sha1 = iv_branch.
save_text_online( lt_repos ).
ENDMETHOD. "update
METHOD list.
CLEAR rt_repos.
APPEND LINES OF read_text_online( ) TO rt_repos.
APPEND LINES OF read_text_offline( ) TO rt_repos.
ENDMETHOD. "list
METHOD read_text.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = is_header-tdid
language = is_header-tdspras
name = is_header-tdname
object = is_header-tdobject
TABLES
lines = rt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 4.
RETURN.
ELSEIF sy-subrc <> 0.
lcx_exception=>raise( 'Error from READ_TEXT' ).
ENDIF.
ENDMETHOD. "read_text
METHOD read_text_online.
DATA: lt_lines TYPE TABLE OF tline,
lv_step TYPE i,
ls_repo TYPE ty_repo_persi.
FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_lines.
lt_lines = read_text( header_online( ) ).
IF lines( lt_lines ) = 0.
RETURN.
ENDIF.
IF lines( lt_lines ) MOD 4 <> 0.
* if this happens, delete text ZABAPGIT in SO10 or edit the text
* manually, so it contains the right information
lcx_exception=>raise( 'Persistence, text broken' ).
ENDIF.
CLEAR ls_repo.
LOOP AT lt_lines ASSIGNING <ls_line>.
lv_step = lv_step + 1.
CASE lv_step.
WHEN 4.
ls_repo-package = <ls_line>-tdline.
IF ls_repo-url IS INITIAL OR ls_repo-branch_name IS INITIAL.
lcx_exception=>raise( 'Persistence, text broken 2' ).
ENDIF.
APPEND ls_repo TO rt_repos.
CLEAR ls_repo.
lv_step = 0.
WHEN 3.
ls_repo-sha1 = <ls_line>-tdline.
WHEN 2.
ls_repo-branch_name = <ls_line>-tdline.
WHEN 1.
ls_repo-url = <ls_line>-tdline.
WHEN OTHERS.
ASSERT 1 = 0.
ENDCASE.
ENDLOOP.
ENDMETHOD. "list
METHOD read_text_offline.
DATA: lt_lines TYPE TABLE OF tline,
ls_repo TYPE ty_repo_persi.
FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_lines.
lt_lines = read_text( header_offline( ) ).
IF lines( lt_lines ) = 0.
RETURN.
ENDIF.
IF lines( lt_lines ) MOD 2 <> 0.
* if this happens, delete text ZABAPGIT in SO10 or edit the text
* manually, so it contains the right information
lcx_exception=>raise( 'Persistence, text broken' ).
ENDIF.
CLEAR ls_repo.
LOOP AT lt_lines ASSIGNING <ls_line>.
IF <ls_line>-tdline IS INITIAL.
lcx_exception=>raise( 'Persistence, text broken' ).
ENDIF.
IF ls_repo-url IS INITIAL.
ls_repo-url = <ls_line>-tdline.
CONTINUE. " current loop
ENDIF.
ls_repo-package = <ls_line>-tdline.
ls_repo-offline = abap_true.
APPEND ls_repo TO rt_repos.
CLEAR ls_repo.
ENDLOOP.
ENDMETHOD. "list
ENDCLASS. "lcl_persistence IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_user DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_user DEFINITION FINAL FRIENDS lcl_persistence_migrate.
* this class is obsolete, use LCL_PERSISTENCE_USER instead
PRIVATE SECTION.
TYPES: BEGIN OF ty_user,
user LIKE sy-uname,
username TYPE string,
email TYPE string,
END OF ty_user.
TYPES: ty_user_tt TYPE STANDARD TABLE OF ty_user WITH DEFAULT KEY.
CLASS-METHODS set_username
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
iv_username TYPE string
RAISING lcx_exception.
CLASS-METHODS get_username
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
RETURNING VALUE(rv_username) TYPE string
RAISING lcx_exception.
CLASS-METHODS set_email
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
iv_email TYPE string
RAISING lcx_exception.
CLASS-METHODS get_email
IMPORTING iv_user TYPE xubname DEFAULT sy-uname
RETURNING VALUE(rv_email) TYPE string
RAISING lcx_exception.
CLASS-METHODS list
RETURNING VALUE(rt_data) TYPE ty_user_tt
RAISING lcx_exception.
CLASS-METHODS read
IMPORTING iv_name TYPE tdobname
RETURNING VALUE(rv_value) TYPE string
RAISING lcx_exception.
CLASS-METHODS save
IMPORTING iv_name TYPE tdobname
iv_value TYPE string
RAISING lcx_exception.
ENDCLASS. "lcl_user DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_user IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_user IMPLEMENTATION.
* this class is obsolete, use LCL_PERSISTENCE_USER instead
METHOD read.
DATA: lt_lines TYPE TABLE OF tline,
ls_line LIKE LINE OF lt_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'ST'
language = gc_english
name = iv_name
object = 'TEXT'
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 4 AND sy-subrc <> 0.
lcx_exception=>raise( 'error from READ_TEXT' ).
ENDIF.
READ TABLE lt_lines INTO ls_line INDEX 1.
IF sy-subrc = 0.
rv_value = ls_line-tdline.
ENDIF.
ENDMETHOD. "get_details
METHOD save.
DATA: ls_header TYPE thead,
lt_lines TYPE TABLE OF tline,
ls_line LIKE LINE OF lt_lines.
ls_line-tdformat = '*'.
ls_line-tdline = iv_value.
APPEND ls_line TO lt_lines.
ls_header-tdid = 'ST'.
ls_header-tdspras = gc_english.
ls_header-tdname = iv_name.
ls_header-tdobject = 'TEXT'.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = ls_header
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
IF sy-subrc <> 0.
ROLLBACK WORK. "#EC CI_ROLLBACK
lcx_exception=>raise( 'error from SAVE_TEXT' ).
ENDIF.
COMMIT WORK.
ENDMETHOD. "change
METHOD set_username.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name.
save( iv_name = lv_name
iv_value = iv_username ).
ENDMETHOD. "set_username
METHOD get_username.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_USERNAME_' iv_user INTO lv_name.
rv_username = read( lv_name ).
ENDMETHOD. "get_username
METHOD set_email.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name.
save( iv_name = lv_name
iv_value = iv_email ).
ENDMETHOD. "set_email
METHOD list.
DATA: lt_stxh TYPE STANDARD TABLE OF stxh WITH DEFAULT KEY.
FIELD-SYMBOLS: <ls_output> LIKE LINE OF rt_data,
<ls_stxh> LIKE LINE OF lt_stxh.
SELECT * FROM stxh INTO TABLE lt_stxh
WHERE tdobject = 'TEXT'
AND tdname LIKE 'ZABAPGIT_USERNAME_%'.
LOOP AT lt_stxh ASSIGNING <ls_stxh>.
APPEND INITIAL LINE TO rt_data ASSIGNING <ls_output>.
<ls_output>-user = <ls_stxh>-tdname+18.
<ls_output>-username = get_username( <ls_output>-user ).
<ls_output>-email = get_email( <ls_output>-user ).
ENDLOOP.
ENDMETHOD.
METHOD get_email.
DATA: lv_name TYPE tdobname.
CONCATENATE 'ZABAPGIT_EMAIL_' iv_user INTO lv_name.
rv_email = read( lv_name ).
ENDMETHOD. "get_email
ENDCLASS. "lcl_user IMPLEMENTATION

View File

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

View File

@ -5,8 +5,6 @@
*----------------------------------------------------------------------*
* CLASS lcl_repo DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_repo DEFINITION ABSTRACT.
PUBLIC SECTION.
@ -134,8 +132,6 @@ ENDCLASS. "lcl_repo_online DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_repo_offline DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_repo_offline DEFINITION INHERITING FROM lcl_repo FINAL.
PUBLIC SECTION.

View File

@ -958,4 +958,84 @@ CLASS lcl_progress IMPLEMENTATION.
ENDMETHOD.
ENDCLASS.
CLASS lcl_log DEFINITION FINAL.
PUBLIC SECTION.
METHODS:
add
IMPORTING
iv_msgv1 TYPE csequence
iv_msgv2 TYPE csequence OPTIONAL
iv_msgv3 TYPE csequence OPTIONAL
iv_msgv4 TYPE csequence OPTIONAL,
count
RETURNING VALUE(rv_count) TYPE i,
to_html
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
show.
PRIVATE SECTION.
DATA: mt_log TYPE rs_t_msg.
ENDCLASS.
CLASS lcl_log IMPLEMENTATION.
METHOD to_html.
DATA: lv_string TYPE string.
FIELD-SYMBOLS: <ls_log> LIKE LINE OF mt_log.
CREATE OBJECT ro_html.
IF count( ) = 0.
RETURN.
ENDIF.
ro_html->add( '<br>' ).
LOOP AT mt_log ASSIGNING <ls_log>.
CONCATENATE <ls_log>-msgv1
<ls_log>-msgv2
<ls_log>-msgv3
<ls_log>-msgv4 INTO lv_string SEPARATED BY space.
ro_html->add( lv_string ).
ro_html->add( '<br>' ).
ENDLOOP.
ro_html->add( '<br>' ).
ENDMETHOD.
METHOD add.
FIELD-SYMBOLS: <ls_log> LIKE LINE OF mt_log.
APPEND INITIAL LINE TO mt_log ASSIGNING <ls_log>.
<ls_log>-msgty = 'W'.
<ls_log>-msgid = '00'.
<ls_log>-msgno = '001'.
<ls_log>-msgv1 = iv_msgv1.
<ls_log>-msgv2 = iv_msgv2.
<ls_log>-msgv3 = iv_msgv3.
<ls_log>-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.