Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Improvement to TH_RETURN handling needed for TH1 hooks. Update and correct TH1 hook tests. Add draft documentation for TH1 hooks. |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
36f0e47b3275937da8b73a7376c9eec4 |
| User & Date: | mistachkin 2017-10-04 05:35:42.085 |
Context
|
2017-10-05
| ||
| 10:02 | Fix a hyperlink on the /mlink page. Add a link from /info for a check-in to the /mlink page under "Other Links". check-in: 180128f523 user: drh tags: trunk | |
|
2017-10-04
| ||
| 10:59 | Add support for markdown page titles check-in: 4a298e69ec user: mjanssen tags: commonmark-markdown | |
| 05:35 | Improvement to TH_RETURN handling needed for TH1 hooks. Update and correct TH1 hook tests. Add draft documentation for TH1 hooks. check-in: 36f0e47b32 user: mistachkin tags: trunk | |
|
2017-10-03
| ||
| 14:42 | Tweak indenting for consistency check-in: 5f37eb84ca user: andygoth tags: trunk | |
Changes
Changes to src/main.c.
| ︙ | ︙ | |||
733 734 735 736 737 738 739 | atexit( fossil_atexit ); #ifdef FOSSIL_ENABLE_TH1_HOOKS /* ** The TH1 return codes from the hook will be handled as follows: ** ** TH_OK: The xFunc() and the TH1 notification will both be executed. ** | | | 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 | atexit( fossil_atexit ); #ifdef FOSSIL_ENABLE_TH1_HOOKS /* ** The TH1 return codes from the hook will be handled as follows: ** ** TH_OK: The xFunc() and the TH1 notification will both be executed. ** ** TH_ERROR: The xFunc() will be skipped, the TH1 notification will be ** skipped. If the xFunc() is being hooked, the error message ** will be emitted. ** ** TH_BREAK: The xFunc() and the TH1 notification will both be skipped. ** ** TH_RETURN: The xFunc() will be executed, the TH1 notification will be ** skipped. |
| ︙ | ︙ | |||
1662 1663 1664 1665 1666 1667 1668 |
}else{
#ifdef FOSSIL_ENABLE_TH1_HOOKS
/*
** The TH1 return codes from the hook will be handled as follows:
**
** TH_OK: The xFunc() and the TH1 notification will both be executed.
**
| | | 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 |
}else{
#ifdef FOSSIL_ENABLE_TH1_HOOKS
/*
** The TH1 return codes from the hook will be handled as follows:
**
** TH_OK: The xFunc() and the TH1 notification will both be executed.
**
** TH_ERROR: The xFunc() will be skipped, the TH1 notification will be
** skipped. If the xFunc() is being hooked, the error message
** will be emitted.
**
** TH_BREAK: The xFunc() and the TH1 notification will both be skipped.
**
** TH_RETURN: The xFunc() will be executed, the TH1 notification will be
** skipped.
|
| ︙ | ︙ |
Changes to src/th.h.
| ︙ | ︙ | |||
100 101 102 103 104 105 106 107 108 109 110 111 112 113 | ** Valid return codes for xProc callbacks. */ #define TH_OK 0 #define TH_ERROR 1 #define TH_BREAK 2 #define TH_RETURN 3 #define TH_CONTINUE 4 /* ** Set and get the interpreter result. */ int Th_SetResult(Th_Interp *, const char *, int); const char *Th_GetResult(Th_Interp *, int *); char *Th_TakeResult(Th_Interp *, int *); | > | 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | ** Valid return codes for xProc callbacks. */ #define TH_OK 0 #define TH_ERROR 1 #define TH_BREAK 2 #define TH_RETURN 3 #define TH_CONTINUE 4 #define TH_RETURN2 5 /* ** Set and get the interpreter result. */ int Th_SetResult(Th_Interp *, const char *, int); const char *Th_GetResult(Th_Interp *, int *); char *Th_TakeResult(Th_Interp *, int *); |
| ︙ | ︙ |
Changes to src/th_lang.c.
| ︙ | ︙ | |||
430 431 432 433 434 435 436 437 438 439 440 441 442 443 |
procargs.argc = argc;
procargs.argv = argv;
procargs.argl = argl;
rc = Th_InFrame(interp, proc_call2, (void *)p, (void *)&procargs);
if( rc==TH_RETURN ){
rc = TH_OK;
}
return rc;
}
/*
** This function is registered as the delete callback for all commands
** created using the built-in [proc] command. It is called automatically
| > > > | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 |
procargs.argc = argc;
procargs.argv = argv;
procargs.argl = argl;
rc = Th_InFrame(interp, proc_call2, (void *)p, (void *)&procargs);
if( rc==TH_RETURN ){
rc = TH_OK;
}
if( rc==TH_RETURN2 ){
rc = TH_RETURN;
}
return rc;
}
/*
** This function is registered as the delete callback for all commands
** created using the built-in [proc] command. It is called automatically
|
| ︙ | ︙ |
Changes to src/th_main.c.
| ︙ | ︙ | |||
297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
switch( rc ){
case TH_OK: return nullIfOk ? 0 : "TH_OK";
case TH_ERROR: return "TH_ERROR";
case TH_BREAK: return "TH_BREAK";
case TH_RETURN: return "TH_RETURN";
case TH_CONTINUE: return "TH_CONTINUE";
default: {
sqlite3_snprintf(sizeof(zRc), zRc, "TH1 return code %d", rc);
}
}
return zRc;
}
| > | 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
switch( rc ){
case TH_OK: return nullIfOk ? 0 : "TH_OK";
case TH_ERROR: return "TH_ERROR";
case TH_BREAK: return "TH_BREAK";
case TH_RETURN: return "TH_RETURN";
case TH_CONTINUE: return "TH_CONTINUE";
case TH_RETURN2: return "TH_RETURN2";
default: {
sqlite3_snprintf(sizeof(zRc), zRc, "TH1 return code %d", rc);
}
}
return zRc;
}
|
| ︙ | ︙ |
Changes to test/th1-hooks.test.
| ︙ | ︙ | |||
68 69 70 71 72 73 74 |
} elseif {$::cmd_name eq "test2"} {
error "unsupported command"
} elseif {$::cmd_name eq "test3"} {
emit_hook_log
break "TH_BREAK return code"
} elseif {$::cmd_name eq "test4"} {
emit_hook_log
| | > > > | 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
} elseif {$::cmd_name eq "test2"} {
error "unsupported command"
} elseif {$::cmd_name eq "test3"} {
emit_hook_log
break "TH_BREAK return code"
} elseif {$::cmd_name eq "test4"} {
emit_hook_log
return -code 5 "TH_RETURN return code"
} elseif {$::cmd_name eq "timeline"} {
set length [llength $::cmd_args]
set length [expr {$length - 1}]
if {[lindex $::cmd_args $length] eq "custom"} {
append_hook_log "CUSTOM TIMELINE"
emit_hook_log
return "custom timeline"
} elseif {[lindex $::cmd_args $length] eq "custom2"} {
emit_hook_log
puts "+++ some stuff here +++"
continue "custom2 timeline"
} elseif {[lindex $::cmd_args $length] eq "custom3"} {
emit_hook_log
return -code 5 "TH_RETURN return code"
} elseif {[lindex $::cmd_args $length] eq "now"} {
emit_hook_log
return "now timeline"
} else {
emit_hook_log
error "unsupported timeline"
}
|
| ︙ | ︙ | |||
140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
test th1-cmd-hooks-1b {[normalize_result] eq \
{<h1><b>command_hook timeline</b></h1>
+++ some stuff here +++
<h1><b>command_hook timeline command_notify timeline</b></h1>}}
###############################################################################
fossil timeline
test th1-cmd-hooks-2a {[first_data_line] eq \
{<h1><b>command_hook timeline</b></h1>}}
test th1-cmd-hooks-2b {[second_data_line] eq {ERROR: unsupported timeline}}
###############################################################################
| > > > > > > > > | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
test th1-cmd-hooks-1b {[normalize_result] eq \
{<h1><b>command_hook timeline</b></h1>
+++ some stuff here +++
<h1><b>command_hook timeline command_notify timeline</b></h1>}}
###############################################################################
fossil timeline custom3; # NOTE: Bad "WHEN" argument.
test th1-cmd-hooks-1c {[normalize_result] eq \
{<h1><b>command_hook timeline</b></h1>
unknown check-in or invalid date: custom3}}
###############################################################################
fossil timeline
test th1-cmd-hooks-2a {[first_data_line] eq \
{<h1><b>command_hook timeline</b></h1>}}
test th1-cmd-hooks-2b {[second_data_line] eq {ERROR: unsupported timeline}}
###############################################################################
|
| ︙ | ︙ | |||
183 184 185 186 187 188 189 |
fossil test3
test th1-custom-cmd-3a {[string trim $RESULT] eq \
{<h1><b>command_hook test3</b></h1>}}
###############################################################################
fossil test4
| > | > > > > > > | 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
fossil test3
test th1-custom-cmd-3a {[string trim $RESULT] eq \
{<h1><b>command_hook test3</b></h1>}}
###############################################################################
fossil test4
test th1-custom-cmd-4a {[first_data_line] eq \
{<h1><b>command_hook test4</b></h1>}}
test th1-custom-cmd-4b {[regexp -- \
{: unknown command: test4$} [second_data_line]]}
test th1-custom-cmd-4d {[regexp -- \
{: use "help" for more information$} [third_data_line]]}
###############################################################################
set RESULT [test_fossil_http $repository $dataFileName /timeline]
test th1-web-hooks-1a {[regexp \
{<title>Unnamed Fossil Project: Timeline</title>} $RESULT]}
|
| ︙ | ︙ |
Changes to www/index.wiki.
| ︙ | ︙ | |||
125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
* On-line [/help | help].
* Documentation on the
[http://www.sqliteconcepts.org/THManual.pdf | TH1 scripting language],
used to customize [./custom_ticket.wiki | ticketing], and several other
subsystems, including [./customskin.md | theming].
* List of [./th1.md | TH1 commands provided by Fossil itself] that expose
its key functionality to TH1 scripts.
* A free hosting server for Fossil repositories is available at
[http://chiselapp.com/].
* How to [./server.wiki | set up a server] for your repository.
* Customizing the [./custom_ticket.wiki | ticket system].
* Methods to [./checkin_names.wiki | identify a specific check-in].
* [./inout.wiki | Import and export] from and to Git.
* [./fossil-v-git.wiki | Fossil versus Git].
| > > | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
* On-line [/help | help].
* Documentation on the
[http://www.sqliteconcepts.org/THManual.pdf | TH1 scripting language],
used to customize [./custom_ticket.wiki | ticketing], and several other
subsystems, including [./customskin.md | theming].
* List of [./th1.md | TH1 commands provided by Fossil itself] that expose
its key functionality to TH1 scripts.
* List of [./th1-hooks.md | TH1 hooks exposed by Fossil] that enable
customization of commands and web pages.
* A free hosting server for Fossil repositories is available at
[http://chiselapp.com/].
* How to [./server.wiki | set up a server] for your repository.
* Customizing the [./custom_ticket.wiki | ticket system].
* Methods to [./checkin_names.wiki | identify a specific check-in].
* [./inout.wiki | Import and export] from and to Git.
* [./fossil-v-git.wiki | Fossil versus Git].
|
| ︙ | ︙ |
Added www/th1-hooks.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
TH1 Hooks
=========
<big><big><big><font color="red">** DRAFT **</font></big></big></big>
The **TH1 hooks** feature allows <a href="th1.md">TH1</a> scripts to be
configured that can monitor, create, alter, or cancel the execution of
Fossil commands and web pages.
This feature requires the TH1 hooks feature to be enabled at compile-time.
Additionally, the "th1-hooks" repository setting must be enabled at runtime
in order to successfully make use of this feature.
TH1 Hook Related User-Defined Procedures
----------------------------------------
In order to activate TH1 hooks, one or more of the following user-defined
procedures should be defined, generally from within the "th1-setup" script
(setting) for a repository. The following bullets summarize the available
TH1 hooks:
* command\_hook -- _Called before execution of a command._
* command\_notify -- _Called after execution of a command._
* webpage\_hook -- _Called before rendering of a web page._
* webpage\_notify -- _Called after rendering of a web page._
TH1 Hook Related Variables for Commands
---------------------------------------
* cmd\_name -- _Name of command being executed._
* cmd\_args -- _Current command line arguments._
* cmd\_flags -- _Bitmask of CMDFLAG values for the command being executed._
TH1 Hook Related Variables for Web Pages
----------------------------------------
* web\_name -- _Name of web page being rendered._
* web\_args -- _Current command line arguments._
* web\_flags -- _Bitmask of CMDFLAG values for the web page being rendered._
<a name="cmdReturnCodes"></a>TH1 Hook Related Return Codes for Commands
-----------------------------------------------------------------------
* TH\_OK -- _Command will be executed, notification will be executed._
* TH\_ERROR -- _Command will be skipped, notification will be skipped,
error message will be emitted._
* TH\_BREAK -- _Command will be skipped, notification will be skipped._
* TH\_RETURN -- _Command will be executed, notification will be skipped._
* TH\_CONTINUE -- _Command will be skipped, notification will be executed._
For commands that are not included in the Fossil binary, allowing their
execution will cause the standard "unknown command" error message to be
generated, which will typically exit the process. Therefore, adding a
new command generally requires using the TH_CONTINUE return code.
<a name="webReturnCodes"></a>TH1 Hook Related Return Codes for Web Pages
------------------------------------------------------------------------
* TH\_OK -- _Web page will be rendered, notification will be executed._
* TH\_ERROR -- _Web page will be skipped, notification will be skipped,
error message will be emitted._
* TH\_BREAK -- _Web page will be skipped, notification will be skipped._
* TH\_RETURN -- _Web page will be rendered, notification will be skipped._
* TH\_CONTINUE -- _Web page will be skipped, notification will be executed._
For web pages that are not included in the Fossil binary, allowing their
rendering will cause the standard "Not Found" error message to be generated,
which will cause an HTTP 404 status code to be sent. Therefore, adding a
new web page generally requires using the TH_CONTINUE return code.
<a name="triggerReturnCodes"></a>Triggering TH1 Return Codes from a Script
--------------------------------------------------------------------------
* TH\_OK -- _This is the default return code, nothing special needed._
* TH\_ERROR -- _Use the **error** command._
* TH\_BREAK -- _Use the **break** command._
* TH\_RETURN -- _Use the **return -code 5** command._
* TH\_CONTINUE -- _Use the **continue** command._
<a name="command_hook"></a>TH1 command_hook Procedure
-----------------------------------------------------
* command\_hook
This user-defined procedure, if present, is called just before the
execution of a command. The name of the command being executed will
be stored in the "cmd\_name" global variable. The arguments to the
command being executed will be stored in the "cmd\_args" global variable.
The associated CMDFLAG value will be stored in the "cmd\_flags" global
variable. The procedure should cause one of the available return the
<a href="#cmdReturnCodes">code</a> that corresponds to the desired action
to take next.
<a name="command_notify"></a>TH1 command_notify Procedure
---------------------------------------------------------
* command\_notify
This user-defined procedure, if present, is called just after the
execution of a command. The name of the command being executed will
be stored in the "cmd\_name" global variable. The arguments to the
command being executed will be stored in the "cmd\_args" global variable.
The associated CMDFLAG value will be stored in the "cmd\_flags" global
variable. The procedure should cause one of the available return the
<a href="#cmdReturnCodes">code</a> that corresponds to the desired action
to take next.
<a name="webpage_hook"></a>TH1 webpage_hook Procedure
-----------------------------------------------------
* webpage\_hook
This user-defined procedure, if present, is called just before the
rendering of a web page. The name of the web page being rendered will
be stored in the "web\_name" global variable. The arguments to the
web page being rendered will be stored in the "web\_args" global variable.
The associated CMDFLAG value will be stored in the "web\_flags" global
variable. The procedure should cause one of the available return the
<a href="#webReturnCodes">code</a> that corresponds to the desired action
to take next.
<a name="webpage_notify"></a>TH1 webpage_notify Procedure
---------------------------------------------------------
* webpage\_notify
This user-defined procedure, if present, is called just after the
rendering of a web page. The name of the web page being rendered will
be stored in the "web\_name" global variable. The arguments to the
web page being rendered will be stored in the "web\_args" global variable.
The associated CMDFLAG value will be stored in the "web\_flags" global
variable. The procedure should cause one of the available return the
<a href="#webReturnCodes">code</a> that corresponds to the desired action
to take next.
|