@@ -115,10 +115,99 @@ <verbatim> #!/usr/bin/fossil repository: /srv/fossil-scm/code.autonomo.us.fossil-scm </verbatim> + +<h3>Another solution to <i>automatically</i> serve multiple repositories</h3> + +With the following CGI script (I have named it <samp>p</samp> simply) it is possible to define a location where all the your repositories should be located (in this example: <samp>/home/repos/fossil</samp>). All the repositories are named according the scheme <samp><project name>.fsl</samp> for sake of this example. + +If this script is called alone (like e.g.: <samp>http://your.server.here/cgi-bin/p</samp>), it will list all repositories located under <samp>$REPOSROOT</samp>, <b>if</b> there <b>does not</b> exist a corresponding file <samp>.<project name></samp> (that mechanism is used to <i>hide</i> some repository in the listing). + +If the script is called like e.g. <samp>http://your.server.here/cgi-bin/p/<project name></samp>, then the corresponding repository will be selected to work with. + +The lines 5 - 8 in the script below allow configuration for you needs. You have to chose, what fossil binary to use, what extension your repository databases have and where all your databases are located. + +<nowiki> +<font face="monospace"> +<font color="#a52a2a"> 1 </font><font color="#0000ff">#!/bin/sh</font><br> +<font color="#a52a2a"> 2 </font><br> +<font color="#a52a2a"> 3 </font><font color="#0000ff">### Configuration section ###</font><br> +<font color="#a52a2a"> 4 </font><br> +<font color="#a52a2a"> 5 </font><font color="#008b8b">TITLE</font>=<font color="#a52a2a"><b>"</b></font><font color="#ff00ff"><h2>Fossil repositories</h2></font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a"> 6 </font><font color="#008b8b">FOSSIL</font>=/usr/local/bin/fossil<br> +<font color="#a52a2a"> 7 </font><font color="#008b8b">REPOSROOT</font>=/home/repos/fossil<br> +<font color="#a52a2a"> 8 </font><font color="#008b8b">REPOSEXT</font>=<font color="#a52a2a"><b>"</b></font><font color="#ff00ff">.fsl</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a"> 9 </font><br> +<font color="#a52a2a">10 </font><font color="#0000ff">### Processing section -- nothing to configure here! ###</font><br> +<font color="#a52a2a">11 </font><br> +<font color="#a52a2a">12 </font><font color="#a52a2a"><b>set</b></font><font color="#008b8b"> </font><font color="#6a5acd">-f</font><font color="#008b8b"> </font>; <font color="#0000ff"># disable filename globbing</font><br> +<font color="#a52a2a">13 </font><br> +<font color="#a52a2a">14 </font><font color="#0000ff">## Some helper functions</font><br> +<font color="#a52a2a">15 </font><br> +<font color="#a52a2a">16 </font><font color="#008b8b">HeaderText () {</font><br> +<font color="#a52a2a">17 </font> <font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font> <font color="#a52a2a"><b>-z</b></font> <font color="#a52a2a"><b>"</b></font><font color="#a020f0">$headerWritten</font><font color="#a52a2a"><b>"</b></font> <font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font> <font color="#a52a2a"><b>then</b></font><br> +<font color="#a52a2a">18 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff">Content-type: text/plain; charset=iso-8859-1</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">19 </font> <font color="#a52a2a"><b>echo</b></font><br> +<font color="#a52a2a">20 </font> <font color="#008b8b">headerWritten</font>=<font color="#ff00ff">1</font><br> +<font color="#a52a2a">21 </font> <font color="#a52a2a"><b>fi</b></font><br> +<font color="#a52a2a">22 </font><font color="#008b8b">}</font><br> +<font color="#a52a2a">23 </font><br> +<font color="#a52a2a">24 </font><font color="#008b8b">HeaderHTML () {</font><br> +<font color="#a52a2a">25 </font> <font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font> <font color="#a52a2a"><b>-z</b></font> <font color="#a52a2a"><b>"</b></font><font color="#a020f0">$headerWritten</font><font color="#a52a2a"><b>"</b></font> <font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font> <font color="#a52a2a"><b>then</b></font><br> +<font color="#a52a2a">26 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff">Content-type: text/html; charset=iso-8859-1</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">27 </font> <font color="#a52a2a"><b>echo</b></font><br> +<font color="#a52a2a">28 </font> <font color="#008b8b">headerWritten</font>=<font color="#ff00ff">1</font><br> +<font color="#a52a2a">29 </font> <font color="#a52a2a"><b>fi</b></font><br> +<font color="#a52a2a">30 </font><font color="#008b8b">}</font><br> +<font color="#a52a2a">31 </font><br> +<font color="#a52a2a">32 </font><font color="#008b8b">Error () {</font><br> +<font color="#a52a2a">33 </font> HeaderHTML<br> +<font color="#a52a2a">34 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff"><p><font color=</font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff">red</font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff">>ERROR: </font><font color="#a020f0">$1</font><font color="#ff00ff"></font></p></font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">35 </font> <font color="#a52a2a"><b>exit</b></font> <font color="#ff00ff">1</font><br> +<font color="#a52a2a">36 </font><font color="#008b8b">}</font><br> +<font color="#a52a2a">37 </font><br> +<font color="#a52a2a">38 </font><font color="#008b8b">P () {</font><br> +<font color="#a52a2a">39 </font> HeaderText<br> +<font color="#a52a2a">40 </font> <font color="#a52a2a"><b>for </b></font>var <font color="#a52a2a"><b>in</b></font> <font color="#a020f0">$*</font><font color="#a52a2a"><b>;</b></font> <font color="#a52a2a"><b>do</b></font><br> +<font color="#a52a2a">41 </font> <font color="#a52a2a"><b>eval</b></font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a020f0">$var</font><font color="#ff00ff"> = </font><font color="#a52a2a"><b>"</b></font><font color="#6a5acd">\$</font><font color="#a020f0">$var</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">42 </font> <font color="#a52a2a"><b>done</b></font><br> +<font color="#a52a2a">43 </font><font color="#008b8b">}</font><br> +<font color="#a52a2a">44 </font><br> +<font color="#a52a2a">45 </font><font color="#0000ff">## Do the real work here ...</font><br> +<font color="#a52a2a">46 </font><br> +<font color="#a52a2a">47 </font><font color="#008b8b">project</font>=<font color="#6a5acd">`echo </font><font color="#a020f0">$PATH_INFO</font><font color="#6a5acd"> </font><font color="#a52a2a"><b>|</b></font><font color="#6a5acd"> sed -e </font><font color="#a52a2a"><b>'</b></font><font color="#ff00ff">s!/</font><font color="#6a5acd">\(</font><font color="#ff00ff">[^/]*</font><font color="#6a5acd">\)</font><font color="#ff00ff">.*!\1!</font><font color="#a52a2a"><b>'|</b></font><font color="#6a5acd"> tr </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff">[A-Z]</font><font color="#a52a2a"><b>"</b></font><font color="#6a5acd"> </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff">[a-z]</font><font color="#a52a2a"><b>"</b></font><font color="#6a5acd">`</font><br> +<font color="#a52a2a">48 </font><font color="#008b8b">repos</font>=<font color="#a52a2a"><b>"</b></font><font color="#a020f0">$REPOSROOT</font><font color="#ff00ff">/</font><font color="#a020f0">$project$REPOSEXT</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">49 </font><br> +<font color="#a52a2a">50 </font><font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font> <font color="#a52a2a"><b>-r</b></font> <font color="#a52a2a"><b>"</b></font><font color="#a020f0">$repos</font><font color="#a52a2a"><b>"</b></font> <font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font> <font color="#a52a2a"><b>then</b></font><br> +<font color="#a52a2a">51 </font> <font color="#008b8b">PATH_INFO</font>=<font color="#6a5acd">`echo </font><font color="#a020f0">$REQUEST_URI</font><font color="#6a5acd"> </font><font color="#a52a2a"><b>|</b></font><font color="#6a5acd"> sed -e </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff">s!^</font><font color="#a020f0">$SCRIPT_NAME</font><font color="#ff00ff">/</font><font color="#a020f0">$project</font><font color="#6a5acd">\\</font><font color="#ff00ff">([^?]*</font><font color="#6a5acd">\\</font><font color="#ff00ff">).*!</font><font color="#6a5acd">\\</font><font color="#ff00ff">1!</font><font color="#a52a2a"><b>"</b></font><font color="#6a5acd">`</font><br> +<font color="#a52a2a">52 </font><font color="#a52a2a"><b> :</b></font> <font color="#a020f0">${</font><font color="#a020f0">PATH_INFO</font><font color="#a52a2a"><b>:=</b></font><font color="#ff00ff">/</font><font color="#a020f0">}</font><br> +<font color="#a52a2a">53 </font> <font color="#008b8b">SCRIPT_NAME</font>=<font color="#a020f0">$SCRIPT_NAME</font>/<font color="#a020f0">$project</font><br> +<font color="#a52a2a">54 </font> <font color="#008b8b">TEMPFILE</font>=<font color="#6a5acd">`mktemp /tmp/fossil-</font><font color="#a020f0">$project</font><font color="#6a5acd">.XXXXXX`</font> <font color="#a52a2a"><b>||</b></font> Error <font color="#a52a2a"><b>"</b></font><font color="#ff00ff">Couldn't create tempfile</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">55 </font> <font color="#a52a2a"><b>trap</b></font> <font color="#a52a2a"><b>"</b></font><font color="#ff00ff">rm -f </font><font color="#a020f0">$TEMPFILE</font><font color="#a52a2a"><b>"</b></font> EXIT QUIT INT TERM<br> +<font color="#a52a2a">56 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> repository: </font><font color="#a020f0">$repos</font><font color="#ff00ff"> </font><font color="#a52a2a"><b>></b></font> <font color="#a020f0">$TEMPFILE</font><br> +<font color="#a52a2a">57 </font> <font color="#a020f0">$FOSSIL</font> cgi <font color="#a020f0">$TEMPFILE</font><br> +<font color="#a52a2a">58 </font><font color="#a52a2a"><b>elif</b></font> <font color="#a52a2a"><b>[</b></font> <font color="#a52a2a"><b>-z</b></font> <font color="#a52a2a"><b>"</b></font><font color="#a020f0">$project</font><font color="#a52a2a"><b>"</b></font> <font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font> <font color="#a52a2a"><b>then</b></font><br> +<font color="#a52a2a">59 </font> HeaderHTML<br> +<font color="#a52a2a">60 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a52a2a"><b>"</b></font><font color="#a020f0">$TITLE</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">61 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff"><ul></font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">62 </font> find <font color="#a020f0">$REPOSROOT</font> -name <font color="#a52a2a"><b>"</b></font><font color="#ff00ff">*</font><font color="#a020f0">$REPOSEXT</font><font color="#a52a2a"><b>"</b></font> <font color="#a52a2a"><b>|</b></font> \<br> +<font color="#a52a2a">63 </font> while <font color="#a52a2a"><b>read</b></font> repos<font color="#a52a2a"><b>;</b></font> <font color="#a52a2a"><b>do</b></font><br> +<font color="#a52a2a">64 </font> <font color="#008b8b">project</font>=<font color="#6a5acd">`basename </font><font color="#a020f0">$repos</font><font color="#6a5acd"> </font><font color="#a020f0">$REPOSEXT</font><font color="#6a5acd">`</font><br> +<font color="#a52a2a">65 </font> <font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font> <font color="#a52a2a"><b>-f</b></font> <font color="#a020f0">$repos</font> <font color="#a52a2a"><b>-a</b></font> <font color="#a52a2a"><b>!</b></font> <font color="#a52a2a"><b>-e</b></font> <font color="#a020f0">$REPOSROOT</font>/.<font color="#a020f0">$project</font> <font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font> <font color="#a52a2a"><b>then</b></font><br> +<font color="#a52a2a">66 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff"><li><a href='</font><font color="#a020f0">${</font><font color="#a020f0">REQUEST_URI</font><font color="#a020f0">}</font><font color="#ff00ff">/</font><font color="#a020f0">$project</font><font color="#ff00ff">'></font><font color="#a020f0">$project</font><font color="#ff00ff"></a></li></font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">67 </font> <font color="#a52a2a"><b>fi</b></font><br> +<font color="#a52a2a">68 </font> <font color="#a52a2a"><b>done</b></font><br> +<font color="#a52a2a">69 </font> <font color="#a52a2a"><b>echo</b></font><font color="#ff00ff"> </font><font color="#a52a2a"><b>"</b></font><font color="#ff00ff"></ul></font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">70 </font><font color="#a52a2a"><b>else</b></font><br> +<font color="#a52a2a">71 </font> Error <font color="#a52a2a"><b>"</b></font><font color="#ff00ff">No such project: </font><font color="#a020f0">$project</font><font color="#a52a2a"><b>"</b></font><br> +<font color="#a52a2a">72 </font><font color="#a52a2a"><b>fi</b></font><br> +<font color="#a52a2a">73 </font><br> +<font color="#a52a2a">74 </font><font color="#a52a2a"><b>exit</b></font> <font color="#ff00ff">0</font><br> +</font> +</nowiki> <h4>Windows</h4> <p>While it is far from a perfect set of instructions.. here are some quick notes that should help windows users along the way...</p> <ul> <li>you need fossil.exe accessible by your web server or on your path.. easiest is to just chuck it in \%SYSTEM_ROOT%\ (usually c:\windows\) </li>