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"> 1 </font><font color="#0000ff">#!/bin/sh</font><br>
134 +<font color="#a52a2a"> 2 </font><br>
135 +<font color="#a52a2a"> 3 </font><font color="#0000ff">### Configuration section ###</font><br>
136 +<font color="#a52a2a"> 4 </font><br>
137 +<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>
138 +<font color="#a52a2a"> 6 </font><font color="#008b8b">FOSSIL</font>=/usr/local/bin/fossil<br>
139 +<font color="#a52a2a"> 7 </font><font color="#008b8b">REPOSROOT</font>=/home/repos/fossil<br>
140 +<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>
141 +<font color="#a52a2a"> 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"> </font><font color="#6a5acd">-f</font><font color="#008b8b"> </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> <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>
150 +<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>
151 +<font color="#a52a2a">19 </font> <font color="#a52a2a"><b>echo</b></font><br>
152 +<font color="#a52a2a">20 </font> <font color="#008b8b">headerWritten</font>=<font color="#ff00ff">1</font><br>
153 +<font color="#a52a2a">21 </font> <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> <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>
158 +<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>
159 +<font color="#a52a2a">27 </font> <font color="#a52a2a"><b>echo</b></font><br>
160 +<font color="#a52a2a">28 </font> <font color="#008b8b">headerWritten</font>=<font color="#ff00ff">1</font><br>
161 +<font color="#a52a2a">29 </font> <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> HeaderHTML<br>
166 +<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>
167 +<font color="#a52a2a">35 </font> <font color="#a52a2a"><b>exit</b></font> <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> HeaderText<br>
172 +<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>
173 +<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>
174 +<font color="#a52a2a">42 </font> <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"> </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>
180 +<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>
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> <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>
183 +<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>
184 +<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>
185 +<font color="#a52a2a">53 </font> <font color="#008b8b">SCRIPT_NAME</font>=<font color="#a020f0">$SCRIPT_NAME</font>/<font color="#a020f0">$project</font><br>
186 +<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>
187 +<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>
188 +<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>
189 +<font color="#a52a2a">57 </font> <font color="#a020f0">$FOSSIL</font> cgi <font color="#a020f0">$TEMPFILE</font><br>
190 +<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>
191 +<font color="#a52a2a">59 </font> HeaderHTML<br>
192 +<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>
193 +<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>
194 +<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>
195 +<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>
196 +<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>
197 +<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>
198 +<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>
199 +<font color="#a52a2a">67 </font> <font color="#a52a2a"><b>fi</b></font><br>
200 +<font color="#a52a2a">68 </font> <font color="#a52a2a"><b>done</b></font><br>
201 +<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>
202 +<font color="#a52a2a">70 </font><font color="#a52a2a"><b>else</b></font><br>
203 +<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>
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> <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)