Merge remote-tracking branch 'refs/remotes/larshp/master'

This commit is contained in:
EduardoCopat 2016-12-12 14:35:51 +01:00
commit 8a24e6fc6d
25 changed files with 1396 additions and 204 deletions

View File

@ -8,6 +8,10 @@ Legend
+ : added + : added
- : removed - : removed
2016-12-01 v1.24.0
------------------
+ abap syntax highlighting
2016-11-22 2016-11-22
------------------ ------------------
+ supported object list @debugpage + supported object list @debugpage

View File

@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100.
* See http://www.abapgit.org * See http://www.abapgit.org
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.23.6'. "#EC NOTEXT gc_abap_version TYPE string VALUE 'v1.24.5'. "#EC NOTEXT
******************************************************************************** ********************************************************************************
* The MIT License (MIT) * The MIT License (MIT)

View File

@ -499,6 +499,11 @@ table.diff_tab code {
font-family: inherit; font-family: inherit;
white-space: pre; white-space: pre;
} }
table.diff_tab code span.keyword { color: #0a69ce; }
table.diff_tab code span.text { color: #48ce4f; }
table.diff_tab code span.comment { color: #808080; font-style: italic; }
table.diff_tab tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:first-child td { padding-top: 0.5em; }
table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; } table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; }
@ -582,3 +587,21 @@ table.tag {
} }
table.tag td { padding: 0.2em 0.5em; } table.tag td { padding: 0.2em 0.5em; }
table.tag td.label { background-color: #b3c1cc; } table.tag td.label { background-color: #b3c1cc; }
/* TUTORIAL */
div.tutorial {
margin-top: 3px;
background-color: #f2f2f2;
padding: 0.5em 1em 0.5em 1em;
}
div.tutorial hr { border-color: #CCC; }
div.tutorial h1 {
font-size: 18pt;
color: #404040;
}
div.tutorial h2 {
font-size: 14pt;
color: #404040;
}

View File

@ -15,13 +15,13 @@
<RELID>MI</RELID> <RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID> <OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>filename</NAME> <NAME>filename</NAME>
<VALUE>common.css</VALUE> <VALUE>~wwwtmp.css</VALUE>
</WWWPARAMS> </WWWPARAMS>
<WWWPARAMS> <WWWPARAMS>
<RELID>MI</RELID> <RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID> <OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>filesize</NAME> <NAME>filesize</NAME>
<VALUE>12136</VALUE> <VALUE>12615</VALUE>
</WWWPARAMS> </WWWPARAMS>
<WWWPARAMS> <WWWPARAMS>
<RELID>MI</RELID> <RELID>MI</RELID>

View File

@ -171,7 +171,9 @@ CONSTANTS: BEGIN OF gc_action,
repo_toggle_fav TYPE string VALUE 'repo_toggle_fav', repo_toggle_fav TYPE string VALUE 'repo_toggle_fav',
abapgit_home TYPE string VALUE 'abapgit_home', abapgit_home TYPE string VALUE 'abapgit_home',
abapgit_wiki TYPE string VALUE 'abapgit_wiki',
abapgit_install TYPE string VALUE 'abapgit_install', abapgit_install TYPE string VALUE 'abapgit_install',
abapgit_install_pi TYPE string VALUE 'abapgit_install_pi',
zip_import TYPE string VALUE 'zip_import', zip_import TYPE string VALUE 'zip_import',
zip_export TYPE string VALUE 'zip_export', zip_export TYPE string VALUE 'zip_export',
@ -203,6 +205,8 @@ CONSTANTS: BEGIN OF gc_action,
go_branch_overview TYPE string VALUE 'go_branch_overview', go_branch_overview TYPE string VALUE 'go_branch_overview',
go_playground TYPE string VALUE 'go_playground', go_playground TYPE string VALUE 'go_playground',
go_debuginfo TYPE string VALUE 'go_debuginfo', go_debuginfo TYPE string VALUE 'go_debuginfo',
go_settings type string value 'go_settings', go_settings TYPE STRING VALUE 'go_settings',
go_tutorial TYPE STRING VALUE 'go_tutorial',
jump TYPE string VALUE 'jump', jump TYPE string VALUE 'jump',
jump_pkg TYPE string VALUE 'jump_pkg',
END OF gc_action. END OF gc_action.

View File

@ -13,6 +13,8 @@ INCLUDE zabapgit_repo_browser_util.
* Components and templates * Components and templates
INCLUDE zabapgit_view_repo. INCLUDE zabapgit_view_repo.
INCLUDE zabapgit_view_tutorial.
INCLUDE zabapgit_syntax_highlighter.
* Pages * Pages
INCLUDE zabapgit_page_commit. INCLUDE zabapgit_page_commit.

View File

@ -96,15 +96,22 @@ CLASS lcl_gui_router IMPLEMENTATION.
WHEN gc_action-go_playground. " Create playground page WHEN gc_action-go_playground. " Create playground page
ei_page = get_page_playground( ). ei_page = get_page_playground( ).
ev_state = gc_event_state-new_page. ev_state = gc_event_state-new_page.
WHEN gc_action-go_tutorial. " Go to tutorial
lcl_app=>user( )->set_repo_show( '' ). " Clear show_id
ev_state = gc_event_state-re_render. " Assume we are on main page
" SAP GUI actions " SAP GUI actions
WHEN gc_action-jump. WHEN gc_action-jump. " Open object editor
lcl_html_action_utils=>jump_decode( EXPORTING iv_string = iv_getdata lcl_html_action_utils=>jump_decode( EXPORTING iv_string = iv_getdata
IMPORTING ev_obj_type = ls_item-obj_type IMPORTING ev_obj_type = ls_item-obj_type
ev_obj_name = ls_item-obj_name ). ev_obj_name = ls_item-obj_name ).
lcl_objects=>jump( ls_item ). lcl_objects=>jump( ls_item ).
ev_state = gc_event_state-no_more_act. ev_state = gc_event_state-no_more_act.
WHEN gc_action-jump_pkg. " Open SE80
lcl_services_repo=>open_se80( |{ iv_getdata }| ).
ev_state = gc_event_state-no_more_act.
" DB actions " DB actions
WHEN gc_action-db_display OR gc_action-db_edit. " DB Display/Edit WHEN gc_action-db_display OR gc_action-db_edit. " DB Display/Edit
ei_page = get_page_db_by_name( iv_name = iv_action iv_getdata = iv_getdata ). ei_page = get_page_db_by_name( iv_name = iv_action iv_getdata = iv_getdata ).
@ -125,9 +132,15 @@ CLASS lcl_gui_router IMPLEMENTATION.
WHEN gc_action-abapgit_home. " Go abapGit homepage WHEN gc_action-abapgit_home. " Go abapGit homepage
lcl_services_abapgit=>open_abapgit_homepage( ). lcl_services_abapgit=>open_abapgit_homepage( ).
ev_state = gc_event_state-no_more_act. ev_state = gc_event_state-no_more_act.
WHEN gc_action-abapgit_wiki. " Go abapGit wikipage
lcl_services_abapgit=>open_abapgit_wikipage( ).
ev_state = gc_event_state-no_more_act.
WHEN gc_action-abapgit_install. " Install abapGit WHEN gc_action-abapgit_install. " Install abapGit
lcl_services_abapgit=>install_abapgit( ). lcl_services_abapgit=>install_abapgit( ).
ev_state = gc_event_state-re_render. ev_state = gc_event_state-re_render.
WHEN gc_action-abapgit_install_pi. " Install abapGit plugins
lcl_services_abapgit=>install_abapgit_pi( ).
ev_state = gc_event_state-re_render.
" Repository services actions " Repository services actions
WHEN gc_action-repo_newoffline. " New offline repo WHEN gc_action-repo_newoffline. " New offline repo

View File

@ -21,6 +21,8 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY. TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY.
TYPES: ty_seocompotx_tt TYPE STANDARD TABLE OF seocompotx WITH DEFAULT KEY.
DATA mv_skip_testclass TYPE abap_bool. DATA mv_skip_testclass TYPE abap_bool.
METHODS deserialize_abap METHODS deserialize_abap
@ -216,11 +218,21 @@ CLASS lcl_object_clas IMPLEMENTATION.
DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc, DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc,
ls_reposrc LIKE LINE OF lt_reposrc, ls_reposrc LIKE LINE OF lt_reposrc,
lt_includes TYPE STANDARD TABLE OF ty_includes. lt_includes TYPE STANDARD TABLE OF ty_includes,
lv_clsname TYPE seoclsname.
lv_clsname = ms_item-obj_name.
CASE ms_item-obj_type.
WHEN 'CLAS'.
lt_includes = get_all_class_includes( ). lt_includes = get_all_class_includes( ).
ASSERT lines( lt_includes ) > 0. ASSERT lines( lt_includes ) > 0.
WHEN 'INTF'.
APPEND cl_oo_classname_service=>get_interfacepool_name( lv_clsname ) TO lt_includes.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
SELECT unam udat utime FROM reposrc SELECT unam udat utime FROM reposrc
INTO TABLE lt_reposrc INTO TABLE lt_reposrc
@ -621,6 +633,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
lt_tpool TYPE textpool_table, lt_tpool TYPE textpool_table,
lv_object TYPE dokhl-object, lv_object TYPE dokhl-object,
lv_state TYPE dokhl-dokstate, lv_state TYPE dokhl-dokstate,
lt_descriptions TYPE ty_seocompotx_tt,
ls_vseointerf TYPE vseointerf, ls_vseointerf TYPE vseointerf,
ls_clskey TYPE seoclskey, ls_clskey TYPE seoclskey,
lt_sotr TYPE ty_sotr_tt, lt_sotr TYPE ty_sotr_tt,
@ -712,6 +725,14 @@ CLASS lcl_object_clas IMPLEMENTATION.
ig_data = lt_lines ). ig_data = lt_lines ).
ENDIF. ENDIF.
SELECT * FROM seocompotx INTO TABLE lt_descriptions
WHERE clsname = ls_clskey-clsname.
DELETE lt_descriptions WHERE descript IS INITIAL.
IF lines( lt_descriptions ) > 0.
io_xml->add( iv_name = 'DESCRIPTIONS'
ig_data = lt_descriptions ).
ENDIF.
ENDMETHOD. "serialize_xml ENDMETHOD. "serialize_xml
METHOD lif_object~deserialize. METHOD lif_object~deserialize.
@ -878,6 +899,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
lt_locals_imp TYPE seop_source_string, lt_locals_imp TYPE seop_source_string,
lt_locals_mac TYPE seop_source_string, lt_locals_mac TYPE seop_source_string,
lt_testclasses TYPE seop_source_string, lt_testclasses TYPE seop_source_string,
lt_descriptions TYPE ty_seocompotx_tt,
ls_clskey TYPE seoclskey. ls_clskey TYPE seoclskey.
@ -977,6 +999,11 @@ CLASS lcl_object_clas IMPLEMENTATION.
it_source = lt_source ). it_source = lt_source ).
ENDTRY. ENDTRY.
io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
CHANGING cg_data = lt_descriptions ).
DELETE FROM seocompotx WHERE clsname = ls_clskey-clsname.
INSERT seocompotx FROM TABLE lt_descriptions.
lcl_objects_activation=>add_item( ms_item ). lcl_objects_activation=>add_item( ms_item ).
ENDMETHOD. "deserialize ENDMETHOD. "deserialize

View File

@ -32,6 +32,7 @@ CLASS lcl_object_susc IMPLEMENTATION.
METHOD lif_object~get_metadata. METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists. METHOD lif_object~exists.

View File

@ -522,8 +522,8 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ls_component_key TYPE wdy_md_component_key, ls_component_key TYPE wdy_md_component_key,
ls_view_key TYPE wdy_md_view_key. ls_view_key TYPE wdy_md_view_key.
FIELD-SYMBOLS: <ls_object> LIKE LINE OF lt_objects. FIELD-SYMBOLS: <ls_object> LIKE LINE OF lt_objects,
<ls_meta> LIKE LINE OF rs_component-ctlr_metadata.
CLEAR mt_components. CLEAR mt_components.
CLEAR mt_sources. CLEAR mt_sources.
@ -550,6 +550,21 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
definition-component_name ASCENDING definition-component_name ASCENDING
definition-controller_name ASCENDING. definition-controller_name ASCENDING.
LOOP AT rs_component-ctlr_metadata ASSIGNING <ls_meta>.
SORT <ls_meta>-descriptions.
SORT <ls_meta>-controller_usages.
SORT <ls_meta>-controller_components.
SORT <ls_meta>-controller_component_texts.
SORT <ls_meta>-controller_parameters.
SORT <ls_meta>-controller_parameter_texts.
SORT <ls_meta>-context_nodes.
SORT <ls_meta>-context_attributes.
SORT <ls_meta>-context_mappings.
SORT <ls_meta>-fieldgroups.
SORT <ls_meta>-controller_exceptions.
SORT <ls_meta>-controller_exception_texts.
ENDLOOP.
SORT mt_components BY SORT mt_components BY
component_name ASCENDING component_name ASCENDING
controller_name ASCENDING controller_name ASCENDING

View File

@ -137,7 +137,10 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
IF iv_show_package = abap_true. IF iv_show_package = abap_true.
ro_html->add( '<img src="img/pkg">' ). ro_html->add( '<img src="img/pkg">' ).
ro_html->add( |<span>{ io_repo->get_package( ) }</span>| ). ro_html->add( '<span>' ).
ro_html->add_anchor( iv_txt = io_repo->get_package( )
iv_act = |{ gc_action-jump_pkg }?{ io_repo->get_package( ) }| ).
ro_html->add( '</span>' ).
ENDIF. ENDIF.
ro_html->add( '</td>' ). ro_html->add( '</td>' ).

View File

@ -6,10 +6,9 @@ CLASS lcl_gui_page_debuginfo DEFINITION FINAL INHERITING FROM lcl_gui_page_super
PUBLIC SECTION. PUBLIC SECTION.
METHODS lif_gui_page~render REDEFINITION. METHODS lif_gui_page~render REDEFINITION.
PRIVATE SECTION.
METHODS scripts METHODS scripts
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
PRIVATE SECTION.
METHODS render_debug_info METHODS render_debug_info
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_supported_object_types METHODS render_supported_object_types

View File

@ -255,19 +255,24 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
METHOD render_lines. METHOD render_lines.
DATA: lt_diffs TYPE lcl_diff=>ty_diffs_tt, DATA: lo_highlighter TYPE REF TO lcl_code_highlighter,
lt_diffs TYPE lcl_diff=>ty_diffs_tt,
lv_local TYPE string, lv_local TYPE string,
lv_remote TYPE string, lv_remote TYPE string,
lv_lattr TYPE string, lv_lattr TYPE string,
lv_rattr TYPE string, lv_rattr TYPE string,
lv_highlight TYPE abap_bool,
lv_insert_nav TYPE abap_bool. lv_insert_nav TYPE abap_bool.
FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs. FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
CREATE OBJECT lo_highlighter.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
lt_diffs = is_diff-o_diff->get( ). lt_diffs = is_diff-o_diff->get( ).
lv_highlight = boolc( is_diff-filename CP '*.abap' ).
LOOP AT lt_diffs ASSIGNING <ls_diff>. LOOP AT lt_diffs ASSIGNING <ls_diff>.
IF <ls_diff>-short = abap_false. IF <ls_diff>-short = abap_false.
lv_insert_nav = abap_true. lv_insert_nav = abap_true.
@ -280,11 +285,19 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDIF. ENDIF.
IF is_diff-mod = c_mod-remote. " Remote file leading changes IF is_diff-mod = c_mod-remote. " Remote file leading changes
lv_local = escape( val = <ls_diff>-old format = cl_abap_format=>e_html_attr ). lv_local = <ls_diff>-old.
lv_remote = escape( val = <ls_diff>-new format = cl_abap_format=>e_html_attr ). lv_remote = <ls_diff>-new.
ELSE. " Local leading changes or both were modified ELSE. " Local leading changes or both were modified
lv_local = escape( val = <ls_diff>-new format = cl_abap_format=>e_html_attr ). lv_local = <ls_diff>-new.
lv_remote = escape( val = <ls_diff>-old format = cl_abap_format=>e_html_attr ). lv_remote = <ls_diff>-old.
ENDIF.
IF lv_highlight = abap_true.
lv_local = lo_highlighter->process_line( lv_local ).
lv_remote = lo_highlighter->process_line( lv_remote ).
ELSE.
lv_local = escape( val = lv_local format = cl_abap_format=>e_html_attr ).
lv_remote = escape( val = lv_remote format = cl_abap_format=>e_html_attr ).
ENDIF. ENDIF.
get_line_hl( EXPORTING iv_mod = is_diff-mod get_line_hl( EXPORTING iv_mod = is_diff-mod
@ -343,6 +356,11 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ro_html->add( title( 'DIFF' ) ). ro_html->add( title( 'DIFF' ) ).
LOOP AT mt_diff_files INTO ls_diff_file. LOOP AT mt_diff_files INTO ls_diff_file.
lcl_progress=>show( iv_key = 'Diff'
iv_current = sy-tabix
iv_total = lines( mt_diff_files )
iv_text = |Render Diff - { ls_diff_file-filename }| ).
ro_html->add( render_diff( ls_diff_file ) ). ro_html->add( render_diff( ls_diff_file ) ).
ENDLOOP. ENDLOOP.

View File

@ -116,6 +116,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt,
lx_error TYPE REF TO lcx_exception, lx_error TYPE REF TO lcx_exception,
lo_tutorial TYPE REF TO lcl_gui_view_tutorial,
lo_repo LIKE LINE OF lt_repos. lo_repo LIKE LINE OF lt_repos.
retrieve_active_repo( ). " Get and validate key of user default repo retrieve_active_repo( ). " Get and validate key of user default repo
@ -136,10 +137,15 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
IF lines( lt_repos ) = 0 AND lx_error IS INITIAL. IF lines( lt_repos ) = 0 AND lx_error IS INITIAL.
ro_html->add( render_explore( ) ). ro_html->add( render_explore( ) ).
ELSE.
IF mv_show IS INITIAL.
CREATE OBJECT lo_tutorial.
ro_html->add( lo_tutorial->lif_gui_page~render( ) ).
ELSE. ELSE.
lo_repo = lcl_app=>repo_srv( )->get( mv_show ). lo_repo = lcl_app=>repo_srv( )->get( mv_show ).
ro_html->add( render_repo( lo_repo ) ). ro_html->add( render_repo( lo_repo ) ).
ENDIF. ENDIF.
ENDIF.
ro_html->add( footer( ) ). ro_html->add( footer( ) ).
@ -165,15 +171,8 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
lo_repo = lcl_app=>repo_srv( )->get( mv_show ). lo_repo = lcl_app=>repo_srv( )->get( mv_show ).
CATCH lcx_exception. CATCH lcx_exception.
CLEAR mv_show. CLEAR mv_show.
ENDTRY.
ENDIF.
IF mv_show IS INITIAL. " Fall back to first available repo
READ TABLE lt_repos INTO lo_repo INDEX 1.
IF sy-subrc = 0.
mv_show = lo_repo->get_key( ).
lcl_app=>user( )->set_repo_show( mv_show ). lcl_app=>user( )->set_repo_show( mv_show ).
ENDIF. ENDTRY.
ENDIF. ENDIF.
IF lv_show_old <> mv_show AND NOT mv_show IS INITIAL. IF lv_show_old <> mv_show AND NOT mv_show IS INITIAL.
@ -186,28 +185,32 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
METHOD build_main_menu. METHOD build_main_menu.
DATA lo_betasub TYPE REF TO lcl_html_toolbar. DATA: lo_advsub TYPE REF TO lcl_html_toolbar,
lo_helpsub TYPE REF TO lcl_html_toolbar.
CREATE OBJECT ro_menu. CREATE OBJECT ro_menu.
CREATE OBJECT lo_betasub. CREATE OBJECT lo_advsub.
CREATE OBJECT lo_helpsub.
lo_betasub->add( iv_txt = 'Database util' iv_act = gc_action-go_db ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Database util' iv_act = gc_action-go_db ) ##NO_TEXT.
lo_betasub->add( iv_txt = 'Package to zip' iv_act = gc_action-zip_package ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Package to zip' iv_act = gc_action-zip_package ) ##NO_TEXT.
lo_betasub->add( iv_txt = 'Transport to zip' iv_act = gc_action-zip_transport ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Transport to zip' iv_act = gc_action-zip_transport ) ##NO_TEXT.
lo_betasub->add( iv_txt = 'Object to files' iv_act = gc_action-zip_object ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Object to files' iv_act = gc_action-zip_object ) ##NO_TEXT.
lo_betasub->add( iv_txt = 'Test changed by' iv_act = c_actions-changed_by ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Test changed by' iv_act = c_actions-changed_by ) ##NO_TEXT.
lo_betasub->add( iv_txt = 'Page playground' iv_act = gc_action-go_playground ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Page playground' iv_act = gc_action-go_playground ) ##NO_TEXT.
lo_betasub->add( iv_txt = 'Debug info' iv_act = gc_action-go_debuginfo ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Debug info' iv_act = gc_action-go_debuginfo ) ##NO_TEXT.
lo_betasub->add( iv_txt = 'Settings' iv_act = gc_action-go_settings ) ##NO_TEXT. lo_advsub->add( iv_txt = 'Settings' iv_act = gc_action-go_settings ) ##NO_TEXT.
ro_menu->add( iv_txt = 'Clone' iv_act = gc_action-repo_clone ) ##NO_TEXT. lo_helpsub->add( iv_txt = 'Tutorial' iv_act = gc_action-go_tutorial ) ##NO_TEXT.
lo_helpsub->add( iv_txt = 'abapGit wiki' iv_act = gc_action-abapgit_wiki ) ##NO_TEXT.
ro_menu->add( iv_txt = '+ Clone' iv_act = gc_action-repo_clone ) ##NO_TEXT.
ro_menu->add( iv_txt = '+ Offline' iv_act = gc_action-repo_newoffline ) ##NO_TEXT.
ro_menu->add( iv_txt = 'Explore' iv_act = gc_action-go_explore ) ##NO_TEXT. ro_menu->add( iv_txt = 'Explore' iv_act = gc_action-go_explore ) ##NO_TEXT.
ro_menu->add( iv_txt = 'New offline repo' iv_act = gc_action-repo_newoffline ) ##NO_TEXT.
IF lcl_services_abapgit=>needs_installation( ) = abap_true. ro_menu->add( iv_txt = 'Advanced' io_sub = lo_advsub ) ##NO_TEXT.
ro_menu->add( iv_txt = 'Get abapGit' iv_act = gc_action-abapgit_install ) ##NO_TEXT. ro_menu->add( iv_txt = 'Help' io_sub = lo_helpsub ) ##NO_TEXT.
ENDIF.
ro_menu->add( iv_txt = 'Advanced' io_sub = lo_betasub ) ##NO_TEXT.
ENDMETHOD. "build main_menu ENDMETHOD. "build main_menu
@ -285,9 +288,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
IF lo_favbar->count( ) > 0. IF lo_favbar->count( ) > 0.
ro_html->add( lo_favbar->render( iv_sort = abap_true ) ). ro_html->add( lo_favbar->render( iv_sort = abap_true ) ).
ELSE. ELSE.
ro_html->add( '<span class="grey">No favorites found. Please' ro_html->add( `<span class="grey">No favorites so far. For more info please check ` ).
&& ' click <img src="img/star-grey"> icon repo toolbar to add' ro_html->add_anchor( iv_txt = 'tutorial' iv_act = gc_action-go_tutorial ).
&& ' it as favourite. Choose a repo there &#x2192;</span>' ). ro_html->add( '</span>' ).
ENDIF. ENDIF.
ro_html->add( '</td>' ). ro_html->add( '</td>' ).

View File

@ -3,14 +3,22 @@
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page_super. CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION. PUBLIC SECTION.
METHODS lif_gui_page~render REDEFINITION. METHODS lif_gui_page~render REDEFINITION.
METHODS lif_gui_page~on_event REDEFINITION. METHODS lif_gui_page~on_event REDEFINITION.
CONSTANTS: CONSTANTS:
BEGIN OF c_action, BEGIN OF c_action,
save_settings TYPE string VALUE 'save_settings', save_settings TYPE string VALUE 'save_settings',
END OF c_action. END OF c_action.
PRIVATE SECTION. PRIVATE SECTION.
DATA:
mo_settings TYPE REF TO lcl_settings,
mv_error TYPE abap_bool.
METHODS render_proxy METHODS render_proxy
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_development_internals METHODS render_development_internals
@ -32,14 +40,13 @@ CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
RAISING RAISING
lcx_exception. lcx_exception.
METHODS read_settings. METHODS read_settings.
DATA:
mo_settings TYPE REF TO lcl_settings,
mv_error TYPE abap_bool.
ENDCLASS. ENDCLASS.
CLASS lcl_gui_page_settings IMPLEMENTATION. CLASS lcl_gui_page_settings IMPLEMENTATION.
METHOD lif_gui_page~render. METHOD lif_gui_page~render.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
read_settings( ). read_settings( ).
@ -52,10 +59,15 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
ro_html->add( |<hr>| ). ro_html->add( |<hr>| ).
ro_html->add( render_development_internals( ) ). ro_html->add( render_development_internals( ) ).
ro_html->add( render_form_end( ) ). ro_html->add( render_form_end( ) ).
ro_html->add( footer( ) ).
ENDMETHOD. ENDMETHOD.
METHOD render_proxy. METHOD render_proxy.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( |<h2>Proxy</h2>| ). ro_html->add( |<h2>Proxy</h2>| ).
ro_html->add( |<label for="proxy_url">Proxy URL</label>| ). ro_html->add( |<label for="proxy_url">Proxy URL</label>| ).
ro_html->add( |<br>| ). ro_html->add( |<br>| ).
@ -66,11 +78,14 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
ro_html->add( `<input name="proxy_port" type="text" size="5" value="` && mo_settings->get_proxy_port( ) && `">` ). ro_html->add( `<input name="proxy_port" type="text" size="5" value="` && mo_settings->get_proxy_port( ) && `">` ).
ro_html->add( |<br>| ). ro_html->add( |<br>| ).
ro_html->add( |<br>| ). ro_html->add( |<br>| ).
ENDMETHOD. ENDMETHOD.
METHOD lif_gui_page~on_event. METHOD lif_gui_page~on_event.
DATA: DATA:
lt_post_fields TYPE tihttpnvp. lt_post_fields TYPE tihttpnvp.
CASE iv_action. CASE iv_action.
WHEN c_action-save_settings. WHEN c_action-save_settings.
lt_post_fields = parse_post( it_postdata ). lt_post_fields = parse_post( it_postdata ).
@ -86,10 +101,12 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
ev_state = gc_event_state-go_back. ev_state = gc_event_state-go_back.
ENDCASE. ENDCASE.
ENDMETHOD. ENDMETHOD.
METHOD build_settings. METHOD build_settings.
DATA ls_post_field TYPE ihttpnvp. DATA ls_post_field TYPE ihttpnvp.
CREATE OBJECT mo_settings. CREATE OBJECT mo_settings.
@ -111,22 +128,27 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
ELSE. ELSE.
mo_settings->set_run_critical_tests( abap_false ). mo_settings->set_run_critical_tests( abap_false ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD validate_settings. METHOD validate_settings.
IF ( mo_settings->get_proxy_url( ) IS NOT INITIAL AND mo_settings->get_proxy_port( ) IS INITIAL ) OR IF ( mo_settings->get_proxy_url( ) IS NOT INITIAL AND mo_settings->get_proxy_port( ) IS INITIAL ) OR
( mo_settings->get_proxy_url( ) IS INITIAL AND mo_settings->get_proxy_port( ) IS NOT INITIAL ). ( mo_settings->get_proxy_url( ) IS INITIAL AND mo_settings->get_proxy_port( ) IS NOT INITIAL ).
MESSAGE 'If specifying proxy, specify both URL and port' TYPE 'W'. MESSAGE 'If specifying proxy, specify both URL and port' TYPE 'W'.
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD parse_post. METHOD parse_post.
DATA lv_serialized_post_data TYPE string. DATA lv_serialized_post_data TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data. CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data.
rt_post_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_serialized_post_data ). rt_post_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_serialized_post_data ).
ENDMETHOD. ENDMETHOD.
@ -141,36 +163,47 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD render_form_begin. METHOD render_form_begin.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( '<div class="settings_container">' ). ro_html->add( '<div class="settings_container">' ).
ro_html->add( `<form id="settings_form" method="post" action="sapevent:` && c_action-save_settings && `">` ). ro_html->add( `<form id="settings_form" method="post" action="sapevent:` && c_action-save_settings && `">` ).
ENDMETHOD. ENDMETHOD.
METHOD render_form_end. METHOD render_form_end.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( '<input type="submit" value="Save" class="submit">' ). ro_html->add( '<input type="submit" value="Save" class="submit">' ).
ro_html->add( '</form>' ). ro_html->add( '</form>' ).
ro_html->add( '</div>' ). ro_html->add( '</div>' ).
ENDMETHOD. ENDMETHOD.
METHOD read_settings. METHOD read_settings.
DATA lo_settings_persistence TYPE REF TO lcl_persistence_settings. DATA lo_settings_persistence TYPE REF TO lcl_persistence_settings.
lo_settings_persistence = lcl_app=>settings( ). lo_settings_persistence = lcl_app=>settings( ).
mo_settings = lo_settings_persistence->read( ). mo_settings = lo_settings_persistence->read( ).
ENDMETHOD. ENDMETHOD.
METHOD render_development_internals. METHOD render_development_internals.
DATA lv_checked TYPE string. DATA lv_checked TYPE string.
IF mo_settings->get_run_critical_tests( ) = abap_true. IF mo_settings->get_run_critical_tests( ) = abap_true.
lv_checked = 'checked'. lv_checked = 'checked'.
ENDIF. ENDIF.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
ro_html->add( |<h2>abapGit Development Internals settings</h2>| ). ro_html->add( |<h2>abapGit Development Internals settings</h2>| ).
ro_html->add( `<input type="checkbox" name="critical_tests" value="X" ` ro_html->add( `<input type="checkbox" name="critical_tests" value="X" `
&& lv_checked && ` > Enable critical unit tests (see LTCL_DANGEROUS)` ). && lv_checked && ` > Enable critical unit tests (see LTCL_DANGEROUS)` ).
ro_html->add( |<br>| ). ro_html->add( |<br>| ).
ro_html->add( |<br>| ). ro_html->add( |<br>| ).
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -239,9 +239,11 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
iv_style = 'display: none' iv_style = 'display: none'
iv_txt = 'Commit' iv_txt = 'Commit'
iv_opt = gc_html_opt-emphas ) ##NO_TEXT. iv_opt = gc_html_opt-emphas ) ##NO_TEXT.
IF lines( ms_files-local ) > 0.
ro_html->add_anchor( iv_act = |{ c_action-stage_all }| ro_html->add_anchor( iv_act = |{ c_action-stage_all }|
iv_id = 'act_commit_all' iv_id = 'act_commit_all'
iv_txt = 'Add all and commit') ##NO_TEXT. iv_txt = 'Add all and commit') ##NO_TEXT.
ENDIF.
ro_html->add( '</div>' ). ro_html->add( '</div>' ).
ENDMETHOD. "render_menu ENDMETHOD. "render_menu

View File

@ -59,8 +59,14 @@ CLASS lcl_popups DEFINITION FINAL.
default_button TYPE char1 DEFAULT '1' default_button TYPE char1 DEFAULT '1'
display_cancel_button TYPE char1 DEFAULT abap_true display_cancel_button TYPE char1 DEFAULT abap_true
RETURNING VALUE(rv_answer) TYPE char1 RETURNING VALUE(rv_answer) TYPE char1
RAISING lcx_exception,
popup_to_inform
IMPORTING
titlebar TYPE clike
text_message TYPE clike
RAISING lcx_exception. RAISING lcx_exception.
ENDCLASS. ENDCLASS.
CLASS lcl_popups IMPLEMENTATION. CLASS lcl_popups IMPLEMENTATION.
@ -438,4 +444,22 @@ CLASS lcl_popups IMPLEMENTATION.
ENDMETHOD. "popup_to_confirm ENDMETHOD. "popup_to_confirm
METHOD popup_to_inform.
DATA: lv_line1 TYPE char70,
lv_line2 TYPE char70.
lv_line1 = text_message.
IF strlen( text_message ) > 70.
lv_line2 = text_message+70.
ENDIF.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = titlebar
txt1 = lv_line1
txt2 = lv_line2.
ENDMETHOD. " popup_to_inform.
ENDCLASS. ENDCLASS.

View File

@ -215,9 +215,10 @@ CLASS lcl_sap_package IMPLEMENTATION.
ENDIF. ENDIF.
ls_child-devclass = iv_child. ls_child-devclass = iv_child.
ls_child-dlvunit = li_parent->software_component.
ls_child-ctext = iv_child. ls_child-ctext = iv_child.
ls_child-parentcl = iv_parent. ls_child-parentcl = iv_parent.
ls_child-component = li_parent->transport_layer. ls_child-pdevclass = li_parent->transport_layer.
ls_child-as4user = sy-uname. ls_child-as4user = sy-uname.
create( ls_child ). create( ls_child ).
@ -247,6 +248,12 @@ CLASS lcl_sap_package IMPLEMENTATION.
ls_package = is_package. ls_package = is_package.
" Set software component to 'HOME' if none is set at this point.
" Otherwise SOFTWARE_COMPONENT_INVALID will be raised.
IF ls_package-dlvunit IS INITIAL.
ls_package-dlvunit = 'HOME'.
ENDIF.
cl_package_factory=>create_new_package( cl_package_factory=>create_new_package(
EXPORTING EXPORTING
i_reuse_deleted_object = abap_true i_reuse_deleted_object = abap_true
@ -348,7 +355,7 @@ CLASS lcl_sap_package IMPLEMENTATION.
ls_package-devclass = iv_package. ls_package-devclass = iv_package.
ls_package-ctext = iv_package. ls_package-ctext = iv_package.
ls_package-parentcl = '$TMP'. ls_package-parentcl = '$TMP'.
ls_package-component = 'LOCAL'. ls_package-dlvunit = 'LOCAL'.
ls_package-as4user = sy-uname. ls_package-as4user = sy-uname.
create( ls_package ). create( ls_package ).

View File

@ -6,6 +6,7 @@ CLASS lcl_services_abapgit DEFINITION FINAL.
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS c_abapgit_homepage TYPE string VALUE 'http://www.abapgit.org' ##NO_TEXT. CONSTANTS c_abapgit_homepage TYPE string VALUE 'http://www.abapgit.org' ##NO_TEXT.
CONSTANTS c_abapgit_wikipage TYPE string VALUE 'https://github.com/larshp/abapGit/wiki'.
CONSTANTS c_package_abapgit TYPE devclass VALUE '$ABAPGIT'. CONSTANTS c_package_abapgit TYPE devclass VALUE '$ABAPGIT'.
CONSTANTS c_package_plugins TYPE devclass VALUE '$ABAPGIT_PLUGINS'. CONSTANTS c_package_plugins TYPE devclass VALUE '$ABAPGIT_PLUGINS'.
CONSTANTS c_abapgit_url TYPE string VALUE 'https://github.com/larshp/abapGit.git'. CONSTANTS c_abapgit_url TYPE string VALUE 'https://github.com/larshp/abapGit.git'.
@ -14,11 +15,29 @@ CLASS lcl_services_abapgit DEFINITION FINAL.
CLASS-METHODS open_abapgit_homepage CLASS-METHODS open_abapgit_homepage
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS open_abapgit_wikipage
RAISING lcx_exception.
CLASS-METHODS install_abapgit CLASS-METHODS install_abapgit
RAISING lcx_exception lcx_cancel. RAISING lcx_exception lcx_cancel.
CLASS-METHODS needs_installation CLASS-METHODS install_abapgit_pi
RETURNING VALUE(rv_not_completely_installed) TYPE abap_bool. RAISING lcx_exception lcx_cancel.
CLASS-METHODS is_installed
RETURNING VALUE(rv_installed) TYPE abap_bool.
CLASS-METHODS is_installed_pi
RETURNING VALUE(rv_installed) TYPE abap_bool.
PRIVATE SECTION.
CLASS-METHODS do_install
IMPORTING iv_title TYPE c
iv_text TYPE c
iv_url TYPE string
iv_package TYPE devclass
RAISING lcx_exception.
ENDCLASS. "lcl_services_abapgit ENDCLASS. "lcl_services_abapgit
@ -35,71 +54,121 @@ CLASS lcl_services_abapgit IMPLEMENTATION.
ENDMETHOD. "open_abapgit_homepage ENDMETHOD. "open_abapgit_homepage
METHOD open_abapgit_wikipage.
cl_gui_frontend_services=>execute(
EXPORTING document = c_abapgit_wikipage
EXCEPTIONS OTHERS = 1 ).
IF sy-subrc <> 0.
lcx_exception=>raise( 'Opening page in external browser failed.' ).
ENDIF.
ENDMETHOD. "open_abapgit_wikipage
METHOD install_abapgit. METHOD install_abapgit.
CONSTANTS lc_title TYPE c LENGTH 40 VALUE 'Install abapGit'.
DATA lv_text TYPE c LENGTH 100. 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 { c_package_abapgit } | IF is_installed( ) = abap_true.
&& |and plugins to { c_package_plugins }|. lv_text = 'Seems like abapGit package is already installed. No changes to be done'.
lcl_popups=>popup_to_inform(
titlebar = lc_title
text_message = lv_text ).
RETURN.
ENDIF.
lv_text = |Confirm to install current version of ABAPGit to package { c_package_abapgit }|.
do_install( iv_title = lc_title
iv_text = lv_text
iv_url = c_abapgit_url
iv_package = c_package_abapgit ).
ENDMETHOD. "install_abapgit
METHOD install_abapgit_pi.
CONSTANTS lc_title TYPE c LENGTH 40 VALUE 'Install abapGit plugins'.
DATA lv_text TYPE c LENGTH 100.
IF is_installed_pi( ) = abap_true.
lv_text = 'Seems like abapGit plugins package is already installed. No changes to be done'.
lcl_popups=>popup_to_inform(
titlebar = lc_title
text_message = lv_text ).
RETURN.
ENDIF.
lv_text = |Confirm to install current version ABAPGit plugins to package {
c_package_plugins }|.
do_install( iv_title = lc_title
iv_text = lv_text
iv_url = c_plugins_url
iv_package = c_package_plugins ).
ENDMETHOD. "install_abapgit_pi
METHOD do_install.
DATA lo_repo TYPE REF TO lcl_repo_online.
DATA lv_answer TYPE c LENGTH 1.
lv_answer = lcl_popups=>popup_to_confirm( lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Install abapGit' titlebar = iv_title
text_question = lv_text text_question = iv_text
text_button_1 = 'Continue' text_button_1 = 'Continue'
text_button_2 = 'Cancel' text_button_2 = 'Cancel'
default_button = '2' default_button = '2'
display_cancel_button = abap_false ). "#EC NOTEXT display_cancel_button = abap_false ). "#EC NOTEXT
IF lv_answer <> '1'. IF lv_answer <> '1'.
RETURN. ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> RETURN.
ENDIF. ENDIF.
DO 2 TIMES.
CASE sy-index.
WHEN 1.
lv_url = c_abapgit_url.
lv_target_package = c_package_abapgit.
WHEN 2.
lv_url = c_plugins_url.
lv_target_package = c_package_plugins.
ENDCASE.
IF abap_false = lcl_app=>repo_srv( )->is_repo_installed( IF abap_false = lcl_app=>repo_srv( )->is_repo_installed(
iv_url = lv_url iv_url = iv_url
iv_target_package = lv_target_package ). iv_target_package = iv_package ).
lcl_sap_package=>create_local( lv_target_package ). lcl_sap_package=>create_local( iv_package ).
lo_repo = lcl_app=>repo_srv( )->new_online( lo_repo = lcl_app=>repo_srv( )->new_online(
iv_url = lv_url iv_url = iv_url
iv_branch_name = 'refs/heads/master' "TODO replace with HEAD ? iv_branch_name = 'refs/heads/master'
iv_package = lv_target_package ) ##NO_TEXT. iv_package = iv_package ) ##NO_TEXT.
lo_repo->status( ). " check for errors lo_repo->status( ). " check for errors
lo_repo->deserialize( ). lo_repo->deserialize( ).
ENDIF. ENDIF.
ENDDO.
COMMIT WORK. COMMIT WORK.
ENDMETHOD. "install_abapgit ENDMETHOD. " do_install.
METHOD needs_installation.
METHOD is_installed.
TRY. TRY.
IF lcl_app=>repo_srv( )->is_repo_installed( c_abapgit_url ) = abap_false rv_installed = lcl_app=>repo_srv( )->is_repo_installed( c_abapgit_url ).
OR lcl_app=>repo_srv( )->is_repo_installed( c_plugins_url ) = abap_false. " TODO, alternative checks for presence in the system
rv_not_completely_installed = abap_true.
ENDIF.
CATCH lcx_exception. CATCH lcx_exception.
" cannot be installed anyway in this case, e.g. no connection " cannot be installed anyway in this case, e.g. no connection
rv_not_completely_installed = abap_false. rv_installed = abap_false.
ENDTRY. ENDTRY.
ENDMETHOD. "needs_installation ENDMETHOD. "is_installed
METHOD is_installed_pi.
TRY.
rv_installed = lcl_app=>repo_srv( )->is_repo_installed( c_plugins_url ).
" TODO, alternative checks for presence in the system
CATCH lcx_exception.
" cannot be installed anyway in this case, e.g. no connection
rv_installed = abap_false.
ENDTRY.
ENDMETHOD. "is_installed_pi
ENDCLASS. "lcl_services_abapgit ENDCLASS. "lcl_services_abapgit

View File

@ -43,6 +43,10 @@ CLASS lcl_services_repo DEFINITION FINAL.
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS open_se80
IMPORTING iv_package TYPE devclass
RAISING lcx_exception.
ENDCLASS. "lcl_services_repo ENDCLASS. "lcl_services_repo
CLASS lcl_services_repo IMPLEMENTATION. CLASS lcl_services_repo IMPLEMENTATION.
@ -296,4 +300,16 @@ CLASS lcl_services_repo IMPLEMENTATION.
ENDMETHOD. " toggle_favorite. ENDMETHOD. " toggle_favorite.
METHOD open_se80.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
OPERATION = 'SHOW'
IN_NEW_WINDOW = 'X'
OBJECT_NAME = iv_package
OBJECT_TYPE = 'DEVC'
WITH_OBJECTLIST = 'X'.
ENDMETHOD. " open_se80.
ENDCLASS. "lcl_services_repo ENDCLASS. "lcl_services_repo

View File

@ -0,0 +1,763 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_SYNTAX_HIGHLIGHTER
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Class lcl_code_highligher
*&---------------------------------------------------------------------*
CLASS ltcl_code_highlighter1 DEFINITION DEFERRED.
CLASS ltcl_code_highlighter2 DEFINITION DEFERRED.
*----------------------------------------------------------------------*
* CLASS lcl_code_highlighter DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_code_highlighter DEFINITION FRIENDS ltcl_code_highlighter1 ltcl_code_highlighter2.
PUBLIC SECTION.
CLASS-METHODS:
class_constructor.
METHODS:
process_line
IMPORTING iv_line TYPE string
RETURNING VALUE(rv_line) TYPE string.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_token,
keyword TYPE c VALUE 'K',
text TYPE c VALUE 'T',
comment TYPE c VALUE 'C',
none TYPE c VALUE 'N',
END OF c_token.
CONSTANTS:
BEGIN OF c_css,
keyword TYPE string VALUE 'keyword',
text TYPE string VALUE 'text',
comment TYPE string VALUE 'comment',
none TYPE string VALUE 'none',
END OF c_css.
TYPES:
BEGIN OF ty_match,
token TYPE char1, " Type of matches
offset TYPE i, " Beginning position of the string that should be formatted
length TYPE i, " Length of the string that should be formatted
text_tag TYPE string, " Type of text tag
END OF ty_match.
TYPES:
ty_match_tt TYPE STANDARD TABLE OF ty_match WITH DEFAULT KEY.
TYPES:
BEGIN OF ty_regex,
regex TYPE REF TO cl_abap_regex,
token TYPE char1,
END OF ty_regex.
CLASS-DATA:
BEGIN OF c_regex,
comment TYPE string,
text TYPE string,
keyword TYPE string,
END OF c_regex.
CLASS-DATA: mo_regex_table TYPE TABLE OF ty_regex.
METHODS:
parse_line
IMPORTING iv_line TYPE string
RETURNING VALUE(rt_matches) TYPE ty_match_tt.
METHODS:
order_matches
IMPORTING iv_line TYPE string
CHANGING ct_matches TYPE ty_match_tt.
METHODS:
format_line
IMPORTING iv_line TYPE string
it_matches TYPE ty_match_tt
RETURNING VALUE(rv_line) TYPE string.
METHODS:
apply_style
IMPORTING iv_line TYPE string
iv_class TYPE string
RETURNING VALUE(rv_line) TYPE string.
ENDCLASS. "lcl_code_highlighter DEFINITION
*----------------------------------------------------------------------*
* Macros
*----------------------------------------------------------------------*
DEFINE _add_regex.
CREATE OBJECT ls_regex_table-regex
EXPORTING
pattern = c_regex-&1
ignore_case = abap_true.
ls_regex_table-token = c_token-&1.
APPEND ls_regex_table TO mo_regex_table.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
* CLASS lcl_code_highlighter IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_code_highlighter IMPLEMENTATION.
METHOD class_constructor.
DATA: ls_regex_table TYPE ty_regex.
c_regex-comment = '##|"|^\*'.
c_regex-text = '`|''|\||\{|\}'.
c_regex-keyword = '&&|\b(' &&
'\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY' &&
'|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS' &&
'|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE' &&
'|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT' &&
'|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY' &&
'|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN' &&
'|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK' &&
'|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT' &&
'|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS' &&
'|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED' &&
'|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHARACTER|CHARLEN' &&
'|CHAR-TO-HEX|CHECK|CHECKBOX|CI_|CIRCULAR|CLASS|CLASS-CODING|CLASS-DATA' &&
'|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE' &&
'|CN|CNT|CO|COALESCE|CODE|CODING|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY' &&
'|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COLLECT|COLOR|COLUMN|COLUMNS' &&
'|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS' &&
'|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT' &&
'|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION' &&
'|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE' &&
'|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION' &&
'|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE' &&
'|DAYLIGHT|DBMAXLEN|DD/MM/YY|DD/MM/YYYY|DDMMYY|DEALLOCATE|DECIMAL_SHIFT|DECIMALS' &&
'|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING' &&
'|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY' &&
'|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING' &&
'|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH' &&
'|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|ENDAT|ENDCASE' &&
'|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|END-ENHANCEMENT-SECTION' &&
'|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE' &&
'|END-LINES|ENDLOOP|ENDMETHOD|ENDMODULE|END-OF-DEFINITION|END-OF-FILE' &&
'|END-OF-PAGE|END-OF-SELECTION|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE' &&
'|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENTS|ENHANCEMENT-SECTION' &&
'|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING' &&
'|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTIONS|EXCEPTION-TABLE|EXCLUDE|EXCLUDING' &&
'|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT' &&
'|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD' &&
'|FIELD-GROUPS|FIELDS|FIELD-SYMBOL|FIELD-SYMBOLS|FILE|FILTER|FILTERS|FILTER-TABLE' &&
'|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM' &&
'|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTIONALITY' &&
'|FUNCTION-POOL|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER' &&
'|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEADER|HEADERS' &&
'|HEADING|HEAD-LINES|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID' &&
'|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION' &&
'|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE' &&
'|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL' &&
'|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE' &&
'|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS' &&
'|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND' &&
'|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS' &&
'|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINEFEED' &&
'|LINES|LINE-SELECTION|LINE-SIZE|LIST|LISTBOX|LIST-PROCESSING|LITTLE|LLANG' &&
'|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG10|LOGFILE|LOGICAL' &&
'|LOG-POINT|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN' &&
'|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE' &&
'|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM/DD/YY' &&
'|MM/DD/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING' &&
'|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING' &&
'|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NODE|NODES|NO-DISPLAY' &&
'|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NON-UNICODE|NON-UNIQUE' &&
'|NO-SCROLLING|NO-SIGN|NOT|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NP|NS|NULL|NUMBER' &&
'|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF' &&
'|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT' &&
'|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE' &&
'|PAGES|PARAMETER|PARAMETERS|PARAMETER-TABLE|PART|PARTIALLY|PATTERN|PERCENTAGE' &&
'|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POS_HIGH|POS_LOW' &&
'|POSITION|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL' &&
'|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC' &&
'|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES' &&
'|RAW|READ|READER|READ-ONLY|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION' &&
'|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE' &&
'|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION' &&
'|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE' &&
'|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE' &&
'|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL' &&
'|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO' &&
'|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECTION' &&
'|SELECTIONS|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS' &&
'|SELECTOR|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN' &&
'|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE' &&
'|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP' &&
'|STANDARD|STARTING|START-OF-SELECTION|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO' &&
'|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE' &&
'|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED' &&
'|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE' &&
'|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP' &&
'|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP' &&
'|TIMEZONE|TITLE|TITLEBAR|TITLE-LINES|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE' &&
'|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE' &&
'|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES' &&
'|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL' &&
'|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES' &&
'|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER' &&
'|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' &&
'|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE' &&
')\b'.
" Initialize instances of regular expressions
_add_regex keyword.
_add_regex comment.
_add_regex text.
ENDMETHOD. "class_constructor
METHOD parse_line.
DATA:
lo_regex TYPE REF TO cl_abap_regex,
lo_matcher TYPE REF TO cl_abap_matcher,
lt_result TYPE match_result_tab,
ls_match TYPE ty_match.
FIELD-SYMBOLS:
<regex> TYPE ty_regex,
<result> TYPE match_result,
<match> TYPE ty_match.
LOOP AT mo_regex_table ASSIGNING <regex>.
lo_regex = <regex>-regex.
lo_matcher = lo_regex->create_matcher( text = iv_line ).
lt_result = lo_matcher->find_all( ).
LOOP AT lt_result ASSIGNING <result>.
ls_match-token = <regex>-token.
ls_match-offset = <result>-offset.
ls_match-length = <result>-length.
IF ls_match-token = c_token-text.
ls_match-text_tag = substring( val = iv_line off = ls_match-offset len = ls_match-length ).
ENDIF.
APPEND ls_match TO rt_matches.
ENDLOOP.
ENDLOOP.
ENDMETHOD. " parse_line
METHOD order_matches.
DATA:
lv_index TYPE sy-tabix,
lv_line_len TYPE i,
lv_prev_token TYPE c,
lv_last_pos TYPE i VALUE 0,
lv_length TYPE i,
ls_match TYPE ty_match.
FIELD-SYMBOLS:
<prev> TYPE ty_match,
<match> TYPE ty_match.
SORT ct_matches BY offset.
lv_line_len = strlen( iv_line ).
LOOP AT ct_matches ASSIGNING <match>.
lv_index = sy-tabix.
" Delete matches after open text match
IF lv_prev_token = c_token-text AND <match>-token <> c_token-text.
DELETE ct_matches INDEX lv_index.
CONTINUE.
ENDIF.
CASE <match>-token.
WHEN c_token-comment.
<match>-length = lv_line_len - <match>-offset.
DELETE ct_matches FROM lv_index + 1.
CONTINUE.
WHEN c_token-text.
IF lv_prev_token = c_token-text.
IF <match>-text_tag = <prev>-text_tag.
<prev>-length = <match>-offset + <match>-length - <prev>-offset.
CLEAR lv_prev_token.
ELSEIF <prev>-text_tag = '}' AND <match>-text_tag = '{'.
<prev>-length = <match>-offset - <prev>-offset - 1. " Shifted } out of highlight
<prev>-offset = <prev>-offset + 1. " Shifted { out of highlight
CLEAR lv_prev_token.
ELSEIF <match>-text_tag = '{'.
<prev>-length = <match>-offset - <prev>-offset.
CLEAR lv_prev_token.
ELSEIF <prev>-text_tag = '}'.
<prev>-length = <match>-offset - <prev>-offset.
<prev>-offset = <prev>-offset + 1. " Shifted } out of highlight
CLEAR lv_prev_token.
ENDIF.
DELETE ct_matches INDEX lv_index.
CONTINUE.
ENDIF.
ENDCASE.
lv_prev_token = <match>-token.
ASSIGN <match> TO <prev>.
ENDLOOP.
" Add entries refering to parts of text that should not be formatted
LOOP AT ct_matches ASSIGNING <match>.
IF <match>-offset > lv_last_pos.
lv_length = <match>-offset - lv_last_pos.
ls_match-token = c_token-none.
ls_match-offset = lv_last_pos.
ls_match-length = lv_length.
INSERT ls_match INTO ct_matches INDEX sy-tabix.
ENDIF.
lv_last_pos = <match>-offset + <match>-length.
ENDLOOP.
" Add remainder of the string
IF lv_line_len > lv_last_pos.
lv_length = lv_line_len - lv_last_pos.
ls_match-token = c_token-none.
ls_match-offset = lv_last_pos.
ls_match-length = lv_length.
APPEND ls_match TO ct_matches.
ENDIF.
ENDMETHOD. " order_matches.
METHOD format_line.
DATA:
lv_chunk TYPE string,
lv_css_class TYPE string.
FIELD-SYMBOLS:
<match> TYPE ty_match.
LOOP AT it_matches ASSIGNING <match>.
lv_chunk = substring( val = iv_line off = <match>-offset len = <match>-length ).
CASE <match>-token.
WHEN c_token-keyword.
lv_css_class = c_css-keyword.
WHEN c_token-comment.
lv_css_class = c_css-comment.
WHEN c_token-text.
lv_css_class = c_css-text.
WHEN c_token-none.
CLEAR: lv_css_class.
ENDCASE.
lv_chunk = me->apply_style( iv_line = lv_chunk
iv_class = lv_css_class ).
rv_line = rv_line && lv_chunk.
ENDLOOP.
ENDMETHOD. "format_line
METHOD apply_style.
DATA lv_escaped TYPE string.
lv_escaped = escape( val = iv_line format = cl_abap_format=>e_html_attr ).
IF iv_class IS NOT INITIAL.
rv_line = |<span class="{ iv_class }">{ lv_escaped }</span>|.
ELSE.
rv_line = lv_escaped.
ENDIF.
ENDMETHOD. "apply_style
METHOD process_line.
DATA: lt_matches TYPE ty_match_tt.
IF strlen( iv_line ) = 0.
RETURN.
ENDIF.
lt_matches = me->parse_line( iv_line ).
me->order_matches( EXPORTING iv_line = iv_line
CHANGING ct_matches = lt_matches ).
rv_line = me->format_line( iv_line = iv_line
it_matches = lt_matches ).
ENDMETHOD. " process_line
ENDCLASS. " lcl_code_highlighter IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS ltcl_code_highlighter definition
*----------------------------------------------------------------------*
CLASS ltcl_code_highlighter1 DEFINITION FINAL
FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PRIVATE SECTION.
DATA:
mo TYPE REF TO lcl_code_highlighter,
mt_after_parse TYPE lcl_code_highlighter=>ty_match_tt,
ms_match TYPE lcl_code_highlighter=>ty_match,
mt_after_order TYPE lcl_code_highlighter=>ty_match_tt.
METHODS:
setup,
test IMPORTING iv_line TYPE string,
test01 FOR TESTING,
test02 FOR TESTING,
test03 FOR TESTING,
test04 FOR TESTING,
test05 FOR TESTING,
test06 FOR TESTING,
test07 FOR TESTING.
ENDCLASS. " ltcl_code_highlighter
*----------------------------------------------------------------------*
* CLASS ltcl_code_highlighter IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS ltcl_code_highlighter1 IMPLEMENTATION.
DEFINE _generate_parse.
ms_match-token = &1.
ms_match-offset = &2.
ms_match-length = &3.
ms_match-text_tag = &4.
APPEND ms_match to mt_after_parse.
END-OF-DEFINITION.
DEFINE _generate_order.
ms_match-token = &1.
ms_match-offset = &2.
ms_match-length = &3.
ms_match-text_tag = &4.
APPEND ms_match to mt_after_order.
END-OF-DEFINITION.
METHOD setup.
CREATE OBJECT mo.
CLEAR mt_after_parse.
CLEAR mt_after_order.
ENDMETHOD. " setup
METHOD test.
DATA: lt_matches_act TYPE lcl_code_highlighter=>ty_match_tt.
lt_matches_act = mo->parse_line( iv_line ).
SORT lt_matches_act BY offset.
cl_abap_unit_assert=>assert_equals( exp = mt_after_parse
act = lt_matches_act
msg = | Error during parsing: { iv_line }| ).
IF lines( mt_after_order ) > 0.
mo->order_matches( EXPORTING iv_line = iv_line
CHANGING ct_matches = lt_matches_act ).
cl_abap_unit_assert=>assert_equals( exp = mt_after_order
act = lt_matches_act
msg = | Error during ordering: { iv_line }| ).
ENDIF.
ENDMETHOD.
******************************************************
* Test parsing and ordering of comments *
******************************************************
METHOD test01.
DATA: lv_line TYPE string.
lv_line = '* commented out line with key word data'.
" Generate table with expected values after parsing
_generate_parse 'C' 0 1 ''.
_generate_parse 'K' 12 3 ''.
_generate_parse 'K' 16 4 ''.
_generate_parse 'K' 21 4 ''.
_generate_parse 'K' 26 3 ''.
_generate_parse 'K' 30 4 ''.
_generate_parse 'K' 35 4 ''.
" Generate table with expected values after ordering
_generate_order 'C' 0 39 ''.
test( lv_line ).
ENDMETHOD.
******************************************************
* Test parsing and ordering of remainder of string *
******************************************************
METHOD test02.
DATA: lv_line TYPE string.
lv_line = 'data: lv_var_name type string.'.
" Generate table with expected values after parsing
_generate_parse 'K' 0 4 ''.
_generate_parse 'K' 18 4 ''.
" Generate table with expected values after ordering
_generate_order 'K' 0 4 ''.
_generate_order 'N' 4 14 ''.
_generate_order 'K' 18 4 ''.
_generate_order 'N' 22 8 ''.
test( lv_line ).
ENDMETHOD.
******************************************************
* Test parsing and ordering of key words & texts *
******************************************************
METHOD test03.
DATA: lv_line TYPE string.
lv_line = 'call function ''FM_NAME''. " Commented'.
" Generate table with expected values after parsing
_generate_parse 'K' 0 4 ''.
_generate_parse 'K' 5 8 ''.
_generate_parse 'T' 14 1 ''''.
_generate_parse 'T' 22 1 ''''.
_generate_parse 'C' 25 1 ''.
" Generate table with expected values after ordering
_generate_order 'K' 0 4 ''.
_generate_order 'N' 4 1 ''.
_generate_order 'K' 5 8 ''.
_generate_order 'N' 13 1 ''.
_generate_order 'T' 14 9 ''''.
_generate_order 'N' 23 2 ''.
_generate_order 'C' 25 11 ''.
test( lv_line ).
ENDMETHOD.
******************************************************
* Test parsing and ordering of key words in texts *
******************************************************
METHOD test04.
DATA: lv_line TYPE string.
lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'.
" Generate table with expected values after parsing
_generate_parse 'K' 0 9 ''.
_generate_parse 'K' 18 4 ''.
_generate_parse 'K' 30 5 ''.
_generate_parse 'T' 36 1 ''''.
_generate_parse 'K' 48 4 ''.
_generate_parse 'T' 63 1 ''''.
" Generate table with expected values after ordering
_generate_order 'K' 0 9 ''.
_generate_order 'N' 9 9 ''.
_generate_order 'K' 18 4 ''.
_generate_order 'N' 22 8 ''.
_generate_order 'K' 30 5 ''.
_generate_order 'N' 35 1 ''.
_generate_order 'T' 36 28 ''''.
_generate_order 'N' 64 1 ''.
test( lv_line ).
ENDMETHOD.
******************************************************
* Test parsing and ordering texts in curly brackets *
******************************************************
METHOD test05.
DATA: lv_line TYPE string.
lv_line = 'a = |{ b }={ c }|.'.
" Generate table with expected values after parsing
_generate_parse 'T' 4 1 '|'.
_generate_parse 'T' 5 1 '{'.
_generate_parse 'T' 9 1 '}'.
_generate_parse 'T' 11 1 '{'.
_generate_parse 'K' 13 1 ''.
_generate_parse 'T' 15 1 '}'.
_generate_parse 'T' 16 1 '|'.
" Generate table with expected values after ordering
_generate_order 'N' 0 4 ''.
_generate_order 'T' 4 1 '|'.
_generate_order 'N' 5 5 ''.
_generate_order 'T' 10 1 '}'.
_generate_order 'N' 11 2 ''.
_generate_order 'K' 13 1 ''.
_generate_order 'N' 14 2 ''.
_generate_order 'T' 16 1 '}'.
_generate_order 'N' 17 1 ''.
test( lv_line ).
ENDMETHOD.
******************************************************
* Test parsing and ordering of texts *
******************************************************
METHOD test06.
DATA: lv_line TYPE string.
lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'.
" Generate table with expected values after parsing
_generate_parse 'K' 22 2 ''.
_generate_parse 'T' 25 1 '|'.
_generate_parse 'T' 30 1 '{'.
_generate_parse 'T' 32 1 ''''.
_generate_parse 'T' 35 1 ''''.
_generate_parse 'K' 37 2 ''.
_generate_parse 'T' 40 1 '|'.
_generate_parse 'T' 43 1 '{'.
_generate_parse 'T' 45 1 ''''.
_generate_parse 'T' 48 1 ''''.
_generate_parse 'T' 50 1 '}'.
_generate_parse 'T' 51 1 '|'.
_generate_parse 'T' 53 1 '}'.
_generate_parse 'T' 54 1 '|'.
" Generate table with expected values after ordering
_generate_order 'N' 00 22 ''.
_generate_order 'K' 22 2 ''.
_generate_order 'N' 24 1 ''.
_generate_order 'T' 25 5 '|'.
_generate_order 'N' 30 2 ''.
_generate_order 'T' 32 4 ''''.
_generate_order 'N' 36 1 ''.
_generate_order 'K' 37 2 ''.
_generate_order 'N' 39 1 ''.
_generate_order 'T' 40 3 '|'.
_generate_order 'N' 43 2 ''.
_generate_order 'T' 45 4 ''''.
_generate_order 'N' 49 2 ''.
_generate_order 'T' 51 1 '}'.
_generate_order 'N' 52 2 ''.
_generate_order 'T' 54 1 '}'.
test( lv_line ).
ENDMETHOD.
METHOD test07.
DATA: lv_line TYPE string.
lv_line = 'SELECT * FROM foo'.
" Generate table with expected values after parsing
_generate_parse 'K' 0 6 ''.
_generate_parse 'K' 9 4 ''.
test( lv_line ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_code_highlighter2 DEFINITION FINAL
FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PRIVATE SECTION.
DATA:
mo TYPE REF TO lcl_code_highlighter.
METHODS: setup.
METHODS: process_line FOR TESTING.
METHODS: format_line FOR TESTING.
METHODS: apply_style FOR TESTING.
ENDCLASS. " ltcl_code_highlighter
*----------------------------------------------------------------------*
* CLASS ltcl_code_highlighter IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS ltcl_code_highlighter2 IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo.
ENDMETHOD.
METHOD format_line.
DATA:
lv_line TYPE string,
lv_line_act TYPE string,
lv_line_exp TYPE string.
lv_line = 'call function ''FM_NAME''. " Commented'.
lv_line_exp =
'<span class="keyword">call</span>' &&
' <span class="keyword">function</span>' &&
' <span class="text">&#39;FM_NAME&#39;</span>.' &&
' <span class="comment">&quot; Commented</span>'.
lv_line_act = mo->process_line( lv_line ).
cl_abap_unit_assert=>assert_equals( exp = lv_line_exp
act = lv_line_act
msg = | Error during formating: { lv_line }| ).
ENDMETHOD. " format_line
METHOD apply_style.
DATA:
lv_line_act TYPE string.
" Call the method and compare results
lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION'
iv_class = lcl_code_highlighter=>c_css-keyword ).
cl_abap_unit_assert=>assert_equals( act = lv_line_act
exp = '<span class="keyword">CALL FUNCTION</span>'
msg = 'Failure during applying of style.' ).
ENDMETHOD. " apply_style
METHOD process_line.
DATA:
lv_line_act TYPE string.
" Call the method with empty parameter and compare results
lv_line_act = mo->process_line( iv_line = '' ).
cl_abap_unit_assert=>assert_equals( act = lv_line_act
exp = ''
msg = 'Failure in method process_line.' ).
" Call the method with non-empty line and compare results
lv_line_act = mo->process_line( iv_line = '* CALL FUNCTION' ).
cl_abap_unit_assert=>assert_equals( act = lv_line_act
exp = '<span class="comment">* CALL FUNCTION</span>'
msg = 'Failure in method process_line.' ).
ENDMETHOD. " process_line
ENDCLASS. " ltcl_code_highlighter

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_SYNTAX_HIGHLIGHTER</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_SYNTAX_HIGHLIGHTER</ENTRY>
<LENGTH>35</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -97,7 +97,9 @@ CLASS lth_critical_tests IMPLEMENTATION.
"These tests may fail if you are locking the entries (e.g. the ZABAPGIT transaction is open) "These tests may fail if you are locking the entries (e.g. the ZABAPGIT transaction is open)
IF lo_settings->get_run_critical_tests( ) = abap_false. IF lo_settings->get_run_critical_tests( ) = abap_false.
cl_abap_unit_assert=>fail( 'Cancelled. You can enable these tests at the Settings page' ). cl_abap_unit_assert=>fail(
msg = 'Cancelled. You can enable these tests at the Settings page'
level = if_aunit_constants=>tolerable ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
@ -1847,68 +1849,68 @@ CLASS ltcl_file_status IMPLEMENTATION.
<state> LIKE LINE OF lt_state. <state> LIKE LINE OF lt_state.
"STATE FILE SHA1 "STATE FILE SHA1
_append_state 'zclass1.clas.xml' 'C1_F1'. _append_state '$$zclass1.clas.xml' 'C1_F1'.
" class1 testclasses is new locally, abap is new remotely " class1 testclasses is new locally, abap is new remotely
" class2 is completely new remotely " class2 is completely new remotely
_append_state 'zdoma1.doma.xml' 'D1'. _append_state '$$zdoma1.doma.xml' 'D1'.
_append_state 'zdoma2.doma.xml' 'D2'. _append_state '$$zdoma2.doma.xml' 'D2'.
_append_state 'zdoma3.doma.xml' 'D3'. _append_state '$$zdoma3.doma.xml' 'D3'.
" doma4 is new locally " doma4 is new locally
" doma5 is new remotely " doma5 is new remotely
_append_state 'zdoma6.doma.xml' 'D6'. _append_state '$$zdoma6.doma.xml' 'D6'.
" doma7 is not in state - emulate brocken cache " doma7 is not in state - emulate brocken cache
" doma8 is not in state - emulate brocken cache " doma8 is not in state - emulate brocken cache
_append_state 'zdoma9.doma.xml' 'D9'. _append_state '$$zdoma9.doma.xml' 'D9'.
_append_state 'xfeld.doma.xml' 'XFELD'. " from different package
_append_state 'num01.doma.xml' 'NUM01'. " another from different package _append_state 'num01.doma.xml' 'NUM01'. " another from different package
_append_state 'xfeld.doma.xml' 'XFELD'. " from different package
"LOCAL TYPE NAME FILE SHA1 "LOCAL TYPE NAME FILE SHA1
_append_local 'CLAS' 'ZCLASS1' 'zclass1.clas.testclasses.abap' 'C1_F3'. _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.testclasses.abap' 'C1_F3'.
_append_local 'CLAS' 'ZCLASS1' 'zclass1.clas.xml' 'C1_F1'. _append_local 'CLAS' '$$ZCLASS1' '$$zclass1.clas.xml' 'C1_F1'.
_append_local 'DOMA' 'ZDOMA1' 'zdoma1.doma.xml' 'D1'. _append_local 'DOMA' '$$ZDOMA1' '$$zdoma1.doma.xml' 'D1'.
_append_local 'DOMA' 'ZDOMA2' 'zdoma2.doma.xml' 'D2_CHANGED_L'. _append_local 'DOMA' '$$ZDOMA2' '$$zdoma2.doma.xml' 'D2_CHANGED_L'.
_append_local 'DOMA' 'ZDOMA3' 'zdoma3.doma.xml' 'D3'. _append_local 'DOMA' '$$ZDOMA3' '$$zdoma3.doma.xml' 'D3'.
_append_local 'DOMA' 'ZDOMA4' 'zdoma4.doma.xml' 'D4'. _append_local 'DOMA' '$$ZDOMA4' '$$zdoma4.doma.xml' 'D4'.
_append_local 'DOMA' 'ZDOMA6' 'zdoma6.doma.xml' 'D6_CHANGED_L'. _append_local 'DOMA' '$$ZDOMA6' '$$zdoma6.doma.xml' 'D6_CHANGED_L'.
_append_local 'DOMA' 'ZDOMA7' 'zdoma7.doma.xml' 'D7'. _append_local 'DOMA' '$$ZDOMA7' '$$zdoma7.doma.xml' 'D7'.
_append_local 'DOMA' 'ZDOMA8' 'zdoma8.doma.xml' 'D8'. _append_local 'DOMA' '$$ZDOMA8' '$$zdoma8.doma.xml' 'D8'.
" dome9 was deleted from local system. Can be found by existing state " dome9 was deleted from local system. Can be found by existing state
"REMOTE FILE SHA1 "REMOTE FILE SHA1
_append_remote 'textfile.txt' 'T1'. _append_remote 'textfile.txt' 'T1'.
_append_remote 'zclass1.clas.abap' 'C1_F2'. " Must be before xml for tougher test _append_remote '$$zclass1.clas.abap' 'C1_F2'. " Must be before xml for tougher test
_append_remote 'zclass1.clas.xml' 'C1_F1'. _append_remote '$$zclass1.clas.xml' 'C1_F1'.
_append_remote 'zclass2.clas.abap' 'C1_F2'. " Must be before xml for tougher test _append_remote '$$zclass2.clas.abap' 'C1_F2'. " Must be before xml for tougher test
_append_remote 'zclass2.clas.xml' 'C1_F1'. _append_remote '$$zclass2.clas.xml' 'C1_F1'.
_append_remote 'zdoma1.doma.xml' 'D1'. _append_remote '$$zdoma1.doma.xml' 'D1'.
_append_remote 'zdoma2.doma.xml' 'D2'. _append_remote '$$zdoma2.doma.xml' 'D2'.
_append_remote 'zdoma3.doma.xml' 'D3_CHANGED_R'. _append_remote '$$zdoma3.doma.xml' 'D3_CHANGED_R'.
_append_remote 'zdoma5.doma.xml' 'D5'. _append_remote '$$zdoma5.doma.xml' 'D5'.
_append_remote 'zdoma6.doma.xml' 'D6_CHANGED_R'. _append_remote '$$zdoma6.doma.xml' 'D6_CHANGED_R'.
_append_remote 'zdoma7.doma.xml' 'D7'. _append_remote '$$zdoma7.doma.xml' 'D7'.
_append_remote 'zdoma8.doma.xml' 'D8_CHANGED_R'. " This one is changed _append_remote '$$zdoma8.doma.xml' 'D8_CHANGED_R'. " This one is changed
_append_remote 'zdoma9.doma.xml' 'D9'. " This one is deleted locally _append_remote '$$zdoma9.doma.xml' 'D9'. " This one is deleted locally
_append_remote 'xfeld.doma.xml' 'XFELD'. " Object from different package _append_remote 'xfeld.doma.xml' 'XFELD'. " Object from different package
_append_remote 'num01.doma.xml' 'NUM01_CHANGED'. " Changed object from different package _append_remote 'num01.doma.xml' 'NUM01_CHANGED'. " Changed object from different package
"EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE
_append_result '' '' ' ' ' ' 'A' '' '/' 'textfile.txt'. _append_result '' '' ' ' ' ' 'A' '' '/' 'textfile.txt'.
_append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'.
_append_result 'CLAS' 'ZCLASS1' ' ' 'A' ' ' '$Z$' '/' 'zclass1.clas.testclasses.abap'. _append_result 'CLAS' '$$ZCLASS1' ' ' 'A' ' ' '$Z$' '/' '$$zclass1.clas.testclasses.abap'.
_append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'.
_append_result 'CLAS' 'ZCLASS2' ' ' ' ' 'A' '' '/' 'zclass2.clas.abap'. _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.abap'.
_append_result 'CLAS' 'ZCLASS2' ' ' ' ' 'A' '' '/' 'zclass2.clas.xml'. _append_result 'CLAS' '$$ZCLASS2' ' ' ' ' 'A' '' '/' '$$zclass2.clas.xml'.
_append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'.
_append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'.
_append_result 'DOMA' '$$ZDOMA3' ' ' ' ' 'M' '$Z$' '/' '$$zdoma3.doma.xml'.
_append_result 'DOMA' '$$ZDOMA4' ' ' 'A' ' ' '$Z$' '/' '$$zdoma4.doma.xml'.
_append_result 'DOMA' '$$ZDOMA5' ' ' ' ' 'A' '' '/' '$$zdoma5.doma.xml'.
_append_result 'DOMA' '$$ZDOMA6' ' ' 'M' 'M' '$Z$' '/' '$$zdoma6.doma.xml'.
_append_result 'DOMA' '$$ZDOMA7' 'X' ' ' ' ' '$Z$' '/' '$$zdoma7.doma.xml'.
_append_result 'DOMA' '$$ZDOMA8' ' ' 'M' 'M' '$Z$' '/' '$$zdoma8.doma.xml'.
_append_result 'DOMA' '$$ZDOMA9' ' ' 'D' ' ' '' '/' '$$zdoma9.doma.xml'.
_append_result 'DOMA' 'NUM01' ' ' ' ' 'M' 'SUTI' '/' 'num01.doma.xml'. _append_result 'DOMA' 'NUM01' ' ' ' ' 'M' 'SUTI' '/' 'num01.doma.xml'.
_append_result 'DOMA' 'XFELD' 'X' ' ' ' ' 'SUTI' '/' 'xfeld.doma.xml'. _append_result 'DOMA' 'XFELD' 'X' ' ' ' ' 'SUTI' '/' 'xfeld.doma.xml'.
_append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'.
_append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'.
_append_result 'DOMA' 'ZDOMA3' ' ' ' ' 'M' '$Z$' '/' 'zdoma3.doma.xml'.
_append_result 'DOMA' 'ZDOMA4' ' ' 'A' ' ' '$Z$' '/' 'zdoma4.doma.xml'.
_append_result 'DOMA' 'ZDOMA5' ' ' ' ' 'A' '' '/' 'zdoma5.doma.xml'.
_append_result 'DOMA' 'ZDOMA6' ' ' 'M' 'M' '$Z$' '/' 'zdoma6.doma.xml'.
_append_result 'DOMA' 'ZDOMA7' 'X' ' ' ' ' '$Z$' '/' 'zdoma7.doma.xml'.
_append_result 'DOMA' 'ZDOMA8' ' ' 'M' 'M' '$Z$' '/' 'zdoma8.doma.xml'.
_append_result 'DOMA' 'ZDOMA9' ' ' 'D' ' ' '' '/' 'zdoma9.doma.xml'.
lt_results_exp = lt_results. lt_results_exp = lt_results.
lt_results = lcl_file_status=>calculate_status( lt_results = lcl_file_status=>calculate_status(
@ -1983,10 +1985,10 @@ CLASS ltcl_sap_package IMPLEMENTATION.
CREATE OBJECT lo_log. CREATE OBJECT lo_log.
"EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE
_append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'.
_append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'.
_append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/sub' 'zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/sub' '$$zdoma1.doma.xml'.
_append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma2.doma.xml'. _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma2.doma.xml'.
lcl_sap_package=>check( io_log = lo_log lcl_sap_package=>check( io_log = lo_log
it_results = lt_results it_results = lt_results
@ -2002,10 +2004,10 @@ CLASS ltcl_sap_package IMPLEMENTATION.
CREATE OBJECT lo_log. CREATE OBJECT lo_log.
"EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE
_append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'.
_append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'.
_append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' 'zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' '$$zdoma1.doma.xml'.
_append_result 'DOMA' 'ZDOMA2' ' ' 'M' ' ' '$Z$' '/' 'zdoma1.doma.xml'. _append_result 'DOMA' '$$ZDOMA2' ' ' 'M' ' ' '$Z$' '/' '$$zdoma1.doma.xml'.
lcl_sap_package=>check( io_log = lo_log lcl_sap_package=>check( io_log = lo_log
it_results = lt_results it_results = lt_results
@ -2021,9 +2023,9 @@ CLASS ltcl_sap_package IMPLEMENTATION.
CREATE OBJECT lo_log. CREATE OBJECT lo_log.
"EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE "EXP RESULT TYPE NAME MATCH LST RST PKG PATH FILE
_append_result 'CLAS' 'ZCLASS1' ' ' ' ' 'A' '$Z$' '/' 'zclass1.clas.abap'. _append_result 'CLAS' '$$ZCLASS1' ' ' ' ' 'A' '$Z$' '/' '$$zclass1.clas.abap'.
_append_result 'CLAS' 'ZCLASS1' 'X' ' ' ' ' '$Z$' '/' 'zclass1.clas.xml'. _append_result 'CLAS' '$$ZCLASS1' 'X' ' ' ' ' '$Z$' '/' '$$zclass1.clas.xml'.
_append_result 'DOMA' 'ZDOMA1' 'X' ' ' ' ' '$Z$' '/' ''. _append_result 'DOMA' '$$ZDOMA1' 'X' ' ' ' ' '$Z$' '/' ''.
lcl_sap_package=>check( io_log = lo_log lcl_sap_package=>check( io_log = lo_log
it_results = lt_results it_results = lt_results

View File

@ -0,0 +1,68 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE_TUTORIAL
*&---------------------------------------------------------------------*
CLASS lcl_gui_view_tutorial DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
METHODS lif_gui_page~render REDEFINITION.
PRIVATE SECTION.
METHODS render_content
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS. "lcl_gui_view_tutorial
CLASS lcl_gui_view_tutorial IMPLEMENTATION.
METHOD lif_gui_page~render.
CREATE OBJECT ro_html.
ro_html->add( '<div class="tutorial">' ).
ro_html->add( render_content( ) ).
ro_html->add( '</div>' ).
ENDMETHOD. "lif_gui_page~render
METHOD render_content.
CREATE OBJECT ro_html.
_add '<h1>Tutorial</h1>'.
_add '<hr>'.
_add '<h2>Repository list and favorites</h2>'.
_add '<p><ul>'.
_add '<li>To choose a repo press <img src="img/burger"> at the favorite bar.</li>'.
_add '<li>To add a repo as favorite'.
_add ' click <img src="img/star-grey"> icon at repo toolbar.</li>'.
_add '</ul></p>'.
_add '<h2>Adding and cloning repos</h2>'.
_add '<p><ul>'.
_add `<li>To clone a remote repo (e.g. from github) click `.
ro_html->add_anchor( iv_txt = '+ Clone' iv_act = gc_action-repo_clone ).
_add ' from the top menu. This will copy a remote repo to your system.</li>'.
_add `<li>To add a local package as a repo click `.
ro_html->add_anchor( iv_txt = '+ Offline' iv_act = gc_action-repo_newoffline ).
_add ' from the top menu. This will track a repo which already exist in'.
_add ' the system with abapGit. You''ll be able to attach it to remote origin'.
_add ' or just serialize as a zip file</li>'.
_add '</ul></p>'.
_add '<h2>abapGit related repositories</h2>'.
_add '<p><ul>'.
_add '<li>'.
ro_html->add_anchor( iv_txt = 'install abapGit repo' iv_act = gc_action-abapgit_install ).
_add ' - To keep abapGit up-to-date (or also to contribute) you need to'.
_add 'install it as a repository.</li>'.
_add '<li>'.
ro_html->add_anchor( iv_txt = 'install abapGit plugins' iv_act = gc_action-abapgit_install_pi ).
_add ' - you can also install plugins to extend supported object types</li>'.
_add '</ul></p>'.
ENDMETHOD. " render_content.
ENDCLASS. "lcl_gui_view_tutorial

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_VIEW_TUTORIAL</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_TUTORIAL</ENTRY>
<LENGTH>30</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>