Fossil SCM

Merge updates from trunk.

mistachkin 2015-02-24 00:46 UTC mvAndRmFiles merge
Commit 75a07f8911fb8335cd889f6b2b34a89415a7847c
+17
--- a/fossil.1
+++ b/fossil.1
@@ -0,0 +1,17 @@
1
+rsioned
2
+.br
3
+biseFebruary 2015wiki, ticket tracker, CGI/httphttp&and rsioned
4
+.br
5
+bisect In
6
+over seven years of operation, no work has ever been lost after
7
+having been commihangesgdiffddremove clean helpisect ranchundlefinfo open sqlite3February 2015wiki, rsiraise stashlean import tashone info purge ll commit init synciff jsonag
8
+.br
9
+bisect exportmote-url timeline
10
+.br
11
+blame iseFebruary 2015wiki, t icrsioi
12
+.br
13
+branchmv rm undousefsrss
14
+.br
15
+cat gdiff praisepdate
16
+.br
17
+changeshelp qlite3
--- a/fossil.1
+++ b/fossil.1
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/fossil.1
+++ b/fossil.1
@@ -0,0 +1,17 @@
1 rsioned
2 .br
3 biseFebruary 2015wiki, ticket tracker, CGI/httphttp&and rsioned
4 .br
5 bisect In
6 over seven years of operation, no work has ever been lost after
7 having been commihangesgdiffddremove clean helpisect ranchundlefinfo open sqlite3February 2015wiki, rsiraise stashlean import tashone info purge ll commit init synciff jsonag
8 .br
9 bisect exportmote-url timeline
10 .br
11 blame iseFebruary 2015wiki, t icrsioi
12 .br
13 branchmv rm undousefsrss
14 .br
15 cat gdiff praisepdate
16 .br
17 changeshelp qlite3
+17 -1
--- skins/README.md
+++ skins/README.md
@@ -1,11 +1,11 @@
11
Built-in Skins
22
==============
33
44
Each subdirectory under this folder describes a built-in "skin".
55
There are three files in each subdirectory for the CSS, the header,
6
-and the footer for the skin.
6
+and the footer for that skin.
77
88
To improve an existing built-in skin, simply edit the appropriate
99
files and recompile.
1010
1111
To add a new skin:
@@ -23,5 +23,21 @@
2323
2424
4. Edit the BuiltinSkin[] array near the top of the src/skins.c source
2525
file so that it describes and references the "newskin" skin.
2626
2727
5. Type "make" to rebuild.
28
+
29
+Development Hints
30
+-----------------
31
+
32
+One way to develop a new skin is to copy the baseline files (css.txt,
33
+footer.txt, and header.txt) into a working directory $WORKDIR then
34
+launch Fossil with a command-line option "--skin $WORKDIR". Example:
35
+
36
+ cp -r skins/default newskin
37
+ fossil ui --skin ./newskin
38
+
39
+When the argument to --skin contains one or more '/' characters, the
40
+appropriate skin files are read from disk from the directory specified.
41
+So after launching fossil as shown above, you can edit the newskin/css.txt,
42
+newskin/header.txt, and newskin/footer.txt files using your favorite
43
+text editor, then press Reload on your browser to see immediate results.
2844
--- skins/README.md
+++ skins/README.md
@@ -1,11 +1,11 @@
1 Built-in Skins
2 ==============
3
4 Each subdirectory under this folder describes a built-in "skin".
5 There are three files in each subdirectory for the CSS, the header,
6 and the footer for the skin.
7
8 To improve an existing built-in skin, simply edit the appropriate
9 files and recompile.
10
11 To add a new skin:
@@ -23,5 +23,21 @@
23
24 4. Edit the BuiltinSkin[] array near the top of the src/skins.c source
25 file so that it describes and references the "newskin" skin.
26
27 5. Type "make" to rebuild.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
--- skins/README.md
+++ skins/README.md
@@ -1,11 +1,11 @@
1 Built-in Skins
2 ==============
3
4 Each subdirectory under this folder describes a built-in "skin".
5 There are three files in each subdirectory for the CSS, the header,
6 and the footer for that skin.
7
8 To improve an existing built-in skin, simply edit the appropriate
9 files and recompile.
10
11 To add a new skin:
@@ -23,5 +23,21 @@
23
24 4. Edit the BuiltinSkin[] array near the top of the src/skins.c source
25 file so that it describes and references the "newskin" skin.
26
27 5. Type "make" to rebuild.
28
29 Development Hints
30 -----------------
31
32 One way to develop a new skin is to copy the baseline files (css.txt,
33 footer.txt, and header.txt) into a working directory $WORKDIR then
34 launch Fossil with a command-line option "--skin $WORKDIR". Example:
35
36 cp -r skins/default newskin
37 fossil ui --skin ./newskin
38
39 When the argument to --skin contains one or more '/' characters, the
40 appropriate skin files are read from disk from the directory specified.
41 So after launching fossil as shown above, you can edit the newskin/css.txt,
42 newskin/header.txt, and newskin/footer.txt files using your favorite
43 text editor, then press Reload on your browser to see immediate results.
44
--- skins/black_and_white/css.txt
+++ skins/black_and_white/css.txt
@@ -3,10 +3,13 @@
33
margin:0px 0px 0px 0px;
44
padding:0px;
55
font-family:verdana, arial, helvetica, "sans serif";
66
color:#333;
77
background-color:white;
8
+ -moz-text-size-adjust: none;
9
+ -webkit-text-size-adjust: none;
10
+ -mx-text-size-adjust: none;
811
}
912
1013
/* consistent colours */
1114
h2 {
1215
color: #333;
1316
--- skins/black_and_white/css.txt
+++ skins/black_and_white/css.txt
@@ -3,10 +3,13 @@
3 margin:0px 0px 0px 0px;
4 padding:0px;
5 font-family:verdana, arial, helvetica, "sans serif";
6 color:#333;
7 background-color:white;
 
 
 
8 }
9
10 /* consistent colours */
11 h2 {
12 color: #333;
13
--- skins/black_and_white/css.txt
+++ skins/black_and_white/css.txt
@@ -3,10 +3,13 @@
3 margin:0px 0px 0px 0px;
4 padding:0px;
5 font-family:verdana, arial, helvetica, "sans serif";
6 color:#333;
7 background-color:white;
8 -moz-text-size-adjust: none;
9 -webkit-text-size-adjust: none;
10 -mx-text-size-adjust: none;
11 }
12
13 /* consistent colours */
14 h2 {
15 color: #333;
16
--- skins/default/css.txt
+++ skins/default/css.txt
@@ -2,10 +2,13 @@
22
body {
33
margin: 0ex 1ex;
44
padding: 0px;
55
background-color: white;
66
font-family: sans-serif;
7
+ -moz-text-size-adjust: none;
8
+ -webkit-text-size-adjust: none;
9
+ -mx-text-size-adjust: none;
710
}
811
912
/* The project logo in the upper left-hand corner of each page */
1013
div.logo {
1114
display: table-cell;
1215
--- skins/default/css.txt
+++ skins/default/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: white;
6 font-family: sans-serif;
 
 
 
7 }
8
9 /* The project logo in the upper left-hand corner of each page */
10 div.logo {
11 display: table-cell;
12
--- skins/default/css.txt
+++ skins/default/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: white;
6 font-family: sans-serif;
7 -moz-text-size-adjust: none;
8 -webkit-text-size-adjust: none;
9 -mx-text-size-adjust: none;
10 }
11
12 /* The project logo in the upper left-hand corner of each page */
13 div.logo {
14 display: table-cell;
15
--- skins/eagle/css.txt
+++ skins/eagle/css.txt
@@ -3,10 +3,13 @@
33
margin: 0ex 1ex;
44
padding: 0px;
55
background-color: #485D7B;
66
font-family: sans-serif;
77
color: white;
8
+ -moz-text-size-adjust: none;
9
+ -webkit-text-size-adjust: none;
10
+ -mx-text-size-adjust: none;
811
}
912
1013
/* The project logo in the upper left-hand corner of each page */
1114
div.logo {
1215
display: table-cell;
1316
--- skins/eagle/css.txt
+++ skins/eagle/css.txt
@@ -3,10 +3,13 @@
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: #485D7B;
6 font-family: sans-serif;
7 color: white;
 
 
 
8 }
9
10 /* The project logo in the upper left-hand corner of each page */
11 div.logo {
12 display: table-cell;
13
--- skins/eagle/css.txt
+++ skins/eagle/css.txt
@@ -3,10 +3,13 @@
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: #485D7B;
6 font-family: sans-serif;
7 color: white;
8 -moz-text-size-adjust: none;
9 -webkit-text-size-adjust: none;
10 -mx-text-size-adjust: none;
11 }
12
13 /* The project logo in the upper left-hand corner of each page */
14 div.logo {
15 display: table-cell;
16
--- skins/enhanced1/css.txt
+++ skins/enhanced1/css.txt
@@ -2,10 +2,13 @@
22
body {
33
margin: 0ex 1ex;
44
padding: 0px;
55
background-color: white;
66
font-family: sans-serif;
7
+ -moz-text-size-adjust: none;
8
+ -webkit-text-size-adjust: none;
9
+ -mx-text-size-adjust: none;
710
}
811
912
/* The project logo in the upper left-hand corner of each page */
1013
div.logo {
1114
display: table-cell;
1215
--- skins/enhanced1/css.txt
+++ skins/enhanced1/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: white;
6 font-family: sans-serif;
 
 
 
7 }
8
9 /* The project logo in the upper left-hand corner of each page */
10 div.logo {
11 display: table-cell;
12
--- skins/enhanced1/css.txt
+++ skins/enhanced1/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: white;
6 font-family: sans-serif;
7 -moz-text-size-adjust: none;
8 -webkit-text-size-adjust: none;
9 -mx-text-size-adjust: none;
10 }
11
12 /* The project logo in the upper left-hand corner of each page */
13 div.logo {
14 display: table-cell;
15
--- skins/etienne1/css.txt
+++ skins/etienne1/css.txt
@@ -1,10 +1,14 @@
11
body {
22
margin: 0 auto;
3
- width: 960px;
3
+ min-width: 800px;
4
+ padding: 0px 20px;
45
font-family: sans-serif;
56
font-size:14pt;
7
+ -moz-text-size-adjust: none;
8
+ -webkit-text-size-adjust: none;
9
+ -mx-text-size-adjust: none;
610
}
711
812
a {
913
color: #4183C4;
1014
text-decoration: none;
@@ -100,20 +104,20 @@
100104
padding: 10px;
101105
border-bottom: 1px solid #ccc;
102106
}
103107
104108
.submenu a {
105
- padding: 10px;
109
+ padding: 10px 11px;
106110
text-decoration:none;
107111
color: #777;
108112
}
109113
110114
.submenu a:hover {
115
+ padding: 6px 10px;
111116
border: 1px solid #ccc;
112
- border-bottom: 1px solid #fff;
113
- border-top-left-radius: 5px;
114
- border-top-right-radius: 5px;
117
+ border-radius: 5px;
118
+ color: #000;
115119
}
116120
117121
.content {
118122
padding-top: 10px;
119123
font-size:.8em;
@@ -163,18 +167,19 @@
163167
.report thead+tbody tr:hover {
164168
background-color: #f5f9fc !important;
165169
}
166170
167171
td.tktDspLabel {
168
- max-width: 70px;
172
+ width: 70px;
169173
text-align: right;
174
+ overflow: hidden;
170175
}
171176
td.tktDspValue {
172
- max-width: 800px;
173177
text-align: left;
174178
vertical-align: top;
175
- background-color: #f5f9fc;
179
+ background-color: #f8f8f8;
180
+ border: 1px solid #ccc;
176181
}
177182
td.tktDspValue pre {
178183
white-space: pre-wrap;
179184
}
180185
181186
--- skins/etienne1/css.txt
+++ skins/etienne1/css.txt
@@ -1,10 +1,14 @@
1 body {
2 margin: 0 auto;
3 width: 960px;
 
4 font-family: sans-serif;
5 font-size:14pt;
 
 
 
6 }
7
8 a {
9 color: #4183C4;
10 text-decoration: none;
@@ -100,20 +104,20 @@
100 padding: 10px;
101 border-bottom: 1px solid #ccc;
102 }
103
104 .submenu a {
105 padding: 10px;
106 text-decoration:none;
107 color: #777;
108 }
109
110 .submenu a:hover {
 
111 border: 1px solid #ccc;
112 border-bottom: 1px solid #fff;
113 border-top-left-radius: 5px;
114 border-top-right-radius: 5px;
115 }
116
117 .content {
118 padding-top: 10px;
119 font-size:.8em;
@@ -163,18 +167,19 @@
163 .report thead+tbody tr:hover {
164 background-color: #f5f9fc !important;
165 }
166
167 td.tktDspLabel {
168 max-width: 70px;
169 text-align: right;
 
170 }
171 td.tktDspValue {
172 max-width: 800px;
173 text-align: left;
174 vertical-align: top;
175 background-color: #f5f9fc;
 
176 }
177 td.tktDspValue pre {
178 white-space: pre-wrap;
179 }
180
181
--- skins/etienne1/css.txt
+++ skins/etienne1/css.txt
@@ -1,10 +1,14 @@
1 body {
2 margin: 0 auto;
3 min-width: 800px;
4 padding: 0px 20px;
5 font-family: sans-serif;
6 font-size:14pt;
7 -moz-text-size-adjust: none;
8 -webkit-text-size-adjust: none;
9 -mx-text-size-adjust: none;
10 }
11
12 a {
13 color: #4183C4;
14 text-decoration: none;
@@ -100,20 +104,20 @@
104 padding: 10px;
105 border-bottom: 1px solid #ccc;
106 }
107
108 .submenu a {
109 padding: 10px 11px;
110 text-decoration:none;
111 color: #777;
112 }
113
114 .submenu a:hover {
115 padding: 6px 10px;
116 border: 1px solid #ccc;
117 border-radius: 5px;
118 color: #000;
 
119 }
120
121 .content {
122 padding-top: 10px;
123 font-size:.8em;
@@ -163,18 +167,19 @@
167 .report thead+tbody tr:hover {
168 background-color: #f5f9fc !important;
169 }
170
171 td.tktDspLabel {
172 width: 70px;
173 text-align: right;
174 overflow: hidden;
175 }
176 td.tktDspValue {
 
177 text-align: left;
178 vertical-align: top;
179 background-color: #f8f8f8;
180 border: 1px solid #ccc;
181 }
182 td.tktDspValue pre {
183 white-space: pre-wrap;
184 }
185
186
--- skins/etienne1/header.txt
+++ skins/etienne1/header.txt
@@ -23,11 +23,11 @@
2323
<div class="mainmenu">
2424
<th1>
2525
proc menulink {url name} {
2626
upvar current_page current
2727
upvar home home
28
- if {$url eq "/$current"} {
28
+ if {[string range $url 0 [string length $current]] eq "/$current"} {
2929
html "<a href='$home$url' class='active'>$name</a>\n"
3030
} else {
3131
html "<a href='$home$url'>$name</a>\n"
3232
}
3333
}
3434
--- skins/etienne1/header.txt
+++ skins/etienne1/header.txt
@@ -23,11 +23,11 @@
23 <div class="mainmenu">
24 <th1>
25 proc menulink {url name} {
26 upvar current_page current
27 upvar home home
28 if {$url eq "/$current"} {
29 html "<a href='$home$url' class='active'>$name</a>\n"
30 } else {
31 html "<a href='$home$url'>$name</a>\n"
32 }
33 }
34
--- skins/etienne1/header.txt
+++ skins/etienne1/header.txt
@@ -23,11 +23,11 @@
23 <div class="mainmenu">
24 <th1>
25 proc menulink {url name} {
26 upvar current_page current
27 upvar home home
28 if {[string range $url 0 [string length $current]] eq "/$current"} {
29 html "<a href='$home$url' class='active'>$name</a>\n"
30 } else {
31 html "<a href='$home$url'>$name</a>\n"
32 }
33 }
34
--- skins/khaki/css.txt
+++ skins/khaki/css.txt
@@ -2,10 +2,13 @@
22
body {
33
margin: 0ex 0ex;
44
padding: 0px;
55
background-color: #fef3bc;
66
font-family: sans-serif;
7
+ -moz-text-size-adjust: none;
8
+ -webkit-text-size-adjust: none;
9
+ -mx-text-size-adjust: none;
710
}
811
912
/* The project logo in the upper left-hand corner of each page */
1013
div.logo {
1114
display: inline;
1215
--- skins/khaki/css.txt
+++ skins/khaki/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 0ex;
4 padding: 0px;
5 background-color: #fef3bc;
6 font-family: sans-serif;
 
 
 
7 }
8
9 /* The project logo in the upper left-hand corner of each page */
10 div.logo {
11 display: inline;
12
--- skins/khaki/css.txt
+++ skins/khaki/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 0ex;
4 padding: 0px;
5 background-color: #fef3bc;
6 font-family: sans-serif;
7 -moz-text-size-adjust: none;
8 -webkit-text-size-adjust: none;
9 -mx-text-size-adjust: none;
10 }
11
12 /* The project logo in the upper left-hand corner of each page */
13 div.logo {
14 display: inline;
15
--- skins/plain_gray/css.txt
+++ skins/plain_gray/css.txt
@@ -2,10 +2,13 @@
22
body {
33
margin: 0ex 1ex;
44
padding: 0px;
55
background-color: white;
66
font-family: sans-serif;
7
+ -moz-text-size-adjust: none;
8
+ -webkit-text-size-adjust: none;
9
+ -mx-text-size-adjust: none;
710
}
811
912
/* The project logo in the upper left-hand corner of each page */
1013
div.logo {
1114
display: table-row;
1215
--- skins/plain_gray/css.txt
+++ skins/plain_gray/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: white;
6 font-family: sans-serif;
 
 
 
7 }
8
9 /* The project logo in the upper left-hand corner of each page */
10 div.logo {
11 display: table-row;
12
--- skins/plain_gray/css.txt
+++ skins/plain_gray/css.txt
@@ -2,10 +2,13 @@
2 body {
3 margin: 0ex 1ex;
4 padding: 0px;
5 background-color: white;
6 font-family: sans-serif;
7 -moz-text-size-adjust: none;
8 -webkit-text-size-adjust: none;
9 -mx-text-size-adjust: none;
10 }
11
12 /* The project logo in the upper left-hand corner of each page */
13 div.logo {
14 display: table-row;
15
--- skins/rounded1/css.txt
+++ skins/rounded1/css.txt
@@ -7,10 +7,13 @@
77
padding: 0px;
88
background-color: white;
99
color: #333;
1010
font-family: Verdana, sans-serif;
1111
font-size: 0.8em;
12
+ -moz-text-size-adjust: none;
13
+ -webkit-text-size-adjust: none;
14
+ -mx-text-size-adjust: none;
1215
}
1316
1417
/* The project logo in the upper left-hand corner of each page */
1518
div.logo {
1619
display: table-cell;
1720
--- skins/rounded1/css.txt
+++ skins/rounded1/css.txt
@@ -7,10 +7,13 @@
7 padding: 0px;
8 background-color: white;
9 color: #333;
10 font-family: Verdana, sans-serif;
11 font-size: 0.8em;
 
 
 
12 }
13
14 /* The project logo in the upper left-hand corner of each page */
15 div.logo {
16 display: table-cell;
17
--- skins/rounded1/css.txt
+++ skins/rounded1/css.txt
@@ -7,10 +7,13 @@
7 padding: 0px;
8 background-color: white;
9 color: #333;
10 font-family: Verdana, sans-serif;
11 font-size: 0.8em;
12 -moz-text-size-adjust: none;
13 -webkit-text-size-adjust: none;
14 -mx-text-size-adjust: none;
15 }
16
17 /* The project logo in the upper left-hand corner of each page */
18 div.logo {
19 display: table-cell;
20
+1 -1
--- src/blob.c
+++ src/blob.c
@@ -753,11 +753,11 @@
753753
** Initialize a blob to be the content of a file. If the filename
754754
** is blank or "-" then read from standard input.
755755
**
756756
** Any prior content of the blob is discarded, not freed.
757757
**
758
-** Return the number of bytes read. Calls fossil_fatal() error (i.e.
758
+** Return the number of bytes read. Calls fossil_fatal() on error (i.e.
759759
** it exit()s and does not return).
760760
*/
761761
int blob_read_from_file(Blob *pBlob, const char *zFilename){
762762
int size, got;
763763
FILE *in;
764764
--- src/blob.c
+++ src/blob.c
@@ -753,11 +753,11 @@
753 ** Initialize a blob to be the content of a file. If the filename
754 ** is blank or "-" then read from standard input.
755 **
756 ** Any prior content of the blob is discarded, not freed.
757 **
758 ** Return the number of bytes read. Calls fossil_fatal() error (i.e.
759 ** it exit()s and does not return).
760 */
761 int blob_read_from_file(Blob *pBlob, const char *zFilename){
762 int size, got;
763 FILE *in;
764
--- src/blob.c
+++ src/blob.c
@@ -753,11 +753,11 @@
753 ** Initialize a blob to be the content of a file. If the filename
754 ** is blank or "-" then read from standard input.
755 **
756 ** Any prior content of the blob is discarded, not freed.
757 **
758 ** Return the number of bytes read. Calls fossil_fatal() on error (i.e.
759 ** it exit()s and does not return).
760 */
761 int blob_read_from_file(Blob *pBlob, const char *zFilename){
762 int size, got;
763 FILE *in;
764
+2
--- src/cgi.c
+++ src/cgi.c
@@ -465,10 +465,11 @@
465465
if( g.fHttpTrace ){
466466
fprintf(stderr, "# cgi: %s = [%s]\n", zName, zValue);
467467
}
468468
aParamQP[nUsedQP].seq = seqQP++;
469469
aParamQP[nUsedQP].isQP = isQP;
470
+ aParamQP[nUsedQP].cTag = 0;
470471
nUsedQP++;
471472
sortQP = 1;
472473
}
473474
474475
/*
@@ -1680,10 +1681,11 @@
16801681
*/
16811682
#define HTTP_SERVER_LOCALHOST 0x0001 /* Bind to 127.0.0.1 only */
16821683
#define HTTP_SERVER_SCGI 0x0002 /* SCGI instead of HTTP */
16831684
#define HTTP_SERVER_HAD_REPOSITORY 0x0004 /* Was the repository open? */
16841685
#define HTTP_SERVER_HAD_CHECKOUT 0x0008 /* Was a checkout open? */
1686
+#define HTTP_SERVER_REPOLIST 0x0010 /* Allow repo listing */
16851687
16861688
#endif /* INTERFACE */
16871689
16881690
/*
16891691
** Maximum number of child processes that we can have running
16901692
--- src/cgi.c
+++ src/cgi.c
@@ -465,10 +465,11 @@
465 if( g.fHttpTrace ){
466 fprintf(stderr, "# cgi: %s = [%s]\n", zName, zValue);
467 }
468 aParamQP[nUsedQP].seq = seqQP++;
469 aParamQP[nUsedQP].isQP = isQP;
 
470 nUsedQP++;
471 sortQP = 1;
472 }
473
474 /*
@@ -1680,10 +1681,11 @@
1680 */
1681 #define HTTP_SERVER_LOCALHOST 0x0001 /* Bind to 127.0.0.1 only */
1682 #define HTTP_SERVER_SCGI 0x0002 /* SCGI instead of HTTP */
1683 #define HTTP_SERVER_HAD_REPOSITORY 0x0004 /* Was the repository open? */
1684 #define HTTP_SERVER_HAD_CHECKOUT 0x0008 /* Was a checkout open? */
 
1685
1686 #endif /* INTERFACE */
1687
1688 /*
1689 ** Maximum number of child processes that we can have running
1690
--- src/cgi.c
+++ src/cgi.c
@@ -465,10 +465,11 @@
465 if( g.fHttpTrace ){
466 fprintf(stderr, "# cgi: %s = [%s]\n", zName, zValue);
467 }
468 aParamQP[nUsedQP].seq = seqQP++;
469 aParamQP[nUsedQP].isQP = isQP;
470 aParamQP[nUsedQP].cTag = 0;
471 nUsedQP++;
472 sortQP = 1;
473 }
474
475 /*
@@ -1680,10 +1681,11 @@
1681 */
1682 #define HTTP_SERVER_LOCALHOST 0x0001 /* Bind to 127.0.0.1 only */
1683 #define HTTP_SERVER_SCGI 0x0002 /* SCGI instead of HTTP */
1684 #define HTTP_SERVER_HAD_REPOSITORY 0x0004 /* Was the repository open? */
1685 #define HTTP_SERVER_HAD_CHECKOUT 0x0008 /* Was a checkout open? */
1686 #define HTTP_SERVER_REPOLIST 0x0010 /* Allow repo listing */
1687
1688 #endif /* INTERFACE */
1689
1690 /*
1691 ** Maximum number of child processes that we can have running
1692
+4 -2
--- src/db.c
+++ src/db.c
@@ -159,14 +159,16 @@
159159
if( rollbackFlag ) db.doRollback = 1;
160160
db.nBegin--;
161161
if( db.nBegin==0 ){
162162
int i;
163163
if( db.doRollback==0 && db.nPriorChanges<sqlite3_total_changes(g.db) ){
164
+ i = 0;
164165
while( db.nBeforeCommit ){
165166
db.nBeforeCommit--;
166
- sqlite3_exec(g.db, db.azBeforeCommit[db.nBeforeCommit], 0, 0, 0);
167
- sqlite3_free(db.azBeforeCommit[db.nBeforeCommit]);
167
+ sqlite3_exec(g.db, db.azBeforeCommit[i], 0, 0, 0);
168
+ sqlite3_free(db.azBeforeCommit[i]);
169
+ i++;
168170
}
169171
leaf_do_pending_checks();
170172
}
171173
for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){
172174
db.doRollback |= db.aHook[i].xHook();
173175
--- src/db.c
+++ src/db.c
@@ -159,14 +159,16 @@
159 if( rollbackFlag ) db.doRollback = 1;
160 db.nBegin--;
161 if( db.nBegin==0 ){
162 int i;
163 if( db.doRollback==0 && db.nPriorChanges<sqlite3_total_changes(g.db) ){
 
164 while( db.nBeforeCommit ){
165 db.nBeforeCommit--;
166 sqlite3_exec(g.db, db.azBeforeCommit[db.nBeforeCommit], 0, 0, 0);
167 sqlite3_free(db.azBeforeCommit[db.nBeforeCommit]);
 
168 }
169 leaf_do_pending_checks();
170 }
171 for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){
172 db.doRollback |= db.aHook[i].xHook();
173
--- src/db.c
+++ src/db.c
@@ -159,14 +159,16 @@
159 if( rollbackFlag ) db.doRollback = 1;
160 db.nBegin--;
161 if( db.nBegin==0 ){
162 int i;
163 if( db.doRollback==0 && db.nPriorChanges<sqlite3_total_changes(g.db) ){
164 i = 0;
165 while( db.nBeforeCommit ){
166 db.nBeforeCommit--;
167 sqlite3_exec(g.db, db.azBeforeCommit[i], 0, 0, 0);
168 sqlite3_free(db.azBeforeCommit[i]);
169 i++;
170 }
171 leaf_do_pending_checks();
172 }
173 for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){
174 db.doRollback |= db.aHook[i].xHook();
175
+4 -2
--- src/db.c
+++ src/db.c
@@ -159,14 +159,16 @@
159159
if( rollbackFlag ) db.doRollback = 1;
160160
db.nBegin--;
161161
if( db.nBegin==0 ){
162162
int i;
163163
if( db.doRollback==0 && db.nPriorChanges<sqlite3_total_changes(g.db) ){
164
+ i = 0;
164165
while( db.nBeforeCommit ){
165166
db.nBeforeCommit--;
166
- sqlite3_exec(g.db, db.azBeforeCommit[db.nBeforeCommit], 0, 0, 0);
167
- sqlite3_free(db.azBeforeCommit[db.nBeforeCommit]);
167
+ sqlite3_exec(g.db, db.azBeforeCommit[i], 0, 0, 0);
168
+ sqlite3_free(db.azBeforeCommit[i]);
169
+ i++;
168170
}
169171
leaf_do_pending_checks();
170172
}
171173
for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){
172174
db.doRollback |= db.aHook[i].xHook();
173175
--- src/db.c
+++ src/db.c
@@ -159,14 +159,16 @@
159 if( rollbackFlag ) db.doRollback = 1;
160 db.nBegin--;
161 if( db.nBegin==0 ){
162 int i;
163 if( db.doRollback==0 && db.nPriorChanges<sqlite3_total_changes(g.db) ){
 
164 while( db.nBeforeCommit ){
165 db.nBeforeCommit--;
166 sqlite3_exec(g.db, db.azBeforeCommit[db.nBeforeCommit], 0, 0, 0);
167 sqlite3_free(db.azBeforeCommit[db.nBeforeCommit]);
 
168 }
169 leaf_do_pending_checks();
170 }
171 for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){
172 db.doRollback |= db.aHook[i].xHook();
173
--- src/db.c
+++ src/db.c
@@ -159,14 +159,16 @@
159 if( rollbackFlag ) db.doRollback = 1;
160 db.nBegin--;
161 if( db.nBegin==0 ){
162 int i;
163 if( db.doRollback==0 && db.nPriorChanges<sqlite3_total_changes(g.db) ){
164 i = 0;
165 while( db.nBeforeCommit ){
166 db.nBeforeCommit--;
167 sqlite3_exec(g.db, db.azBeforeCommit[i], 0, 0, 0);
168 sqlite3_free(db.azBeforeCommit[i]);
169 i++;
170 }
171 leaf_do_pending_checks();
172 }
173 for(i=0; db.doRollback==0 && i<db.nCommitHook; i++){
174 db.doRollback |= db.aHook[i].xHook();
175
+14 -1
--- src/event.c
+++ src/event.c
@@ -267,10 +267,16 @@
267267
rid = db_int(0,
268268
"SELECT rid FROM tagxref"
269269
" WHERE tagid=(SELECT tagid FROM tag WHERE tagname GLOB '%q*')"
270270
" ORDER BY mtime DESC", zTag
271271
);
272
+ if( rid && strlen(zId)<40 ){
273
+ zId = db_text(0,
274
+ "SELECT substr(tagname,7) FROM tag WHERE tagname GLOB '%q*'",
275
+ zTag
276
+ );
277
+ }
272278
free(zTag);
273279
274280
/* Need both check-in and wiki-write or wiki-create privileges in order
275281
** to edit/create an event.
276282
*/
@@ -393,11 +399,18 @@
393399
md5sum_blob(&event, &cksum);
394400
blob_appendf(&event, "Z %b\n", &cksum);
395401
blob_reset(&cksum);
396402
nrid = content_put(&event);
397403
db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
398
- manifest_crosslink(nrid, &event, MC_NONE);
404
+ if( manifest_crosslink(nrid, &event, MC_NONE)==0 ){
405
+ db_end_transaction(1);
406
+ style_header("Error");
407
+ @ Internal error: Fossil tried to make an invalid artifact for
408
+ @ the edited technode.
409
+ style_footer();
410
+ return;
411
+ }
399412
assert( blob_is_reset(&event) );
400413
content_deltify(rid, nrid, 0);
401414
db_end_transaction(0);
402415
cgi_redirectf("technote?name=%T", zId);
403416
}
404417
--- src/event.c
+++ src/event.c
@@ -267,10 +267,16 @@
267 rid = db_int(0,
268 "SELECT rid FROM tagxref"
269 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname GLOB '%q*')"
270 " ORDER BY mtime DESC", zTag
271 );
 
 
 
 
 
 
272 free(zTag);
273
274 /* Need both check-in and wiki-write or wiki-create privileges in order
275 ** to edit/create an event.
276 */
@@ -393,11 +399,18 @@
393 md5sum_blob(&event, &cksum);
394 blob_appendf(&event, "Z %b\n", &cksum);
395 blob_reset(&cksum);
396 nrid = content_put(&event);
397 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
398 manifest_crosslink(nrid, &event, MC_NONE);
 
 
 
 
 
 
 
399 assert( blob_is_reset(&event) );
400 content_deltify(rid, nrid, 0);
401 db_end_transaction(0);
402 cgi_redirectf("technote?name=%T", zId);
403 }
404
--- src/event.c
+++ src/event.c
@@ -267,10 +267,16 @@
267 rid = db_int(0,
268 "SELECT rid FROM tagxref"
269 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname GLOB '%q*')"
270 " ORDER BY mtime DESC", zTag
271 );
272 if( rid && strlen(zId)<40 ){
273 zId = db_text(0,
274 "SELECT substr(tagname,7) FROM tag WHERE tagname GLOB '%q*'",
275 zTag
276 );
277 }
278 free(zTag);
279
280 /* Need both check-in and wiki-write or wiki-create privileges in order
281 ** to edit/create an event.
282 */
@@ -393,11 +399,18 @@
399 md5sum_blob(&event, &cksum);
400 blob_appendf(&event, "Z %b\n", &cksum);
401 blob_reset(&cksum);
402 nrid = content_put(&event);
403 db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid);
404 if( manifest_crosslink(nrid, &event, MC_NONE)==0 ){
405 db_end_transaction(1);
406 style_header("Error");
407 @ Internal error: Fossil tried to make an invalid artifact for
408 @ the edited technode.
409 style_footer();
410 return;
411 }
412 assert( blob_is_reset(&event) );
413 content_deltify(rid, nrid, 0);
414 db_end_transaction(0);
415 cgi_redirectf("technote?name=%T", zId);
416 }
417
+4 -1
--- src/info.c
+++ src/info.c
@@ -827,10 +827,13 @@
827827
@ <tr><th>Page&nbsp;Name:</th><td>%h(pWiki->zWikiTitle)</td></tr>
828828
@ <tr><th>Date:</th><td>
829829
hyperlink_to_date(zDate, "</td></tr>");
830830
@ <tr><th>Original&nbsp;User:</th><td>
831831
hyperlink_to_user(pWiki->zUser, zDate, "</td></tr>");
832
+ if( pWiki->zMimetype ){
833
+ @ <tr><th>Mimetype:</th><td>%h(pWiki->zMimetype)</td></tr>
834
+ }
832835
if( pWiki->nParent>0 ){
833836
int i;
834837
@ <tr><th>Parent%s(pWiki->nParent==1?"":"s"):</th><td>
835838
for(i=0; i<pWiki->nParent; i++){
836839
char *zParent = pWiki->azParent[i];
@@ -854,11 +857,11 @@
854857
}
855858
856859
857860
@ <div class="section">Content</div>
858861
blob_init(&wiki, pWiki->zWiki, -1);
859
- wiki_convert(&wiki, 0, 0);
862
+ wiki_render_by_mimetype(&wiki, pWiki->zMimetype);
860863
blob_reset(&wiki);
861864
manifest_destroy(pWiki);
862865
style_footer();
863866
}
864867
865868
--- src/info.c
+++ src/info.c
@@ -827,10 +827,13 @@
827 @ <tr><th>Page&nbsp;Name:</th><td>%h(pWiki->zWikiTitle)</td></tr>
828 @ <tr><th>Date:</th><td>
829 hyperlink_to_date(zDate, "</td></tr>");
830 @ <tr><th>Original&nbsp;User:</th><td>
831 hyperlink_to_user(pWiki->zUser, zDate, "</td></tr>");
 
 
 
832 if( pWiki->nParent>0 ){
833 int i;
834 @ <tr><th>Parent%s(pWiki->nParent==1?"":"s"):</th><td>
835 for(i=0; i<pWiki->nParent; i++){
836 char *zParent = pWiki->azParent[i];
@@ -854,11 +857,11 @@
854 }
855
856
857 @ <div class="section">Content</div>
858 blob_init(&wiki, pWiki->zWiki, -1);
859 wiki_convert(&wiki, 0, 0);
860 blob_reset(&wiki);
861 manifest_destroy(pWiki);
862 style_footer();
863 }
864
865
--- src/info.c
+++ src/info.c
@@ -827,10 +827,13 @@
827 @ <tr><th>Page&nbsp;Name:</th><td>%h(pWiki->zWikiTitle)</td></tr>
828 @ <tr><th>Date:</th><td>
829 hyperlink_to_date(zDate, "</td></tr>");
830 @ <tr><th>Original&nbsp;User:</th><td>
831 hyperlink_to_user(pWiki->zUser, zDate, "</td></tr>");
832 if( pWiki->zMimetype ){
833 @ <tr><th>Mimetype:</th><td>%h(pWiki->zMimetype)</td></tr>
834 }
835 if( pWiki->nParent>0 ){
836 int i;
837 @ <tr><th>Parent%s(pWiki->nParent==1?"":"s"):</th><td>
838 for(i=0; i<pWiki->nParent; i++){
839 char *zParent = pWiki->azParent[i];
@@ -854,11 +857,11 @@
857 }
858
859
860 @ <div class="section">Content</div>
861 blob_init(&wiki, pWiki->zWiki, -1);
862 wiki_render_by_mimetype(&wiki, pWiki->zMimetype);
863 blob_reset(&wiki);
864 manifest_destroy(pWiki);
865 style_footer();
866 }
867
868
+86 -30
--- src/main.c
+++ src/main.c
@@ -1408,10 +1408,48 @@
14081408
}
14091409
}
14101410
#endif
14111411
return zRepo;
14121412
}
1413
+
1414
+/*
1415
+** Generate a web-page that lists all repositories located under the
1416
+** g.zRepositoryName directory and return non-zero.
1417
+**
1418
+** Or, if no repositories can be located beneath g.zRepositoryName,
1419
+** return 0.
1420
+*/
1421
+static int repo_list_page(void){
1422
+ Blob base;
1423
+ int n = 0;
1424
+
1425
+ assert( g.db==0 );
1426
+ blob_init(&base, g.zRepositoryName, -1);
1427
+ sqlite3_open(":memory:", &g.db);
1428
+ db_multi_exec("CREATE TABLE sfile(x TEXT);");
1429
+ db_multi_exec("CREATE TABLE vfile(pathname);");
1430
+ vfile_scan(&base, blob_size(&base), 0, 0, 0);
1431
+ db_multi_exec("DELETE FROM sfile WHERE x NOT GLOB '*.fossil'");
1432
+ n = db_int(0, "SELECT count(*) FROM sfile");
1433
+ if( n>0 ){
1434
+ Stmt q;
1435
+ @ <h1>Available Repositories:</h1>
1436
+ @ <ol>
1437
+ db_prepare(&q, "SELECT x, substr(x,-7,-100000)||'/home'"
1438
+ " FROM sfile ORDER BY x COLLATE nocase;");
1439
+ while( db_step(&q)==SQLITE_ROW ){
1440
+ const char *zName = db_column_text(&q, 0);
1441
+ const char *zUrl = db_column_text(&q, 1);
1442
+ @ <li><a href="%h(zUrl)">%h(zName)</a></li>
1443
+ }
1444
+ @ </ol>
1445
+ cgi_reply();
1446
+ }
1447
+ sqlite3_close(g.db);
1448
+ g.db = 0;
1449
+ return n;
1450
+}
14131451
14141452
/*
14151453
** Preconditions:
14161454
**
14171455
** * Environment variables are set up according to the CGI standard.
@@ -1431,11 +1469,15 @@
14311469
** $prefix can be determined from its suffix, then the file $prefix is
14321470
** returned as static text.
14331471
**
14341472
** If no suitable webpage is found, try to redirect to zNotFound.
14351473
*/
1436
-static void process_one_web_page(const char *zNotFound, Glob *pFileGlob){
1474
+static void process_one_web_page(
1475
+ const char *zNotFound, /* Redirect here on a 404 if not NULL */
1476
+ Glob *pFileGlob, /* Deliver static files matching */
1477
+ int allowRepoList /* Send repo list for "/" URL */
1478
+){
14371479
const char *zPathInfo;
14381480
char *zPath = NULL;
14391481
int idx;
14401482
int i;
14411483
@@ -1506,10 +1548,14 @@
15061548
15071549
if( szFile<1024 ){
15081550
set_base_url(0);
15091551
if( zNotFound ){
15101552
cgi_redirect(zNotFound);
1553
+ }else if( strcmp(zPathInfo,"/")==0
1554
+ && allowRepoList
1555
+ && repo_list_page() ){
1556
+ /* Will return a list of repositories */
15111557
}else{
15121558
#ifdef FOSSIL_ENABLE_JSON
15131559
if(g.json.isJsonMode){
15141560
json_err(FSL_JSON_E_RESOURCE_NOT_FOUND,NULL,1);
15151561
return;
@@ -1805,10 +1851,11 @@
18051851
const char *zFile;
18061852
const char *zNotFound = 0;
18071853
char **azRedirect = 0; /* List of repositories to redirect to */
18081854
int nRedirect = 0; /* Number of entries in azRedirect */
18091855
Glob *pFileGlob = 0; /* Pattern for files */
1856
+ int allowRepoList = 0; /* Allow lists of repository files */
18101857
Blob config, line, key, value, value2;
18111858
if( g.argc==3 && fossil_strcmp(g.argv[1],"cgi")==0 ){
18121859
zFile = g.argv[2];
18131860
}else{
18141861
zFile = g.argv[1];
@@ -1862,10 +1909,19 @@
18621909
** Grant "administrator" privileges to users connecting with HTTP
18631910
** from IP address 127.0.0.1. Do not bother checking credentials.
18641911
*/
18651912
g.useLocalauth = 1;
18661913
continue;
1914
+ }
1915
+ if( blob_eq(&key, "repolist") ){
1916
+ /* repolist
1917
+ **
1918
+ ** If using "directory:" and the URL is "/" then generate a page
1919
+ ** showing a list of available repositories.
1920
+ */
1921
+ allowRepoList = 1;
1922
+ continue;
18671923
}
18681924
if( blob_eq(&key, "redirect:") && blob_token(&line, &value)
18691925
&& blob_token(&line, &value2) ){
18701926
/* See the header comment on the redirect_web_page() function
18711927
** above for details. */
@@ -1952,11 +2008,11 @@
19522008
}
19532009
cgi_init();
19542010
if( nRedirect ){
19552011
redirect_web_page(nRedirect, azRedirect);
19562012
}else{
1957
- process_one_web_page(zNotFound, pFileGlob);
2013
+ process_one_web_page(zNotFound, pFileGlob, allowRepoList);
19582014
}
19592015
}
19602016
19612017
/*
19622018
** If g.argv[arg] exists then it is either the name of a repository
@@ -1970,24 +2026,17 @@
19702026
** Open the repository to be served if it is known. If g.argv[arg] is
19712027
** a directory full of repositories, then set g.zRepositoryName to
19722028
** the name of that directory and the specific repository will be
19732029
** opened later by process_one_web_page() based on the content of
19742030
** the PATH_INFO variable.
1975
-**
1976
-** If disallowDir is set, then the directory full of repositories method
1977
-** is disallowed.
19782031
*/
1979
-static void find_server_repository(int disallowDir, int arg){
2032
+static void find_server_repository(int arg){
19802033
if( g.argc<=arg ){
19812034
db_must_be_within_tree();
19822035
}else if( file_isdir(g.argv[arg])==1 ){
1983
- if( disallowDir ){
1984
- fossil_fatal("\"%s\" is a directory, not a repository file", g.argv[arg]);
1985
- }else{
1986
- g.zRepositoryName = mprintf("%s", g.argv[arg]);
1987
- file_simplify_name(g.zRepositoryName, -1, 0);
1988
- }
2036
+ g.zRepositoryName = mprintf("%s", g.argv[arg]);
2037
+ file_simplify_name(g.zRepositoryName, -1, 0);
19892038
}else{
19902039
db_open_repository(g.argv[arg]);
19912040
}
19922041
}
19932042
@@ -2028,18 +2077,19 @@
20282077
** If the --localauth option is given, then automatic login is performed
20292078
** for requests coming from localhost, if the "localauth" setting is not
20302079
** enabled.
20312080
**
20322081
** Options:
2082
+** --baseurl URL base URL (useful with reverse proxies)
2083
+** --files GLOB comma-separate glob patterns for static file to serve
20332084
** --localauth enable automatic login for local connections
20342085
** --host NAME specify hostname of the server
20352086
** --https signal a request coming in via https
20362087
** --nojail drop root privilege but do not enter the chroot jail
20372088
** --nossl signal that no SSL connections are available
20382089
** --notfound URL use URL as "HTTP 404, object not found" page.
2039
-** --files GLOB comma-separate glob patterns for static file to serve
2040
-** --baseurl URL base URL (useful with reverse proxies)
2090
+** --repolist If REPOSITORY is directory, URL "/" lists all repos
20412091
** --scgi Interpret input as SCGI rather than HTTP
20422092
** --skin LABEL Use override skin LABEL
20432093
**
20442094
** See also: cgi, server, winsrv
20452095
*/
@@ -2049,10 +2099,11 @@
20492099
const char *zHost;
20502100
const char *zAltBase;
20512101
const char *zFileGlob;
20522102
int useSCGI;
20532103
int noJail;
2104
+ int allowRepoList;
20542105
20552106
/* The winhttp module passes the --files option as --files-urlenc with
20562107
** the argument being URL encoded, to avoid wildcard expansion in the
20572108
** shell. This option is for internal use and is undocumented.
20582109
*/
@@ -2065,10 +2116,11 @@
20652116
zFileGlob = find_option("files",0,1);
20662117
}
20672118
skin_override();
20682119
zNotFound = find_option("notfound", 0, 1);
20692120
noJail = find_option("nojail",0,0)!=0;
2121
+ allowRepoList = find_option("repolist",0,0)!=0;
20702122
g.useLocalauth = find_option("localauth", 0, 0)!=0;
20712123
g.sslNotAvailable = find_option("nossl", 0, 0)!=0;
20722124
useSCGI = find_option("scgi", 0, 0)!=0;
20732125
zAltBase = find_option("baseurl", 0, 1);
20742126
if( zAltBase ) set_base_url(zAltBase);
@@ -2089,15 +2141,15 @@
20892141
g.fullHttpReply = 1;
20902142
if( g.argc>=5 ){
20912143
g.httpIn = fossil_fopen(g.argv[2], "rb");
20922144
g.httpOut = fossil_fopen(g.argv[3], "wb");
20932145
zIpAddr = g.argv[4];
2094
- find_server_repository(0, 5);
2146
+ find_server_repository(5);
20952147
}else{
20962148
g.httpIn = stdin;
20972149
g.httpOut = stdout;
2098
- find_server_repository(0, 2);
2150
+ find_server_repository(2);
20992151
}
21002152
if( zIpAddr==0 ){
21012153
zIpAddr = cgi_ssh_remote_addr(0);
21022154
if( zIpAddr && zIpAddr[0] ){
21032155
g.fSshClient |= CGI_SSH_CLIENT;
@@ -2109,21 +2161,21 @@
21092161
}else if( g.fSshClient & CGI_SSH_CLIENT ){
21102162
ssh_request_loop(zIpAddr, glob_create(zFileGlob));
21112163
}else{
21122164
cgi_handle_http_request(zIpAddr);
21132165
}
2114
- process_one_web_page(zNotFound, glob_create(zFileGlob));
2166
+ process_one_web_page(zNotFound, glob_create(zFileGlob), allowRepoList);
21152167
}
21162168
21172169
/*
21182170
** Process all requests in a single SSH connection if possible.
21192171
*/
21202172
void ssh_request_loop(const char *zIpAddr, Glob *FileGlob){
21212173
blob_zero(&g.cgiIn);
21222174
do{
21232175
cgi_handle_ssh_http_request(zIpAddr);
2124
- process_one_web_page(0, FileGlob);
2176
+ process_one_web_page(0, FileGlob, 0);
21252177
blob_reset(&g.cgiIn);
21262178
} while ( g.fSshClient & CGI_SSH_FOSSIL ||
21272179
g.fSshClient & CGI_SSH_COMPAT );
21282180
}
21292181
@@ -2140,21 +2192,21 @@
21402192
Th_InitTraceLog();
21412193
login_set_capabilities("sx", 0);
21422194
g.useLocalauth = 1;
21432195
g.httpIn = stdin;
21442196
g.httpOut = stdout;
2145
- find_server_repository(0, 2);
2197
+ find_server_repository(2);
21462198
g.cgiOutput = 1;
21472199
g.fullHttpReply = 1;
21482200
zIpAddr = cgi_ssh_remote_addr(0);
21492201
if( zIpAddr && zIpAddr[0] ){
21502202
g.fSshClient |= CGI_SSH_CLIENT;
21512203
ssh_request_loop(zIpAddr, 0);
21522204
}else{
21532205
cgi_set_parameter("REMOTE_ADDR", "127.0.0.1");
21542206
cgi_handle_http_request(0);
2155
- process_one_web_page(0, 0);
2207
+ process_one_web_page(0, 0, 0);
21562208
}
21572209
}
21582210
21592211
#if !defined(_WIN32)
21602212
#if !defined(__DARWIN__) && !defined(__APPLE__) && !defined(__HAIKU__)
@@ -2211,16 +2263,15 @@
22112263
** "*.fossil*" will be served as static content. With the "ui" command,
22122264
** the REPOSITORY can only be a directory if the --notfound option is
22132265
** also present.
22142266
**
22152267
** By default, the "ui" command provides full administrative access without
2216
-** having to log in. This can be disabled by setting turning off the
2217
-** "localauth" setting. Automatic login for the "server" command is available
2218
-** if the --localauth option is present and the "localauth" setting is off
2219
-** and the connection is from localhost. The optional REPOSITORY argument
2220
-** to "ui" may be a directory and will function as "server" if and only if
2221
-** the --notfound option is used.
2268
+** having to log in. This can be disabled by turning off the "localauth"
2269
+** setting. Automatic login for the "server" command is available if the
2270
+** --localauth option is present and the "localauth" setting is off and the
2271
+** connection is from localhost. The "ui" command also enables --repolist
2272
+** by default.
22222273
**
22232274
** Options:
22242275
** --baseurl URL Use URL as the base (useful for reverse proxies)
22252276
** --files GLOBLIST Comma-separated list of glob patterns for static files
22262277
** --localauth enable automatic login for requests from localhost
@@ -2227,10 +2278,11 @@
22272278
** --localhost listen on 127.0.0.1 only (always true for "ui")
22282279
** --nojail Drop root privileges but do not enter the chroot jail
22292280
** --notfound URL Redirect
22302281
** -P|--port TCPPORT listen to request on port TCPPORT
22312282
** --th-trace trace TH1 execution (for debugging purposes)
2283
+** --repolist If REPOSITORY is dir, URL "/" lists repos.
22322284
** --scgi Accept SCGI rather than HTTP
22332285
** --skin LABEL Use override skin LABEL
22342286
22352287
**
22362288
** See also: cgi, http, winsrv
@@ -2244,10 +2296,11 @@
22442296
const char *zNotFound; /* The --notfound option or NULL */
22452297
int flags = 0; /* Server flags */
22462298
#if !defined(_WIN32)
22472299
int noJail; /* Do not enter the chroot jail */
22482300
#endif
2301
+ int allowRepoList; /* List repositories on URL "/" */
22492302
const char *zAltBase; /* Argument to the --baseurl option */
22502303
const char *zFileGlob; /* Static content must match this */
22512304
char *zIpAddr = 0; /* Bind to this IP address */
22522305
22532306
#if defined(_WIN32)
@@ -2269,10 +2322,11 @@
22692322
#endif
22702323
g.useLocalauth = find_option("localauth", 0, 0)!=0;
22712324
Th_InitTraceLog();
22722325
zPort = find_option("port", "P", 1);
22732326
zNotFound = find_option("notfound", 0, 1);
2327
+ allowRepoList = find_option("repolist",0,0)!=0;
22742328
zAltBase = find_option("baseurl", 0, 1);
22752329
if( find_option("scgi", 0, 0)!=0 ) flags |= HTTP_SERVER_SCGI;
22762330
if( zAltBase ){
22772331
set_base_url(zAltBase);
22782332
}
@@ -2284,14 +2338,15 @@
22842338
verify_all_options();
22852339
22862340
if( g.argc!=2 && g.argc!=3 ) usage("?REPOSITORY?");
22872341
isUiCmd = g.argv[1][0]=='u';
22882342
if( isUiCmd ){
2289
- flags |= HTTP_SERVER_LOCALHOST;
2343
+ flags |= HTTP_SERVER_LOCALHOST|HTTP_SERVER_REPOLIST;
22902344
g.useLocalauth = 1;
2345
+ allowRepoList = 1;
22912346
}
2292
- find_server_repository(isUiCmd && zNotFound==0, 2);
2347
+ find_server_repository(2);
22932348
if( zPort ){
22942349
int i;
22952350
for(i=strlen(zPort)-1; i>=0 && zPort[i]!=':'; i--){}
22962351
if( i>0 ){
22972352
zIpAddr = mprintf("%.*s", i, zPort);
@@ -2341,20 +2396,21 @@
23412396
g.httpOut = stdout;
23422397
if( g.fHttpTrace || g.fSqlTrace ){
23432398
fprintf(stderr, "====== SERVER pid %d =======\n", getpid());
23442399
}
23452400
g.cgiOutput = 1;
2346
- find_server_repository(isUiCmd && zNotFound==0, 2);
2401
+ find_server_repository(2);
23472402
g.zRepositoryName = enter_chroot_jail(g.zRepositoryName, noJail);
23482403
if( flags & HTTP_SERVER_SCGI ){
23492404
cgi_handle_scgi_request();
23502405
}else{
23512406
cgi_handle_http_request(0);
23522407
}
2353
- process_one_web_page(zNotFound, glob_create(zFileGlob));
2408
+ process_one_web_page(zNotFound, glob_create(zFileGlob), allowRepoList);
23542409
#else
23552410
/* Win32 implementation */
2411
+ (void)allowRepoList; /* Suppress warning */
23562412
if( isUiCmd ){
23572413
zBrowser = db_get("web-browser", "start");
23582414
if( zIpAddr ){
23592415
zBrowserCmd = mprintf("%s http://%s:%%d/ &", zBrowser, zIpAddr);
23602416
}else{
23612417
--- src/main.c
+++ src/main.c
@@ -1408,10 +1408,48 @@
1408 }
1409 }
1410 #endif
1411 return zRepo;
1412 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1413
1414 /*
1415 ** Preconditions:
1416 **
1417 ** * Environment variables are set up according to the CGI standard.
@@ -1431,11 +1469,15 @@
1431 ** $prefix can be determined from its suffix, then the file $prefix is
1432 ** returned as static text.
1433 **
1434 ** If no suitable webpage is found, try to redirect to zNotFound.
1435 */
1436 static void process_one_web_page(const char *zNotFound, Glob *pFileGlob){
 
 
 
 
1437 const char *zPathInfo;
1438 char *zPath = NULL;
1439 int idx;
1440 int i;
1441
@@ -1506,10 +1548,14 @@
1506
1507 if( szFile<1024 ){
1508 set_base_url(0);
1509 if( zNotFound ){
1510 cgi_redirect(zNotFound);
 
 
 
 
1511 }else{
1512 #ifdef FOSSIL_ENABLE_JSON
1513 if(g.json.isJsonMode){
1514 json_err(FSL_JSON_E_RESOURCE_NOT_FOUND,NULL,1);
1515 return;
@@ -1805,10 +1851,11 @@
1805 const char *zFile;
1806 const char *zNotFound = 0;
1807 char **azRedirect = 0; /* List of repositories to redirect to */
1808 int nRedirect = 0; /* Number of entries in azRedirect */
1809 Glob *pFileGlob = 0; /* Pattern for files */
 
1810 Blob config, line, key, value, value2;
1811 if( g.argc==3 && fossil_strcmp(g.argv[1],"cgi")==0 ){
1812 zFile = g.argv[2];
1813 }else{
1814 zFile = g.argv[1];
@@ -1862,10 +1909,19 @@
1862 ** Grant "administrator" privileges to users connecting with HTTP
1863 ** from IP address 127.0.0.1. Do not bother checking credentials.
1864 */
1865 g.useLocalauth = 1;
1866 continue;
 
 
 
 
 
 
 
 
 
1867 }
1868 if( blob_eq(&key, "redirect:") && blob_token(&line, &value)
1869 && blob_token(&line, &value2) ){
1870 /* See the header comment on the redirect_web_page() function
1871 ** above for details. */
@@ -1952,11 +2008,11 @@
1952 }
1953 cgi_init();
1954 if( nRedirect ){
1955 redirect_web_page(nRedirect, azRedirect);
1956 }else{
1957 process_one_web_page(zNotFound, pFileGlob);
1958 }
1959 }
1960
1961 /*
1962 ** If g.argv[arg] exists then it is either the name of a repository
@@ -1970,24 +2026,17 @@
1970 ** Open the repository to be served if it is known. If g.argv[arg] is
1971 ** a directory full of repositories, then set g.zRepositoryName to
1972 ** the name of that directory and the specific repository will be
1973 ** opened later by process_one_web_page() based on the content of
1974 ** the PATH_INFO variable.
1975 **
1976 ** If disallowDir is set, then the directory full of repositories method
1977 ** is disallowed.
1978 */
1979 static void find_server_repository(int disallowDir, int arg){
1980 if( g.argc<=arg ){
1981 db_must_be_within_tree();
1982 }else if( file_isdir(g.argv[arg])==1 ){
1983 if( disallowDir ){
1984 fossil_fatal("\"%s\" is a directory, not a repository file", g.argv[arg]);
1985 }else{
1986 g.zRepositoryName = mprintf("%s", g.argv[arg]);
1987 file_simplify_name(g.zRepositoryName, -1, 0);
1988 }
1989 }else{
1990 db_open_repository(g.argv[arg]);
1991 }
1992 }
1993
@@ -2028,18 +2077,19 @@
2028 ** If the --localauth option is given, then automatic login is performed
2029 ** for requests coming from localhost, if the "localauth" setting is not
2030 ** enabled.
2031 **
2032 ** Options:
 
 
2033 ** --localauth enable automatic login for local connections
2034 ** --host NAME specify hostname of the server
2035 ** --https signal a request coming in via https
2036 ** --nojail drop root privilege but do not enter the chroot jail
2037 ** --nossl signal that no SSL connections are available
2038 ** --notfound URL use URL as "HTTP 404, object not found" page.
2039 ** --files GLOB comma-separate glob patterns for static file to serve
2040 ** --baseurl URL base URL (useful with reverse proxies)
2041 ** --scgi Interpret input as SCGI rather than HTTP
2042 ** --skin LABEL Use override skin LABEL
2043 **
2044 ** See also: cgi, server, winsrv
2045 */
@@ -2049,10 +2099,11 @@
2049 const char *zHost;
2050 const char *zAltBase;
2051 const char *zFileGlob;
2052 int useSCGI;
2053 int noJail;
 
2054
2055 /* The winhttp module passes the --files option as --files-urlenc with
2056 ** the argument being URL encoded, to avoid wildcard expansion in the
2057 ** shell. This option is for internal use and is undocumented.
2058 */
@@ -2065,10 +2116,11 @@
2065 zFileGlob = find_option("files",0,1);
2066 }
2067 skin_override();
2068 zNotFound = find_option("notfound", 0, 1);
2069 noJail = find_option("nojail",0,0)!=0;
 
2070 g.useLocalauth = find_option("localauth", 0, 0)!=0;
2071 g.sslNotAvailable = find_option("nossl", 0, 0)!=0;
2072 useSCGI = find_option("scgi", 0, 0)!=0;
2073 zAltBase = find_option("baseurl", 0, 1);
2074 if( zAltBase ) set_base_url(zAltBase);
@@ -2089,15 +2141,15 @@
2089 g.fullHttpReply = 1;
2090 if( g.argc>=5 ){
2091 g.httpIn = fossil_fopen(g.argv[2], "rb");
2092 g.httpOut = fossil_fopen(g.argv[3], "wb");
2093 zIpAddr = g.argv[4];
2094 find_server_repository(0, 5);
2095 }else{
2096 g.httpIn = stdin;
2097 g.httpOut = stdout;
2098 find_server_repository(0, 2);
2099 }
2100 if( zIpAddr==0 ){
2101 zIpAddr = cgi_ssh_remote_addr(0);
2102 if( zIpAddr && zIpAddr[0] ){
2103 g.fSshClient |= CGI_SSH_CLIENT;
@@ -2109,21 +2161,21 @@
2109 }else if( g.fSshClient & CGI_SSH_CLIENT ){
2110 ssh_request_loop(zIpAddr, glob_create(zFileGlob));
2111 }else{
2112 cgi_handle_http_request(zIpAddr);
2113 }
2114 process_one_web_page(zNotFound, glob_create(zFileGlob));
2115 }
2116
2117 /*
2118 ** Process all requests in a single SSH connection if possible.
2119 */
2120 void ssh_request_loop(const char *zIpAddr, Glob *FileGlob){
2121 blob_zero(&g.cgiIn);
2122 do{
2123 cgi_handle_ssh_http_request(zIpAddr);
2124 process_one_web_page(0, FileGlob);
2125 blob_reset(&g.cgiIn);
2126 } while ( g.fSshClient & CGI_SSH_FOSSIL ||
2127 g.fSshClient & CGI_SSH_COMPAT );
2128 }
2129
@@ -2140,21 +2192,21 @@
2140 Th_InitTraceLog();
2141 login_set_capabilities("sx", 0);
2142 g.useLocalauth = 1;
2143 g.httpIn = stdin;
2144 g.httpOut = stdout;
2145 find_server_repository(0, 2);
2146 g.cgiOutput = 1;
2147 g.fullHttpReply = 1;
2148 zIpAddr = cgi_ssh_remote_addr(0);
2149 if( zIpAddr && zIpAddr[0] ){
2150 g.fSshClient |= CGI_SSH_CLIENT;
2151 ssh_request_loop(zIpAddr, 0);
2152 }else{
2153 cgi_set_parameter("REMOTE_ADDR", "127.0.0.1");
2154 cgi_handle_http_request(0);
2155 process_one_web_page(0, 0);
2156 }
2157 }
2158
2159 #if !defined(_WIN32)
2160 #if !defined(__DARWIN__) && !defined(__APPLE__) && !defined(__HAIKU__)
@@ -2211,16 +2263,15 @@
2211 ** "*.fossil*" will be served as static content. With the "ui" command,
2212 ** the REPOSITORY can only be a directory if the --notfound option is
2213 ** also present.
2214 **
2215 ** By default, the "ui" command provides full administrative access without
2216 ** having to log in. This can be disabled by setting turning off the
2217 ** "localauth" setting. Automatic login for the "server" command is available
2218 ** if the --localauth option is present and the "localauth" setting is off
2219 ** and the connection is from localhost. The optional REPOSITORY argument
2220 ** to "ui" may be a directory and will function as "server" if and only if
2221 ** the --notfound option is used.
2222 **
2223 ** Options:
2224 ** --baseurl URL Use URL as the base (useful for reverse proxies)
2225 ** --files GLOBLIST Comma-separated list of glob patterns for static files
2226 ** --localauth enable automatic login for requests from localhost
@@ -2227,10 +2278,11 @@
2227 ** --localhost listen on 127.0.0.1 only (always true for "ui")
2228 ** --nojail Drop root privileges but do not enter the chroot jail
2229 ** --notfound URL Redirect
2230 ** -P|--port TCPPORT listen to request on port TCPPORT
2231 ** --th-trace trace TH1 execution (for debugging purposes)
 
2232 ** --scgi Accept SCGI rather than HTTP
2233 ** --skin LABEL Use override skin LABEL
2234
2235 **
2236 ** See also: cgi, http, winsrv
@@ -2244,10 +2296,11 @@
2244 const char *zNotFound; /* The --notfound option or NULL */
2245 int flags = 0; /* Server flags */
2246 #if !defined(_WIN32)
2247 int noJail; /* Do not enter the chroot jail */
2248 #endif
 
2249 const char *zAltBase; /* Argument to the --baseurl option */
2250 const char *zFileGlob; /* Static content must match this */
2251 char *zIpAddr = 0; /* Bind to this IP address */
2252
2253 #if defined(_WIN32)
@@ -2269,10 +2322,11 @@
2269 #endif
2270 g.useLocalauth = find_option("localauth", 0, 0)!=0;
2271 Th_InitTraceLog();
2272 zPort = find_option("port", "P", 1);
2273 zNotFound = find_option("notfound", 0, 1);
 
2274 zAltBase = find_option("baseurl", 0, 1);
2275 if( find_option("scgi", 0, 0)!=0 ) flags |= HTTP_SERVER_SCGI;
2276 if( zAltBase ){
2277 set_base_url(zAltBase);
2278 }
@@ -2284,14 +2338,15 @@
2284 verify_all_options();
2285
2286 if( g.argc!=2 && g.argc!=3 ) usage("?REPOSITORY?");
2287 isUiCmd = g.argv[1][0]=='u';
2288 if( isUiCmd ){
2289 flags |= HTTP_SERVER_LOCALHOST;
2290 g.useLocalauth = 1;
 
2291 }
2292 find_server_repository(isUiCmd && zNotFound==0, 2);
2293 if( zPort ){
2294 int i;
2295 for(i=strlen(zPort)-1; i>=0 && zPort[i]!=':'; i--){}
2296 if( i>0 ){
2297 zIpAddr = mprintf("%.*s", i, zPort);
@@ -2341,20 +2396,21 @@
2341 g.httpOut = stdout;
2342 if( g.fHttpTrace || g.fSqlTrace ){
2343 fprintf(stderr, "====== SERVER pid %d =======\n", getpid());
2344 }
2345 g.cgiOutput = 1;
2346 find_server_repository(isUiCmd && zNotFound==0, 2);
2347 g.zRepositoryName = enter_chroot_jail(g.zRepositoryName, noJail);
2348 if( flags & HTTP_SERVER_SCGI ){
2349 cgi_handle_scgi_request();
2350 }else{
2351 cgi_handle_http_request(0);
2352 }
2353 process_one_web_page(zNotFound, glob_create(zFileGlob));
2354 #else
2355 /* Win32 implementation */
 
2356 if( isUiCmd ){
2357 zBrowser = db_get("web-browser", "start");
2358 if( zIpAddr ){
2359 zBrowserCmd = mprintf("%s http://%s:%%d/ &", zBrowser, zIpAddr);
2360 }else{
2361
--- src/main.c
+++ src/main.c
@@ -1408,10 +1408,48 @@
1408 }
1409 }
1410 #endif
1411 return zRepo;
1412 }
1413
1414 /*
1415 ** Generate a web-page that lists all repositories located under the
1416 ** g.zRepositoryName directory and return non-zero.
1417 **
1418 ** Or, if no repositories can be located beneath g.zRepositoryName,
1419 ** return 0.
1420 */
1421 static int repo_list_page(void){
1422 Blob base;
1423 int n = 0;
1424
1425 assert( g.db==0 );
1426 blob_init(&base, g.zRepositoryName, -1);
1427 sqlite3_open(":memory:", &g.db);
1428 db_multi_exec("CREATE TABLE sfile(x TEXT);");
1429 db_multi_exec("CREATE TABLE vfile(pathname);");
1430 vfile_scan(&base, blob_size(&base), 0, 0, 0);
1431 db_multi_exec("DELETE FROM sfile WHERE x NOT GLOB '*.fossil'");
1432 n = db_int(0, "SELECT count(*) FROM sfile");
1433 if( n>0 ){
1434 Stmt q;
1435 @ <h1>Available Repositories:</h1>
1436 @ <ol>
1437 db_prepare(&q, "SELECT x, substr(x,-7,-100000)||'/home'"
1438 " FROM sfile ORDER BY x COLLATE nocase;");
1439 while( db_step(&q)==SQLITE_ROW ){
1440 const char *zName = db_column_text(&q, 0);
1441 const char *zUrl = db_column_text(&q, 1);
1442 @ <li><a href="%h(zUrl)">%h(zName)</a></li>
1443 }
1444 @ </ol>
1445 cgi_reply();
1446 }
1447 sqlite3_close(g.db);
1448 g.db = 0;
1449 return n;
1450 }
1451
1452 /*
1453 ** Preconditions:
1454 **
1455 ** * Environment variables are set up according to the CGI standard.
@@ -1431,11 +1469,15 @@
1469 ** $prefix can be determined from its suffix, then the file $prefix is
1470 ** returned as static text.
1471 **
1472 ** If no suitable webpage is found, try to redirect to zNotFound.
1473 */
1474 static void process_one_web_page(
1475 const char *zNotFound, /* Redirect here on a 404 if not NULL */
1476 Glob *pFileGlob, /* Deliver static files matching */
1477 int allowRepoList /* Send repo list for "/" URL */
1478 ){
1479 const char *zPathInfo;
1480 char *zPath = NULL;
1481 int idx;
1482 int i;
1483
@@ -1506,10 +1548,14 @@
1548
1549 if( szFile<1024 ){
1550 set_base_url(0);
1551 if( zNotFound ){
1552 cgi_redirect(zNotFound);
1553 }else if( strcmp(zPathInfo,"/")==0
1554 && allowRepoList
1555 && repo_list_page() ){
1556 /* Will return a list of repositories */
1557 }else{
1558 #ifdef FOSSIL_ENABLE_JSON
1559 if(g.json.isJsonMode){
1560 json_err(FSL_JSON_E_RESOURCE_NOT_FOUND,NULL,1);
1561 return;
@@ -1805,10 +1851,11 @@
1851 const char *zFile;
1852 const char *zNotFound = 0;
1853 char **azRedirect = 0; /* List of repositories to redirect to */
1854 int nRedirect = 0; /* Number of entries in azRedirect */
1855 Glob *pFileGlob = 0; /* Pattern for files */
1856 int allowRepoList = 0; /* Allow lists of repository files */
1857 Blob config, line, key, value, value2;
1858 if( g.argc==3 && fossil_strcmp(g.argv[1],"cgi")==0 ){
1859 zFile = g.argv[2];
1860 }else{
1861 zFile = g.argv[1];
@@ -1862,10 +1909,19 @@
1909 ** Grant "administrator" privileges to users connecting with HTTP
1910 ** from IP address 127.0.0.1. Do not bother checking credentials.
1911 */
1912 g.useLocalauth = 1;
1913 continue;
1914 }
1915 if( blob_eq(&key, "repolist") ){
1916 /* repolist
1917 **
1918 ** If using "directory:" and the URL is "/" then generate a page
1919 ** showing a list of available repositories.
1920 */
1921 allowRepoList = 1;
1922 continue;
1923 }
1924 if( blob_eq(&key, "redirect:") && blob_token(&line, &value)
1925 && blob_token(&line, &value2) ){
1926 /* See the header comment on the redirect_web_page() function
1927 ** above for details. */
@@ -1952,11 +2008,11 @@
2008 }
2009 cgi_init();
2010 if( nRedirect ){
2011 redirect_web_page(nRedirect, azRedirect);
2012 }else{
2013 process_one_web_page(zNotFound, pFileGlob, allowRepoList);
2014 }
2015 }
2016
2017 /*
2018 ** If g.argv[arg] exists then it is either the name of a repository
@@ -1970,24 +2026,17 @@
2026 ** Open the repository to be served if it is known. If g.argv[arg] is
2027 ** a directory full of repositories, then set g.zRepositoryName to
2028 ** the name of that directory and the specific repository will be
2029 ** opened later by process_one_web_page() based on the content of
2030 ** the PATH_INFO variable.
 
 
 
2031 */
2032 static void find_server_repository(int arg){
2033 if( g.argc<=arg ){
2034 db_must_be_within_tree();
2035 }else if( file_isdir(g.argv[arg])==1 ){
2036 g.zRepositoryName = mprintf("%s", g.argv[arg]);
2037 file_simplify_name(g.zRepositoryName, -1, 0);
 
 
 
 
2038 }else{
2039 db_open_repository(g.argv[arg]);
2040 }
2041 }
2042
@@ -2028,18 +2077,19 @@
2077 ** If the --localauth option is given, then automatic login is performed
2078 ** for requests coming from localhost, if the "localauth" setting is not
2079 ** enabled.
2080 **
2081 ** Options:
2082 ** --baseurl URL base URL (useful with reverse proxies)
2083 ** --files GLOB comma-separate glob patterns for static file to serve
2084 ** --localauth enable automatic login for local connections
2085 ** --host NAME specify hostname of the server
2086 ** --https signal a request coming in via https
2087 ** --nojail drop root privilege but do not enter the chroot jail
2088 ** --nossl signal that no SSL connections are available
2089 ** --notfound URL use URL as "HTTP 404, object not found" page.
2090 ** --repolist If REPOSITORY is directory, URL "/" lists all repos
 
2091 ** --scgi Interpret input as SCGI rather than HTTP
2092 ** --skin LABEL Use override skin LABEL
2093 **
2094 ** See also: cgi, server, winsrv
2095 */
@@ -2049,10 +2099,11 @@
2099 const char *zHost;
2100 const char *zAltBase;
2101 const char *zFileGlob;
2102 int useSCGI;
2103 int noJail;
2104 int allowRepoList;
2105
2106 /* The winhttp module passes the --files option as --files-urlenc with
2107 ** the argument being URL encoded, to avoid wildcard expansion in the
2108 ** shell. This option is for internal use and is undocumented.
2109 */
@@ -2065,10 +2116,11 @@
2116 zFileGlob = find_option("files",0,1);
2117 }
2118 skin_override();
2119 zNotFound = find_option("notfound", 0, 1);
2120 noJail = find_option("nojail",0,0)!=0;
2121 allowRepoList = find_option("repolist",0,0)!=0;
2122 g.useLocalauth = find_option("localauth", 0, 0)!=0;
2123 g.sslNotAvailable = find_option("nossl", 0, 0)!=0;
2124 useSCGI = find_option("scgi", 0, 0)!=0;
2125 zAltBase = find_option("baseurl", 0, 1);
2126 if( zAltBase ) set_base_url(zAltBase);
@@ -2089,15 +2141,15 @@
2141 g.fullHttpReply = 1;
2142 if( g.argc>=5 ){
2143 g.httpIn = fossil_fopen(g.argv[2], "rb");
2144 g.httpOut = fossil_fopen(g.argv[3], "wb");
2145 zIpAddr = g.argv[4];
2146 find_server_repository(5);
2147 }else{
2148 g.httpIn = stdin;
2149 g.httpOut = stdout;
2150 find_server_repository(2);
2151 }
2152 if( zIpAddr==0 ){
2153 zIpAddr = cgi_ssh_remote_addr(0);
2154 if( zIpAddr && zIpAddr[0] ){
2155 g.fSshClient |= CGI_SSH_CLIENT;
@@ -2109,21 +2161,21 @@
2161 }else if( g.fSshClient & CGI_SSH_CLIENT ){
2162 ssh_request_loop(zIpAddr, glob_create(zFileGlob));
2163 }else{
2164 cgi_handle_http_request(zIpAddr);
2165 }
2166 process_one_web_page(zNotFound, glob_create(zFileGlob), allowRepoList);
2167 }
2168
2169 /*
2170 ** Process all requests in a single SSH connection if possible.
2171 */
2172 void ssh_request_loop(const char *zIpAddr, Glob *FileGlob){
2173 blob_zero(&g.cgiIn);
2174 do{
2175 cgi_handle_ssh_http_request(zIpAddr);
2176 process_one_web_page(0, FileGlob, 0);
2177 blob_reset(&g.cgiIn);
2178 } while ( g.fSshClient & CGI_SSH_FOSSIL ||
2179 g.fSshClient & CGI_SSH_COMPAT );
2180 }
2181
@@ -2140,21 +2192,21 @@
2192 Th_InitTraceLog();
2193 login_set_capabilities("sx", 0);
2194 g.useLocalauth = 1;
2195 g.httpIn = stdin;
2196 g.httpOut = stdout;
2197 find_server_repository(2);
2198 g.cgiOutput = 1;
2199 g.fullHttpReply = 1;
2200 zIpAddr = cgi_ssh_remote_addr(0);
2201 if( zIpAddr && zIpAddr[0] ){
2202 g.fSshClient |= CGI_SSH_CLIENT;
2203 ssh_request_loop(zIpAddr, 0);
2204 }else{
2205 cgi_set_parameter("REMOTE_ADDR", "127.0.0.1");
2206 cgi_handle_http_request(0);
2207 process_one_web_page(0, 0, 0);
2208 }
2209 }
2210
2211 #if !defined(_WIN32)
2212 #if !defined(__DARWIN__) && !defined(__APPLE__) && !defined(__HAIKU__)
@@ -2211,16 +2263,15 @@
2263 ** "*.fossil*" will be served as static content. With the "ui" command,
2264 ** the REPOSITORY can only be a directory if the --notfound option is
2265 ** also present.
2266 **
2267 ** By default, the "ui" command provides full administrative access without
2268 ** having to log in. This can be disabled by turning off the "localauth"
2269 ** setting. Automatic login for the "server" command is available if the
2270 ** --localauth option is present and the "localauth" setting is off and the
2271 ** connection is from localhost. The "ui" command also enables --repolist
2272 ** by default.
 
2273 **
2274 ** Options:
2275 ** --baseurl URL Use URL as the base (useful for reverse proxies)
2276 ** --files GLOBLIST Comma-separated list of glob patterns for static files
2277 ** --localauth enable automatic login for requests from localhost
@@ -2227,10 +2278,11 @@
2278 ** --localhost listen on 127.0.0.1 only (always true for "ui")
2279 ** --nojail Drop root privileges but do not enter the chroot jail
2280 ** --notfound URL Redirect
2281 ** -P|--port TCPPORT listen to request on port TCPPORT
2282 ** --th-trace trace TH1 execution (for debugging purposes)
2283 ** --repolist If REPOSITORY is dir, URL "/" lists repos.
2284 ** --scgi Accept SCGI rather than HTTP
2285 ** --skin LABEL Use override skin LABEL
2286
2287 **
2288 ** See also: cgi, http, winsrv
@@ -2244,10 +2296,11 @@
2296 const char *zNotFound; /* The --notfound option or NULL */
2297 int flags = 0; /* Server flags */
2298 #if !defined(_WIN32)
2299 int noJail; /* Do not enter the chroot jail */
2300 #endif
2301 int allowRepoList; /* List repositories on URL "/" */
2302 const char *zAltBase; /* Argument to the --baseurl option */
2303 const char *zFileGlob; /* Static content must match this */
2304 char *zIpAddr = 0; /* Bind to this IP address */
2305
2306 #if defined(_WIN32)
@@ -2269,10 +2322,11 @@
2322 #endif
2323 g.useLocalauth = find_option("localauth", 0, 0)!=0;
2324 Th_InitTraceLog();
2325 zPort = find_option("port", "P", 1);
2326 zNotFound = find_option("notfound", 0, 1);
2327 allowRepoList = find_option("repolist",0,0)!=0;
2328 zAltBase = find_option("baseurl", 0, 1);
2329 if( find_option("scgi", 0, 0)!=0 ) flags |= HTTP_SERVER_SCGI;
2330 if( zAltBase ){
2331 set_base_url(zAltBase);
2332 }
@@ -2284,14 +2338,15 @@
2338 verify_all_options();
2339
2340 if( g.argc!=2 && g.argc!=3 ) usage("?REPOSITORY?");
2341 isUiCmd = g.argv[1][0]=='u';
2342 if( isUiCmd ){
2343 flags |= HTTP_SERVER_LOCALHOST|HTTP_SERVER_REPOLIST;
2344 g.useLocalauth = 1;
2345 allowRepoList = 1;
2346 }
2347 find_server_repository(2);
2348 if( zPort ){
2349 int i;
2350 for(i=strlen(zPort)-1; i>=0 && zPort[i]!=':'; i--){}
2351 if( i>0 ){
2352 zIpAddr = mprintf("%.*s", i, zPort);
@@ -2341,20 +2396,21 @@
2396 g.httpOut = stdout;
2397 if( g.fHttpTrace || g.fSqlTrace ){
2398 fprintf(stderr, "====== SERVER pid %d =======\n", getpid());
2399 }
2400 g.cgiOutput = 1;
2401 find_server_repository(2);
2402 g.zRepositoryName = enter_chroot_jail(g.zRepositoryName, noJail);
2403 if( flags & HTTP_SERVER_SCGI ){
2404 cgi_handle_scgi_request();
2405 }else{
2406 cgi_handle_http_request(0);
2407 }
2408 process_one_web_page(zNotFound, glob_create(zFileGlob), allowRepoList);
2409 #else
2410 /* Win32 implementation */
2411 (void)allowRepoList; /* Suppress warning */
2412 if( isUiCmd ){
2413 zBrowser = db_get("web-browser", "start");
2414 if( zIpAddr ){
2415 zBrowserCmd = mprintf("%s http://%s:%%d/ &", zBrowser, zIpAddr);
2416 }else{
2417
+3 -2
--- src/main.mk
+++ src/main.mk
@@ -450,11 +450,12 @@
450450
-DSQLITE_ENABLE_LOCKING_STYLE=0 \
451451
-DSQLITE_THREADSAFE=0 \
452452
-DSQLITE_DEFAULT_FILE_FORMAT=4 \
453453
-DSQLITE_OMIT_DEPRECATED \
454454
-DSQLITE_ENABLE_EXPLAIN_COMMENTS \
455
- -DSQLITE_ENABLE_FTS4
455
+ -DSQLITE_ENABLE_FTS4 \
456
+ -DSQLITE_ENABLE_FTS3_PARENTHESIS
456457
457458
# Setup the options used to compile the included SQLite shell.
458459
SHELL_OPTIONS = -Dmain=sqlite3_shell \
459460
-DSQLITE_OMIT_LOAD_EXTENSION=1 \
460461
-DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
@@ -491,11 +492,11 @@
491492
$(OBJDIR)/cson_amalgamation.o
492493
493494
494495
$(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ)
495496
$(OBJDIR)/codecheck1 $(TRANS_SRC)
496
- $(TCC) $(CFLAGS) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
497
+ $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
497498
498499
# This rule prevents make from using its default rules to try build
499500
# an executable named "manifest" out of the file named "manifest.c"
500501
#
501502
$(SRCDIR)/../manifest:
502503
--- src/main.mk
+++ src/main.mk
@@ -450,11 +450,12 @@
450 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
451 -DSQLITE_THREADSAFE=0 \
452 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
453 -DSQLITE_OMIT_DEPRECATED \
454 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
455 -DSQLITE_ENABLE_FTS4
 
456
457 # Setup the options used to compile the included SQLite shell.
458 SHELL_OPTIONS = -Dmain=sqlite3_shell \
459 -DSQLITE_OMIT_LOAD_EXTENSION=1 \
460 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
@@ -491,11 +492,11 @@
491 $(OBJDIR)/cson_amalgamation.o
492
493
494 $(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ)
495 $(OBJDIR)/codecheck1 $(TRANS_SRC)
496 $(TCC) $(CFLAGS) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
497
498 # This rule prevents make from using its default rules to try build
499 # an executable named "manifest" out of the file named "manifest.c"
500 #
501 $(SRCDIR)/../manifest:
502
--- src/main.mk
+++ src/main.mk
@@ -450,11 +450,12 @@
450 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
451 -DSQLITE_THREADSAFE=0 \
452 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
453 -DSQLITE_OMIT_DEPRECATED \
454 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
455 -DSQLITE_ENABLE_FTS4 \
456 -DSQLITE_ENABLE_FTS3_PARENTHESIS
457
458 # Setup the options used to compile the included SQLite shell.
459 SHELL_OPTIONS = -Dmain=sqlite3_shell \
460 -DSQLITE_OMIT_LOAD_EXTENSION=1 \
461 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
@@ -491,11 +492,11 @@
492 $(OBJDIR)/cson_amalgamation.o
493
494
495 $(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ)
496 $(OBJDIR)/codecheck1 $(TRANS_SRC)
497 $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB)
498
499 # This rule prevents make from using its default rules to try build
500 # an executable named "manifest" out of the file named "manifest.c"
501 #
502 $(SRCDIR)/../manifest:
503
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -158,10 +158,11 @@
158158
-DSQLITE_THREADSAFE=0
159159
-DSQLITE_DEFAULT_FILE_FORMAT=4
160160
-DSQLITE_OMIT_DEPRECATED
161161
-DSQLITE_ENABLE_EXPLAIN_COMMENTS
162162
-DSQLITE_ENABLE_FTS4
163
+ -DSQLITE_ENABLE_FTS3_PARENTHESIS
163164
}
164165
#lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1
165166
#lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4
166167
#lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI
167168
#lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096
168169
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -158,10 +158,11 @@
158 -DSQLITE_THREADSAFE=0
159 -DSQLITE_DEFAULT_FILE_FORMAT=4
160 -DSQLITE_OMIT_DEPRECATED
161 -DSQLITE_ENABLE_EXPLAIN_COMMENTS
162 -DSQLITE_ENABLE_FTS4
 
163 }
164 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1
165 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4
166 #lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI
167 #lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096
168
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -158,10 +158,11 @@
158 -DSQLITE_THREADSAFE=0
159 -DSQLITE_DEFAULT_FILE_FORMAT=4
160 -DSQLITE_OMIT_DEPRECATED
161 -DSQLITE_ENABLE_EXPLAIN_COMMENTS
162 -DSQLITE_ENABLE_FTS4
163 -DSQLITE_ENABLE_FTS3_PARENTHESIS
164 }
165 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1
166 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4
167 #lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI
168 #lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096
169
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -82,14 +82,18 @@
8282
}
8383
}
8484
8585
8686
/* HTML block tags */
87
+
88
+/* Size of the prolog: "<div class='markdown'>\n" */
89
+#define PROLOG_SIZE 23
8790
8891
static void html_prolog(struct Blob *ob, void *opaque){
8992
INTER_BLOCK(ob);
9093
BLOB_APPEND_LITTERAL(ob, "<div class=\"markdown\">\n");
94
+ assert( blob_size(ob)==PROLOG_SIZE );
9195
}
9296
9397
static void html_epilog(struct Blob *ob, void *opaque){
9498
INTER_BLOCK(ob);
9599
BLOB_APPEND_LITTERAL(ob, "</div>\n");
@@ -126,13 +130,12 @@
126130
void *opaque
127131
){
128132
struct Blob *title = opaque;
129133
/* The first header at the beginning of a text is considered as
130134
* a title and not output. */
131
- if( blob_size(ob)==0 && blob_size(title)==0 ){
135
+ if( blob_size(ob)<=PROLOG_SIZE && blob_size(title)==0 ){
132136
BLOB_APPEND_BLOB(title, text);
133
- return;
134137
}
135138
INTER_BLOCK(ob);
136139
blob_appendf(ob, "<h%d>", level);
137140
BLOB_APPEND_BLOB(ob, text);
138141
blob_appendf(ob, "</h%d>", level);
139142
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -82,14 +82,18 @@
82 }
83 }
84
85
86 /* HTML block tags */
 
 
 
87
88 static void html_prolog(struct Blob *ob, void *opaque){
89 INTER_BLOCK(ob);
90 BLOB_APPEND_LITTERAL(ob, "<div class=\"markdown\">\n");
 
91 }
92
93 static void html_epilog(struct Blob *ob, void *opaque){
94 INTER_BLOCK(ob);
95 BLOB_APPEND_LITTERAL(ob, "</div>\n");
@@ -126,13 +130,12 @@
126 void *opaque
127 ){
128 struct Blob *title = opaque;
129 /* The first header at the beginning of a text is considered as
130 * a title and not output. */
131 if( blob_size(ob)==0 && blob_size(title)==0 ){
132 BLOB_APPEND_BLOB(title, text);
133 return;
134 }
135 INTER_BLOCK(ob);
136 blob_appendf(ob, "<h%d>", level);
137 BLOB_APPEND_BLOB(ob, text);
138 blob_appendf(ob, "</h%d>", level);
139
--- src/markdown_html.c
+++ src/markdown_html.c
@@ -82,14 +82,18 @@
82 }
83 }
84
85
86 /* HTML block tags */
87
88 /* Size of the prolog: "<div class='markdown'>\n" */
89 #define PROLOG_SIZE 23
90
91 static void html_prolog(struct Blob *ob, void *opaque){
92 INTER_BLOCK(ob);
93 BLOB_APPEND_LITTERAL(ob, "<div class=\"markdown\">\n");
94 assert( blob_size(ob)==PROLOG_SIZE );
95 }
96
97 static void html_epilog(struct Blob *ob, void *opaque){
98 INTER_BLOCK(ob);
99 BLOB_APPEND_LITTERAL(ob, "</div>\n");
@@ -126,13 +130,12 @@
130 void *opaque
131 ){
132 struct Blob *title = opaque;
133 /* The first header at the beginning of a text is considered as
134 * a title and not output. */
135 if( blob_size(ob)<=PROLOG_SIZE && blob_size(title)==0 ){
136 BLOB_APPEND_BLOB(title, text);
 
137 }
138 INTER_BLOCK(ob);
139 blob_appendf(ob, "<h%d>", level);
140 BLOB_APPEND_BLOB(ob, text);
141 blob_appendf(ob, "</h%d>", level);
142
+23 -3
--- src/skins.c
+++ src/skins.c
@@ -60,28 +60,38 @@
6060
**
6161
** The following static variable holds the name of the alternative skin,
6262
** or NULL if the skin should be as configured.
6363
*/
6464
static struct BuiltinSkin *pAltSkin = 0;
65
+static char *zAltSkinDir = 0;
6566
6667
/*
6768
** Invoke this routine to set the alternative skin. Return NULL if the
6869
** alternative was successfully installed. Return a string listing all
6970
** available skins if zName does not match an available skin. Memory
7071
** for the returned string comes from fossil_malloc() and should be freed
7172
** by the caller.
73
+**
74
+** If the alternative skin name contains one or more '/' characters, then
75
+** it is assumed to be a directory on disk that holds override css.txt,
76
+** footer.txt, and header.txt. This mode can be used for interactive
77
+** development of new skins.
7278
*/
7379
char *skin_use_alternative(const char *zName){
7480
int i;
75
- Blob err;
81
+ Blob err = BLOB_INITIALIZER;
82
+ if( strchr(zName, '/')!=0 ){
83
+ zAltSkinDir = fossil_strdup(zName);
84
+ return 0;
85
+ }
7686
for(i=0; i<ArraySize(aBuiltinSkin); i++){
7787
if( fossil_strcmp(aBuiltinSkin[i].zLabel, zName)==0 ){
7888
pAltSkin = &aBuiltinSkin[i];
7989
return 0;
8090
}
8191
}
82
- blob_init(&err, aBuiltinSkin[0].zLabel, -1);
92
+ blob_appendf(&err, "available skins: %s", aBuiltinSkin[0].zLabel);
8393
for(i=1; i<ArraySize(aBuiltinSkin); i++){
8494
blob_append(&err, " ", 1);
8595
blob_append(&err, aBuiltinSkin[i].zLabel, -1);
8696
}
8797
return blob_str(&err);
@@ -93,11 +103,11 @@
93103
*/
94104
void skin_override(void){
95105
const char *zSkin = find_option("skin",0,1);
96106
if( zSkin ){
97107
char *zErr = skin_use_alternative(zSkin);
98
- if( zErr ) fossil_fatal("available skins: %s", zErr);
108
+ if( zErr ) fossil_fatal("%s", zErr);
99109
}
100110
}
101111
102112
/*
103113
** The following routines return the various components of the skin
@@ -104,10 +114,20 @@
104114
** that should be used for the current run.
105115
*/
106116
const char *skin_get(const char *zWhat){
107117
const char *zOut;
108118
char *z;
119
+ if( zAltSkinDir ){
120
+ char *z = mprintf("%s/%s.txt", zAltSkinDir, zWhat);
121
+ if( file_isfile(z) ){
122
+ Blob x;
123
+ blob_read_from_file(&x, z);
124
+ fossil_free(z);
125
+ return blob_str(&x);
126
+ }
127
+ fossil_free(z);
128
+ }
109129
if( pAltSkin ){
110130
z = mprintf("skins/%s/%s.txt", pAltSkin->zLabel, zWhat);
111131
zOut = builtin_text(z);
112132
fossil_free(z);
113133
}else{
114134
--- src/skins.c
+++ src/skins.c
@@ -60,28 +60,38 @@
60 **
61 ** The following static variable holds the name of the alternative skin,
62 ** or NULL if the skin should be as configured.
63 */
64 static struct BuiltinSkin *pAltSkin = 0;
 
65
66 /*
67 ** Invoke this routine to set the alternative skin. Return NULL if the
68 ** alternative was successfully installed. Return a string listing all
69 ** available skins if zName does not match an available skin. Memory
70 ** for the returned string comes from fossil_malloc() and should be freed
71 ** by the caller.
 
 
 
 
 
72 */
73 char *skin_use_alternative(const char *zName){
74 int i;
75 Blob err;
 
 
 
 
76 for(i=0; i<ArraySize(aBuiltinSkin); i++){
77 if( fossil_strcmp(aBuiltinSkin[i].zLabel, zName)==0 ){
78 pAltSkin = &aBuiltinSkin[i];
79 return 0;
80 }
81 }
82 blob_init(&err, aBuiltinSkin[0].zLabel, -1);
83 for(i=1; i<ArraySize(aBuiltinSkin); i++){
84 blob_append(&err, " ", 1);
85 blob_append(&err, aBuiltinSkin[i].zLabel, -1);
86 }
87 return blob_str(&err);
@@ -93,11 +103,11 @@
93 */
94 void skin_override(void){
95 const char *zSkin = find_option("skin",0,1);
96 if( zSkin ){
97 char *zErr = skin_use_alternative(zSkin);
98 if( zErr ) fossil_fatal("available skins: %s", zErr);
99 }
100 }
101
102 /*
103 ** The following routines return the various components of the skin
@@ -104,10 +114,20 @@
104 ** that should be used for the current run.
105 */
106 const char *skin_get(const char *zWhat){
107 const char *zOut;
108 char *z;
 
 
 
 
 
 
 
 
 
 
109 if( pAltSkin ){
110 z = mprintf("skins/%s/%s.txt", pAltSkin->zLabel, zWhat);
111 zOut = builtin_text(z);
112 fossil_free(z);
113 }else{
114
--- src/skins.c
+++ src/skins.c
@@ -60,28 +60,38 @@
60 **
61 ** The following static variable holds the name of the alternative skin,
62 ** or NULL if the skin should be as configured.
63 */
64 static struct BuiltinSkin *pAltSkin = 0;
65 static char *zAltSkinDir = 0;
66
67 /*
68 ** Invoke this routine to set the alternative skin. Return NULL if the
69 ** alternative was successfully installed. Return a string listing all
70 ** available skins if zName does not match an available skin. Memory
71 ** for the returned string comes from fossil_malloc() and should be freed
72 ** by the caller.
73 **
74 ** If the alternative skin name contains one or more '/' characters, then
75 ** it is assumed to be a directory on disk that holds override css.txt,
76 ** footer.txt, and header.txt. This mode can be used for interactive
77 ** development of new skins.
78 */
79 char *skin_use_alternative(const char *zName){
80 int i;
81 Blob err = BLOB_INITIALIZER;
82 if( strchr(zName, '/')!=0 ){
83 zAltSkinDir = fossil_strdup(zName);
84 return 0;
85 }
86 for(i=0; i<ArraySize(aBuiltinSkin); i++){
87 if( fossil_strcmp(aBuiltinSkin[i].zLabel, zName)==0 ){
88 pAltSkin = &aBuiltinSkin[i];
89 return 0;
90 }
91 }
92 blob_appendf(&err, "available skins: %s", aBuiltinSkin[0].zLabel);
93 for(i=1; i<ArraySize(aBuiltinSkin); i++){
94 blob_append(&err, " ", 1);
95 blob_append(&err, aBuiltinSkin[i].zLabel, -1);
96 }
97 return blob_str(&err);
@@ -93,11 +103,11 @@
103 */
104 void skin_override(void){
105 const char *zSkin = find_option("skin",0,1);
106 if( zSkin ){
107 char *zErr = skin_use_alternative(zSkin);
108 if( zErr ) fossil_fatal("%s", zErr);
109 }
110 }
111
112 /*
113 ** The following routines return the various components of the skin
@@ -104,10 +114,20 @@
114 ** that should be used for the current run.
115 */
116 const char *skin_get(const char *zWhat){
117 const char *zOut;
118 char *z;
119 if( zAltSkinDir ){
120 char *z = mprintf("%s/%s.txt", zAltSkinDir, zWhat);
121 if( file_isfile(z) ){
122 Blob x;
123 blob_read_from_file(&x, z);
124 fossil_free(z);
125 return blob_str(&x);
126 }
127 fossil_free(z);
128 }
129 if( pAltSkin ){
130 z = mprintf("skins/%s/%s.txt", pAltSkin->zLabel, zWhat);
131 zOut = builtin_text(z);
132 fossil_free(z);
133 }else{
134
--- src/style.c
+++ src/style.c
@@ -1264,11 +1264,10 @@
12641264
@ padding-left: 1em;
12651265
@ padding-right: 1em;
12661266
},
12671267
{ ".fileage td:nth-child(3)",
12681268
"fileage third column (the check-in comment)",
1269
- @ word-break: break-all;
12701269
@ word-wrap: break-word;
12711270
@ max-width: 50%;
12721271
},
12731272
{ ".brlist table", "The list of branches",
12741273
@ border-spacing: 0;
12751274
--- src/style.c
+++ src/style.c
@@ -1264,11 +1264,10 @@
1264 @ padding-left: 1em;
1265 @ padding-right: 1em;
1266 },
1267 { ".fileage td:nth-child(3)",
1268 "fileage third column (the check-in comment)",
1269 @ word-break: break-all;
1270 @ word-wrap: break-word;
1271 @ max-width: 50%;
1272 },
1273 { ".brlist table", "The list of branches",
1274 @ border-spacing: 0;
1275
--- src/style.c
+++ src/style.c
@@ -1264,11 +1264,10 @@
1264 @ padding-left: 1em;
1265 @ padding-right: 1em;
1266 },
1267 { ".fileage td:nth-child(3)",
1268 "fileage third column (the check-in comment)",
 
1269 @ word-wrap: break-word;
1270 @ max-width: 50%;
1271 },
1272 { ".brlist table", "The list of branches",
1273 @ border-spacing: 0;
1274
+3 -2
--- src/th_main.c
+++ src/th_main.c
@@ -2110,12 +2110,13 @@
21102110
int rc = TH_OK;
21112111
int nResult = 0;
21122112
char *zResult;
21132113
int forceCgi, fullHttpReply;
21142114
Th_InitTraceLog();
2115
- forceCgi = find_option("th-force-cgi", 0, 0)!=0;
2116
- fullHttpReply = find_option("th-full-http", 0, 0)!=0;
2115
+ forceCgi = find_option("cgi", 0, 0)!=0;
2116
+ fullHttpReply = find_option("http", 0, 0)!=0;
2117
+ if( fullHttpReply ) forceCgi = 1;
21172118
if( forceCgi ) Th_ForceCgi(fullHttpReply);
21182119
if( g.argc<5 ){
21192120
usage("TYPE NAME FLAGS");
21202121
}
21212122
if( fossil_stricmp(g.argv[2], "cmdhook")==0 ){
21222123
--- src/th_main.c
+++ src/th_main.c
@@ -2110,12 +2110,13 @@
2110 int rc = TH_OK;
2111 int nResult = 0;
2112 char *zResult;
2113 int forceCgi, fullHttpReply;
2114 Th_InitTraceLog();
2115 forceCgi = find_option("th-force-cgi", 0, 0)!=0;
2116 fullHttpReply = find_option("th-full-http", 0, 0)!=0;
 
2117 if( forceCgi ) Th_ForceCgi(fullHttpReply);
2118 if( g.argc<5 ){
2119 usage("TYPE NAME FLAGS");
2120 }
2121 if( fossil_stricmp(g.argv[2], "cmdhook")==0 ){
2122
--- src/th_main.c
+++ src/th_main.c
@@ -2110,12 +2110,13 @@
2110 int rc = TH_OK;
2111 int nResult = 0;
2112 char *zResult;
2113 int forceCgi, fullHttpReply;
2114 Th_InitTraceLog();
2115 forceCgi = find_option("cgi", 0, 0)!=0;
2116 fullHttpReply = find_option("http", 0, 0)!=0;
2117 if( fullHttpReply ) forceCgi = 1;
2118 if( forceCgi ) Th_ForceCgi(fullHttpReply);
2119 if( g.argc<5 ){
2120 usage("TYPE NAME FLAGS");
2121 }
2122 if( fossil_stricmp(g.argv[2], "cmdhook")==0 ){
2123
+19 -14
--- src/timeline.c
+++ src/timeline.c
@@ -1198,10 +1198,11 @@
11981198
}
11991199
if( tagid>0
12001200
&& db_int(0,"SELECT count(*) FROM tagxref WHERE tagid=%d",tagid)<=nEntry
12011201
){
12021202
nEntry = -1;
1203
+ zCirca = 0;
12031204
}
12041205
if( zType[0]=='a' ){
12051206
tmFlags |= TIMELINE_BRIEF | TIMELINE_GRAPH;
12061207
}else{
12071208
tmFlags |= TIMELINE_GRAPH;
@@ -1250,11 +1251,11 @@
12501251
tmFlags |= TIMELINE_FCHANGES;
12511252
}
12521253
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
12531254
blob_append_sql(&sql,
12541255
" AND NOT EXISTS(SELECT 1 FROM tagxref"
1255
- " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1256
+ " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)\n",
12561257
TAG_HIDDEN
12571258
);
12581259
}
12591260
if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
12601261
/* If from= and to= are present, display all nodes on a path connecting
@@ -1375,12 +1376,12 @@
13751376
blob_append_sql(&sql, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
13761377
zYearWeek);
13771378
}
13781379
if( tagid>0 ){
13791380
blob_append_sql(&sql,
1380
- "AND (EXISTS(SELECT 1 FROM tagxref"
1381
- " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
1381
+ " AND (EXISTS(SELECT 1 FROM tagxref"
1382
+ " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)\n", tagid);
13821383
13831384
if( zBrName ){
13841385
/* The next two blob_appendf() calls add SQL that causes checkins that
13851386
** are not part of the branch which are parents or children of the
13861387
** branch to be included in the report. This related check-ins are
@@ -1387,30 +1388,30 @@
13871388
** useful in helping to visualize what has happened on a quiescent
13881389
** branch that is infrequently merged with a much more activate branch.
13891390
*/
13901391
blob_append_sql(&sql,
13911392
" OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=cid"
1392
- " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1393
+ " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)\n",
13931394
tagid
13941395
);
13951396
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
13961397
blob_append_sql(&sql,
13971398
" AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid"
1398
- " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1399
+ " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)\n",
13991400
TAG_HIDDEN
14001401
);
14011402
}
14021403
if( P("mionly")==0 ){
14031404
blob_append_sql(&sql,
14041405
" OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=pid"
1405
- " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1406
+ " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)\n",
14061407
tagid
14071408
);
14081409
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
14091410
blob_append_sql(&sql,
14101411
" AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1411
- " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1412
+ " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)\n",
14121413
TAG_HIDDEN
14131414
);
14141415
}
14151416
}
14161417
}
@@ -1496,20 +1497,24 @@
14961497
url_add_parameter(&url, "c", 0);
14971498
}else if( rCirca>0.0 ){
14981499
Blob sql2;
14991500
blob_init(&sql2, blob_sql_text(&sql), -1);
15001501
blob_append_sql(&sql2,
1501
- " AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
1502
- rCirca, (nEntry+1)/2
1503
- );
1502
+ " AND event.mtime<=%f ORDER BY event.mtime DESC", rCirca);
1503
+ if( nEntry>0 ){
1504
+ blob_append_sql(&sql2," LIMIT %d", (nEntry+1)/2);
1505
+ nEntry -= (nEntry+1)/2;
1506
+ }
1507
+ if( PB("showsql") ){
1508
+ @ <pre>%h(blob_sql_text(&sql2))</pre>
1509
+ }
15041510
db_multi_exec("%s", blob_sql_text(&sql2));
15051511
blob_reset(&sql2);
15061512
blob_append_sql(&sql,
15071513
" AND event.mtime>=%f ORDER BY event.mtime ASC",
15081514
rCirca
15091515
);
1510
- nEntry -= (nEntry+1)/2;
15111516
if( zMark==0 ) zMark = zCirca;
15121517
}else{
15131518
blob_append_sql(&sql, " ORDER BY event.mtime DESC");
15141519
}
15151520
if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
@@ -1583,11 +1588,11 @@
15831588
style_submenu_binary("v","With Files","Without Files",
15841589
zType[0]!='a' && zType[0]!='c');
15851590
}
15861591
}
15871592
if( PB("showsql") ){
1588
- @ <blockquote>%h(blob_sql_text(&sql))</blockquote>
1593
+ @ <pre>%h(blob_sql_text(&sql))</pre>
15891594
}
15901595
if( search_restrict(SRCH_CKIN)!=0 ){
15911596
style_submenu_element("Search", 0, "%R/search?y=c");
15921597
}
15931598
if( PB("showid") ) tmFlags |= TIMELINE_SHOWRID;
@@ -1802,11 +1807,11 @@
18021807
** before
18031808
** after
18041809
** descendants | children
18051810
** ancestors | parents
18061811
**
1807
-** The BASELINE can be any unique prefix of 4 characters or more.
1812
+** The CHECKIN can be any unique prefix of 4 characters or more.
18081813
** The DATETIME should be in the ISO8601 format. For
18091814
** examples: "2007-08-18 07:21:21". You can also say "current"
18101815
** for the current version or "now" for the current time.
18111816
**
18121817
** Options:
@@ -1950,11 +1955,11 @@
19501955
}
19511956
19521957
if( mode==0 ) mode = 1;
19531958
blob_zero(&sql);
19541959
blob_append(&sql, timeline_query_for_tty(), -1);
1955
- blob_append_sql(&sql, " AND event.mtime %s %s",
1960
+ blob_append_sql(&sql, "\n AND event.mtime %s %s",
19561961
(mode==1 || mode==4) ? "<=" : ">=",
19571962
zDate /*safe-for-%s*/
19581963
);
19591964
19601965
if( mode==3 || mode==4 ){
19611966
--- src/timeline.c
+++ src/timeline.c
@@ -1198,10 +1198,11 @@
1198 }
1199 if( tagid>0
1200 && db_int(0,"SELECT count(*) FROM tagxref WHERE tagid=%d",tagid)<=nEntry
1201 ){
1202 nEntry = -1;
 
1203 }
1204 if( zType[0]=='a' ){
1205 tmFlags |= TIMELINE_BRIEF | TIMELINE_GRAPH;
1206 }else{
1207 tmFlags |= TIMELINE_GRAPH;
@@ -1250,11 +1251,11 @@
1250 tmFlags |= TIMELINE_FCHANGES;
1251 }
1252 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1253 blob_append_sql(&sql,
1254 " AND NOT EXISTS(SELECT 1 FROM tagxref"
1255 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1256 TAG_HIDDEN
1257 );
1258 }
1259 if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
1260 /* If from= and to= are present, display all nodes on a path connecting
@@ -1375,12 +1376,12 @@
1375 blob_append_sql(&sql, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
1376 zYearWeek);
1377 }
1378 if( tagid>0 ){
1379 blob_append_sql(&sql,
1380 "AND (EXISTS(SELECT 1 FROM tagxref"
1381 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
1382
1383 if( zBrName ){
1384 /* The next two blob_appendf() calls add SQL that causes checkins that
1385 ** are not part of the branch which are parents or children of the
1386 ** branch to be included in the report. This related check-ins are
@@ -1387,30 +1388,30 @@
1387 ** useful in helping to visualize what has happened on a quiescent
1388 ** branch that is infrequently merged with a much more activate branch.
1389 */
1390 blob_append_sql(&sql,
1391 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=cid"
1392 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1393 tagid
1394 );
1395 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1396 blob_append_sql(&sql,
1397 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid"
1398 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)",
1399 TAG_HIDDEN
1400 );
1401 }
1402 if( P("mionly")==0 ){
1403 blob_append_sql(&sql,
1404 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=pid"
1405 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1406 tagid
1407 );
1408 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1409 blob_append_sql(&sql,
1410 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1411 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1412 TAG_HIDDEN
1413 );
1414 }
1415 }
1416 }
@@ -1496,20 +1497,24 @@
1496 url_add_parameter(&url, "c", 0);
1497 }else if( rCirca>0.0 ){
1498 Blob sql2;
1499 blob_init(&sql2, blob_sql_text(&sql), -1);
1500 blob_append_sql(&sql2,
1501 " AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
1502 rCirca, (nEntry+1)/2
1503 );
 
 
 
 
 
1504 db_multi_exec("%s", blob_sql_text(&sql2));
1505 blob_reset(&sql2);
1506 blob_append_sql(&sql,
1507 " AND event.mtime>=%f ORDER BY event.mtime ASC",
1508 rCirca
1509 );
1510 nEntry -= (nEntry+1)/2;
1511 if( zMark==0 ) zMark = zCirca;
1512 }else{
1513 blob_append_sql(&sql, " ORDER BY event.mtime DESC");
1514 }
1515 if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
@@ -1583,11 +1588,11 @@
1583 style_submenu_binary("v","With Files","Without Files",
1584 zType[0]!='a' && zType[0]!='c');
1585 }
1586 }
1587 if( PB("showsql") ){
1588 @ <blockquote>%h(blob_sql_text(&sql))</blockquote>
1589 }
1590 if( search_restrict(SRCH_CKIN)!=0 ){
1591 style_submenu_element("Search", 0, "%R/search?y=c");
1592 }
1593 if( PB("showid") ) tmFlags |= TIMELINE_SHOWRID;
@@ -1802,11 +1807,11 @@
1802 ** before
1803 ** after
1804 ** descendants | children
1805 ** ancestors | parents
1806 **
1807 ** The BASELINE can be any unique prefix of 4 characters or more.
1808 ** The DATETIME should be in the ISO8601 format. For
1809 ** examples: "2007-08-18 07:21:21". You can also say "current"
1810 ** for the current version or "now" for the current time.
1811 **
1812 ** Options:
@@ -1950,11 +1955,11 @@
1950 }
1951
1952 if( mode==0 ) mode = 1;
1953 blob_zero(&sql);
1954 blob_append(&sql, timeline_query_for_tty(), -1);
1955 blob_append_sql(&sql, " AND event.mtime %s %s",
1956 (mode==1 || mode==4) ? "<=" : ">=",
1957 zDate /*safe-for-%s*/
1958 );
1959
1960 if( mode==3 || mode==4 ){
1961
--- src/timeline.c
+++ src/timeline.c
@@ -1198,10 +1198,11 @@
1198 }
1199 if( tagid>0
1200 && db_int(0,"SELECT count(*) FROM tagxref WHERE tagid=%d",tagid)<=nEntry
1201 ){
1202 nEntry = -1;
1203 zCirca = 0;
1204 }
1205 if( zType[0]=='a' ){
1206 tmFlags |= TIMELINE_BRIEF | TIMELINE_GRAPH;
1207 }else{
1208 tmFlags |= TIMELINE_GRAPH;
@@ -1250,11 +1251,11 @@
1251 tmFlags |= TIMELINE_FCHANGES;
1252 }
1253 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1254 blob_append_sql(&sql,
1255 " AND NOT EXISTS(SELECT 1 FROM tagxref"
1256 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)\n",
1257 TAG_HIDDEN
1258 );
1259 }
1260 if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
1261 /* If from= and to= are present, display all nodes on a path connecting
@@ -1375,12 +1376,12 @@
1376 blob_append_sql(&sql, " AND %Q=strftime('%%Y-%%W',event.mtime) ",
1377 zYearWeek);
1378 }
1379 if( tagid>0 ){
1380 blob_append_sql(&sql,
1381 " AND (EXISTS(SELECT 1 FROM tagxref"
1382 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)\n", tagid);
1383
1384 if( zBrName ){
1385 /* The next two blob_appendf() calls add SQL that causes checkins that
1386 ** are not part of the branch which are parents or children of the
1387 ** branch to be included in the report. This related check-ins are
@@ -1387,30 +1388,30 @@
1388 ** useful in helping to visualize what has happened on a quiescent
1389 ** branch that is infrequently merged with a much more activate branch.
1390 */
1391 blob_append_sql(&sql,
1392 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=cid"
1393 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)\n",
1394 tagid
1395 );
1396 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1397 blob_append_sql(&sql,
1398 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid"
1399 " WHERE tagid=%d AND tagtype>0 AND pid=blob.rid)\n",
1400 TAG_HIDDEN
1401 );
1402 }
1403 if( P("mionly")==0 ){
1404 blob_append_sql(&sql,
1405 " OR EXISTS(SELECT 1 FROM plink CROSS JOIN tagxref ON rid=pid"
1406 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)\n",
1407 tagid
1408 );
1409 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1410 blob_append_sql(&sql,
1411 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1412 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)\n",
1413 TAG_HIDDEN
1414 );
1415 }
1416 }
1417 }
@@ -1496,20 +1497,24 @@
1497 url_add_parameter(&url, "c", 0);
1498 }else if( rCirca>0.0 ){
1499 Blob sql2;
1500 blob_init(&sql2, blob_sql_text(&sql), -1);
1501 blob_append_sql(&sql2,
1502 " AND event.mtime<=%f ORDER BY event.mtime DESC", rCirca);
1503 if( nEntry>0 ){
1504 blob_append_sql(&sql2," LIMIT %d", (nEntry+1)/2);
1505 nEntry -= (nEntry+1)/2;
1506 }
1507 if( PB("showsql") ){
1508 @ <pre>%h(blob_sql_text(&sql2))</pre>
1509 }
1510 db_multi_exec("%s", blob_sql_text(&sql2));
1511 blob_reset(&sql2);
1512 blob_append_sql(&sql,
1513 " AND event.mtime>=%f ORDER BY event.mtime ASC",
1514 rCirca
1515 );
 
1516 if( zMark==0 ) zMark = zCirca;
1517 }else{
1518 blob_append_sql(&sql, " ORDER BY event.mtime DESC");
1519 }
1520 if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
@@ -1583,11 +1588,11 @@
1588 style_submenu_binary("v","With Files","Without Files",
1589 zType[0]!='a' && zType[0]!='c');
1590 }
1591 }
1592 if( PB("showsql") ){
1593 @ <pre>%h(blob_sql_text(&sql))</pre>
1594 }
1595 if( search_restrict(SRCH_CKIN)!=0 ){
1596 style_submenu_element("Search", 0, "%R/search?y=c");
1597 }
1598 if( PB("showid") ) tmFlags |= TIMELINE_SHOWRID;
@@ -1802,11 +1807,11 @@
1807 ** before
1808 ** after
1809 ** descendants | children
1810 ** ancestors | parents
1811 **
1812 ** The CHECKIN can be any unique prefix of 4 characters or more.
1813 ** The DATETIME should be in the ISO8601 format. For
1814 ** examples: "2007-08-18 07:21:21". You can also say "current"
1815 ** for the current version or "now" for the current time.
1816 **
1817 ** Options:
@@ -1950,11 +1955,11 @@
1955 }
1956
1957 if( mode==0 ) mode = 1;
1958 blob_zero(&sql);
1959 blob_append(&sql, timeline_query_for_tty(), -1);
1960 blob_append_sql(&sql, "\n AND event.mtime %s %s",
1961 (mode==1 || mode==4) ? "<=" : ">=",
1962 zDate /*safe-for-%s*/
1963 );
1964
1965 if( mode==3 || mode==4 ){
1966
+2
--- src/wiki.c
+++ src/wiki.c
@@ -147,13 +147,15 @@
147147
wiki_convert(pWiki, 0, 0);
148148
}else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
149149
Blob title = BLOB_INITIALIZER;
150150
Blob tail = BLOB_INITIALIZER;
151151
markdown_to_html(pWiki, &title, &tail);
152
+#if 0
152153
if( blob_size(&title)>0 ){
153154
@ <h1>%s(blob_str(&title))</h1>
154155
}
156
+#endif
155157
@ %s(blob_str(&tail))
156158
blob_reset(&title);
157159
blob_reset(&tail);
158160
}else{
159161
@ <pre>
160162
--- src/wiki.c
+++ src/wiki.c
@@ -147,13 +147,15 @@
147 wiki_convert(pWiki, 0, 0);
148 }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
149 Blob title = BLOB_INITIALIZER;
150 Blob tail = BLOB_INITIALIZER;
151 markdown_to_html(pWiki, &title, &tail);
 
152 if( blob_size(&title)>0 ){
153 @ <h1>%s(blob_str(&title))</h1>
154 }
 
155 @ %s(blob_str(&tail))
156 blob_reset(&title);
157 blob_reset(&tail);
158 }else{
159 @ <pre>
160
--- src/wiki.c
+++ src/wiki.c
@@ -147,13 +147,15 @@
147 wiki_convert(pWiki, 0, 0);
148 }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){
149 Blob title = BLOB_INITIALIZER;
150 Blob tail = BLOB_INITIALIZER;
151 markdown_to_html(pWiki, &title, &tail);
152 #if 0
153 if( blob_size(&title)>0 ){
154 @ <h1>%s(blob_str(&title))</h1>
155 }
156 #endif
157 @ %s(blob_str(&tail))
158 blob_reset(&title);
159 blob_reset(&tail);
160 }else{
161 @ <pre>
162
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -762,11 +762,11 @@
762762
** Parse this element into the p structure.
763763
**
764764
** The content of z[] might be modified by converting characters
765765
** to lowercase and by inserting some "\000" characters.
766766
*/
767
-static void parseMarkup(ParsedMarkup *p, char *z){
767
+static int parseMarkup(ParsedMarkup *p, char *z){
768768
int i, j, c;
769769
int iACode;
770770
char *zValue;
771771
int seen = 0;
772772
char zTag[100];
@@ -794,11 +794,11 @@
794794
p->aAttr[0].zValue = &z[i];
795795
while( fossil_isalnum(z[i]) ){ i++; }
796796
p->aAttr[0].cTerm = c = z[i];
797797
z[i++] = 0;
798798
p->nAttr = 1;
799
- if( c=='>' ) return;
799
+ if( c=='>' ) return 0;
800800
}
801801
while( fossil_isspace(z[i]) ){ i++; }
802802
while( c!='>' && p->nAttr<8 && fossil_isalpha(z[i]) ){
803803
int attrOk; /* True to preserve attribute. False to ignore it */
804804
j = 0;
@@ -841,10 +841,11 @@
841841
p->nAttr++;
842842
}
843843
while( fossil_isspace(z[i]) ){ i++; }
844844
if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
845845
}
846
+ return seen;
846847
}
847848
848849
/*
849850
** Render markup on the given blob.
850851
*/
@@ -960,11 +961,11 @@
960961
static void popStack(Renderer *p){
961962
if( p->nStack ){
962963
int iCode;
963964
p->nStack--;
964965
iCode = p->aStack[p->nStack].iCode;
965
- if( iCode!=MARKUP_DIV && p->pOut ){
966
+ if( (iCode!=MARKUP_DIV || p->aStack[p->nStack].zId==0) && p->pOut ){
966967
blob_appendf(p->pOut, "</%s>", aMarkup[iCode].zName);
967968
}
968969
}
969970
}
970971
@@ -1480,11 +1481,11 @@
14801481
break;
14811482
}
14821483
case TOKEN_MARKUP: {
14831484
const char *zId;
14841485
int iDiv;
1485
- parseMarkup(&markup, z);
1486
+ int mAttr = parseMarkup(&markup, z);
14861487
14871488
/* Convert <title> to <h1 align='center'> */
14881489
if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
14891490
markup.iCode = MARKUP_H1;
14901491
markup.nAttr = 1;
@@ -1567,11 +1568,11 @@
15671568
popStackToTag(p, markup.iCode);
15681569
}else
15691570
15701571
/* Push <div> markup onto the stack together with the id=ID attribute.
15711572
*/
1572
- if( markup.iCode==MARKUP_DIV ){
1573
+ if( markup.iCode==MARKUP_DIV && (mAttr & ATTR_ID)!=0 ){
15731574
pushStackWithId(p, markup.iCode, markupId(&markup),
15741575
(p->state & ALLOW_WIKI)!=0);
15751576
}else
15761577
15771578
/* Enter <verbatim> processing. With verbatim enabled, all other
15781579
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -762,11 +762,11 @@
762 ** Parse this element into the p structure.
763 **
764 ** The content of z[] might be modified by converting characters
765 ** to lowercase and by inserting some "\000" characters.
766 */
767 static void parseMarkup(ParsedMarkup *p, char *z){
768 int i, j, c;
769 int iACode;
770 char *zValue;
771 int seen = 0;
772 char zTag[100];
@@ -794,11 +794,11 @@
794 p->aAttr[0].zValue = &z[i];
795 while( fossil_isalnum(z[i]) ){ i++; }
796 p->aAttr[0].cTerm = c = z[i];
797 z[i++] = 0;
798 p->nAttr = 1;
799 if( c=='>' ) return;
800 }
801 while( fossil_isspace(z[i]) ){ i++; }
802 while( c!='>' && p->nAttr<8 && fossil_isalpha(z[i]) ){
803 int attrOk; /* True to preserve attribute. False to ignore it */
804 j = 0;
@@ -841,10 +841,11 @@
841 p->nAttr++;
842 }
843 while( fossil_isspace(z[i]) ){ i++; }
844 if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
845 }
 
846 }
847
848 /*
849 ** Render markup on the given blob.
850 */
@@ -960,11 +961,11 @@
960 static void popStack(Renderer *p){
961 if( p->nStack ){
962 int iCode;
963 p->nStack--;
964 iCode = p->aStack[p->nStack].iCode;
965 if( iCode!=MARKUP_DIV && p->pOut ){
966 blob_appendf(p->pOut, "</%s>", aMarkup[iCode].zName);
967 }
968 }
969 }
970
@@ -1480,11 +1481,11 @@
1480 break;
1481 }
1482 case TOKEN_MARKUP: {
1483 const char *zId;
1484 int iDiv;
1485 parseMarkup(&markup, z);
1486
1487 /* Convert <title> to <h1 align='center'> */
1488 if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
1489 markup.iCode = MARKUP_H1;
1490 markup.nAttr = 1;
@@ -1567,11 +1568,11 @@
1567 popStackToTag(p, markup.iCode);
1568 }else
1569
1570 /* Push <div> markup onto the stack together with the id=ID attribute.
1571 */
1572 if( markup.iCode==MARKUP_DIV ){
1573 pushStackWithId(p, markup.iCode, markupId(&markup),
1574 (p->state & ALLOW_WIKI)!=0);
1575 }else
1576
1577 /* Enter <verbatim> processing. With verbatim enabled, all other
1578
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -762,11 +762,11 @@
762 ** Parse this element into the p structure.
763 **
764 ** The content of z[] might be modified by converting characters
765 ** to lowercase and by inserting some "\000" characters.
766 */
767 static int parseMarkup(ParsedMarkup *p, char *z){
768 int i, j, c;
769 int iACode;
770 char *zValue;
771 int seen = 0;
772 char zTag[100];
@@ -794,11 +794,11 @@
794 p->aAttr[0].zValue = &z[i];
795 while( fossil_isalnum(z[i]) ){ i++; }
796 p->aAttr[0].cTerm = c = z[i];
797 z[i++] = 0;
798 p->nAttr = 1;
799 if( c=='>' ) return 0;
800 }
801 while( fossil_isspace(z[i]) ){ i++; }
802 while( c!='>' && p->nAttr<8 && fossil_isalpha(z[i]) ){
803 int attrOk; /* True to preserve attribute. False to ignore it */
804 j = 0;
@@ -841,10 +841,11 @@
841 p->nAttr++;
842 }
843 while( fossil_isspace(z[i]) ){ i++; }
844 if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
845 }
846 return seen;
847 }
848
849 /*
850 ** Render markup on the given blob.
851 */
@@ -960,11 +961,11 @@
961 static void popStack(Renderer *p){
962 if( p->nStack ){
963 int iCode;
964 p->nStack--;
965 iCode = p->aStack[p->nStack].iCode;
966 if( (iCode!=MARKUP_DIV || p->aStack[p->nStack].zId==0) && p->pOut ){
967 blob_appendf(p->pOut, "</%s>", aMarkup[iCode].zName);
968 }
969 }
970 }
971
@@ -1480,11 +1481,11 @@
1481 break;
1482 }
1483 case TOKEN_MARKUP: {
1484 const char *zId;
1485 int iDiv;
1486 int mAttr = parseMarkup(&markup, z);
1487
1488 /* Convert <title> to <h1 align='center'> */
1489 if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){
1490 markup.iCode = MARKUP_H1;
1491 markup.nAttr = 1;
@@ -1567,11 +1568,11 @@
1568 popStackToTag(p, markup.iCode);
1569 }else
1570
1571 /* Push <div> markup onto the stack together with the id=ID attribute.
1572 */
1573 if( markup.iCode==MARKUP_DIV && (mAttr & ATTR_ID)!=0 ){
1574 pushStackWithId(p, markup.iCode, markupId(&markup),
1575 (p->state & ALLOW_WIKI)!=0);
1576 }else
1577
1578 /* Enter <verbatim> processing. With verbatim enabled, all other
1579
--- src/winhttp.c
+++ src/winhttp.c
@@ -260,10 +260,13 @@
260260
blob_appendf(&options, " --files-urlenc %T", zFileGlob);
261261
}
262262
if( g.useLocalauth ){
263263
blob_appendf(&options, " --localauth");
264264
}
265
+ if( flags & HTTP_SERVER_REPOLIST ){
266
+ blob_appendf(&options, " --repolist");
267
+ }
265268
if( WSAStartup(MAKEWORD(1,1), &wd) ){
266269
fossil_fatal("unable to initialize winsock");
267270
}
268271
while( iPort<=mxPort ){
269272
s = socket(AF_INET, SOCK_STREAM, 0);
270273
--- src/winhttp.c
+++ src/winhttp.c
@@ -260,10 +260,13 @@
260 blob_appendf(&options, " --files-urlenc %T", zFileGlob);
261 }
262 if( g.useLocalauth ){
263 blob_appendf(&options, " --localauth");
264 }
 
 
 
265 if( WSAStartup(MAKEWORD(1,1), &wd) ){
266 fossil_fatal("unable to initialize winsock");
267 }
268 while( iPort<=mxPort ){
269 s = socket(AF_INET, SOCK_STREAM, 0);
270
--- src/winhttp.c
+++ src/winhttp.c
@@ -260,10 +260,13 @@
260 blob_appendf(&options, " --files-urlenc %T", zFileGlob);
261 }
262 if( g.useLocalauth ){
263 blob_appendf(&options, " --localauth");
264 }
265 if( flags & HTTP_SERVER_REPOLIST ){
266 blob_appendf(&options, " --repolist");
267 }
268 if( WSAStartup(MAKEWORD(1,1), &wd) ){
269 fossil_fatal("unable to initialize winsock");
270 }
271 while( iPort<=mxPort ){
272 s = socket(AF_INET, SOCK_STREAM, 0);
273
--- win/Makefile.PellesCGMake
+++ win/Makefile.PellesCGMake
@@ -83,11 +83,11 @@
8383
8484
# define the SQLite files, which need special flags on compile
8585
SQLITESRC=sqlite3.c
8686
ORIGSQLITESRC=$(foreach sf,$(SQLITESRC),$(SRCDIR)$(sf))
8787
SQLITEOBJ=$(foreach sf,$(SQLITESRC),$(sf:.c=.obj))
88
-SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_WIN32_NO_ANSI
88
+SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_WIN32_NO_ANSI
8989
9090
# define the SQLite shell files, which need special flags on compile
9191
SQLITESHELLSRC=shell.c
9292
ORIGSQLITESHELLSRC=$(foreach sf,$(SQLITESHELLSRC),$(SRCDIR)$(sf))
9393
SQLITESHELLOBJ=$(foreach sf,$(SQLITESHELLSRC),$(sf:.c=.obj))
9494
--- win/Makefile.PellesCGMake
+++ win/Makefile.PellesCGMake
@@ -83,11 +83,11 @@
83
84 # define the SQLite files, which need special flags on compile
85 SQLITESRC=sqlite3.c
86 ORIGSQLITESRC=$(foreach sf,$(SQLITESRC),$(SRCDIR)$(sf))
87 SQLITEOBJ=$(foreach sf,$(SQLITESRC),$(sf:.c=.obj))
88 SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_WIN32_NO_ANSI
89
90 # define the SQLite shell files, which need special flags on compile
91 SQLITESHELLSRC=shell.c
92 ORIGSQLITESHELLSRC=$(foreach sf,$(SQLITESHELLSRC),$(SRCDIR)$(sf))
93 SQLITESHELLOBJ=$(foreach sf,$(SQLITESHELLSRC),$(sf:.c=.obj))
94
--- win/Makefile.PellesCGMake
+++ win/Makefile.PellesCGMake
@@ -83,11 +83,11 @@
83
84 # define the SQLite files, which need special flags on compile
85 SQLITESRC=sqlite3.c
86 ORIGSQLITESRC=$(foreach sf,$(SQLITESRC),$(SRCDIR)$(sf))
87 SQLITEOBJ=$(foreach sf,$(SQLITESRC),$(sf:.c=.obj))
88 SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_WIN32_NO_ANSI
89
90 # define the SQLite shell files, which need special flags on compile
91 SQLITESHELLSRC=shell.c
92 ORIGSQLITESHELLSRC=$(foreach sf,$(SQLITESHELLSRC),$(SRCDIR)$(sf))
93 SQLITESHELLOBJ=$(foreach sf,$(SQLITESHELLSRC),$(sf:.c=.obj))
94
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -24,11 +24,11 @@
2424
CFLAGS = -o
2525
BCC = $(DMDIR)\bin\dmc $(CFLAGS)
2626
TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
2727
LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
2828
29
-SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4
29
+SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS
3030
3131
SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
3232
3333
SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
3434
3535
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -24,11 +24,11 @@
24 CFLAGS = -o
25 BCC = $(DMDIR)\bin\dmc $(CFLAGS)
26 TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
27 LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4
30
31 SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -24,11 +24,11 @@
24 CFLAGS = -o
25 BCC = $(DMDIR)\bin\dmc $(CFLAGS)
26 TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
27 LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS
30
31 SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -2025,10 +2025,11 @@
20252025
-DSQLITE_THREADSAFE=0 \
20262026
-DSQLITE_DEFAULT_FILE_FORMAT=4 \
20272027
-DSQLITE_OMIT_DEPRECATED \
20282028
-DSQLITE_ENABLE_EXPLAIN_COMMENTS \
20292029
-DSQLITE_ENABLE_FTS4 \
2030
+ -DSQLITE_ENABLE_FTS3_PARENTHESIS \
20302031
-DSQLITE_WIN32_NO_ANSI \
20312032
-D_HAVE__MINGW_H \
20322033
-DSQLITE_USE_MALLOC_H \
20332034
-DSQLITE_USE_MSIZE
20342035
20352036
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -2025,10 +2025,11 @@
2025 -DSQLITE_THREADSAFE=0 \
2026 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
2027 -DSQLITE_OMIT_DEPRECATED \
2028 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
2029 -DSQLITE_ENABLE_FTS4 \
 
2030 -DSQLITE_WIN32_NO_ANSI \
2031 -D_HAVE__MINGW_H \
2032 -DSQLITE_USE_MALLOC_H \
2033 -DSQLITE_USE_MSIZE
2034
2035
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -2025,10 +2025,11 @@
2025 -DSQLITE_THREADSAFE=0 \
2026 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
2027 -DSQLITE_OMIT_DEPRECATED \
2028 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
2029 -DSQLITE_ENABLE_FTS4 \
2030 -DSQLITE_ENABLE_FTS3_PARENTHESIS \
2031 -DSQLITE_WIN32_NO_ANSI \
2032 -D_HAVE__MINGW_H \
2033 -DSQLITE_USE_MALLOC_H \
2034 -DSQLITE_USE_MSIZE
2035
2036
--- win/Makefile.mingw.mistachkin
+++ win/Makefile.mingw.mistachkin
@@ -2024,10 +2024,12 @@
20242024
-DSQLITE_ENABLE_LOCKING_STYLE=0 \
20252025
-DSQLITE_THREADSAFE=0 \
20262026
-DSQLITE_DEFAULT_FILE_FORMAT=4 \
20272027
-DSQLITE_OMIT_DEPRECATED \
20282028
-DSQLITE_ENABLE_EXPLAIN_COMMENTS \
2029
+ -DSQLITE_ENABLE_FTS4 \
2030
+ -DSQLITE_ENABLE_FTS3_PARENTHESIS \
20292031
-DSQLITE_WIN32_NO_ANSI \
20302032
-D_HAVE__MINGW_H \
20312033
-DSQLITE_USE_MALLOC_H \
20322034
-DSQLITE_USE_MSIZE
20332035
20342036
--- win/Makefile.mingw.mistachkin
+++ win/Makefile.mingw.mistachkin
@@ -2024,10 +2024,12 @@
2024 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
2025 -DSQLITE_THREADSAFE=0 \
2026 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
2027 -DSQLITE_OMIT_DEPRECATED \
2028 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
 
 
2029 -DSQLITE_WIN32_NO_ANSI \
2030 -D_HAVE__MINGW_H \
2031 -DSQLITE_USE_MALLOC_H \
2032 -DSQLITE_USE_MSIZE
2033
2034
--- win/Makefile.mingw.mistachkin
+++ win/Makefile.mingw.mistachkin
@@ -2024,10 +2024,12 @@
2024 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
2025 -DSQLITE_THREADSAFE=0 \
2026 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
2027 -DSQLITE_OMIT_DEPRECATED \
2028 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
2029 -DSQLITE_ENABLE_FTS4 \
2030 -DSQLITE_ENABLE_FTS3_PARENTHESIS \
2031 -DSQLITE_WIN32_NO_ANSI \
2032 -D_HAVE__MINGW_H \
2033 -DSQLITE_USE_MALLOC_H \
2034 -DSQLITE_USE_MSIZE
2035
2036
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -190,10 +190,11 @@
190190
/DSQLITE_THREADSAFE=0 \
191191
/DSQLITE_DEFAULT_FILE_FORMAT=4 \
192192
/DSQLITE_OMIT_DEPRECATED \
193193
/DSQLITE_ENABLE_EXPLAIN_COMMENTS \
194194
/DSQLITE_ENABLE_FTS4 \
195
+ /DSQLITE_ENABLE_FTS3_PARENTHESIS \
195196
/DSQLITE_WIN32_NO_ANSI
196197
197198
SHELL_OPTIONS = /Dmain=sqlite3_shell \
198199
/DSQLITE_OMIT_LOAD_EXTENSION=1 \
199200
/DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
200201
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -190,10 +190,11 @@
190 /DSQLITE_THREADSAFE=0 \
191 /DSQLITE_DEFAULT_FILE_FORMAT=4 \
192 /DSQLITE_OMIT_DEPRECATED \
193 /DSQLITE_ENABLE_EXPLAIN_COMMENTS \
194 /DSQLITE_ENABLE_FTS4 \
 
195 /DSQLITE_WIN32_NO_ANSI
196
197 SHELL_OPTIONS = /Dmain=sqlite3_shell \
198 /DSQLITE_OMIT_LOAD_EXTENSION=1 \
199 /DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
200
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -190,10 +190,11 @@
190 /DSQLITE_THREADSAFE=0 \
191 /DSQLITE_DEFAULT_FILE_FORMAT=4 \
192 /DSQLITE_OMIT_DEPRECATED \
193 /DSQLITE_ENABLE_EXPLAIN_COMMENTS \
194 /DSQLITE_ENABLE_FTS4 \
195 /DSQLITE_ENABLE_FTS3_PARENTHESIS \
196 /DSQLITE_WIN32_NO_ANSI
197
198 SHELL_OPTIONS = /Dmain=sqlite3_shell \
199 /DSQLITE_OMIT_LOAD_EXTENSION=1 \
200 /DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
201
--- www/branching.wiki
+++ www/branching.wiki
@@ -180,11 +180,11 @@
180180
181181
A tag can be a one-time tag, a propagating tag or a cancellation tag.
182182
A one-time tag only applies to the check-in to which it is attached. A
183183
propagating tag applies to the check-in to which it is attached and also
184184
to all direct descendants of that check-in. A <i>direct descendant</i>
185
-is a descendant through direct children. Tags propagation does not
185
+is a descendant through direct children. Tag propagation does not
186186
cross merges. Tag propagation also stops as soon
187187
as it encounters another check-in with the same tag. A cancellation tag
188188
is attached to a single check-in in order to either override a one-time
189189
tag that was previously placed on that same check-in, or to block
190190
tag propagation from an ancestor.
191191
--- www/branching.wiki
+++ www/branching.wiki
@@ -180,11 +180,11 @@
180
181 A tag can be a one-time tag, a propagating tag or a cancellation tag.
182 A one-time tag only applies to the check-in to which it is attached. A
183 propagating tag applies to the check-in to which it is attached and also
184 to all direct descendants of that check-in. A <i>direct descendant</i>
185 is a descendant through direct children. Tags propagation does not
186 cross merges. Tag propagation also stops as soon
187 as it encounters another check-in with the same tag. A cancellation tag
188 is attached to a single check-in in order to either override a one-time
189 tag that was previously placed on that same check-in, or to block
190 tag propagation from an ancestor.
191
--- www/branching.wiki
+++ www/branching.wiki
@@ -180,11 +180,11 @@
180
181 A tag can be a one-time tag, a propagating tag or a cancellation tag.
182 A one-time tag only applies to the check-in to which it is attached. A
183 propagating tag applies to the check-in to which it is attached and also
184 to all direct descendants of that check-in. A <i>direct descendant</i>
185 is a descendant through direct children. Tag propagation does not
186 cross merges. Tag propagation also stops as soon
187 as it encounters another check-in with the same tag. A cancellation tag
188 is attached to a single check-in in order to either override a one-time
189 tag that was previously placed on that same check-in, or to block
190 tag propagation from an ancestor.
191
--- www/changes.wiki
+++ www/changes.wiki
@@ -1,8 +1,8 @@
11
<title>Change Log</title>
22
3
-<h2>Changes For Version 1.31 (2015-02-??)</h2>
3
+<h2>Changes For Version 1.31 (2015-02-23)</h2>
44
* Change the auxiliary schema by adding columns MLINK.ISAUX and MLINK.PMID
55
columns to the schema, to support better drawing of file change graphs.
66
A [/help?cmd=rebuild|fossil rebuild] is recommended but is not required.
77
so that the new graph drawing logic can work effectively.
88
* Added [/search|search] over Check-in comments, Documents, Tickets and
@@ -20,15 +20,19 @@
2020
[/help?cmd=ui|ui], or
2121
[/help?cmd=http|http] commands.
2222
* Embedded html documents that begin with
2323
&lt;doc class="fossil-doc"&gt; are displayed with standard
2424
headers and footers added.
25
+ * Allow &lt;div style='...'&gt; markup in [/wiki_rules|wiki].
2526
* Renamed "Events" to "Technical Notes", while updating the technote
2627
display and control pages. Add support for technotes as plain text
2728
or as Markdown.
2829
* Added the [/md_rules] pages containing summary instructions on the
2930
Markdown format.
31
+ * Added the --repolist and --nojail options to the various server commands
32
+ (ex: [/help?cmd=server|fossil server]).
33
+ * Added the [/help?cmd=all|fossil all add] subcommand to "fossil all".
3034
* Improvements to the /login page. Some hyperlinks to pages that require
3135
"anonymous" privileges are displayed even if the current user is "nobody"
3236
but automatically redirect to /login.
3337
* The [/help?cmd=/doc|/doc] web-page will now try to deliver the file
3438
"404.md" from the top-level directory (if such a file exists) in
3539
--- www/changes.wiki
+++ www/changes.wiki
@@ -1,8 +1,8 @@
1 <title>Change Log</title>
2
3 <h2>Changes For Version 1.31 (2015-02-??)</h2>
4 * Change the auxiliary schema by adding columns MLINK.ISAUX and MLINK.PMID
5 columns to the schema, to support better drawing of file change graphs.
6 A [/help?cmd=rebuild|fossil rebuild] is recommended but is not required.
7 so that the new graph drawing logic can work effectively.
8 * Added [/search|search] over Check-in comments, Documents, Tickets and
@@ -20,15 +20,19 @@
20 [/help?cmd=ui|ui], or
21 [/help?cmd=http|http] commands.
22 * Embedded html documents that begin with
23 &lt;doc class="fossil-doc"&gt; are displayed with standard
24 headers and footers added.
 
25 * Renamed "Events" to "Technical Notes", while updating the technote
26 display and control pages. Add support for technotes as plain text
27 or as Markdown.
28 * Added the [/md_rules] pages containing summary instructions on the
29 Markdown format.
 
 
 
30 * Improvements to the /login page. Some hyperlinks to pages that require
31 "anonymous" privileges are displayed even if the current user is "nobody"
32 but automatically redirect to /login.
33 * The [/help?cmd=/doc|/doc] web-page will now try to deliver the file
34 "404.md" from the top-level directory (if such a file exists) in
35
--- www/changes.wiki
+++ www/changes.wiki
@@ -1,8 +1,8 @@
1 <title>Change Log</title>
2
3 <h2>Changes For Version 1.31 (2015-02-23)</h2>
4 * Change the auxiliary schema by adding columns MLINK.ISAUX and MLINK.PMID
5 columns to the schema, to support better drawing of file change graphs.
6 A [/help?cmd=rebuild|fossil rebuild] is recommended but is not required.
7 so that the new graph drawing logic can work effectively.
8 * Added [/search|search] over Check-in comments, Documents, Tickets and
@@ -20,15 +20,19 @@
20 [/help?cmd=ui|ui], or
21 [/help?cmd=http|http] commands.
22 * Embedded html documents that begin with
23 &lt;doc class="fossil-doc"&gt; are displayed with standard
24 headers and footers added.
25 * Allow &lt;div style='...'&gt; markup in [/wiki_rules|wiki].
26 * Renamed "Events" to "Technical Notes", while updating the technote
27 display and control pages. Add support for technotes as plain text
28 or as Markdown.
29 * Added the [/md_rules] pages containing summary instructions on the
30 Markdown format.
31 * Added the --repolist and --nojail options to the various server commands
32 (ex: [/help?cmd=server|fossil server]).
33 * Added the [/help?cmd=all|fossil all add] subcommand to "fossil all".
34 * Improvements to the /login page. Some hyperlinks to pages that require
35 "anonymous" privileges are displayed even if the current user is "nobody"
36 but automatically redirect to /login.
37 * The [/help?cmd=/doc|/doc] web-page will now try to deliver the file
38 "404.md" from the top-level directory (if such a file exists) in
39
+25 -64
--- www/concepts.wiki
+++ www/concepts.wiki
@@ -197,11 +197,15 @@
197197
is identified by your VISUAL environment variable. Fossil will also
198198
use GPG to clearsign your manifests if you happen to have it installed,
199199
but fossil will skip that step if GPG missing from your system.
200200
You can optionally set up fossil to use external "diff" programs,
201201
though fossil has an excellent built-in "diff" algorithm that works
202
-fine for most people.
202
+fine for most people. If you happen to have Tcl/Tk installed on your
203
+system, Fossil will use it to generate a graphical "diff" display when
204
+you use the --tk option to the "diff" command, but this too is entirely
205
+optional.
206
+
203207
204208
To uninstall fossil, simply delete the executable.
205209
206210
To upgrade an older version of fossil to a newer version, just
207211
replace the old executable with the new one. You might need to
@@ -391,75 +395,32 @@
391395
<h2>5.0 Setting Up A Fossil Server</h2>
392396
393397
With other configuration management software, setting up a server is
394398
a lot of work and normally takes time, patience, and a lot of system
395399
knowledge. Fossil is designed to avoid this frustration. Setting up
396
-a server with fossil is ridiculously easy. You have three options:</p>
400
+a server with fossil is ridiculously easy. You have four options:</p>
397401
398402
<ol>
399
-<li><b><a name="saserv"></a>Setting up a stand-alone server</b>
400
-
401
-From within your source tree just use the <b>server</b> command and
402
-fossil will start listening for incoming requests on TCP port 8080.
403
-You can point your web browser at <a href="http://localhost:8080/">
404
-http://localhost:8080/</a> and begin exploring. Or your coworkers
405
-can do pushes or pulls against your server. Use the <b>--port</b>
406
-option to the server command to specify a different TCP port. If
407
-you do not have a local source tree, use the <b>-R</b> command-line
408
-option to specify the repository file.
409
-
410
-The "fossil server" command is a great way to set of transient connections
411
-between coworkers for doing quick pushes or pulls. But you can also
412
-set up a permanent stand-alone server if you prefer. Just make
413
-arrangements for fossil to be launched with appropriate arguments
414
-after every reboot.
415
-
416
-If you just want a server to browse the built-in fossil website
417
-locally, use the <b>ui</b> command in place of <b>server</b>. The
418
-<b>ui</b> command starts up a local server too, but it also takes
419
-the additional step of automatically launching your webbrowser and
420
-pointing at the new server.
421
-</li>
422
-
423
-<li><b>Setting up a CGI server</b>
424
-
425
-If you have a web-server running on your machine already, you can
426
-set up fossil to be run from CGI. Simply create an executable script
427
-that looks something like this:
428
-
429
-<blockquote><pre>
430
-#!/usr/local/bin/fossil
431
-repository: /home/me/bigproject.fossil
432
-</pre></blockquote>
433
-
434
-Edit this script to use whatever pathnames are appropriate for
435
-your project. Then point your web browser at the script and off you
436
-go. The [./selfhost.wiki | self-hosting fossil repositories] are
437
-all set up this way.</li>
438
-
439
-<li><b>Setting up an inetd server</b>
440
-
441
-If you have inetd or xinetd running on your system, you can set
442
-those services up to launch fossil to deal with inbound TCP/IP connections
443
-on whatever port you want. Set up inetd or xinetd to launch fossil
444
-like this:
445
-
446
-<blockquote><pre>
447
-/usr/local/bin/fossil http /home/me/bigproject.fossil
448
-</pre></blockquote>
449
-
450
-As before, change the filenames to whatever is appropriate for
451
-your system. You can have fossil run as any user that has write
452
-permission on the repository and on the directory that contains the
453
-repository. But it is safer to run fossil as root. When fossil
454
-sees that it is running as root, it automatically puts itself into
455
-a <a href="http://en.wikipedia.org/wiki/Chroot">chroot jail</a> and
456
-drops all privileges prior to reading any information from the client.
457
-Since fossil is a stand-alone program, you do not need to put anything
458
-in the chroot jail with fossil in order for it to do its job.
459
-</li>
460
-</ol>
403
+<li><p><b>Stand-alone server.</b>
404
+Simply run the [/help?cmd=server|fossil server] or
405
+[/help?cmd=ui|fossil ui] command from the command-line.
406
+
407
+<li><p><b>CGI.</b>
408
+Install a 2-line CGI script on a CGI-enabled web-server like Apache.
409
+
410
+<li><p><b>SCGI.</b>
411
+Start an SCGI server using the
412
+[/help?cmd=server| fossil server --scgi] command for handling
413
+SCGI requests from web-servers like Nginx.
414
+
415
+<li><p><b>Inetd or Stunnel.</b>
416
+Configure programs like inetd, xinetd, or stunnel to hand off HTTP requests
417
+directly to the [/help?cmd=http|fossil http] command.
418
+</ol>
419
+
420
+See the [./server.wiki | How To Configure A Fossil Server] document
421
+for details.
461422
462423
<h2>6.0 Review Of Key Concepts</h2>
463424
464425
<ul>
465426
<li>The <b>fossil</b> program is a self-contained stand-alone executable.
466427
467428
ADDED www/customskin.md
--- www/concepts.wiki
+++ www/concepts.wiki
@@ -197,11 +197,15 @@
197 is identified by your VISUAL environment variable. Fossil will also
198 use GPG to clearsign your manifests if you happen to have it installed,
199 but fossil will skip that step if GPG missing from your system.
200 You can optionally set up fossil to use external "diff" programs,
201 though fossil has an excellent built-in "diff" algorithm that works
202 fine for most people.
 
 
 
 
203
204 To uninstall fossil, simply delete the executable.
205
206 To upgrade an older version of fossil to a newer version, just
207 replace the old executable with the new one. You might need to
@@ -391,75 +395,32 @@
391 <h2>5.0 Setting Up A Fossil Server</h2>
392
393 With other configuration management software, setting up a server is
394 a lot of work and normally takes time, patience, and a lot of system
395 knowledge. Fossil is designed to avoid this frustration. Setting up
396 a server with fossil is ridiculously easy. You have three options:</p>
397
398 <ol>
399 <li><b><a name="saserv"></a>Setting up a stand-alone server</b>
400
401 From within your source tree just use the <b>server</b> command and
402 fossil will start listening for incoming requests on TCP port 8080.
403 You can point your web browser at <a href="http://localhost:8080/">
404 http://localhost:8080/</a> and begin exploring. Or your coworkers
405 can do pushes or pulls against your server. Use the <b>--port</b>
406 option to the server command to specify a different TCP port. If
407 you do not have a local source tree, use the <b>-R</b> command-line
408 option to specify the repository file.
409
410 The "fossil server" command is a great way to set of transient connections
411 between coworkers for doing quick pushes or pulls. But you can also
412 set up a permanent stand-alone server if you prefer. Just make
413 arrangements for fossil to be launched with appropriate arguments
414 after every reboot.
415
416 If you just want a server to browse the built-in fossil website
417 locally, use the <b>ui</b> command in place of <b>server</b>. The
418 <b>ui</b> command starts up a local server too, but it also takes
419 the additional step of automatically launching your webbrowser and
420 pointing at the new server.
421 </li>
422
423 <li><b>Setting up a CGI server</b>
424
425 If you have a web-server running on your machine already, you can
426 set up fossil to be run from CGI. Simply create an executable script
427 that looks something like this:
428
429 <blockquote><pre>
430 #!/usr/local/bin/fossil
431 repository: /home/me/bigproject.fossil
432 </pre></blockquote>
433
434 Edit this script to use whatever pathnames are appropriate for
435 your project. Then point your web browser at the script and off you
436 go. The [./selfhost.wiki | self-hosting fossil repositories] are
437 all set up this way.</li>
438
439 <li><b>Setting up an inetd server</b>
440
441 If you have inetd or xinetd running on your system, you can set
442 those services up to launch fossil to deal with inbound TCP/IP connections
443 on whatever port you want. Set up inetd or xinetd to launch fossil
444 like this:
445
446 <blockquote><pre>
447 /usr/local/bin/fossil http /home/me/bigproject.fossil
448 </pre></blockquote>
449
450 As before, change the filenames to whatever is appropriate for
451 your system. You can have fossil run as any user that has write
452 permission on the repository and on the directory that contains the
453 repository. But it is safer to run fossil as root. When fossil
454 sees that it is running as root, it automatically puts itself into
455 a <a href="http://en.wikipedia.org/wiki/Chroot">chroot jail</a> and
456 drops all privileges prior to reading any information from the client.
457 Since fossil is a stand-alone program, you do not need to put anything
458 in the chroot jail with fossil in order for it to do its job.
459 </li>
460 </ol>
461
462 <h2>6.0 Review Of Key Concepts</h2>
463
464 <ul>
465 <li>The <b>fossil</b> program is a self-contained stand-alone executable.
466
467 DDED www/customskin.md
--- www/concepts.wiki
+++ www/concepts.wiki
@@ -197,11 +197,15 @@
197 is identified by your VISUAL environment variable. Fossil will also
198 use GPG to clearsign your manifests if you happen to have it installed,
199 but fossil will skip that step if GPG missing from your system.
200 You can optionally set up fossil to use external "diff" programs,
201 though fossil has an excellent built-in "diff" algorithm that works
202 fine for most people. If you happen to have Tcl/Tk installed on your
203 system, Fossil will use it to generate a graphical "diff" display when
204 you use the --tk option to the "diff" command, but this too is entirely
205 optional.
206
207
208 To uninstall fossil, simply delete the executable.
209
210 To upgrade an older version of fossil to a newer version, just
211 replace the old executable with the new one. You might need to
@@ -391,75 +395,32 @@
395 <h2>5.0 Setting Up A Fossil Server</h2>
396
397 With other configuration management software, setting up a server is
398 a lot of work and normally takes time, patience, and a lot of system
399 knowledge. Fossil is designed to avoid this frustration. Setting up
400 a server with fossil is ridiculously easy. You have four options:</p>
401
402 <ol>
403 <li><p><b>Stand-alone server.</b>
404 Simply run the [/help?cmd=server|fossil server] or
405 [/help?cmd=ui|fossil ui] command from the command-line.
406
407 <li><p><b>CGI.</b>
408 Install a 2-line CGI script on a CGI-enabled web-server like Apache.
409
410 <li><p><b>SCGI.</b>
411 Start an SCGI server using the
412 [/help?cmd=server| fossil server --scgi] command for handling
413 SCGI requests from web-servers like Nginx.
414
415 <li><p><b>Inetd or Stunnel.</b>
416 Configure programs like inetd, xinetd, or stunnel to hand off HTTP requests
417 directly to the [/help?cmd=http|fossil http] command.
418 </ol>
419
420 See the [./server.wiki | How To Configure A Fossil Server] document
421 for details.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
422
423 <h2>6.0 Review Of Key Concepts</h2>
424
425 <ul>
426 <li>The <b>fossil</b> program is a self-contained stand-alone executable.
427
428 DDED www/customskin.md
--- a/www/customskin.md
+++ b/www/customskin.md
@@ -0,0 +1,5 @@
1
+Theming
2
+=======onal)default header looks# Sk</div
3
+Tcontent sectionnd the footer# SkNoticee that there are no `<html>` or `<head>` elements in the header,
4
+nor three files,three under the
5
+ Admin menu.
--- a/www/customskin.md
+++ b/www/customskin.md
@@ -0,0 +1,5 @@
 
 
 
 
 
--- a/www/customskin.md
+++ b/www/customskin.md
@@ -0,0 +1,5 @@
1 Theming
2 =======onal)default header looks# Sk</div
3 Tcontent sectionnd the footer# SkNoticee that there are no `<html>` or `<head>` elements in the header,
4 nor three files,three under the
5 Admin menu.
--- www/fossil-v-git.wiki
+++ www/fossil-v-git.wiki
@@ -17,17 +17,20 @@
1717
<h2>2.0 Executive Summary:</h2>
1818
1919
<blockquote><center><table border=1 cellpadding=5>
2020
<tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr>
2121
<tr><td>File versioning only</td>
22
- <td>Versioning, Tickets, Wiki, and Blog/News</td></tr>
22
+ <td>Versioning, Tickets, Wiki, and Technotes</td></tr>
2323
<tr><td>Sharding</td><td>Replicating</td></tr>
2424
<tr><td>Developer branches</td><td>Feature branches</td></tr>
2525
<tr><td>Complex</td><td>Intuitive</td></tr>
2626
<tr><td>Separate web tools</td><td>Integrated Web interface</td></tr>
2727
<tr><td>Lots of little tools</td><td>Single executable</td></tr>
28
-<tr><td>Pile-of-files repository</td><td>Single file repository</td></tr>
28
+<tr><td>Pile-of-files repository</td>
29
+ <td>Single-file relational database</td></tr>
30
+<tr><td>One check-out per repository</td>
31
+ <td>Many check-outs per repository</td></tr>
2932
<tr><td>Uses "<tt>rebase</tt>"</td><td>Immutable</td></tr>
3033
<tr><td>GPL</td><td>BSD</td></tr>
3134
</table></center></blockquote>
3235
3336
<h2>3.0 Discussion</h2>
@@ -36,11 +39,11 @@
3639
3740
Git provides file versioning services only, whereas Fossil adds an
3841
integrated [./wikitheory.wiki | wiki],
3942
[./bugtheory.wiki | ticketing &amp; bug tracking],
4043
[./embeddeddoc.wiki | embedded documentation], and
41
-[./event.wiki | News/Blog features].
44
+[./event.wiki | Technical notes].
4245
These additional capabilities are available for Git as 3rd-party
4346
user-installed add-ons, but with Fossil they are integrated into
4447
the design. One way to describe Fossil is that it is
4548
"[https://github.com/ | github]-in-a-box".
4649
@@ -148,10 +151,13 @@
148151
Fossil strives for simplicity. Fossil wants to be easy to learn and to
149152
require little thinking about how to operating it.
150153
[./quotes.wiki | Reports from the field]
151154
indicate that Fossil is mostly successful at this effort.
152155
156
+Fossil will <u>never</u> get you into anything like the
157
+"disconnected head state" which has frustrated so many Git users.
158
+
153159
<h3>3.5 Web Interface</h3>
154160
155161
Git has a web interface, but it requires a fair amount of setup and an
156162
external web server. Fossil comes with a fully functional
157163
[./webui.wiki | built-in web-server]
@@ -189,11 +195,27 @@
189195
repository can serve multiple simultaneous working checkouts.
190196
A Fossil repository is an SQLite database, so it is highly resistant
191197
to damage from a power-loss or system crash - incomplete transactions
192198
are simply rolled back after the system reboots.
193199
194
-<h3>3.8 Audit Trail</h3>
200
+<h3>3.8 Check-outs Per Repository</h3>
201
+
202
+In Git, a check-out and a repository are joined in a fundamental way
203
+so that only a single version of the project history, or a single branch,
204
+can be open at once. If you have a project with multiple branches and
205
+you want to have two or more branches open at the same time (perhaps to
206
+do performance comparisons, or maybe to run simultaneous builds using
207
+different compile-time options) then in Git you actually have to create
208
+a new clone of the repository for each open checkout.
209
+
210
+In Fossil, the repository and the check-out are distinct entities and
211
+so a single repository can support multiple simultaneous checkouts.
212
+This feature is <em>extensively</em> used by the Fossil developers
213
+themselves. Perhaps we are biased, but we not understand how anyone
214
+can work efficiently with just one check-out per repository.
215
+
216
+<h3>3.9 Audit Trail</h3>
195217
196218
Git features the "rebase" command which can be used to change the
197219
sequence of check-ins in the repository. Rebase can be used to "clean up"
198220
a complex sequence of check-ins to make their intent easier for others
199221
to understand. This is important if you view the history of a project
@@ -204,24 +226,47 @@
204226
Fossil allows mistakes to be corrected (for example, check-in comments
205227
can be revised, and check-ins can be moved onto new branches even after
206228
the check-in has occurred) but the correction is an addition to the repository
207229
and the original actions are preserved and displayed alongside
208230
the corrections, thus preserving an historically accurate audit trail.
209
-This is analogous to an accountant marking through an incorrect
210
-entry in a ledger and writing in a correction beside it, rather than
211
-erasing and incorrect entry.
231
+This is analogous to an accounting practice of marking through an incorrect
232
+entry in a ledger and writing a correction beside it.
233
+
212234
213235
To put it another way, Git remembers what you should have done whereas
214236
Fossil remembers what you actually did.
215237
216238
The lack of a "rebase" command and the inability to rewrite history
217239
is considered a feature of Fossil, not an omission or bug.
218240
219
-<h3>3.9 License</h3>
241
+<h3>3.10 License</h3>
220242
221243
Both Git and Fossil are open-source. Git is under
222244
[http://www.gnu.org/licenses/gpl.html | GPL] whereas Fossil is
223245
under the
224246
[http://en.wikipedia.org/wiki/BSD_licenses | two-clause BSD license].
225
-The difference should not be of a concern to most users. However,
226
-some corporate lawyers have objections to using GPL products and
227
-are more comfortable with a BSD-style license.
247
+The different licenses parallel, to some extent, the different philosophies
248
+of Git and Fossil.
249
+There are exceptions on both sides, but to a first approximation, Git
250
+works better for GPL projects and Fossil works better for BSD projects.
251
+
252
+The GPL is designed to provide a very contributor-friendly environment.
253
+No legal paperwork is needed to contribute to a GPL project because
254
+the GPL is cleverly designed so that the act of contributing
255
+to the project (or even reading the code for the project) constitutes
256
+an acceptance of the licensing terms. GPL encourages a bazaar-style
257
+development model, with lots of anonymous programmers contributing
258
+drive-by patches. The theory is that with many eyeballs, all bugs
259
+are shallow. Surprisingly, this has actually been demonstrated to
260
+work in many well-known projects.
261
+
262
+The BSD-style licenses are more user-friendly. BSD-style licenses
263
+place fewer restrictions on the users of the software at the expense
264
+of making it more difficult to contribute changes or enhancements.
265
+To protect against IP claims,
266
+every contributor to a BSD-style project must sign legal documents in
267
+which they agree to release their contributions under the same license.
268
+(Some BSD-licensed projects omit this formality, but do so at their peril.)
269
+A BSD-style license encourages a more cathedral-style approach to development.
270
+There is a small team of developers. Drive-by patches and anonymous
271
+contributors are discouraged and/or prohibited. Contributors are expected
272
+to be experts and be available to support their changes for the long-term.
228273
--- www/fossil-v-git.wiki
+++ www/fossil-v-git.wiki
@@ -17,17 +17,20 @@
17 <h2>2.0 Executive Summary:</h2>
18
19 <blockquote><center><table border=1 cellpadding=5>
20 <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr>
21 <tr><td>File versioning only</td>
22 <td>Versioning, Tickets, Wiki, and Blog/News</td></tr>
23 <tr><td>Sharding</td><td>Replicating</td></tr>
24 <tr><td>Developer branches</td><td>Feature branches</td></tr>
25 <tr><td>Complex</td><td>Intuitive</td></tr>
26 <tr><td>Separate web tools</td><td>Integrated Web interface</td></tr>
27 <tr><td>Lots of little tools</td><td>Single executable</td></tr>
28 <tr><td>Pile-of-files repository</td><td>Single file repository</td></tr>
 
 
 
29 <tr><td>Uses "<tt>rebase</tt>"</td><td>Immutable</td></tr>
30 <tr><td>GPL</td><td>BSD</td></tr>
31 </table></center></blockquote>
32
33 <h2>3.0 Discussion</h2>
@@ -36,11 +39,11 @@
36
37 Git provides file versioning services only, whereas Fossil adds an
38 integrated [./wikitheory.wiki | wiki],
39 [./bugtheory.wiki | ticketing &amp; bug tracking],
40 [./embeddeddoc.wiki | embedded documentation], and
41 [./event.wiki | News/Blog features].
42 These additional capabilities are available for Git as 3rd-party
43 user-installed add-ons, but with Fossil they are integrated into
44 the design. One way to describe Fossil is that it is
45 "[https://github.com/ | github]-in-a-box".
46
@@ -148,10 +151,13 @@
148 Fossil strives for simplicity. Fossil wants to be easy to learn and to
149 require little thinking about how to operating it.
150 [./quotes.wiki | Reports from the field]
151 indicate that Fossil is mostly successful at this effort.
152
 
 
 
153 <h3>3.5 Web Interface</h3>
154
155 Git has a web interface, but it requires a fair amount of setup and an
156 external web server. Fossil comes with a fully functional
157 [./webui.wiki | built-in web-server]
@@ -189,11 +195,27 @@
189 repository can serve multiple simultaneous working checkouts.
190 A Fossil repository is an SQLite database, so it is highly resistant
191 to damage from a power-loss or system crash - incomplete transactions
192 are simply rolled back after the system reboots.
193
194 <h3>3.8 Audit Trail</h3>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
196 Git features the "rebase" command which can be used to change the
197 sequence of check-ins in the repository. Rebase can be used to "clean up"
198 a complex sequence of check-ins to make their intent easier for others
199 to understand. This is important if you view the history of a project
@@ -204,24 +226,47 @@
204 Fossil allows mistakes to be corrected (for example, check-in comments
205 can be revised, and check-ins can be moved onto new branches even after
206 the check-in has occurred) but the correction is an addition to the repository
207 and the original actions are preserved and displayed alongside
208 the corrections, thus preserving an historically accurate audit trail.
209 This is analogous to an accountant marking through an incorrect
210 entry in a ledger and writing in a correction beside it, rather than
211 erasing and incorrect entry.
212
213 To put it another way, Git remembers what you should have done whereas
214 Fossil remembers what you actually did.
215
216 The lack of a "rebase" command and the inability to rewrite history
217 is considered a feature of Fossil, not an omission or bug.
218
219 <h3>3.9 License</h3>
220
221 Both Git and Fossil are open-source. Git is under
222 [http://www.gnu.org/licenses/gpl.html | GPL] whereas Fossil is
223 under the
224 [http://en.wikipedia.org/wiki/BSD_licenses | two-clause BSD license].
225 The difference should not be of a concern to most users. However,
226 some corporate lawyers have objections to using GPL products and
227 are more comfortable with a BSD-style license.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
228
--- www/fossil-v-git.wiki
+++ www/fossil-v-git.wiki
@@ -17,17 +17,20 @@
17 <h2>2.0 Executive Summary:</h2>
18
19 <blockquote><center><table border=1 cellpadding=5>
20 <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr>
21 <tr><td>File versioning only</td>
22 <td>Versioning, Tickets, Wiki, and Technotes</td></tr>
23 <tr><td>Sharding</td><td>Replicating</td></tr>
24 <tr><td>Developer branches</td><td>Feature branches</td></tr>
25 <tr><td>Complex</td><td>Intuitive</td></tr>
26 <tr><td>Separate web tools</td><td>Integrated Web interface</td></tr>
27 <tr><td>Lots of little tools</td><td>Single executable</td></tr>
28 <tr><td>Pile-of-files repository</td>
29 <td>Single-file relational database</td></tr>
30 <tr><td>One check-out per repository</td>
31 <td>Many check-outs per repository</td></tr>
32 <tr><td>Uses "<tt>rebase</tt>"</td><td>Immutable</td></tr>
33 <tr><td>GPL</td><td>BSD</td></tr>
34 </table></center></blockquote>
35
36 <h2>3.0 Discussion</h2>
@@ -36,11 +39,11 @@
39
40 Git provides file versioning services only, whereas Fossil adds an
41 integrated [./wikitheory.wiki | wiki],
42 [./bugtheory.wiki | ticketing &amp; bug tracking],
43 [./embeddeddoc.wiki | embedded documentation], and
44 [./event.wiki | Technical notes].
45 These additional capabilities are available for Git as 3rd-party
46 user-installed add-ons, but with Fossil they are integrated into
47 the design. One way to describe Fossil is that it is
48 "[https://github.com/ | github]-in-a-box".
49
@@ -148,10 +151,13 @@
151 Fossil strives for simplicity. Fossil wants to be easy to learn and to
152 require little thinking about how to operating it.
153 [./quotes.wiki | Reports from the field]
154 indicate that Fossil is mostly successful at this effort.
155
156 Fossil will <u>never</u> get you into anything like the
157 "disconnected head state" which has frustrated so many Git users.
158
159 <h3>3.5 Web Interface</h3>
160
161 Git has a web interface, but it requires a fair amount of setup and an
162 external web server. Fossil comes with a fully functional
163 [./webui.wiki | built-in web-server]
@@ -189,11 +195,27 @@
195 repository can serve multiple simultaneous working checkouts.
196 A Fossil repository is an SQLite database, so it is highly resistant
197 to damage from a power-loss or system crash - incomplete transactions
198 are simply rolled back after the system reboots.
199
200 <h3>3.8 Check-outs Per Repository</h3>
201
202 In Git, a check-out and a repository are joined in a fundamental way
203 so that only a single version of the project history, or a single branch,
204 can be open at once. If you have a project with multiple branches and
205 you want to have two or more branches open at the same time (perhaps to
206 do performance comparisons, or maybe to run simultaneous builds using
207 different compile-time options) then in Git you actually have to create
208 a new clone of the repository for each open checkout.
209
210 In Fossil, the repository and the check-out are distinct entities and
211 so a single repository can support multiple simultaneous checkouts.
212 This feature is <em>extensively</em> used by the Fossil developers
213 themselves. Perhaps we are biased, but we not understand how anyone
214 can work efficiently with just one check-out per repository.
215
216 <h3>3.9 Audit Trail</h3>
217
218 Git features the "rebase" command which can be used to change the
219 sequence of check-ins in the repository. Rebase can be used to "clean up"
220 a complex sequence of check-ins to make their intent easier for others
221 to understand. This is important if you view the history of a project
@@ -204,24 +226,47 @@
226 Fossil allows mistakes to be corrected (for example, check-in comments
227 can be revised, and check-ins can be moved onto new branches even after
228 the check-in has occurred) but the correction is an addition to the repository
229 and the original actions are preserved and displayed alongside
230 the corrections, thus preserving an historically accurate audit trail.
231 This is analogous to an accounting practice of marking through an incorrect
232 entry in a ledger and writing a correction beside it.
233
234
235 To put it another way, Git remembers what you should have done whereas
236 Fossil remembers what you actually did.
237
238 The lack of a "rebase" command and the inability to rewrite history
239 is considered a feature of Fossil, not an omission or bug.
240
241 <h3>3.10 License</h3>
242
243 Both Git and Fossil are open-source. Git is under
244 [http://www.gnu.org/licenses/gpl.html | GPL] whereas Fossil is
245 under the
246 [http://en.wikipedia.org/wiki/BSD_licenses | two-clause BSD license].
247 The different licenses parallel, to some extent, the different philosophies
248 of Git and Fossil.
249 There are exceptions on both sides, but to a first approximation, Git
250 works better for GPL projects and Fossil works better for BSD projects.
251
252 The GPL is designed to provide a very contributor-friendly environment.
253 No legal paperwork is needed to contribute to a GPL project because
254 the GPL is cleverly designed so that the act of contributing
255 to the project (or even reading the code for the project) constitutes
256 an acceptance of the licensing terms. GPL encourages a bazaar-style
257 development model, with lots of anonymous programmers contributing
258 drive-by patches. The theory is that with many eyeballs, all bugs
259 are shallow. Surprisingly, this has actually been demonstrated to
260 work in many well-known projects.
261
262 The BSD-style licenses are more user-friendly. BSD-style licenses
263 place fewer restrictions on the users of the software at the expense
264 of making it more difficult to contribute changes or enhancements.
265 To protect against IP claims,
266 every contributor to a BSD-style project must sign legal documents in
267 which they agree to release their contributions under the same license.
268 (Some BSD-licensed projects omit this formality, but do so at their peril.)
269 A BSD-style license encourages a more cathedral-style approach to development.
270 There is a small team of developers. Drive-by patches and anonymous
271 contributors are discouraged and/or prohibited. Contributors are expected
272 to be experts and be available to support their changes for the long-term.
273
--- www/hacker-howto.wiki
+++ www/hacker-howto.wiki
@@ -2,10 +2,11 @@
22
33
The following links are of interest to programmers who want to modify
44
or enhance Fossil. Ordinary users can safely ignore this information.
55
66
* [./build.wiki | How To Compile And Install Fossil]
7
+ * [./customskin.md | Theming Fossil]
78
* [./makefile.wiki | The Fossil Build Process]
89
* [./tech_overview.wiki | A Technical Overview of Fossil]
910
* [./adding_code.wiki | Adding Features To Fossil]
1011
* [./contribute.wiki|Contributing Code Or Enhancements To The Fossil Project]
1112
* [./style.wiki | Coding Style Guidelines]
1213
--- www/hacker-howto.wiki
+++ www/hacker-howto.wiki
@@ -2,10 +2,11 @@
2
3 The following links are of interest to programmers who want to modify
4 or enhance Fossil. Ordinary users can safely ignore this information.
5
6 * [./build.wiki | How To Compile And Install Fossil]
 
7 * [./makefile.wiki | The Fossil Build Process]
8 * [./tech_overview.wiki | A Technical Overview of Fossil]
9 * [./adding_code.wiki | Adding Features To Fossil]
10 * [./contribute.wiki|Contributing Code Or Enhancements To The Fossil Project]
11 * [./style.wiki | Coding Style Guidelines]
12
--- www/hacker-howto.wiki
+++ www/hacker-howto.wiki
@@ -2,10 +2,11 @@
2
3 The following links are of interest to programmers who want to modify
4 or enhance Fossil. Ordinary users can safely ignore this information.
5
6 * [./build.wiki | How To Compile And Install Fossil]
7 * [./customskin.md | Theming Fossil]
8 * [./makefile.wiki | The Fossil Build Process]
9 * [./tech_overview.wiki | A Technical Overview of Fossil]
10 * [./adding_code.wiki | Adding Features To Fossil]
11 * [./contribute.wiki|Contributing Code Or Enhancements To The Fossil Project]
12 * [./style.wiki | Coding Style Guidelines]
13
+51 -75
--- www/index.wiki
+++ www/index.wiki
@@ -1,115 +1,91 @@
1
-<title>Fossil</title>
2
-
3
-
4
-<p align="center">
5
-<font size="3">
6
-<i>Simple, high-reliability, distributed software configuration management</i>
7
-</font>
8
-</p>
9
-
10
-
11
-<h3>Why Use Fossil?</h3>
12
-
13
-<table border="0" cellspacing="10" bgcolor="white" align="right"
14
-cellpadding="2">
15
-<tr><td bgcolor="#446979">
16
-<table border="0" cellpadding="10" bgcolor="white">
17
-<tr><td>
1
+<title>Home</title>
2
+
3
+<h3>What Is Fossil?</h3>
4
+
5
+<div style='width:200px;float:right;border:2px solid #446979;padding:10px;margin:0px 10px;'>
186
<ul>
197
<li> [http://www.fossil-scm.org/download.html | Download]
208
<li> [./quickstart.wiki | Quick Start]
219
<li> [./build.wiki | Install]
2210
<li> [../COPYRIGHT-BSD2.txt | License]
23
-<li> [/timeline | Recent changes]
2411
<li> [./faq.wiki | FAQ]
25
-<li> [./hacker-howto.wiki | Hacker How-To]
2612
<li> [./changes.wiki | Change Log]
13
+<li> [./hacker-howto.wiki | Hacker How-To]
2714
<li> [./hints.wiki | Tip &amp; Hints]
2815
<li> [./permutedindex.html | Documentation Index]
2916
<li> [http://www.fossil-scm.org/schimpf-book/home | Jim Schimpf's book]
3017
<li> Mailing list
3118
<ul>
3219
<li> [http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users | sign-up]
3320
<li> [http://www.mail-archive.com/[email protected] | archives]
34
- <ul>
21
+ </ul>
3522
</ul>
36
-</td></tr>
37
-<tr><td>
3823
<center><img src="fossil3.gif"></center>
39
-</td></tr>
40
-</table>
41
-</table>
42
-
43
-There are plenty of open-source version control systems available on the
44
-internet these days. What makes Fossil worthy of attention?
45
-
46
- 1. <b>Bug Tracking And Wiki</b> -
24
+</div>
25
+
26
+<p>Fossil is a simple, high-reliability, distributed software configuration
27
+management with these advanced features:
28
+
29
+ 1. <b>Integrated Bug Tracking, Wiki, and Technotes</b> -
4730
In addition to doing [./concepts.wiki | distributed version control]
4831
like Git and Mercurial,
49
- Fossil also supports [./bugtheory.wiki | distributed bug tracking],
50
- [./wikitheory.wiki | distributed wiki], and a
51
- [./event.wiki | distributed blog] mechanism all in a single
52
- integrated package.
53
-
54
- 2. <b>Web Interface</b> -
55
- Fossil has a built-in and easy-to-use [./webui.wiki | web interface]
56
- that simplifies project tracking and promotes situational awareness.
57
- Simply type "fossil&nbsp;ui" from within any check-out and Fossil
58
- automatically opens your web browser in a page that gives detailed
59
- [/timeline?n=100&y=ci | graphical history] and status information
60
- on that project.
61
-
62
- This entire website (except the
63
- [http://www.fossil-scm.org/download.html | download] page)
32
+ Fossil also supports [./bugtheory.wiki | bug tracking],
33
+ [./wikitheory.wiki | wiki], and [./event.wiki | technotes].
34
+
35
+ 2. <b>Built-in Web Interface</b> -
36
+ Fossil has a built-in and intuitive [./webui.wiki | web interface]
37
+ with a rich assortment of information pages
38
+ ([./webpage-ex.md|examples]) designed to promote situational awareness.
39
+
40
+ This entire website&#185;
6441
is just a running instance of Fossil. The pages you see here
6542
are all [./wikitheory.wiki | wiki] or
6643
[./embeddeddoc.wiki | embedded documentation].
6744
When you clone Fossil from one of its
6845
[./selfhost.wiki | self-hosting repositories],
6946
you get more than just source code - you get this entire website.
47
+ <span style='font-size:75%;'>(&#185;except the
48
+ [http://www.fossil-scm.org/download.html | download] page)</span>
49
+
50
+ 3. <b>Self-Contained</b> -
51
+ Fossil is a single self-contained stand-alone executable.
52
+ To install, simply download a
53
+ <a href="http://www.fossil-scm.org/download.html">precompiled binary</a>
54
+ for Linux, Mac, OpenBSD, or Windows and put it on your $PATH.
55
+ [./build.wiki | Easy-to-compile source code] is also available.
56
+
57
+ 4. <b>Simple Networking</b> -
58
+ No custom protocols or TCP ports.
59
+ Fossil uses ordinary HTTP (or HTTPS or SSH)
60
+ for network communications, so it works fine from behind
61
+ restrictive firewalls, including [./quickstart.wiki#proxy|proxies].
62
+ The protocol is
63
+ [./stats.wiki | bandwidth efficient] to the point that Fossil can be
64
+ used comfortably over dial-up.
65
+
66
+ 5. <b>CGI/SCGI Enabled</b> - No server is required, but if you want to
67
+ set one up, Fossil supports four easy
68
+ [./server.wiki | server configurations].
7069
71
- 3. <b>Autosync</b> -
70
+ 6. <b>Autosync</b> -
7271
Fossil supports [./concepts.wiki#workflow | "autosync" mode]
7372
which helps to keep projects moving
7473
forward by reducing the amount of needless
7574
[./branching.wiki | forking and merging] often
7675
associated with distributed projects.
7776
78
- 4. <b>Self-Contained</b> -
79
- Fossil is a single stand-alone executable that contains everything
80
- needed to do configuration management.
81
- Installation is trivial: simply download a
82
- <a href="http://www.fossil-scm.org/download.html">precompiled binary</a>
83
- for Linux, Mac, or Windows and put it on your $PATH.
84
- [./build.wiki | Easy-to-compile source code] is available for
85
- users on other platforms. Fossil sources are also mostly self-contained,
86
- requiring only the standard C library to build.
87
-
88
- 5. <b>Simple Networking</b> -
89
- Fossil uses plain old HTTP (with
90
- [./quickstart.wiki#proxy | proxy support])
91
- for all network communications, meaning that it works fine from behind
92
- restrictive firewalls. The protocol is
93
- [./stats.wiki | bandwidth efficient] to the point that Fossil can be
94
- used comfortably over a dial-up internet connection.
95
-
96
- 6. <b>CGI/SCGI Enabled</b> -
97
- No server is required to use fossil. But a
98
- server does make collaboration easier. Fossil supports four different
99
- yet simple [./server.wiki | server configurations].
100
- The most popular is a 2-line CGI script. This is the approach
101
- used by the [./selfhost.wiki | self-hosting fossil repositories].
102
-
10377
7. <b>Robust &amp; Reliable</b> -
10478
Fossil stores content using an [./fileformat.wiki | enduring file format]
10579
in an SQLite database so that transactions are
106
- atomic even if interrupted by a power loss or system crash. Furthermore,
107
- automatic [./selfcheck.wiki | self-checks] verify that all aspects of
108
- the repository are consistent prior to each commit. In over six years
80
+ atomic even if interrupted by a power loss or system crash.
81
+ Automatic [./selfcheck.wiki | self-checks] verify that all aspects of
82
+ the repository are consistent prior to each commit. In over seven years
10983
of operation, no work has ever been lost after having been committed to
11084
a Fossil repository.
85
+
86
+ 8. <b>Free and Open-Source</b> - Uses the [../COPYRIGHT-BSD2.txt|2-clause BSD license].
11187
11288
<hr>
11389
<h3>Links For Fossil Users:</h3>
11490
11591
* "Fuel" is cross-platform GUI front-end for Fossil
@@ -159,11 +135,11 @@
159135
* [./fossil-v-git.wiki | Fossil versus Git].
160136
* [./fiveminutes.wiki | Up and running in 5 minutes as a single user]
161137
(contributed by Gilles Ganault on 2013-01-08).
162138
* [./antibot.wiki | How Fossil defends against abuse by spiders and bots].
163139
164
-<h3>Links For Fossil Developer:</h3>
140
+<h3>Links For Fossil Developers:</h3>
165141
166142
* [./contribute.wiki | Contributing] code or documentation to the
167143
Fossil project.
168144
* [./theory1.wiki | Thoughts On The Design Of Fossil].
169145
* [./pop.wiki | Principles Of Operation]
170146
--- www/index.wiki
+++ www/index.wiki
@@ -1,115 +1,91 @@
1 <title>Fossil</title>
2
3
4 <p align="center">
5 <font size="3">
6 <i>Simple, high-reliability, distributed software configuration management</i>
7 </font>
8 </p>
9
10
11 <h3>Why Use Fossil?</h3>
12
13 <table border="0" cellspacing="10" bgcolor="white" align="right"
14 cellpadding="2">
15 <tr><td bgcolor="#446979">
16 <table border="0" cellpadding="10" bgcolor="white">
17 <tr><td>
18 <ul>
19 <li> [http://www.fossil-scm.org/download.html | Download]
20 <li> [./quickstart.wiki | Quick Start]
21 <li> [./build.wiki | Install]
22 <li> [../COPYRIGHT-BSD2.txt | License]
23 <li> [/timeline | Recent changes]
24 <li> [./faq.wiki | FAQ]
25 <li> [./hacker-howto.wiki | Hacker How-To]
26 <li> [./changes.wiki | Change Log]
 
27 <li> [./hints.wiki | Tip &amp; Hints]
28 <li> [./permutedindex.html | Documentation Index]
29 <li> [http://www.fossil-scm.org/schimpf-book/home | Jim Schimpf's book]
30 <li> Mailing list
31 <ul>
32 <li> [http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users | sign-up]
33 <li> [http://www.mail-archive.com/[email protected] | archives]
34 <ul>
35 </ul>
36 </td></tr>
37 <tr><td>
38 <center><img src="fossil3.gif"></center>
39 </td></tr>
40 </table>
41 </table>
42
43 There are plenty of open-source version control systems available on the
44 internet these days. What makes Fossil worthy of attention?
45
46 1. <b>Bug Tracking And Wiki</b> -
47 In addition to doing [./concepts.wiki | distributed version control]
48 like Git and Mercurial,
49 Fossil also supports [./bugtheory.wiki | distributed bug tracking],
50 [./wikitheory.wiki | distributed wiki], and a
51 [./event.wiki | distributed blog] mechanism all in a single
52 integrated package.
53
54 2. <b>Web Interface</b> -
55 Fossil has a built-in and easy-to-use [./webui.wiki | web interface]
56 that simplifies project tracking and promotes situational awareness.
57 Simply type "fossil&nbsp;ui" from within any check-out and Fossil
58 automatically opens your web browser in a page that gives detailed
59 [/timeline?n=100&y=ci | graphical history] and status information
60 on that project.
61
62 This entire website (except the
63 [http://www.fossil-scm.org/download.html | download] page)
64 is just a running instance of Fossil. The pages you see here
65 are all [./wikitheory.wiki | wiki] or
66 [./embeddeddoc.wiki | embedded documentation].
67 When you clone Fossil from one of its
68 [./selfhost.wiki | self-hosting repositories],
69 you get more than just source code - you get this entire website.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
71 3. <b>Autosync</b> -
72 Fossil supports [./concepts.wiki#workflow | "autosync" mode]
73 which helps to keep projects moving
74 forward by reducing the amount of needless
75 [./branching.wiki | forking and merging] often
76 associated with distributed projects.
77
78 4. <b>Self-Contained</b> -
79 Fossil is a single stand-alone executable that contains everything
80 needed to do configuration management.
81 Installation is trivial: simply download a
82 <a href="http://www.fossil-scm.org/download.html">precompiled binary</a>
83 for Linux, Mac, or Windows and put it on your $PATH.
84 [./build.wiki | Easy-to-compile source code] is available for
85 users on other platforms. Fossil sources are also mostly self-contained,
86 requiring only the standard C library to build.
87
88 5. <b>Simple Networking</b> -
89 Fossil uses plain old HTTP (with
90 [./quickstart.wiki#proxy | proxy support])
91 for all network communications, meaning that it works fine from behind
92 restrictive firewalls. The protocol is
93 [./stats.wiki | bandwidth efficient] to the point that Fossil can be
94 used comfortably over a dial-up internet connection.
95
96 6. <b>CGI/SCGI Enabled</b> -
97 No server is required to use fossil. But a
98 server does make collaboration easier. Fossil supports four different
99 yet simple [./server.wiki | server configurations].
100 The most popular is a 2-line CGI script. This is the approach
101 used by the [./selfhost.wiki | self-hosting fossil repositories].
102
103 7. <b>Robust &amp; Reliable</b> -
104 Fossil stores content using an [./fileformat.wiki | enduring file format]
105 in an SQLite database so that transactions are
106 atomic even if interrupted by a power loss or system crash. Furthermore,
107 automatic [./selfcheck.wiki | self-checks] verify that all aspects of
108 the repository are consistent prior to each commit. In over six years
109 of operation, no work has ever been lost after having been committed to
110 a Fossil repository.
 
 
111
112 <hr>
113 <h3>Links For Fossil Users:</h3>
114
115 * "Fuel" is cross-platform GUI front-end for Fossil
@@ -159,11 +135,11 @@
159 * [./fossil-v-git.wiki | Fossil versus Git].
160 * [./fiveminutes.wiki | Up and running in 5 minutes as a single user]
161 (contributed by Gilles Ganault on 2013-01-08).
162 * [./antibot.wiki | How Fossil defends against abuse by spiders and bots].
163
164 <h3>Links For Fossil Developer:</h3>
165
166 * [./contribute.wiki | Contributing] code or documentation to the
167 Fossil project.
168 * [./theory1.wiki | Thoughts On The Design Of Fossil].
169 * [./pop.wiki | Principles Of Operation]
170
--- www/index.wiki
+++ www/index.wiki
@@ -1,115 +1,91 @@
1 <title>Home</title>
2
3 <h3>What Is Fossil?</h3>
4
5 <div style='width:200px;float:right;border:2px solid #446979;padding:10px;margin:0px 10px;'>
 
 
 
 
 
 
 
 
 
 
 
 
6 <ul>
7 <li> [http://www.fossil-scm.org/download.html | Download]
8 <li> [./quickstart.wiki | Quick Start]
9 <li> [./build.wiki | Install]
10 <li> [../COPYRIGHT-BSD2.txt | License]
 
11 <li> [./faq.wiki | FAQ]
 
12 <li> [./changes.wiki | Change Log]
13 <li> [./hacker-howto.wiki | Hacker How-To]
14 <li> [./hints.wiki | Tip &amp; Hints]
15 <li> [./permutedindex.html | Documentation Index]
16 <li> [http://www.fossil-scm.org/schimpf-book/home | Jim Schimpf's book]
17 <li> Mailing list
18 <ul>
19 <li> [http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users | sign-up]
20 <li> [http://www.mail-archive.com/[email protected] | archives]
21 </ul>
22 </ul>
 
 
23 <center><img src="fossil3.gif"></center>
24 </div>
25
26 <p>Fossil is a simple, high-reliability, distributed software configuration
27 management with these advanced features:
28
29 1. <b>Integrated Bug Tracking, Wiki, and Technotes</b> -
 
 
30 In addition to doing [./concepts.wiki | distributed version control]
31 like Git and Mercurial,
32 Fossil also supports [./bugtheory.wiki | bug tracking],
33 [./wikitheory.wiki | wiki], and [./event.wiki | technotes].
34
35 2. <b>Built-in Web Interface</b> -
36 Fossil has a built-in and intuitive [./webui.wiki | web interface]
37 with a rich assortment of information pages
38 ([./webpage-ex.md|examples]) designed to promote situational awareness.
39
40 This entire website&#185;
 
 
 
 
 
 
41 is just a running instance of Fossil. The pages you see here
42 are all [./wikitheory.wiki | wiki] or
43 [./embeddeddoc.wiki | embedded documentation].
44 When you clone Fossil from one of its
45 [./selfhost.wiki | self-hosting repositories],
46 you get more than just source code - you get this entire website.
47 <span style='font-size:75%;'>(&#185;except the
48 [http://www.fossil-scm.org/download.html | download] page)</span>
49
50 3. <b>Self-Contained</b> -
51 Fossil is a single self-contained stand-alone executable.
52 To install, simply download a
53 <a href="http://www.fossil-scm.org/download.html">precompiled binary</a>
54 for Linux, Mac, OpenBSD, or Windows and put it on your $PATH.
55 [./build.wiki | Easy-to-compile source code] is also available.
56
57 4. <b>Simple Networking</b> -
58 No custom protocols or TCP ports.
59 Fossil uses ordinary HTTP (or HTTPS or SSH)
60 for network communications, so it works fine from behind
61 restrictive firewalls, including [./quickstart.wiki#proxy|proxies].
62 The protocol is
63 [./stats.wiki | bandwidth efficient] to the point that Fossil can be
64 used comfortably over dial-up.
65
66 5. <b>CGI/SCGI Enabled</b> - No server is required, but if you want to
67 set one up, Fossil supports four easy
68 [./server.wiki | server configurations].
69
70 6. <b>Autosync</b> -
71 Fossil supports [./concepts.wiki#workflow | "autosync" mode]
72 which helps to keep projects moving
73 forward by reducing the amount of needless
74 [./branching.wiki | forking and merging] often
75 associated with distributed projects.
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77 7. <b>Robust &amp; Reliable</b> -
78 Fossil stores content using an [./fileformat.wiki | enduring file format]
79 in an SQLite database so that transactions are
80 atomic even if interrupted by a power loss or system crash.
81 Automatic [./selfcheck.wiki | self-checks] verify that all aspects of
82 the repository are consistent prior to each commit. In over seven years
83 of operation, no work has ever been lost after having been committed to
84 a Fossil repository.
85
86 8. <b>Free and Open-Source</b> - Uses the [../COPYRIGHT-BSD2.txt|2-clause BSD license].
87
88 <hr>
89 <h3>Links For Fossil Users:</h3>
90
91 * "Fuel" is cross-platform GUI front-end for Fossil
@@ -159,11 +135,11 @@
135 * [./fossil-v-git.wiki | Fossil versus Git].
136 * [./fiveminutes.wiki | Up and running in 5 minutes as a single user]
137 (contributed by Gilles Ganault on 2013-01-08).
138 * [./antibot.wiki | How Fossil defends against abuse by spiders and bots].
139
140 <h3>Links For Fossil Developers:</h3>
141
142 * [./contribute.wiki | Contributing] code or documentation to the
143 Fossil project.
144 * [./theory1.wiki | Thoughts On The Design Of Fossil].
145 * [./pop.wiki | Principles Of Operation]
146
--- www/inout.wiki
+++ www/inout.wiki
@@ -48,5 +48,16 @@
4848
since the git-fast-export file format is currently the only VCS interchange
4949
format that Fossil will generate. However,
5050
future versions of Fossil might add the ability to generate other
5151
VCS interchange formats, and so for compatibility, the use of the --git
5252
option recommented.
53
+
54
+An anonymous user sends this comment:
55
+
56
+<blockquote>
57
+The main Fossil branch is called "trunk", while the main git branch is
58
+called "master". After you've exported your FOSSIL repo to git, you won't
59
+see any files and gitk will complain about a missing "HEAD". You can
60
+resolve this problem by merging "trunk" with "master"
61
+(first verify using git status that you are on the "master" branch):
62
+<tt>git merge trunk</tt>
63
+</blockquote>
5364
--- www/inout.wiki
+++ www/inout.wiki
@@ -48,5 +48,16 @@
48 since the git-fast-export file format is currently the only VCS interchange
49 format that Fossil will generate. However,
50 future versions of Fossil might add the ability to generate other
51 VCS interchange formats, and so for compatibility, the use of the --git
52 option recommented.
 
 
 
 
 
 
 
 
 
 
 
53
--- www/inout.wiki
+++ www/inout.wiki
@@ -48,5 +48,16 @@
48 since the git-fast-export file format is currently the only VCS interchange
49 format that Fossil will generate. However,
50 future versions of Fossil might add the ability to generate other
51 VCS interchange formats, and so for compatibility, the use of the --git
52 option recommented.
53
54 An anonymous user sends this comment:
55
56 <blockquote>
57 The main Fossil branch is called "trunk", while the main git branch is
58 called "master". After you've exported your FOSSIL repo to git, you won't
59 see any files and gitk will complain about a missing "HEAD". You can
60 resolve this problem by merging "trunk" with "master"
61 (first verify using git status that you are on the "master" branch):
62 <tt>git merge trunk</tt>
63 </blockquote>
64
+23 -24
--- www/mkdownload.tcl
+++ www/mkdownload.tcl
@@ -5,42 +5,41 @@
55
#
66
#
77
set out [open download.html w]
88
fconfigure $out -encoding utf-8 -translation lf
99
puts $out \
10
-{<!DOCTYPE html><html>
11
-<head>
12
-<base href="/" />
13
-<title>Fossil: Downloads</title>
14
-<link rel="stylesheet" href="/fossil/style.css" type="text/css"
15
- media="screen">
16
-</head>
17
-<body>
18
-<div class="header">
19
- <div class="logo">
20
- <img src="/fossil/logo" alt="logo">
21
- <br /><nobr>Fossil</nobr>
22
- </div>
23
-
24
- <div class="title">Fossil Downloads</div>
25
-</div>
26
-<div class="mainmenu">
10
+{<!DOCTYPE html>
11
+<html>
12
+ <head>
13
+ <base href="https://www.fossil-scm.org/download.html" />
14
+ <title>Fossil: Download</title>
15
+ <link rel="alternate" type="application/rss+xml" title="RSS Feed"
16
+ href="/fossil/timeline.rss" />
17
+ <link rel="stylesheet" href="/fossil/style.css?default" type="text/css"
18
+ media="screen" />
19
+ </head>
20
+
21
+ <body>
22
+ <div class="header">
23
+ <div class="title"><h1>Fossil</h1>Download</div>
24
+ </div>
25
+ <div class="mainmenu">
2726
<a href='/fossil/doc/trunk/www/index.wiki'>Home</a>
2827
<a href='/fossil/timeline?y=ci'>Timeline</a>
29
-<a href='/download.html'>Download</a>
30
-<a href='/fossil/dir?ci=trunk'>Code</a>
31
-<a href='/fossil/doc/trunk/www/permutedindex.html'>Documentation</a>
28
+<a href='/fossil/dir?ci=tip'>Code</a>
29
+<a href='/fossil/doc/trunk/www/permutedindex.html'>Docs</a>
3230
<a href='/fossil/brlist'>Branches</a>
33
-<a href='/fossil/taglist'>Tags</a>
34
-<a href='/fossil/reportlist'>Tickets</a>
31
+<a href='/fossil/ticket'>Tickets</a>
32
+<a href='/fossil/wiki'>Wiki</a>
33
+<a href='/download.html' class='active'>Download</a>
3534
</div>
3635
<div class="content">
3736
<p>
3837
3938
<center><font size=4>}
4039
puts $out \
41
-"<b>To install Fossil \u2192</b> download the stand-alone executable"
40
+"<b>To install Fossil &rarr;</b> download the stand-alone executable"
4241
puts $out \
4342
{and put it on your $PATH.
4443
</font><p><small>
4544
RPMs available
4645
<a href="http://download.opensuse.org/repositories/home:/rmax:/fossil/">
@@ -111,11 +110,11 @@
111110
puts $out "</td></tr>"
112111
}
113112
}
114113
puts $out "<tr><td colspan=5><hr></td></tr>"
115114
116
-puts $out {</table>
115
+puts $out {</table></div>
117116
</body>
118117
</html>
119118
}
120119
121120
close $out
122121
--- www/mkdownload.tcl
+++ www/mkdownload.tcl
@@ -5,42 +5,41 @@
5 #
6 #
7 set out [open download.html w]
8 fconfigure $out -encoding utf-8 -translation lf
9 puts $out \
10 {<!DOCTYPE html><html>
11 <head>
12 <base href="/" />
13 <title>Fossil: Downloads</title>
14 <link rel="stylesheet" href="/fossil/style.css" type="text/css"
15 media="screen">
16 </head>
17 <body>
18 <div class="header">
19 <div class="logo">
20 <img src="/fossil/logo" alt="logo">
21 <br /><nobr>Fossil</nobr>
22 </div>
23
24 <div class="title">Fossil Downloads</div>
25 </div>
26 <div class="mainmenu">
27 <a href='/fossil/doc/trunk/www/index.wiki'>Home</a>
28 <a href='/fossil/timeline?y=ci'>Timeline</a>
29 <a href='/download.html'>Download</a>
30 <a href='/fossil/dir?ci=trunk'>Code</a>
31 <a href='/fossil/doc/trunk/www/permutedindex.html'>Documentation</a>
32 <a href='/fossil/brlist'>Branches</a>
33 <a href='/fossil/taglist'>Tags</a>
34 <a href='/fossil/reportlist'>Tickets</a>
 
35 </div>
36 <div class="content">
37 <p>
38
39 <center><font size=4>}
40 puts $out \
41 "<b>To install Fossil \u2192</b> download the stand-alone executable"
42 puts $out \
43 {and put it on your $PATH.
44 </font><p><small>
45 RPMs available
46 <a href="http://download.opensuse.org/repositories/home:/rmax:/fossil/">
@@ -111,11 +110,11 @@
111 puts $out "</td></tr>"
112 }
113 }
114 puts $out "<tr><td colspan=5><hr></td></tr>"
115
116 puts $out {</table>
117 </body>
118 </html>
119 }
120
121 close $out
122
--- www/mkdownload.tcl
+++ www/mkdownload.tcl
@@ -5,42 +5,41 @@
5 #
6 #
7 set out [open download.html w]
8 fconfigure $out -encoding utf-8 -translation lf
9 puts $out \
10 {<!DOCTYPE html>
11 <html>
12 <head>
13 <base href="https://www.fossil-scm.org/download.html" />
14 <title>Fossil: Download</title>
15 <link rel="alternate" type="application/rss+xml" title="RSS Feed"
16 href="/fossil/timeline.rss" />
17 <link rel="stylesheet" href="/fossil/style.css?default" type="text/css"
18 media="screen" />
19 </head>
20
21 <body>
22 <div class="header">
23 <div class="title"><h1>Fossil</h1>Download</div>
24 </div>
25 <div class="mainmenu">
 
26 <a href='/fossil/doc/trunk/www/index.wiki'>Home</a>
27 <a href='/fossil/timeline?y=ci'>Timeline</a>
28 <a href='/fossil/dir?ci=tip'>Code</a>
29 <a href='/fossil/doc/trunk/www/permutedindex.html'>Docs</a>
 
30 <a href='/fossil/brlist'>Branches</a>
31 <a href='/fossil/ticket'>Tickets</a>
32 <a href='/fossil/wiki'>Wiki</a>
33 <a href='/download.html' class='active'>Download</a>
34 </div>
35 <div class="content">
36 <p>
37
38 <center><font size=4>}
39 puts $out \
40 "<b>To install Fossil &rarr;</b> download the stand-alone executable"
41 puts $out \
42 {and put it on your $PATH.
43 </font><p><small>
44 RPMs available
45 <a href="http://download.opensuse.org/repositories/home:/rmax:/fossil/">
@@ -111,11 +110,11 @@
110 puts $out "</td></tr>"
111 }
112 }
113 puts $out "<tr><td colspan=5><hr></td></tr>"
114
115 puts $out {</table></div>
116 </body>
117 </html>
118 }
119
120 close $out
121
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -17,10 +17,11 @@
1717
checkin.wiki {Check-in Checklist}
1818
changes.wiki {Fossil Changelog}
1919
copyright-release.html {Contributor License Agreement}
2020
concepts.wiki {Fossil Core Concepts}
2121
contribute.wiki {Contributing Code or Documentation To The Fossil Project}
22
+ customskin.md {Theming: Customizing The Appearance of Web Pages}
2223
custom_ticket.wiki {Customizing The Ticket System}
2324
delta_encoder_algorithm.wiki {Fossil Delta Encoding Algorithm}
2425
delta_format.wiki {Fossil Delta Format}
2526
embeddeddoc.wiki {Embedded Project Documentation}
2627
event.wiki {Events}
@@ -55,10 +56,11 @@
5556
ssl.wiki {Using SSL with Fossil}
5657
sync.wiki {The Fossil Sync Protocol}
5758
tech_overview.wiki {A Technical Overview Of The Design And Implementation
5859
Of Fossil}
5960
tech_overview.wiki {SQLite Databases Used By Fossil}
61
+ th1.md {The TH1 Scripting Language}
6062
tickets.wiki {The Fossil Ticket System}
6163
theory1.wiki {Thoughts On The Design Of The Fossil DVCS}
6264
webui.wiki {The Fossil Web Interface}
6365
wikitheory.wiki {Wiki In Fossil}
6466
}
6567
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -17,10 +17,11 @@
17 checkin.wiki {Check-in Checklist}
18 changes.wiki {Fossil Changelog}
19 copyright-release.html {Contributor License Agreement}
20 concepts.wiki {Fossil Core Concepts}
21 contribute.wiki {Contributing Code or Documentation To The Fossil Project}
 
22 custom_ticket.wiki {Customizing The Ticket System}
23 delta_encoder_algorithm.wiki {Fossil Delta Encoding Algorithm}
24 delta_format.wiki {Fossil Delta Format}
25 embeddeddoc.wiki {Embedded Project Documentation}
26 event.wiki {Events}
@@ -55,10 +56,11 @@
55 ssl.wiki {Using SSL with Fossil}
56 sync.wiki {The Fossil Sync Protocol}
57 tech_overview.wiki {A Technical Overview Of The Design And Implementation
58 Of Fossil}
59 tech_overview.wiki {SQLite Databases Used By Fossil}
 
60 tickets.wiki {The Fossil Ticket System}
61 theory1.wiki {Thoughts On The Design Of The Fossil DVCS}
62 webui.wiki {The Fossil Web Interface}
63 wikitheory.wiki {Wiki In Fossil}
64 }
65
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -17,10 +17,11 @@
17 checkin.wiki {Check-in Checklist}
18 changes.wiki {Fossil Changelog}
19 copyright-release.html {Contributor License Agreement}
20 concepts.wiki {Fossil Core Concepts}
21 contribute.wiki {Contributing Code or Documentation To The Fossil Project}
22 customskin.md {Theming: Customizing The Appearance of Web Pages}
23 custom_ticket.wiki {Customizing The Ticket System}
24 delta_encoder_algorithm.wiki {Fossil Delta Encoding Algorithm}
25 delta_format.wiki {Fossil Delta Format}
26 embeddeddoc.wiki {Embedded Project Documentation}
27 event.wiki {Events}
@@ -55,10 +56,11 @@
56 ssl.wiki {Using SSL with Fossil}
57 sync.wiki {The Fossil Sync Protocol}
58 tech_overview.wiki {A Technical Overview Of The Design And Implementation
59 Of Fossil}
60 tech_overview.wiki {SQLite Databases Used By Fossil}
61 th1.md {The TH1 Scripting Language}
62 tickets.wiki {The Fossil Ticket System}
63 theory1.wiki {Thoughts On The Design Of The Fossil DVCS}
64 webui.wiki {The Fossil Web Interface}
65 wikitheory.wiki {Wiki In Fossil}
66 }
67
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -24,10 +24,11 @@
2424
<li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li>
2525
<li><a href="adding_code.wiki">Adding New Features To Fossil</a></li>
2626
<li><a href="antibot.wiki">against Spiders and Bots &mdash; Defense</a></li>
2727
<li><a href="copyright-release.html">Agreement &mdash; Contributor License</a></li>
2828
<li><a href="delta_encoder_algorithm.wiki">Algorithm &mdash; Fossil Delta Encoding</a></li>
29
+<li><a href="customskin.md">Appearance of Web Pages &mdash; Theming: Customizing The</a></li>
2930
<li><a href="fiveminutes.wiki">as a Single User &mdash; Update and Running in 5 Minutes</a></li>
3031
<li><a href="faq.wiki">Asked Questions &mdash; Frequently</a></li>
3132
<li><a href="password.wiki">Authentication &mdash; Password Management And</a></li>
3233
<li><a href="antibot.wiki">Bots &mdash; Defense against Spiders and</a></li>
3334
<li><a href="private.wiki">Branches &mdash; Creating, Syncing, and Deleting Private</a></li>
@@ -51,10 +52,11 @@
5152
<li><a href="copyright-release.html">Contributor License Agreement</a></li>
5253
<li><a href="concepts.wiki">Core Concepts &mdash; Fossil</a></li>
5354
<li><a href="newrepo.wiki">Create A New Fossil Repository &mdash; How To</a></li>
5455
<li><a href="private.wiki">Creating, Syncing, and Deleting Private Branches</a></li>
5556
<li><a href="qandc.wiki">Criticisms &mdash; Questions And</a></li>
57
+<li><a href="customskin.md">Customizing The Appearance of Web Pages &mdash; Theming:</a></li>
5658
<li><a href="custom_ticket.wiki">Customizing The Ticket System</a></li>
5759
<li><a href="tech_overview.wiki">Databases Used By Fossil &mdash; SQLite</a></li>
5860
<li><a href="antibot.wiki">Defense against Spiders and Bots</a></li>
5961
<li><a href="shunning.wiki">Deleting Content From Fossil &mdash; Shunning:</a></li>
6062
<li><a href="private.wiki">Deleting Private Branches &mdash; Creating, Syncing, and</a></li>
@@ -110,10 +112,11 @@
110112
<li><a href="inout.wiki">Import And Export To And From Git</a></li>
111113
<li><a href="build.wiki">Installing Fossil &mdash; Compiling and</a></li>
112114
<li><a href="fossil-from-msvc.wiki">Integrating Fossil in the Microsoft Express 2010 IDE</a></li>
113115
<li><a href="selfcheck.wiki">Integrity Self Checks &mdash; Fossil Repository</a></li>
114116
<li><a href="webui.wiki">Interface &mdash; The Fossil Web</a></li>
117
+<li><a href="th1.md">Language &mdash; The TH1 Scripting</a></li>
115118
<li><a href="copyright-release.html">License Agreement &mdash; Contributor</a></li>
116119
<li><a href="password.wiki">Management And Authentication &mdash; Password</a></li>
117120
<li><a href="branching.wiki">Merging, and Tagging &mdash; Branching, Forking,</a></li>
118121
<li><a href="fossil-from-msvc.wiki">Microsoft Express 2010 IDE &mdash; Integrating Fossil in the</a></li>
119122
<li><a href="fiveminutes.wiki">Minutes as a Single User &mdash; Update and Running in 5</a></li>
@@ -122,10 +125,11 @@
122125
<li><a href="newrepo.wiki">New Fossil Repository &mdash; How To Create A</a></li>
123126
<li><a href="foss-cklist.wiki">Open-Source Projects &mdash; Checklist For Successful</a></li>
124127
<li><a href="pop.wiki">Operations &mdash; Principles Of</a></li>
125128
<li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil &mdash; A Technical</a></li>
126129
<li><a href="index.wiki">Page &mdash; Home</a></li>
130
+<li><a href="customskin.md">Pages &mdash; Theming: Customizing The Appearance of Web</a></li>
127131
<li><a href="password.wiki">Password Management And Authentication</a></li>
128132
<li><a href="quotes.wiki">People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What</a></li>
129133
<li><a href="stats.wiki">Performance Statistics</a></li>
130134
<li><a href="../test/release-checklist.wiki">Pre-Release Testing Checklist</a></li>
131135
<li><a href="pop.wiki">Principles Of Operations</a></li>
@@ -143,10 +147,11 @@
143147
<li><a href="newrepo.wiki">Repository &mdash; How To Create A New Fossil</a></li>
144148
<li><a href="selfcheck.wiki">Repository Integrity Self Checks &mdash; Fossil</a></li>
145149
<li><a href="reviews.wiki">Reviews</a></li>
146150
<li><a href="fiveminutes.wiki">Running in 5 Minutes as a Single User &mdash; Update and</a></li>
147151
<li><a href="quotes.wiki">Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What People Are</a></li>
152
+<li><a href="th1.md">Scripting Language &mdash; The TH1</a></li>
148153
<li><a href="selfcheck.wiki">Self Checks &mdash; Fossil Repository Integrity</a></li>
149154
<li><a href="selfhost.wiki">Self Hosting Repositories &mdash; Fossil</a></li>
150155
<li><a href="server.wiki">Server &mdash; How To Configure A Fossil</a></li>
151156
<li><a href="settings.wiki">Settings &mdash; Fossil</a></li>
152157
<li><a href="shunning.wiki">Shunning: Deleting Content From Fossil</a></li>
@@ -164,14 +169,17 @@
164169
<li><a href="custom_ticket.wiki">System &mdash; Customizing The Ticket</a></li>
165170
<li><a href="tickets.wiki">System &mdash; The Fossil Ticket</a></li>
166171
<li><a href="branching.wiki">Tagging &mdash; Branching, Forking, Merging, and</a></li>
167172
<li><a href="tech_overview.wiki">Technical Overview Of The Design And Implementation Of Fossil &mdash; A</a></li>
168173
<li><a href="../test/release-checklist.wiki">Testing Checklist &mdash; Pre-Release</a></li>
174
+<li><a href="th1.md">TH1 Scripting Language &mdash; The</a></li>
169175
<li><a href="makefile.wiki">The Fossil Build Process</a></li>
170176
<li><a href="sync.wiki">The Fossil Sync Protocol</a></li>
171177
<li><a href="tickets.wiki">The Fossil Ticket System</a></li>
172178
<li><a href="webui.wiki">The Fossil Web Interface</a></li>
179
+<li><a href="th1.md">The TH1 Scripting Language</a></li>
180
+<li><a href="customskin.md">Theming: Customizing The Appearance of Web Pages</a></li>
173181
<li><a href="theory1.wiki">Thoughts On The Design Of The Fossil DVCS</a></li>
174182
<li><a href="custom_ticket.wiki">Ticket System &mdash; Customizing The</a></li>
175183
<li><a href="tickets.wiki">Ticket System &mdash; The Fossil</a></li>
176184
<li><a href="hints.wiki">Tips And Usage Hints &mdash; Fossil</a></li>
177185
<li><a href="bugtheory.wiki">Tracking In Fossil &mdash; Bug</a></li>
@@ -180,9 +188,10 @@
180188
<li><a href="fiveminutes.wiki">User &mdash; Update and Running in 5 Minutes as a Single</a></li>
181189
<li><a href="ssl.wiki">Using SSL with Fossil</a></li>
182190
<li><a href="checkin_names.wiki">Version Names &mdash; Checkin And</a></li>
183191
<li><a href="fossil-v-git.wiki">Versus Git &mdash; Fossil</a></li>
184192
<li><a href="webui.wiki">Web Interface &mdash; The Fossil</a></li>
193
+<li><a href="customskin.md">Web Pages &mdash; Theming: Customizing The Appearance of</a></li>
185194
<li><a href="quotes.wiki">What People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes:</a></li>
186195
<li><a href="wikitheory.wiki">Wiki In Fossil</a></li>
187196
<li><a href="ssl.wiki">with Fossil &mdash; Using SSL</a></li>
188197
</ul></div>
189198
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -24,10 +24,11 @@
24 <li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li>
25 <li><a href="adding_code.wiki">Adding New Features To Fossil</a></li>
26 <li><a href="antibot.wiki">against Spiders and Bots &mdash; Defense</a></li>
27 <li><a href="copyright-release.html">Agreement &mdash; Contributor License</a></li>
28 <li><a href="delta_encoder_algorithm.wiki">Algorithm &mdash; Fossil Delta Encoding</a></li>
 
29 <li><a href="fiveminutes.wiki">as a Single User &mdash; Update and Running in 5 Minutes</a></li>
30 <li><a href="faq.wiki">Asked Questions &mdash; Frequently</a></li>
31 <li><a href="password.wiki">Authentication &mdash; Password Management And</a></li>
32 <li><a href="antibot.wiki">Bots &mdash; Defense against Spiders and</a></li>
33 <li><a href="private.wiki">Branches &mdash; Creating, Syncing, and Deleting Private</a></li>
@@ -51,10 +52,11 @@
51 <li><a href="copyright-release.html">Contributor License Agreement</a></li>
52 <li><a href="concepts.wiki">Core Concepts &mdash; Fossil</a></li>
53 <li><a href="newrepo.wiki">Create A New Fossil Repository &mdash; How To</a></li>
54 <li><a href="private.wiki">Creating, Syncing, and Deleting Private Branches</a></li>
55 <li><a href="qandc.wiki">Criticisms &mdash; Questions And</a></li>
 
56 <li><a href="custom_ticket.wiki">Customizing The Ticket System</a></li>
57 <li><a href="tech_overview.wiki">Databases Used By Fossil &mdash; SQLite</a></li>
58 <li><a href="antibot.wiki">Defense against Spiders and Bots</a></li>
59 <li><a href="shunning.wiki">Deleting Content From Fossil &mdash; Shunning:</a></li>
60 <li><a href="private.wiki">Deleting Private Branches &mdash; Creating, Syncing, and</a></li>
@@ -110,10 +112,11 @@
110 <li><a href="inout.wiki">Import And Export To And From Git</a></li>
111 <li><a href="build.wiki">Installing Fossil &mdash; Compiling and</a></li>
112 <li><a href="fossil-from-msvc.wiki">Integrating Fossil in the Microsoft Express 2010 IDE</a></li>
113 <li><a href="selfcheck.wiki">Integrity Self Checks &mdash; Fossil Repository</a></li>
114 <li><a href="webui.wiki">Interface &mdash; The Fossil Web</a></li>
 
115 <li><a href="copyright-release.html">License Agreement &mdash; Contributor</a></li>
116 <li><a href="password.wiki">Management And Authentication &mdash; Password</a></li>
117 <li><a href="branching.wiki">Merging, and Tagging &mdash; Branching, Forking,</a></li>
118 <li><a href="fossil-from-msvc.wiki">Microsoft Express 2010 IDE &mdash; Integrating Fossil in the</a></li>
119 <li><a href="fiveminutes.wiki">Minutes as a Single User &mdash; Update and Running in 5</a></li>
@@ -122,10 +125,11 @@
122 <li><a href="newrepo.wiki">New Fossil Repository &mdash; How To Create A</a></li>
123 <li><a href="foss-cklist.wiki">Open-Source Projects &mdash; Checklist For Successful</a></li>
124 <li><a href="pop.wiki">Operations &mdash; Principles Of</a></li>
125 <li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil &mdash; A Technical</a></li>
126 <li><a href="index.wiki">Page &mdash; Home</a></li>
 
127 <li><a href="password.wiki">Password Management And Authentication</a></li>
128 <li><a href="quotes.wiki">People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What</a></li>
129 <li><a href="stats.wiki">Performance Statistics</a></li>
130 <li><a href="../test/release-checklist.wiki">Pre-Release Testing Checklist</a></li>
131 <li><a href="pop.wiki">Principles Of Operations</a></li>
@@ -143,10 +147,11 @@
143 <li><a href="newrepo.wiki">Repository &mdash; How To Create A New Fossil</a></li>
144 <li><a href="selfcheck.wiki">Repository Integrity Self Checks &mdash; Fossil</a></li>
145 <li><a href="reviews.wiki">Reviews</a></li>
146 <li><a href="fiveminutes.wiki">Running in 5 Minutes as a Single User &mdash; Update and</a></li>
147 <li><a href="quotes.wiki">Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What People Are</a></li>
 
148 <li><a href="selfcheck.wiki">Self Checks &mdash; Fossil Repository Integrity</a></li>
149 <li><a href="selfhost.wiki">Self Hosting Repositories &mdash; Fossil</a></li>
150 <li><a href="server.wiki">Server &mdash; How To Configure A Fossil</a></li>
151 <li><a href="settings.wiki">Settings &mdash; Fossil</a></li>
152 <li><a href="shunning.wiki">Shunning: Deleting Content From Fossil</a></li>
@@ -164,14 +169,17 @@
164 <li><a href="custom_ticket.wiki">System &mdash; Customizing The Ticket</a></li>
165 <li><a href="tickets.wiki">System &mdash; The Fossil Ticket</a></li>
166 <li><a href="branching.wiki">Tagging &mdash; Branching, Forking, Merging, and</a></li>
167 <li><a href="tech_overview.wiki">Technical Overview Of The Design And Implementation Of Fossil &mdash; A</a></li>
168 <li><a href="../test/release-checklist.wiki">Testing Checklist &mdash; Pre-Release</a></li>
 
169 <li><a href="makefile.wiki">The Fossil Build Process</a></li>
170 <li><a href="sync.wiki">The Fossil Sync Protocol</a></li>
171 <li><a href="tickets.wiki">The Fossil Ticket System</a></li>
172 <li><a href="webui.wiki">The Fossil Web Interface</a></li>
 
 
173 <li><a href="theory1.wiki">Thoughts On The Design Of The Fossil DVCS</a></li>
174 <li><a href="custom_ticket.wiki">Ticket System &mdash; Customizing The</a></li>
175 <li><a href="tickets.wiki">Ticket System &mdash; The Fossil</a></li>
176 <li><a href="hints.wiki">Tips And Usage Hints &mdash; Fossil</a></li>
177 <li><a href="bugtheory.wiki">Tracking In Fossil &mdash; Bug</a></li>
@@ -180,9 +188,10 @@
180 <li><a href="fiveminutes.wiki">User &mdash; Update and Running in 5 Minutes as a Single</a></li>
181 <li><a href="ssl.wiki">Using SSL with Fossil</a></li>
182 <li><a href="checkin_names.wiki">Version Names &mdash; Checkin And</a></li>
183 <li><a href="fossil-v-git.wiki">Versus Git &mdash; Fossil</a></li>
184 <li><a href="webui.wiki">Web Interface &mdash; The Fossil</a></li>
 
185 <li><a href="quotes.wiki">What People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes:</a></li>
186 <li><a href="wikitheory.wiki">Wiki In Fossil</a></li>
187 <li><a href="ssl.wiki">with Fossil &mdash; Using SSL</a></li>
188 </ul></div>
189
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -24,10 +24,11 @@
24 <li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li>
25 <li><a href="adding_code.wiki">Adding New Features To Fossil</a></li>
26 <li><a href="antibot.wiki">against Spiders and Bots &mdash; Defense</a></li>
27 <li><a href="copyright-release.html">Agreement &mdash; Contributor License</a></li>
28 <li><a href="delta_encoder_algorithm.wiki">Algorithm &mdash; Fossil Delta Encoding</a></li>
29 <li><a href="customskin.md">Appearance of Web Pages &mdash; Theming: Customizing The</a></li>
30 <li><a href="fiveminutes.wiki">as a Single User &mdash; Update and Running in 5 Minutes</a></li>
31 <li><a href="faq.wiki">Asked Questions &mdash; Frequently</a></li>
32 <li><a href="password.wiki">Authentication &mdash; Password Management And</a></li>
33 <li><a href="antibot.wiki">Bots &mdash; Defense against Spiders and</a></li>
34 <li><a href="private.wiki">Branches &mdash; Creating, Syncing, and Deleting Private</a></li>
@@ -51,10 +52,11 @@
52 <li><a href="copyright-release.html">Contributor License Agreement</a></li>
53 <li><a href="concepts.wiki">Core Concepts &mdash; Fossil</a></li>
54 <li><a href="newrepo.wiki">Create A New Fossil Repository &mdash; How To</a></li>
55 <li><a href="private.wiki">Creating, Syncing, and Deleting Private Branches</a></li>
56 <li><a href="qandc.wiki">Criticisms &mdash; Questions And</a></li>
57 <li><a href="customskin.md">Customizing The Appearance of Web Pages &mdash; Theming:</a></li>
58 <li><a href="custom_ticket.wiki">Customizing The Ticket System</a></li>
59 <li><a href="tech_overview.wiki">Databases Used By Fossil &mdash; SQLite</a></li>
60 <li><a href="antibot.wiki">Defense against Spiders and Bots</a></li>
61 <li><a href="shunning.wiki">Deleting Content From Fossil &mdash; Shunning:</a></li>
62 <li><a href="private.wiki">Deleting Private Branches &mdash; Creating, Syncing, and</a></li>
@@ -110,10 +112,11 @@
112 <li><a href="inout.wiki">Import And Export To And From Git</a></li>
113 <li><a href="build.wiki">Installing Fossil &mdash; Compiling and</a></li>
114 <li><a href="fossil-from-msvc.wiki">Integrating Fossil in the Microsoft Express 2010 IDE</a></li>
115 <li><a href="selfcheck.wiki">Integrity Self Checks &mdash; Fossil Repository</a></li>
116 <li><a href="webui.wiki">Interface &mdash; The Fossil Web</a></li>
117 <li><a href="th1.md">Language &mdash; The TH1 Scripting</a></li>
118 <li><a href="copyright-release.html">License Agreement &mdash; Contributor</a></li>
119 <li><a href="password.wiki">Management And Authentication &mdash; Password</a></li>
120 <li><a href="branching.wiki">Merging, and Tagging &mdash; Branching, Forking,</a></li>
121 <li><a href="fossil-from-msvc.wiki">Microsoft Express 2010 IDE &mdash; Integrating Fossil in the</a></li>
122 <li><a href="fiveminutes.wiki">Minutes as a Single User &mdash; Update and Running in 5</a></li>
@@ -122,10 +125,11 @@
125 <li><a href="newrepo.wiki">New Fossil Repository &mdash; How To Create A</a></li>
126 <li><a href="foss-cklist.wiki">Open-Source Projects &mdash; Checklist For Successful</a></li>
127 <li><a href="pop.wiki">Operations &mdash; Principles Of</a></li>
128 <li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil &mdash; A Technical</a></li>
129 <li><a href="index.wiki">Page &mdash; Home</a></li>
130 <li><a href="customskin.md">Pages &mdash; Theming: Customizing The Appearance of Web</a></li>
131 <li><a href="password.wiki">Password Management And Authentication</a></li>
132 <li><a href="quotes.wiki">People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What</a></li>
133 <li><a href="stats.wiki">Performance Statistics</a></li>
134 <li><a href="../test/release-checklist.wiki">Pre-Release Testing Checklist</a></li>
135 <li><a href="pop.wiki">Principles Of Operations</a></li>
@@ -143,10 +147,11 @@
147 <li><a href="newrepo.wiki">Repository &mdash; How To Create A New Fossil</a></li>
148 <li><a href="selfcheck.wiki">Repository Integrity Self Checks &mdash; Fossil</a></li>
149 <li><a href="reviews.wiki">Reviews</a></li>
150 <li><a href="fiveminutes.wiki">Running in 5 Minutes as a Single User &mdash; Update and</a></li>
151 <li><a href="quotes.wiki">Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What People Are</a></li>
152 <li><a href="th1.md">Scripting Language &mdash; The TH1</a></li>
153 <li><a href="selfcheck.wiki">Self Checks &mdash; Fossil Repository Integrity</a></li>
154 <li><a href="selfhost.wiki">Self Hosting Repositories &mdash; Fossil</a></li>
155 <li><a href="server.wiki">Server &mdash; How To Configure A Fossil</a></li>
156 <li><a href="settings.wiki">Settings &mdash; Fossil</a></li>
157 <li><a href="shunning.wiki">Shunning: Deleting Content From Fossil</a></li>
@@ -164,14 +169,17 @@
169 <li><a href="custom_ticket.wiki">System &mdash; Customizing The Ticket</a></li>
170 <li><a href="tickets.wiki">System &mdash; The Fossil Ticket</a></li>
171 <li><a href="branching.wiki">Tagging &mdash; Branching, Forking, Merging, and</a></li>
172 <li><a href="tech_overview.wiki">Technical Overview Of The Design And Implementation Of Fossil &mdash; A</a></li>
173 <li><a href="../test/release-checklist.wiki">Testing Checklist &mdash; Pre-Release</a></li>
174 <li><a href="th1.md">TH1 Scripting Language &mdash; The</a></li>
175 <li><a href="makefile.wiki">The Fossil Build Process</a></li>
176 <li><a href="sync.wiki">The Fossil Sync Protocol</a></li>
177 <li><a href="tickets.wiki">The Fossil Ticket System</a></li>
178 <li><a href="webui.wiki">The Fossil Web Interface</a></li>
179 <li><a href="th1.md">The TH1 Scripting Language</a></li>
180 <li><a href="customskin.md">Theming: Customizing The Appearance of Web Pages</a></li>
181 <li><a href="theory1.wiki">Thoughts On The Design Of The Fossil DVCS</a></li>
182 <li><a href="custom_ticket.wiki">Ticket System &mdash; Customizing The</a></li>
183 <li><a href="tickets.wiki">Ticket System &mdash; The Fossil</a></li>
184 <li><a href="hints.wiki">Tips And Usage Hints &mdash; Fossil</a></li>
185 <li><a href="bugtheory.wiki">Tracking In Fossil &mdash; Bug</a></li>
@@ -180,9 +188,10 @@
188 <li><a href="fiveminutes.wiki">User &mdash; Update and Running in 5 Minutes as a Single</a></li>
189 <li><a href="ssl.wiki">Using SSL with Fossil</a></li>
190 <li><a href="checkin_names.wiki">Version Names &mdash; Checkin And</a></li>
191 <li><a href="fossil-v-git.wiki">Versus Git &mdash; Fossil</a></li>
192 <li><a href="webui.wiki">Web Interface &mdash; The Fossil</a></li>
193 <li><a href="customskin.md">Web Pages &mdash; Theming: Customizing The Appearance of</a></li>
194 <li><a href="quotes.wiki">What People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes:</a></li>
195 <li><a href="wikitheory.wiki">Wiki In Fossil</a></li>
196 <li><a href="ssl.wiki">with Fossil &mdash; Using SSL</a></li>
197 </ul></div>
198
+9 -2
--- www/quotes.wiki
+++ www/quotes.wiki
@@ -71,16 +71,23 @@
7171
<blockquote>
7272
<i>Stephen Beal on the [http://www.mail-archive.com/[email protected]/msg17181.html|Fossil mailing list]
7373
2014-09-01.</i>
7474
</blockquote>
7575
76
+<li>If programmers _really_ wanted to help scientists, they'd build a version control
77
+system that was more usable than Git.
78
+
79
+<blockquote>
80
+<i>Tweet by Greg Wilson @gvwilson on 2015-02-22 17:47</i>
81
+</blockquote>
82
+
7683
</ol>
7784
7885
<h2>On The Usability Of Fossil:</h2>
7986
8087
<ol>
81
-<li value=9>
88
+<li value=10>
8289
Fossil mesmerizes me with simplicity especially after I struggled to
8390
get a bug-tracking system to work with mercurial.
8491
8592
<blockquote>
8693
<i>rawjeev at [http://stackoverflow.com/questions/156322/what-do-people-think-of-the-fossil-dvcs]</i>
@@ -108,11 +115,11 @@
108115
109116
110117
<h2>On Git Versus Fossil</h2>
111118
112119
<ol>
113
-<li value=12>
120
+<li value=13>
114121
Just want to say thanks for fossil making my life easier....
115122
Also <nowiki>[for]</nowiki> not having a misanthropic command line interface.
116123
117124
<blockquote>
118125
<i>Joshua Paine at [http://www.mail-archive.com/[email protected]/msg02736.html]</i>
119126
--- www/quotes.wiki
+++ www/quotes.wiki
@@ -71,16 +71,23 @@
71 <blockquote>
72 <i>Stephen Beal on the [http://www.mail-archive.com/[email protected]/msg17181.html|Fossil mailing list]
73 2014-09-01.</i>
74 </blockquote>
75
 
 
 
 
 
 
 
76 </ol>
77
78 <h2>On The Usability Of Fossil:</h2>
79
80 <ol>
81 <li value=9>
82 Fossil mesmerizes me with simplicity especially after I struggled to
83 get a bug-tracking system to work with mercurial.
84
85 <blockquote>
86 <i>rawjeev at [http://stackoverflow.com/questions/156322/what-do-people-think-of-the-fossil-dvcs]</i>
@@ -108,11 +115,11 @@
108
109
110 <h2>On Git Versus Fossil</h2>
111
112 <ol>
113 <li value=12>
114 Just want to say thanks for fossil making my life easier....
115 Also <nowiki>[for]</nowiki> not having a misanthropic command line interface.
116
117 <blockquote>
118 <i>Joshua Paine at [http://www.mail-archive.com/[email protected]/msg02736.html]</i>
119
--- www/quotes.wiki
+++ www/quotes.wiki
@@ -71,16 +71,23 @@
71 <blockquote>
72 <i>Stephen Beal on the [http://www.mail-archive.com/[email protected]/msg17181.html|Fossil mailing list]
73 2014-09-01.</i>
74 </blockquote>
75
76 <li>If programmers _really_ wanted to help scientists, they'd build a version control
77 system that was more usable than Git.
78
79 <blockquote>
80 <i>Tweet by Greg Wilson @gvwilson on 2015-02-22 17:47</i>
81 </blockquote>
82
83 </ol>
84
85 <h2>On The Usability Of Fossil:</h2>
86
87 <ol>
88 <li value=10>
89 Fossil mesmerizes me with simplicity especially after I struggled to
90 get a bug-tracking system to work with mercurial.
91
92 <blockquote>
93 <i>rawjeev at [http://stackoverflow.com/questions/156322/what-do-people-think-of-the-fossil-dvcs]</i>
@@ -108,11 +115,11 @@
115
116
117 <h2>On Git Versus Fossil</h2>
118
119 <ol>
120 <li value=13>
121 Just want to say thanks for fossil making my life easier....
122 Also <nowiki>[for]</nowiki> not having a misanthropic command line interface.
123
124 <blockquote>
125 <i>Joshua Paine at [http://www.mail-archive.com/[email protected]/msg02736.html]</i>
126
--- www/selfcheck.wiki
+++ www/selfcheck.wiki
@@ -44,11 +44,11 @@
4444
new delta-encoding mechanism designed expressly for fossil. We want
4545
to make sure that bugs in these encoding mechanisms do not lead to
4646
loss of data.
4747
4848
To increase our confidence that everything in the repository is
49
-recoverable, fossil makes sure it can extract an exact replicate
49
+recoverable, fossil makes sure it can extract an exact replica
5050
of every content file that it changes just prior to transaction
5151
commit. So during the course of check-in (or other repository
5252
operation) many different files
5353
in the repository might be modified. Some files are simply
5454
compressed. Other files are delta encoded and then compressed.
5555
5656
ADDED www/th1.md
5757
ADDED www/webpage-ex.md
--- www/selfcheck.wiki
+++ www/selfcheck.wiki
@@ -44,11 +44,11 @@
44 new delta-encoding mechanism designed expressly for fossil. We want
45 to make sure that bugs in these encoding mechanisms do not lead to
46 loss of data.
47
48 To increase our confidence that everything in the repository is
49 recoverable, fossil makes sure it can extract an exact replicate
50 of every content file that it changes just prior to transaction
51 commit. So during the course of check-in (or other repository
52 operation) many different files
53 in the repository might be modified. Some files are simply
54 compressed. Other files are delta encoded and then compressed.
55
56 DDED www/th1.md
57 DDED www/webpage-ex.md
--- www/selfcheck.wiki
+++ www/selfcheck.wiki
@@ -44,11 +44,11 @@
44 new delta-encoding mechanism designed expressly for fossil. We want
45 to make sure that bugs in these encoding mechanisms do not lead to
46 loss of data.
47
48 To increase our confidence that everything in the repository is
49 recoverable, fossil makes sure it can extract an exact replica
50 of every content file that it changes just prior to transaction
51 commit. So during the course of check-in (or other repository
52 operation) many different files
53 in the repository might be modified. Some files are simply
54 compressed. Other files are delta encoded and then compressed.
55
56 DDED www/th1.md
57 DDED www/webpage-ex.md
+2
--- a/www/th1.md
+++ b/www/th1.md
@@ -0,0 +1,2 @@
1
+ sCL CLCLCLCLCL. Refer to the
2
+TCL ttpiz_main.c or thsource fileeach each command does.
--- a/www/th1.md
+++ b/www/th1.md
@@ -0,0 +1,2 @@
 
 
--- a/www/th1.md
+++ b/www/th1.md
@@ -0,0 +1,2 @@
1 sCL CLCLCLCLCL. Refer to the
2 TCL ttpiz_main.c or thsource fileeach each command does.
--- a/www/webpage-ex.md
+++ b/www/webpage-ex.md
@@ -0,0 +1,60 @@
1
+Web-Page Examples
2
+============
3
+
4
+Here are just a fewThis is not an exhaustive list.
5
+Exp t<style>
6
+.exbtn {
7
+ border: 1px solid #000;
8
+ margin: 1ex;
9
+ border-radius: 1ex;
10
+ padding: 0 1ex;
11
+ background-color: #eee;
12
+}
13
+</style>
14
+
15
+ * <a tar=25&y=ci&a=1970-01-01'>(Example)</a> &../../..
16
+ Firsy=ci&n=100'>Example</a>ss='exbtn'
17
+ href='$ROOT/tim to see many
18
+other exampl../../..mple</a>>src/file.c</b> source file.
19
+
20
+ * <a target='_blank' class='exbtn'
21
+=200&uf=0c3c2d086a'>(Example)</a> &rarr;
22
+ All check-ins using../../..rticExample</a>merge with that bran source file.
23
+
24
+ * <a target='_blank' class='exbtn'
25
+ href='$ROOT/timeline?n href='$ROOT/timelch.
26
+
27
+ * <a targ../../..-ins betwee/a>roject.)
28
+
29
+ * <a Web-Page Examples
30
+===============
31
+
32
+Here are just a few examples of the many web pages supported
33
+by Fossil. ../../..-ins betwee/a>roject.)
34
+
35
+ * <a target='_blank' class='exbtn'
36
+ hre
37
+
38
+ * <a Web-Page Examples
39
+===============
40
+
41
+Here are just a few examples of the many webrmple)</a> &rarr;
42
+ S ../../..t branch.
43
+
44
+ * <a target='_blank' class='exbtn'
45
+ href='$ROOT/timeline?n=200&tget='_blank' ll check-ins of the "svn-import" branch only.
46
+
47
+ * <aExample</../../..===============
48
+
49
+Here are just a few examples of the many web pages supported
50
+by Fossil. Follow hyperlinks on the examples below t<style>
51
+.exbtn {
52
+ border: 1px solid #000;
53
+ margin: 1ex;
54
+ bordeWeb-Pagen the most direct path from
55
+ versionExample</a>merge with that branclank' class='exbtn'
56
+ href='$ROOT/timeline?namechng'>(Example)</a> &rarr;
57
+ Show check-ins that contain file name changes
58
+
59
+ * <a Example</a>timeline?u=drh&c=2014-01-08&y=ci'>(Example)</a> &rarr;
60
+ S
--- a/www/webpage-ex.md
+++ b/www/webpage-ex.md
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/www/webpage-ex.md
+++ b/www/webpage-ex.md
@@ -0,0 +1,60 @@
1 Web-Page Examples
2 ============
3
4 Here are just a fewThis is not an exhaustive list.
5 Exp t<style>
6 .exbtn {
7 border: 1px solid #000;
8 margin: 1ex;
9 border-radius: 1ex;
10 padding: 0 1ex;
11 background-color: #eee;
12 }
13 </style>
14
15 * <a tar=25&y=ci&a=1970-01-01'>(Example)</a> &../../..
16 Firsy=ci&n=100'>Example</a>ss='exbtn'
17 href='$ROOT/tim to see many
18 other exampl../../..mple</a>>src/file.c</b> source file.
19
20 * <a target='_blank' class='exbtn'
21 =200&uf=0c3c2d086a'>(Example)</a> &rarr;
22 All check-ins using../../..rticExample</a>merge with that bran source file.
23
24 * <a target='_blank' class='exbtn'
25 href='$ROOT/timeline?n href='$ROOT/timelch.
26
27 * <a targ../../..-ins betwee/a>roject.)
28
29 * <a Web-Page Examples
30 ===============
31
32 Here are just a few examples of the many web pages supported
33 by Fossil. ../../..-ins betwee/a>roject.)
34
35 * <a target='_blank' class='exbtn'
36 hre
37
38 * <a Web-Page Examples
39 ===============
40
41 Here are just a few examples of the many webrmple)</a> &rarr;
42 S ../../..t branch.
43
44 * <a target='_blank' class='exbtn'
45 href='$ROOT/timeline?n=200&tget='_blank' ll check-ins of the "svn-import" branch only.
46
47 * <aExample</../../..===============
48
49 Here are just a few examples of the many web pages supported
50 by Fossil. Follow hyperlinks on the examples below t<style>
51 .exbtn {
52 border: 1px solid #000;
53 margin: 1ex;
54 bordeWeb-Pagen the most direct path from
55 versionExample</a>merge with that branclank' class='exbtn'
56 href='$ROOT/timeline?namechng'>(Example)</a> &rarr;
57 Show check-ins that contain file name changes
58
59 * <a Example</a>timeline?u=drh&c=2014-01-08&y=ci'>(Example)</a> &rarr;
60 S
+2 -2
--- www/webui.wiki
+++ www/webui.wiki
@@ -8,19 +8,19 @@
88
* [./wikitheory.wiki | Wiki]
99
* [./embeddeddoc.wiki | On-line documentation]
1010
* Status information
1111
* Timelines
1212
* Graphs of revision and branching history
13
- * [./event.wiki | Blogs, News, and Announcements]
13
+ * [./event.wiki | Technical notes]
1414
* File and version lists and differences
1515
* Download historical versions as ZIP archives
1616
* Historical change data
1717
* Add and remove tags on checkins
1818
* Move checkins between branches
1919
* Revise checkin comments
2020
* Manage user credentials and access permissions
21
- * And so forth...
21
+ * And so forth... (some [./webpage-ex.md|examples])
2222
2323
You get all of this, and more, for free when you use Fossil.
2424
There are no extra programs to install or setup.
2525
Everything you need is already pre-configured and built into the
2626
self-contained, stand-alone Fossil executable.
2727
--- www/webui.wiki
+++ www/webui.wiki
@@ -8,19 +8,19 @@
8 * [./wikitheory.wiki | Wiki]
9 * [./embeddeddoc.wiki | On-line documentation]
10 * Status information
11 * Timelines
12 * Graphs of revision and branching history
13 * [./event.wiki | Blogs, News, and Announcements]
14 * File and version lists and differences
15 * Download historical versions as ZIP archives
16 * Historical change data
17 * Add and remove tags on checkins
18 * Move checkins between branches
19 * Revise checkin comments
20 * Manage user credentials and access permissions
21 * And so forth...
22
23 You get all of this, and more, for free when you use Fossil.
24 There are no extra programs to install or setup.
25 Everything you need is already pre-configured and built into the
26 self-contained, stand-alone Fossil executable.
27
--- www/webui.wiki
+++ www/webui.wiki
@@ -8,19 +8,19 @@
8 * [./wikitheory.wiki | Wiki]
9 * [./embeddeddoc.wiki | On-line documentation]
10 * Status information
11 * Timelines
12 * Graphs of revision and branching history
13 * [./event.wiki | Technical notes]
14 * File and version lists and differences
15 * Download historical versions as ZIP archives
16 * Historical change data
17 * Add and remove tags on checkins
18 * Move checkins between branches
19 * Revise checkin comments
20 * Manage user credentials and access permissions
21 * And so forth... (some [./webpage-ex.md|examples])
22
23 You get all of this, and more, for free when you use Fossil.
24 There are no extra programs to install or setup.
25 Everything you need is already pre-configured and built into the
26 self-contained, stand-alone Fossil executable.
27

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button