diff --git a/src/ui/zabapgit_css_common.w3mi.data.css b/src/ui/zabapgit_css_common.w3mi.data.css index 6aafc5241..ae422349c 100644 --- a/src/ui/zabapgit_css_common.w3mi.data.css +++ b/src/ui/zabapgit_css_common.w3mi.data.css @@ -183,7 +183,11 @@ div.repo { padding: 4px 2px 3px 2px; } -span.branch { +/* ABAPGIT OBJECTS */ +span.branch, +span.user, +span.package, +span.transport { padding: 2px 4px; border: 1px solid; border-radius: 4px; @@ -386,11 +390,6 @@ span.diff_name { span.diff_changed_by { float: right; } -span.diff_changed_by span.user { - border-radius: 3px; - border: solid 1px; - padding: 1px 0.4em; -} span.diff_banner { border-style: solid; border-width: 1px; diff --git a/src/ui/zabapgit_css_theme_dark.w3mi.data.css b/src/ui/zabapgit_css_theme_dark.w3mi.data.css index 4e160f289..7b90f1eca 100644 --- a/src/ui/zabapgit_css_theme_dark.w3mi.data.css +++ b/src/ui/zabapgit_css_theme_dark.w3mi.data.css @@ -47,6 +47,20 @@ table.repo_tab { background-color: var(--theme-background-color); } +/* ABAPGIT OBJECTS */ +span.user { + background-color: #4c6782; + border-color: #7491b2; +} +span.package { + background-color: #705a6d; + border-color: #987095; +} +span.transport { + background-color: #456d5d; + border-color: #60a087; +} + /* PANELS */ #debug-output { color: var(--theme-greyscale-dark); } diff --git a/src/ui/zabapgit_css_theme_dark.w3mi.xml b/src/ui/zabapgit_css_theme_dark.w3mi.xml index 2ae5bb0e2..cd17035eb 100644 --- a/src/ui/zabapgit_css_theme_dark.w3mi.xml +++ b/src/ui/zabapgit_css_theme_dark.w3mi.xml @@ -15,7 +15,7 @@ MI ZABAPGIT_CSS_THEME_DARK filename - ~wwwtmp.css + dark_theme.css MI diff --git a/src/ui/zabapgit_css_theme_default.w3mi.data.css b/src/ui/zabapgit_css_theme_default.w3mi.data.css index a7ad264eb..e3aeb2dc0 100644 --- a/src/ui/zabapgit_css_theme_default.w3mi.data.css +++ b/src/ui/zabapgit_css_theme_default.w3mi.data.css @@ -57,6 +57,20 @@ input:focus, textarea:focus { border-color: #8cadd9; } background-color: #e6e6e6; } +/* ABAPGIT OBJECTS */ +span.user { + border-color: #c2d4ea; + background-color: #d9e4f2; +} +span.package { + border-color: #d3ccd2; + background-color: #ebe3ea; +} +span.transport { + border-color: #a7e3cf; + background-color: #dbf3eb; +} + /* PANELS */ /* TODO: add warning and error colors */ div.panel.success { diff --git a/src/ui/zabapgit_css_theme_default.w3mi.xml b/src/ui/zabapgit_css_theme_default.w3mi.xml index 59c9b86d8..a6d6e3a2c 100644 --- a/src/ui/zabapgit_css_theme_default.w3mi.xml +++ b/src/ui/zabapgit_css_theme_default.w3mi.xml @@ -9,13 +9,13 @@ MI ZABAPGIT_CSS_THEME_DEFAULT fileextension - .CSS + .css MI ZABAPGIT_CSS_THEME_DEFAULT filename - ~wwwtmp.CSS + default_theme.css MI diff --git a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap index b4ecf329d..2c501c07c 100644 --- a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap +++ b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap @@ -26,7 +26,6 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION !iv_show_branch TYPE abap_bool DEFAULT abap_true !iv_show_commit TYPE abap_bool DEFAULT abap_true !iv_interactive_branch TYPE abap_bool DEFAULT abap_false - !iv_branch TYPE string OPTIONAL !io_news TYPE REF TO zcl_abapgit_news OPTIONAL RETURNING VALUE(ri_html) TYPE REF TO zif_abapgit_html @@ -105,6 +104,40 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION CLASS-METHODS help_submenu RETURNING VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar . + CLASS-METHODS render_branch_name + IMPORTING + !iv_branch TYPE string OPTIONAL + !iv_repo_key TYPE zif_abapgit_persistence=>ty_value OPTIONAL + !io_repo TYPE REF TO zcl_abapgit_repo_online OPTIONAL + !iv_interactive TYPE abap_bool DEFAULT abap_true + RETURNING + VALUE(ri_html) TYPE REF TO zif_abapgit_html + RAISING + zcx_abapgit_exception . + CLASS-METHODS render_package_name + IMPORTING + !iv_package TYPE devclass + !iv_interactive TYPE abap_bool DEFAULT abap_true + RETURNING + VALUE(ri_html) TYPE REF TO zif_abapgit_html + RAISING + zcx_abapgit_exception . + CLASS-METHODS render_user_name + IMPORTING + !iv_username TYPE xubname + !iv_interactive TYPE abap_bool DEFAULT abap_true + RETURNING + VALUE(ri_html) TYPE REF TO zif_abapgit_html + RAISING + zcx_abapgit_exception . + CLASS-METHODS render_transport + IMPORTING + !iv_transport TYPE trkorr + !iv_interactive TYPE abap_bool DEFAULT abap_true + RETURNING + VALUE(ri_html) TYPE REF TO zif_abapgit_html + RAISING + zcx_abapgit_exception . PROTECTED SECTION. CLASS-METHODS render_repo_top_commit_hash @@ -117,15 +150,6 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION CLASS-DATA gv_time_zone TYPE timezone . - CLASS-METHODS render_branch_span - IMPORTING - !iv_branch TYPE string - !io_repo TYPE REF TO zcl_abapgit_repo_online - !iv_interactive TYPE abap_bool - RETURNING - VALUE(ri_html) TYPE REF TO zif_abapgit_html - RAISING - zcx_abapgit_exception . CLASS-METHODS get_t100_text IMPORTING !iv_msgid TYPE scx_t100key-msgid @@ -239,14 +263,33 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ENDMETHOD. - METHOD render_branch_span. + METHOD render_branch_name. - DATA: lv_text TYPE string, - lv_class TYPE string. + DATA: + lv_key TYPE string, + lv_branch TYPE string, + lv_text TYPE string, + lv_class TYPE string. - lv_text = zcl_abapgit_git_branch_list=>get_display_name( iv_branch ). + IF iv_repo_key IS NOT INITIAL. + lv_key = iv_repo_key. + ELSEIF io_repo IS BOUND. + lv_key = io_repo->get_key( ). + ELSE. + zcx_abapgit_exception=>raise( 'Either iv_repo_key or io_repo must be supplied' ). + ENDIF. - IF zcl_abapgit_git_branch_list=>get_type( iv_branch ) = zif_abapgit_definitions=>c_git_branch_type-branch. + IF iv_branch IS NOT INITIAL. + lv_branch = iv_branch. + ELSEIF io_repo IS BOUND. + lv_branch = io_repo->get_selected_branch( ). + ELSE. + zcx_abapgit_exception=>raise( 'Either iv_branch or io_repo must be supplied' ). + ENDIF. + + lv_text = zcl_abapgit_git_branch_list=>get_display_name( lv_branch ). + + IF zcl_abapgit_git_branch_list=>get_type( lv_branch ) = zif_abapgit_definitions=>c_git_branch_type-branch. lv_class = 'branch branch_branch'. ELSE. lv_class = 'branch'. @@ -257,7 +300,7 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ri_html->add_icon( iv_name = 'code-branch/grey70' iv_hint = 'Current branch' ). IF iv_interactive = abap_true. - ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ io_repo->get_key( ) }| + ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ lv_key }| iv_txt = lv_text ). ELSE. ri_html->add( lv_text ). @@ -612,6 +655,42 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ENDMETHOD. + METHOD render_package_name. + + DATA: + lv_obj_name TYPE tadir-obj_name, + lv_jump TYPE string, + lv_title TYPE string. + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. + + IF iv_package IS INITIAL. + RETURN. + ENDIF. + + SELECT SINGLE ctext FROM tdevct INTO lv_title + WHERE devclass = iv_package AND spras = sy-langu ##SUBRC_OK. + + lv_obj_name = iv_package. + lv_jump = zcl_abapgit_html_action_utils=>jump_encode( + iv_obj_type = 'DEVC' + iv_obj_name = lv_obj_name ). + + ri_html->add( || ). + ri_html->add_icon( iv_name = 'box/grey70' + iv_hint = 'SAP package' ). + IF iv_interactive = abap_true. + ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_jump }| + iv_title = lv_title + iv_txt = to_lower( iv_package ) ). + ELSE. + ri_html->add( to_lower( iv_package ) ). + ENDIF. + ri_html->add( '' ). + + ENDMETHOD. + + METHOD render_repo_palette. DATA li_repo_srv TYPE REF TO zif_abapgit_repo_srv. @@ -745,31 +824,14 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. IF io_repo->is_offline( ) = abap_false. lo_repo_online ?= io_repo. IF iv_show_branch = abap_true. - IF iv_branch IS INITIAL. - ri_html->add( render_branch_span( iv_branch = lo_repo_online->get_selected_branch( ) - io_repo = lo_repo_online - iv_interactive = iv_interactive_branch ) ). - ELSE. - ri_html->add( render_branch_span( iv_branch = iv_branch - io_repo = lo_repo_online - iv_interactive = iv_interactive_branch ) ). - ENDIF. + ri_html->add( render_branch_name( io_repo = lo_repo_online + iv_interactive = iv_interactive_branch ) ). ENDIF. ENDIF. " Package IF iv_show_package = abap_true. - ri_html->add_icon( iv_name = 'box/grey70' - iv_hint = 'SAP package' ). - ri_html->add( '' ). - - lv_package_jump_data = zcl_abapgit_html_action_utils=>jump_encode( - iv_obj_type = 'DEVC' - iv_obj_name = io_repo->get_package( ) ). - - ri_html->add_a( iv_txt = io_repo->get_package( ) - iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_package_jump_data }| ). - ri_html->add( '' ). + ri_html->add( render_package_name( io_repo->get_package( ) ) ). ENDIF. ri_html->add( '' ). @@ -805,6 +867,75 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ENDMETHOD. + METHOD render_transport. + + DATA lv_title TYPE string. + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. + + IF iv_transport IS INITIAL. + RETURN. + ENDIF. + + SELECT SINGLE as4text FROM e07t INTO lv_title + WHERE trkorr = iv_transport AND langu = sy-langu ##SUBRC_OK. + + ri_html->add( || ). + ri_html->add_icon( iv_name = 'briefcase/grey70' + iv_hint = 'Transport' ). + IF iv_interactive = abap_true. + ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-jump_transport }?transport={ iv_transport }| + iv_title = lv_title + iv_txt = to_lower( iv_transport ) ). + ELSE. + ri_html->add( to_lower( iv_transport ) ). + ENDIF. + ri_html->add( '' ). + + ENDMETHOD. + + + METHOD render_user_name. + + DATA: + ls_user_address TYPE addr3_val, + lv_title TYPE string. + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. + + IF iv_username IS INITIAL. + RETURN. + ENDIF. + + IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown. + CALL FUNCTION 'SUSR_USER_ADDRESS_READ' + EXPORTING + user_name = iv_username + IMPORTING + user_address = ls_user_address + EXCEPTIONS + user_address_not_found = 1 + OTHERS = 2. + IF sy-subrc = 0. + lv_title = ls_user_address-name_text. + ENDIF. + ENDIF. + + ri_html->add( || ). + " todo, add icon ri_html->add_icon( iv_name = 'user/grey70' + " iv_hint = 'User name' ) + IF iv_interactive = abap_true AND iv_username <> zcl_abapgit_objects_super=>c_user_unknown. + ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-jump_user }?user={ iv_username }| + iv_title = lv_title + iv_txt = to_lower( iv_username ) ). + ELSE. + ri_html->add( to_lower( iv_username ) ). + ENDIF. + ri_html->add( '' ). + + ENDMETHOD. + + METHOD render_warning_banner. CREATE OBJECT ri_html TYPE zcl_abapgit_html. diff --git a/src/ui/zcl_abapgit_gui_page_commit.clas.abap b/src/ui/zcl_abapgit_gui_page_commit.clas.abap index 0e05e7f05..9fed51ddf 100644 --- a/src/ui/zcl_abapgit_gui_page_commit.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_commit.clas.abap @@ -82,7 +82,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_commit IMPLEMENTATION. METHOD constructor. @@ -198,8 +198,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION. ri_html->add( '
' ). ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( io_repo = mo_repo - iv_show_package = abap_false - iv_branch = mo_repo->get_selected_branch( ) ) ). + iv_show_package = abap_false ) ). ri_html->add( render_menu( ) ). ri_html->add( render_form( ) ). diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap index 145cc6e45..8d52ecd08 100644 --- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap @@ -128,7 +128,9 @@ CLASS zcl_abapgit_gui_page_diff DEFINITION IMPORTING !is_diff TYPE ty_file_diff RETURNING - VALUE(ri_html) TYPE REF TO zif_abapgit_html . + VALUE(ri_html) TYPE REF TO zif_abapgit_html + RAISING + zcx_abapgit_exception . METHODS render_table_head IMPORTING !is_diff TYPE ty_file_diff @@ -200,7 +202,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. METHOD add_filter_sub_menu. @@ -344,10 +346,10 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. " Changed by IF -item-obj_type IS NOT INITIAL. - -changed_by = to_lower( zcl_abapgit_objects=>changed_by( -item ) ). + -changed_by = zcl_abapgit_objects=>changed_by( -item ). ENDIF. IF -changed_by IS INITIAL. - -changed_by = to_lower( zcl_abapgit_objects_super=>c_user_unknown ). + -changed_by = zcl_abapgit_objects_super=>c_user_unknown. ENDIF. " Extension @@ -711,8 +713,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. ii_html = ri_html is_diff = is_diff ). - ri_html->add( |Last Changed by: { - is_diff-changed_by }| ). + ri_html->add( 'Last Changed by: ' ). + ri_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( is_diff-changed_by ) ). + ri_html->add( '' ). ri_html->add( '
' ). diff --git a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap index 96bab291f..a1b9fe167 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap @@ -34,14 +34,14 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION favorite TYPE string, "! True for offline, false for online repo type TYPE string, - key TYPE string, + key TYPE zif_abapgit_persistence=>ty_value, name TYPE string, url TYPE string, - package TYPE string, + package TYPE devclass, branch TYPE string, - created_by TYPE string, + created_by TYPE xubname, created_at TYPE string, - deserialized_by TYPE string, + deserialized_by TYPE xubname, deserialized_at TYPE string, END OF ty_overview, ty_overviews TYPE STANDARD TABLE OF ty_overview @@ -84,12 +84,16 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION render_table IMPORTING ii_html TYPE REF TO zif_abapgit_html - it_overview TYPE ty_overviews, + it_overview TYPE ty_overviews + RAISING + zcx_abapgit_exception, render_table_body IMPORTING ii_html TYPE REF TO zif_abapgit_html - it_overview TYPE ty_overviews, + it_overview TYPE ty_overviews + RAISING + zcx_abapgit_exception, render_header_bar IMPORTING @@ -100,11 +104,11 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION _add_column IMPORTING - iv_tech_name TYPE string OPTIONAL - iv_display_name TYPE string OPTIONAL - iv_css_class TYPE string OPTIONAL - iv_add_tz TYPE abap_bool OPTIONAL - iv_title TYPE string OPTIONAL + iv_tech_name TYPE string OPTIONAL + iv_display_name TYPE string OPTIONAL + iv_css_class TYPE string OPTIONAL + iv_add_tz TYPE abap_bool OPTIONAL + iv_title TYPE string OPTIONAL iv_allow_order_by TYPE any OPTIONAL. METHODS render_scripts @@ -116,7 +120,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. METHOD apply_filter. @@ -209,7 +213,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. ls_overview-name = lo_repo_srv->get_name( ). ls_overview-url = -url. ls_overview-package = -package. - ls_overview-branch = zcl_abapgit_git_branch_list=>get_display_name( -branch_name ). + ls_overview-branch = -branch_name. ls_overview-created_by = -created_by. IF -created_at IS NOT INITIAL. @@ -353,31 +357,27 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. ii_html->add( || ). ENDIF. - lv_package_obj_name = -package. - lv_package_jump_data = zcl_abapgit_html_action_utils=>jump_encode( - iv_obj_type = 'DEVC' - iv_obj_name = lv_package_obj_name ). - - ii_html->add( |{ ii_html->a( - iv_txt = -package - iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_package_jump_data }| ) }| ). + ii_html->add( || ). + ii_html->add( zcl_abapgit_gui_chunk_lib=>render_package_name( -package ) ). + ii_html->add( || ). IF -branch IS INITIAL. ii_html->add( | | ). ELSE. - lv_branch_html = `` - && `` - && -branch - && ``. - - ii_html->add( |{ ii_html->a( - iv_txt = lv_branch_html - iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ -key }| ) }| ). + ii_html->add( || ). + ii_html->add( zcl_abapgit_gui_chunk_lib=>render_branch_name( + iv_branch = -branch + iv_repo_key = -key ) ). + ii_html->add( || ). ENDIF. - ii_html->add( |{ -deserialized_by }| ). + ii_html->add( || ). + ii_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( -deserialized_by ) ). + ii_html->add( || ). ii_html->add( |{ -deserialized_at }| ). - ii_html->add( |{ -created_by }| ). + ii_html->add( || ). + ii_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( -created_by ) ). + ii_html->add( || ). ii_html->add( |{ -created_at }| ). ii_html->add( |{ -key }| ). diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index 49f4034a8..da1e41554 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -107,16 +107,19 @@ CLASS zcl_abapgit_gui_router DEFINITION VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable RAISING zcx_abapgit_exception . - CLASS-METHODS jump_display_transport IMPORTING !iv_transport TYPE trkorr RAISING - zcx_abapgit_exception. - + zcx_abapgit_exception . + CLASS-METHODS jump_display_user + IMPORTING + !iv_username TYPE xubname + RAISING + zcx_abapgit_exception . METHODS call_browser IMPORTING - iv_url TYPE csequence + !iv_url TYPE csequence RAISING zcx_abapgit_exception. @@ -124,7 +127,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. +CLASS zcl_abapgit_gui_router IMPLEMENTATION. METHOD abapgit_services_actions. @@ -459,6 +462,17 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. ENDMETHOD. + METHOD jump_display_user. + + " todo, user display in ADT + + CALL FUNCTION 'BAPI_USER_DISPLAY' + EXPORTING + username = iv_username. + + ENDMETHOD. + + METHOD other_utilities. CASE ii_event->mv_action. @@ -576,6 +590,10 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. jump_display_transport( |{ ii_event->query( )->get( 'TRANSPORT' ) }| ). rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. + WHEN zif_abapgit_definitions=>c_action-jump_user. + jump_display_user( |{ ii_event->query( )->get( 'USER' ) }| ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. + WHEN zif_abapgit_definitions=>c_action-url. call_browser( ii_event->query( )->get( 'URL' ) ). rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 09b8c3314..610e1e33d 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -526,6 +526,7 @@ INTERFACE zif_abapgit_definitions go_patch TYPE string VALUE 'go_patch', jump TYPE string VALUE 'jump', jump_transport TYPE string VALUE 'jump_transport', + jump_user TYPE string VALUE 'jump_user', url TYPE string VALUE 'url', goto_source TYPE string VALUE 'goto_source', show_callstack TYPE string VALUE 'show_callstack',