Changes To Cookbook
Not logged in

Changes to "Cookbook" between 2009-04-22 14:53:44 and 2009-05-22 13:30:49

   113    113   
   114    114   /usr/lib/cgi-bin/code.autonomo.us is just a standard fossil CGI file; it looks like this:
   115    115   
   116    116   <verbatim>
   117    117   #!/usr/bin/fossil
   118    118   repository: /srv/fossil-scm/code.autonomo.us.fossil-scm
   119    119   </verbatim>
          120  +
          121  +<h3>Another solution to <i>automatically</i> serve multiple repositories</h3>
          122  +
          123  +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.
          124  +
          125  +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).
          126  +
          127  +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.
          128  +
          129  +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.
          130  +
          131  +<nowiki>
          132  +<font face="monospace">
          133  +<font color="#a52a2a">&nbsp;1 </font><font color="#0000ff">#!/bin/sh</font><br>
          134  +<font color="#a52a2a">&nbsp;2 </font><br>
          135  +<font color="#a52a2a">&nbsp;3 </font><font color="#0000ff">### Configuration section ###</font><br>
          136  +<font color="#a52a2a">&nbsp;4 </font><br>
          137  +<font color="#a52a2a">&nbsp;5 </font><font color="#008b8b">TITLE</font>=<font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">&lt;h2&gt;Fossil repositories&lt;/h2&gt;</font><font color="#a52a2a"><b>&quot;</b></font><br>
          138  +<font color="#a52a2a">&nbsp;6 </font><font color="#008b8b">FOSSIL</font>=/usr/local/bin/fossil<br>
          139  +<font color="#a52a2a">&nbsp;7 </font><font color="#008b8b">REPOSROOT</font>=/home/repos/fossil<br>
          140  +<font color="#a52a2a">&nbsp;8 </font><font color="#008b8b">REPOSEXT</font>=<font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">.fsl</font><font color="#a52a2a"><b>&quot;</b></font><br>
          141  +<font color="#a52a2a">&nbsp;9 </font><br>
          142  +<font color="#a52a2a">10 </font><font color="#0000ff">### Processing section -- nothing to configure here! ###</font><br>
          143  +<font color="#a52a2a">11 </font><br>
          144  +<font color="#a52a2a">12 </font><font color="#a52a2a"><b>set</b></font><font color="#008b8b">&nbsp;</font><font color="#6a5acd">-f</font><font color="#008b8b">&nbsp;&nbsp;&nbsp;&nbsp;</font>; <font color="#0000ff"># disable filename globbing</font><br>
          145  +<font color="#a52a2a">13 </font><br>
          146  +<font color="#a52a2a">14 </font><font color="#0000ff">## Some helper functions</font><br>
          147  +<font color="#a52a2a">15 </font><br>
          148  +<font color="#a52a2a">16 </font><font color="#008b8b">HeaderText () {</font><br>
          149  +<font color="#a52a2a">17 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font>&nbsp;<font color="#a52a2a"><b>-z</b></font>&nbsp;<font color="#a52a2a"><b>&quot;</b></font><font color="#a020f0">$headerWritten</font><font color="#a52a2a"><b>&quot;</b></font>&nbsp;<font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font>&nbsp;<font color="#a52a2a"><b>then</b></font><br>
          150  +<font color="#a52a2a">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">Content-type: text/plain; charset=iso-8859-1</font><font color="#a52a2a"><b>&quot;</b></font><br>
          151  +<font color="#a52a2a">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><br>
          152  +<font color="#a52a2a">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008b8b">headerWritten</font>=<font color="#ff00ff">1</font><br>
          153  +<font color="#a52a2a">21 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>fi</b></font><br>
          154  +<font color="#a52a2a">22 </font><font color="#008b8b">}</font><br>
          155  +<font color="#a52a2a">23 </font><br>
          156  +<font color="#a52a2a">24 </font><font color="#008b8b">HeaderHTML () {</font><br>
          157  +<font color="#a52a2a">25 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font>&nbsp;<font color="#a52a2a"><b>-z</b></font>&nbsp;<font color="#a52a2a"><b>&quot;</b></font><font color="#a020f0">$headerWritten</font><font color="#a52a2a"><b>&quot;</b></font>&nbsp;<font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font>&nbsp;<font color="#a52a2a"><b>then</b></font><br>
          158  +<font color="#a52a2a">26 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">Content-type: text/html; charset=iso-8859-1</font><font color="#a52a2a"><b>&quot;</b></font><br>
          159  +<font color="#a52a2a">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><br>
          160  +<font color="#a52a2a">28 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008b8b">headerWritten</font>=<font color="#ff00ff">1</font><br>
          161  +<font color="#a52a2a">29 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>fi</b></font><br>
          162  +<font color="#a52a2a">30 </font><font color="#008b8b">}</font><br>
          163  +<font color="#a52a2a">31 </font><br>
          164  +<font color="#a52a2a">32 </font><font color="#008b8b">Error () {</font><br>
          165  +<font color="#a52a2a">33 </font>&nbsp;&nbsp;HeaderHTML<br>
          166  +<font color="#a52a2a">34 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">&lt;p&gt;&lt;font color=</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">red</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">&gt;ERROR: </font><font color="#a020f0">$1</font><font color="#ff00ff">&lt;/font&gt;&lt;/p&gt;</font><font color="#a52a2a"><b>&quot;</b></font><br>
          167  +<font color="#a52a2a">35 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>exit</b></font>&nbsp;<font color="#ff00ff">1</font><br>
          168  +<font color="#a52a2a">36 </font><font color="#008b8b">}</font><br>
          169  +<font color="#a52a2a">37 </font><br>
          170  +<font color="#a52a2a">38 </font><font color="#008b8b">P () {</font><br>
          171  +<font color="#a52a2a">39 </font>&nbsp;&nbsp;HeaderText<br>
          172  +<font color="#a52a2a">40 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>for </b></font>var <font color="#a52a2a"><b>in</b></font>&nbsp;<font color="#a020f0">$*</font><font color="#a52a2a"><b>;</b></font>&nbsp;<font color="#a52a2a"><b>do</b></font><br>
          173  +<font color="#a52a2a">41 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>eval</b></font>&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a020f0">$var</font><font color="#ff00ff">&nbsp;= </font><font color="#a52a2a"><b>&quot;</b></font><font color="#6a5acd">\$</font><font color="#a020f0">$var</font><font color="#a52a2a"><b>&quot;</b></font><br>
          174  +<font color="#a52a2a">42 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>done</b></font><br>
          175  +<font color="#a52a2a">43 </font><font color="#008b8b">}</font><br>
          176  +<font color="#a52a2a">44 </font><br>
          177  +<font color="#a52a2a">45 </font><font color="#0000ff">## Do the real work here ...</font><br>
          178  +<font color="#a52a2a">46 </font><br>
          179  +<font color="#a52a2a">47 </font><font color="#008b8b">project</font>=<font color="#6a5acd">`echo </font><font color="#a020f0">$PATH_INFO</font><font color="#6a5acd">&nbsp;</font><font color="#a52a2a"><b>|</b></font><font color="#6a5acd">&nbsp;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">&nbsp;tr </font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">[A-Z]</font><font color="#a52a2a"><b>&quot;</b></font><font color="#6a5acd">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">[a-z]</font><font color="#a52a2a"><b>&quot;</b></font><font color="#6a5acd">`</font><br>
          180  +<font color="#a52a2a">48 </font><font color="#008b8b">repos</font>=<font color="#a52a2a"><b>&quot;</b></font><font color="#a020f0">$REPOSROOT</font><font color="#ff00ff">/</font><font color="#a020f0">$project$REPOSEXT</font><font color="#a52a2a"><b>&quot;</b></font><br>
          181  +<font color="#a52a2a">49 </font><br>
          182  +<font color="#a52a2a">50 </font><font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font>&nbsp;<font color="#a52a2a"><b>-r</b></font>&nbsp;<font color="#a52a2a"><b>&quot;</b></font><font color="#a020f0">$repos</font><font color="#a52a2a"><b>&quot;</b></font>&nbsp;<font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font>&nbsp;<font color="#a52a2a"><b>then</b></font><br>
          183  +<font color="#a52a2a">51 </font>&nbsp;&nbsp;<font color="#008b8b">PATH_INFO</font>=<font color="#6a5acd">`echo </font><font color="#a020f0">$REQUEST_URI</font><font color="#6a5acd">&nbsp;</font><font color="#a52a2a"><b>|</b></font><font color="#6a5acd">&nbsp;sed -e </font><font color="#a52a2a"><b>&quot;</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>&quot;</b></font><font color="#6a5acd">`</font><br>
          184  +<font color="#a52a2a">52 </font><font color="#a52a2a"><b>&nbsp;&nbsp;:</b></font>&nbsp;<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>
          185  +<font color="#a52a2a">53 </font>&nbsp;&nbsp;<font color="#008b8b">SCRIPT_NAME</font>=<font color="#a020f0">$SCRIPT_NAME</font>/<font color="#a020f0">$project</font><br>
          186  +<font color="#a52a2a">54 </font>&nbsp;&nbsp;<font color="#008b8b">TEMPFILE</font>=<font color="#6a5acd">`mktemp /tmp/fossil-</font><font color="#a020f0">$project</font><font color="#6a5acd">.XXXXXX`</font>&nbsp;<font color="#a52a2a"><b>||</b></font>&nbsp;Error <font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">Couldn't create tempfile</font><font color="#a52a2a"><b>&quot;</b></font><br>
          187  +<font color="#a52a2a">55 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>trap</b></font>&nbsp;<font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">rm -f </font><font color="#a020f0">$TEMPFILE</font><font color="#a52a2a"><b>&quot;</b></font>&nbsp;EXIT QUIT INT TERM<br>
          188  +<font color="#a52a2a">56 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;repository: </font><font color="#a020f0">$repos</font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&gt;</b></font>&nbsp;<font color="#a020f0">$TEMPFILE</font><br>
          189  +<font color="#a52a2a">57 </font>&nbsp;&nbsp;<font color="#a020f0">$FOSSIL</font>&nbsp;cgi <font color="#a020f0">$TEMPFILE</font><br>
          190  +<font color="#a52a2a">58 </font><font color="#a52a2a"><b>elif</b></font>&nbsp;<font color="#a52a2a"><b>[</b></font>&nbsp;<font color="#a52a2a"><b>-z</b></font>&nbsp;<font color="#a52a2a"><b>&quot;</b></font><font color="#a020f0">$project</font><font color="#a52a2a"><b>&quot;</b></font>&nbsp;<font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font>&nbsp;<font color="#a52a2a"><b>then</b></font><br>
          191  +<font color="#a52a2a">59 </font>&nbsp;&nbsp;HeaderHTML<br>
          192  +<font color="#a52a2a">60 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#a020f0">$TITLE</font><font color="#a52a2a"><b>&quot;</b></font><br>
          193  +<font color="#a52a2a">61 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">&lt;ul&gt;</font><font color="#a52a2a"><b>&quot;</b></font><br>
          194  +<font color="#a52a2a">62 </font>&nbsp;&nbsp;find <font color="#a020f0">$REPOSROOT</font>&nbsp;-name <font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">*</font><font color="#a020f0">$REPOSEXT</font><font color="#a52a2a"><b>&quot;</b></font>&nbsp;<font color="#a52a2a"><b>|</b></font>&nbsp;\<br>
          195  +<font color="#a52a2a">63 </font>&nbsp;&nbsp;while <font color="#a52a2a"><b>read</b></font>&nbsp;repos<font color="#a52a2a"><b>;</b></font>&nbsp;<font color="#a52a2a"><b>do</b></font><br>
          196  +<font color="#a52a2a">64 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008b8b">project</font>=<font color="#6a5acd">`basename </font><font color="#a020f0">$repos</font><font color="#6a5acd">&nbsp;</font><font color="#a020f0">$REPOSEXT</font><font color="#6a5acd">`</font><br>
          197  +<font color="#a52a2a">65 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>if </b></font><font color="#a52a2a"><b>[</b></font>&nbsp;<font color="#a52a2a"><b>-f</b></font>&nbsp;<font color="#a020f0">$repos</font>&nbsp;<font color="#a52a2a"><b>-a</b></font>&nbsp;<font color="#a52a2a"><b>!</b></font>&nbsp;<font color="#a52a2a"><b>-e</b></font>&nbsp;<font color="#a020f0">$REPOSROOT</font>/.<font color="#a020f0">$project</font>&nbsp;<font color="#a52a2a"><b>]</b></font><font color="#a52a2a"><b>;</b></font>&nbsp;<font color="#a52a2a"><b>then</b></font><br>
          198  +<font color="#a52a2a">66 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">&lt;li&gt;&lt;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">'&gt;</font><font color="#a020f0">$project</font><font color="#ff00ff">&lt;/a&gt;&lt;/li&gt;</font><font color="#a52a2a"><b>&quot;</b></font><br>
          199  +<font color="#a52a2a">67 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>fi</b></font><br>
          200  +<font color="#a52a2a">68 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>done</b></font><br>
          201  +<font color="#a52a2a">69 </font>&nbsp;&nbsp;<font color="#a52a2a"><b>echo</b></font><font color="#ff00ff">&nbsp;</font><font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">&lt;/ul&gt;</font><font color="#a52a2a"><b>&quot;</b></font><br>
          202  +<font color="#a52a2a">70 </font><font color="#a52a2a"><b>else</b></font><br>
          203  +<font color="#a52a2a">71 </font>&nbsp;&nbsp;Error <font color="#a52a2a"><b>&quot;</b></font><font color="#ff00ff">No such project: </font><font color="#a020f0">$project</font><font color="#a52a2a"><b>&quot;</b></font><br>
          204  +<font color="#a52a2a">72 </font><font color="#a52a2a"><b>fi</b></font><br>
          205  +<font color="#a52a2a">73 </font><br>
          206  +<font color="#a52a2a">74 </font><font color="#a52a2a"><b>exit</b></font>&nbsp;<font color="#ff00ff">0</font><br>
          207  +</font>
          208  +</nowiki>
   120    209   
   121    210   <h4>Windows</h4>
   122    211   <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>
   123    212   <ul>
   124    213   <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>
   125    214   <li>assuming you are running apache, you need to either add the ExecCGI to the options on your DocumentRoot, or make sure the ScriptAlias directive is set and put your .cgi files in that folder..</li>
   126    215   <li>the contents of your cgi file needs to essentially the same as above.. however paths needs to be windows friendly.. i have made sure that all folders on my test box are free of spaces, and as such this file works for me (obviously your paths may differ)