Fossil SCM
merge trunk
Commit
c3bcab0f0505eb9a96a59dbd3994b93e998f5463
Parent
ca336d2a9b6e99c…
36 files changed
+17
+17
-1
+6
-4
+1
-1
+1
+14
-1
+4
-1
+86
-30
+3
-2
+1
+5
-2
+23
-3
-1
+1
-1
+2
+6
-5
+3
+1
-1
+1
-1
+1
+2
+1
+1
-1
+25
-64
+5
+56
-11
+1
+51
-75
+11
+23
-24
+2
+9
+1
-1
+2
+60
+2
-2
~
fossil.1
~
skins/README.md
~
skins/etienne1/css.txt
~
src/blob.c
~
src/cgi.c
~
src/event.c
~
src/info.c
~
src/main.c
~
src/main.mk
~
src/makemake.tcl
~
src/markdown_html.c
~
src/skins.c
~
src/style.c
~
src/timeline.c
~
src/wiki.c
~
src/wikiformat.c
~
src/winhttp.c
~
win/Makefile.PellesCGMake
~
win/Makefile.dmc
~
win/Makefile.mingw
~
win/Makefile.mingw.mistachkin
~
win/Makefile.msc
~
www/branching.wiki
~
www/concepts.wiki
~
www/customskin.md
~
www/fossil-v-git.wiki
~
www/hacker-howto.wiki
~
www/index.wiki
~
www/inout.wiki
~
www/mkdownload.tcl
~
www/mkindex.tcl
~
www/permutedindex.html
~
www/selfcheck.wiki
~
www/th1.md
~
www/webpage-ex.md
~
www/webui.wiki
M
fossil.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 |
| --- 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 @@ | ||
| 1 | 1 | Built-in Skins |
| 2 | 2 | ============== |
| 3 | 3 | |
| 4 | 4 | Each subdirectory under this folder describes a built-in "skin". |
| 5 | 5 | 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. | |
| 7 | 7 | |
| 8 | 8 | To improve an existing built-in skin, simply edit the appropriate |
| 9 | 9 | files and recompile. |
| 10 | 10 | |
| 11 | 11 | To add a new skin: |
| @@ -23,5 +23,21 @@ | ||
| 23 | 23 | |
| 24 | 24 | 4. Edit the BuiltinSkin[] array near the top of the src/skins.c source |
| 25 | 25 | file so that it describes and references the "newskin" skin. |
| 26 | 26 | |
| 27 | 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. | |
| 28 | 44 |
| --- 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 |
+6
-4
| --- skins/etienne1/css.txt | ||
| +++ skins/etienne1/css.txt | ||
| @@ -1,8 +1,9 @@ | ||
| 1 | 1 | body { |
| 2 | 2 | margin: 0 auto; |
| 3 | - width: 960px; | |
| 3 | + min-width: 800px; | |
| 4 | + padding: 0px 20px; | |
| 4 | 5 | font-family: sans-serif; |
| 5 | 6 | font-size:14pt; |
| 6 | 7 | } |
| 7 | 8 | |
| 8 | 9 | a { |
| @@ -163,18 +164,19 @@ | ||
| 163 | 164 | .report thead+tbody tr:hover { |
| 164 | 165 | background-color: #f5f9fc !important; |
| 165 | 166 | } |
| 166 | 167 | |
| 167 | 168 | td.tktDspLabel { |
| 168 | - max-width: 70px; | |
| 169 | + width: 70px; | |
| 169 | 170 | text-align: right; |
| 171 | + overflow: hidden; | |
| 170 | 172 | } |
| 171 | 173 | td.tktDspValue { |
| 172 | - max-width: 800px; | |
| 173 | 174 | text-align: left; |
| 174 | 175 | vertical-align: top; |
| 175 | - background-color: #f5f9fc; | |
| 176 | + background-color: #f8f8f8; | |
| 177 | + border: 1px solid #ccc; | |
| 176 | 178 | } |
| 177 | 179 | td.tktDspValue pre { |
| 178 | 180 | white-space: pre-wrap; |
| 179 | 181 | } |
| 180 | 182 | |
| 181 | 183 |
| --- skins/etienne1/css.txt | |
| +++ skins/etienne1/css.txt | |
| @@ -1,8 +1,9 @@ | |
| 1 | body { |
| 2 | margin: 0 auto; |
| 3 | width: 960px; |
| 4 | font-family: sans-serif; |
| 5 | font-size:14pt; |
| 6 | } |
| 7 | |
| 8 | a { |
| @@ -163,18 +164,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,8 +1,9 @@ | |
| 1 | body { |
| 2 | margin: 0 auto; |
| 3 | min-width: 800px; |
| 4 | padding: 0px 20px; |
| 5 | font-family: sans-serif; |
| 6 | font-size:14pt; |
| 7 | } |
| 8 | |
| 9 | a { |
| @@ -163,18 +164,19 @@ | |
| 164 | .report thead+tbody tr:hover { |
| 165 | background-color: #f5f9fc !important; |
| 166 | } |
| 167 | |
| 168 | td.tktDspLabel { |
| 169 | width: 70px; |
| 170 | text-align: right; |
| 171 | overflow: hidden; |
| 172 | } |
| 173 | td.tktDspValue { |
| 174 | text-align: left; |
| 175 | vertical-align: top; |
| 176 | background-color: #f8f8f8; |
| 177 | border: 1px solid #ccc; |
| 178 | } |
| 179 | td.tktDspValue pre { |
| 180 | white-space: pre-wrap; |
| 181 | } |
| 182 | |
| 183 |
+1
-1
| --- src/blob.c | ||
| +++ src/blob.c | ||
| @@ -753,11 +753,11 @@ | ||
| 753 | 753 | ** Initialize a blob to be the content of a file. If the filename |
| 754 | 754 | ** is blank or "-" then read from standard input. |
| 755 | 755 | ** |
| 756 | 756 | ** Any prior content of the blob is discarded, not freed. |
| 757 | 757 | ** |
| 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. | |
| 759 | 759 | ** it exit()s and does not return). |
| 760 | 760 | */ |
| 761 | 761 | int blob_read_from_file(Blob *pBlob, const char *zFilename){ |
| 762 | 762 | int size, got; |
| 763 | 763 | FILE *in; |
| 764 | 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() 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 |
+1
| --- src/cgi.c | ||
| +++ src/cgi.c | ||
| @@ -1680,10 +1680,11 @@ | ||
| 1680 | 1680 | */ |
| 1681 | 1681 | #define HTTP_SERVER_LOCALHOST 0x0001 /* Bind to 127.0.0.1 only */ |
| 1682 | 1682 | #define HTTP_SERVER_SCGI 0x0002 /* SCGI instead of HTTP */ |
| 1683 | 1683 | #define HTTP_SERVER_HAD_REPOSITORY 0x0004 /* Was the repository open? */ |
| 1684 | 1684 | #define HTTP_SERVER_HAD_CHECKOUT 0x0008 /* Was a checkout open? */ |
| 1685 | +#define HTTP_SERVER_REPOLIST 0x0010 /* Allow repo listing */ | |
| 1685 | 1686 | |
| 1686 | 1687 | #endif /* INTERFACE */ |
| 1687 | 1688 | |
| 1688 | 1689 | /* |
| 1689 | 1690 | ** Maximum number of child processes that we can have running |
| 1690 | 1691 |
| --- src/cgi.c | |
| +++ src/cgi.c | |
| @@ -1680,10 +1680,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 | |
| @@ -1680,10 +1680,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 | #define HTTP_SERVER_REPOLIST 0x0010 /* Allow repo listing */ |
| 1686 | |
| 1687 | #endif /* INTERFACE */ |
| 1688 | |
| 1689 | /* |
| 1690 | ** Maximum number of child processes that we can have running |
| 1691 |
+14
-1
| --- src/event.c | ||
| +++ src/event.c | ||
| @@ -267,10 +267,16 @@ | ||
| 267 | 267 | rid = db_int(0, |
| 268 | 268 | "SELECT rid FROM tagxref" |
| 269 | 269 | " WHERE tagid=(SELECT tagid FROM tag WHERE tagname GLOB '%q*')" |
| 270 | 270 | " ORDER BY mtime DESC", zTag |
| 271 | 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 | + } | |
| 272 | 278 | free(zTag); |
| 273 | 279 | |
| 274 | 280 | /* Need both check-in and wiki-write or wiki-create privileges in order |
| 275 | 281 | ** to edit/create an event. |
| 276 | 282 | */ |
| @@ -393,11 +399,18 @@ | ||
| 393 | 399 | md5sum_blob(&event, &cksum); |
| 394 | 400 | blob_appendf(&event, "Z %b\n", &cksum); |
| 395 | 401 | blob_reset(&cksum); |
| 396 | 402 | nrid = content_put(&event); |
| 397 | 403 | 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 | + } | |
| 399 | 412 | assert( blob_is_reset(&event) ); |
| 400 | 413 | content_deltify(rid, nrid, 0); |
| 401 | 414 | db_end_transaction(0); |
| 402 | 415 | cgi_redirectf("technote?name=%T", zId); |
| 403 | 416 | } |
| 404 | 417 |
| --- 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 @@ | ||
| 827 | 827 | @ <tr><th>Page Name:</th><td>%h(pWiki->zWikiTitle)</td></tr> |
| 828 | 828 | @ <tr><th>Date:</th><td> |
| 829 | 829 | hyperlink_to_date(zDate, "</td></tr>"); |
| 830 | 830 | @ <tr><th>Original User:</th><td> |
| 831 | 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 | + } | |
| 832 | 835 | if( pWiki->nParent>0 ){ |
| 833 | 836 | int i; |
| 834 | 837 | @ <tr><th>Parent%s(pWiki->nParent==1?"":"s"):</th><td> |
| 835 | 838 | for(i=0; i<pWiki->nParent; i++){ |
| 836 | 839 | char *zParent = pWiki->azParent[i]; |
| @@ -854,11 +857,11 @@ | ||
| 854 | 857 | } |
| 855 | 858 | |
| 856 | 859 | |
| 857 | 860 | @ <div class="section">Content</div> |
| 858 | 861 | blob_init(&wiki, pWiki->zWiki, -1); |
| 859 | - wiki_convert(&wiki, 0, 0); | |
| 862 | + wiki_render_by_mimetype(&wiki, pWiki->zMimetype); | |
| 860 | 863 | blob_reset(&wiki); |
| 861 | 864 | manifest_destroy(pWiki); |
| 862 | 865 | style_footer(); |
| 863 | 866 | } |
| 864 | 867 | |
| 865 | 868 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -827,10 +827,13 @@ | |
| 827 | @ <tr><th>Page 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 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 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 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 @@ | ||
| 1408 | 1408 | } |
| 1409 | 1409 | } |
| 1410 | 1410 | #endif |
| 1411 | 1411 | return zRepo; |
| 1412 | 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 | +} | |
| 1413 | 1451 | |
| 1414 | 1452 | /* |
| 1415 | 1453 | ** Preconditions: |
| 1416 | 1454 | ** |
| 1417 | 1455 | ** * Environment variables are set up according to the CGI standard. |
| @@ -1431,11 +1469,15 @@ | ||
| 1431 | 1469 | ** $prefix can be determined from its suffix, then the file $prefix is |
| 1432 | 1470 | ** returned as static text. |
| 1433 | 1471 | ** |
| 1434 | 1472 | ** If no suitable webpage is found, try to redirect to zNotFound. |
| 1435 | 1473 | */ |
| 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 | +){ | |
| 1437 | 1479 | const char *zPathInfo; |
| 1438 | 1480 | char *zPath = NULL; |
| 1439 | 1481 | int idx; |
| 1440 | 1482 | int i; |
| 1441 | 1483 | |
| @@ -1506,10 +1548,14 @@ | ||
| 1506 | 1548 | |
| 1507 | 1549 | if( szFile<1024 ){ |
| 1508 | 1550 | set_base_url(0); |
| 1509 | 1551 | if( zNotFound ){ |
| 1510 | 1552 | cgi_redirect(zNotFound); |
| 1553 | + }else if( strcmp(zPathInfo,"/")==0 | |
| 1554 | + && allowRepoList | |
| 1555 | + && repo_list_page() ){ | |
| 1556 | + /* Will return a list of repositories */ | |
| 1511 | 1557 | }else{ |
| 1512 | 1558 | #ifdef FOSSIL_ENABLE_JSON |
| 1513 | 1559 | if(g.json.isJsonMode){ |
| 1514 | 1560 | json_err(FSL_JSON_E_RESOURCE_NOT_FOUND,NULL,1); |
| 1515 | 1561 | return; |
| @@ -1805,10 +1851,11 @@ | ||
| 1805 | 1851 | const char *zFile; |
| 1806 | 1852 | const char *zNotFound = 0; |
| 1807 | 1853 | char **azRedirect = 0; /* List of repositories to redirect to */ |
| 1808 | 1854 | int nRedirect = 0; /* Number of entries in azRedirect */ |
| 1809 | 1855 | Glob *pFileGlob = 0; /* Pattern for files */ |
| 1856 | + int allowRepoList = 0; /* Allow lists of repository files */ | |
| 1810 | 1857 | Blob config, line, key, value, value2; |
| 1811 | 1858 | if( g.argc==3 && fossil_strcmp(g.argv[1],"cgi")==0 ){ |
| 1812 | 1859 | zFile = g.argv[2]; |
| 1813 | 1860 | }else{ |
| 1814 | 1861 | zFile = g.argv[1]; |
| @@ -1862,10 +1909,19 @@ | ||
| 1862 | 1909 | ** Grant "administrator" privileges to users connecting with HTTP |
| 1863 | 1910 | ** from IP address 127.0.0.1. Do not bother checking credentials. |
| 1864 | 1911 | */ |
| 1865 | 1912 | g.useLocalauth = 1; |
| 1866 | 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; | |
| 1867 | 1923 | } |
| 1868 | 1924 | if( blob_eq(&key, "redirect:") && blob_token(&line, &value) |
| 1869 | 1925 | && blob_token(&line, &value2) ){ |
| 1870 | 1926 | /* See the header comment on the redirect_web_page() function |
| 1871 | 1927 | ** above for details. */ |
| @@ -1952,11 +2008,11 @@ | ||
| 1952 | 2008 | } |
| 1953 | 2009 | cgi_init(); |
| 1954 | 2010 | if( nRedirect ){ |
| 1955 | 2011 | redirect_web_page(nRedirect, azRedirect); |
| 1956 | 2012 | }else{ |
| 1957 | - process_one_web_page(zNotFound, pFileGlob); | |
| 2013 | + process_one_web_page(zNotFound, pFileGlob, allowRepoList); | |
| 1958 | 2014 | } |
| 1959 | 2015 | } |
| 1960 | 2016 | |
| 1961 | 2017 | /* |
| 1962 | 2018 | ** If g.argv[arg] exists then it is either the name of a repository |
| @@ -1970,24 +2026,17 @@ | ||
| 1970 | 2026 | ** Open the repository to be served if it is known. If g.argv[arg] is |
| 1971 | 2027 | ** a directory full of repositories, then set g.zRepositoryName to |
| 1972 | 2028 | ** the name of that directory and the specific repository will be |
| 1973 | 2029 | ** opened later by process_one_web_page() based on the content of |
| 1974 | 2030 | ** the PATH_INFO variable. |
| 1975 | -** | |
| 1976 | -** If disallowDir is set, then the directory full of repositories method | |
| 1977 | -** is disallowed. | |
| 1978 | 2031 | */ |
| 1979 | -static void find_server_repository(int disallowDir, int arg){ | |
| 2032 | +static void find_server_repository(int arg){ | |
| 1980 | 2033 | if( g.argc<=arg ){ |
| 1981 | 2034 | db_must_be_within_tree(); |
| 1982 | 2035 | }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); | |
| 1989 | 2038 | }else{ |
| 1990 | 2039 | db_open_repository(g.argv[arg]); |
| 1991 | 2040 | } |
| 1992 | 2041 | } |
| 1993 | 2042 | |
| @@ -2028,18 +2077,19 @@ | ||
| 2028 | 2077 | ** If the --localauth option is given, then automatic login is performed |
| 2029 | 2078 | ** for requests coming from localhost, if the "localauth" setting is not |
| 2030 | 2079 | ** enabled. |
| 2031 | 2080 | ** |
| 2032 | 2081 | ** Options: |
| 2082 | +** --baseurl URL base URL (useful with reverse proxies) | |
| 2083 | +** --files GLOB comma-separate glob patterns for static file to serve | |
| 2033 | 2084 | ** --localauth enable automatic login for local connections |
| 2034 | 2085 | ** --host NAME specify hostname of the server |
| 2035 | 2086 | ** --https signal a request coming in via https |
| 2036 | 2087 | ** --nojail drop root privilege but do not enter the chroot jail |
| 2037 | 2088 | ** --nossl signal that no SSL connections are available |
| 2038 | 2089 | ** --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 | |
| 2041 | 2091 | ** --scgi Interpret input as SCGI rather than HTTP |
| 2042 | 2092 | ** --skin LABEL Use override skin LABEL |
| 2043 | 2093 | ** |
| 2044 | 2094 | ** See also: cgi, server, winsrv |
| 2045 | 2095 | */ |
| @@ -2049,10 +2099,11 @@ | ||
| 2049 | 2099 | const char *zHost; |
| 2050 | 2100 | const char *zAltBase; |
| 2051 | 2101 | const char *zFileGlob; |
| 2052 | 2102 | int useSCGI; |
| 2053 | 2103 | int noJail; |
| 2104 | + int allowRepoList; | |
| 2054 | 2105 | |
| 2055 | 2106 | /* The winhttp module passes the --files option as --files-urlenc with |
| 2056 | 2107 | ** the argument being URL encoded, to avoid wildcard expansion in the |
| 2057 | 2108 | ** shell. This option is for internal use and is undocumented. |
| 2058 | 2109 | */ |
| @@ -2065,10 +2116,11 @@ | ||
| 2065 | 2116 | zFileGlob = find_option("files",0,1); |
| 2066 | 2117 | } |
| 2067 | 2118 | skin_override(); |
| 2068 | 2119 | zNotFound = find_option("notfound", 0, 1); |
| 2069 | 2120 | noJail = find_option("nojail",0,0)!=0; |
| 2121 | + allowRepoList = find_option("repolist",0,0)!=0; | |
| 2070 | 2122 | g.useLocalauth = find_option("localauth", 0, 0)!=0; |
| 2071 | 2123 | g.sslNotAvailable = find_option("nossl", 0, 0)!=0; |
| 2072 | 2124 | useSCGI = find_option("scgi", 0, 0)!=0; |
| 2073 | 2125 | zAltBase = find_option("baseurl", 0, 1); |
| 2074 | 2126 | if( zAltBase ) set_base_url(zAltBase); |
| @@ -2089,15 +2141,15 @@ | ||
| 2089 | 2141 | g.fullHttpReply = 1; |
| 2090 | 2142 | if( g.argc>=5 ){ |
| 2091 | 2143 | g.httpIn = fossil_fopen(g.argv[2], "rb"); |
| 2092 | 2144 | g.httpOut = fossil_fopen(g.argv[3], "wb"); |
| 2093 | 2145 | zIpAddr = g.argv[4]; |
| 2094 | - find_server_repository(0, 5); | |
| 2146 | + find_server_repository(5); | |
| 2095 | 2147 | }else{ |
| 2096 | 2148 | g.httpIn = stdin; |
| 2097 | 2149 | g.httpOut = stdout; |
| 2098 | - find_server_repository(0, 2); | |
| 2150 | + find_server_repository(2); | |
| 2099 | 2151 | } |
| 2100 | 2152 | if( zIpAddr==0 ){ |
| 2101 | 2153 | zIpAddr = cgi_ssh_remote_addr(0); |
| 2102 | 2154 | if( zIpAddr && zIpAddr[0] ){ |
| 2103 | 2155 | g.fSshClient |= CGI_SSH_CLIENT; |
| @@ -2109,21 +2161,21 @@ | ||
| 2109 | 2161 | }else if( g.fSshClient & CGI_SSH_CLIENT ){ |
| 2110 | 2162 | ssh_request_loop(zIpAddr, glob_create(zFileGlob)); |
| 2111 | 2163 | }else{ |
| 2112 | 2164 | cgi_handle_http_request(zIpAddr); |
| 2113 | 2165 | } |
| 2114 | - process_one_web_page(zNotFound, glob_create(zFileGlob)); | |
| 2166 | + process_one_web_page(zNotFound, glob_create(zFileGlob), allowRepoList); | |
| 2115 | 2167 | } |
| 2116 | 2168 | |
| 2117 | 2169 | /* |
| 2118 | 2170 | ** Process all requests in a single SSH connection if possible. |
| 2119 | 2171 | */ |
| 2120 | 2172 | void ssh_request_loop(const char *zIpAddr, Glob *FileGlob){ |
| 2121 | 2173 | blob_zero(&g.cgiIn); |
| 2122 | 2174 | do{ |
| 2123 | 2175 | cgi_handle_ssh_http_request(zIpAddr); |
| 2124 | - process_one_web_page(0, FileGlob); | |
| 2176 | + process_one_web_page(0, FileGlob, 0); | |
| 2125 | 2177 | blob_reset(&g.cgiIn); |
| 2126 | 2178 | } while ( g.fSshClient & CGI_SSH_FOSSIL || |
| 2127 | 2179 | g.fSshClient & CGI_SSH_COMPAT ); |
| 2128 | 2180 | } |
| 2129 | 2181 | |
| @@ -2140,21 +2192,21 @@ | ||
| 2140 | 2192 | Th_InitTraceLog(); |
| 2141 | 2193 | login_set_capabilities("sx", 0); |
| 2142 | 2194 | g.useLocalauth = 1; |
| 2143 | 2195 | g.httpIn = stdin; |
| 2144 | 2196 | g.httpOut = stdout; |
| 2145 | - find_server_repository(0, 2); | |
| 2197 | + find_server_repository(2); | |
| 2146 | 2198 | g.cgiOutput = 1; |
| 2147 | 2199 | g.fullHttpReply = 1; |
| 2148 | 2200 | zIpAddr = cgi_ssh_remote_addr(0); |
| 2149 | 2201 | if( zIpAddr && zIpAddr[0] ){ |
| 2150 | 2202 | g.fSshClient |= CGI_SSH_CLIENT; |
| 2151 | 2203 | ssh_request_loop(zIpAddr, 0); |
| 2152 | 2204 | }else{ |
| 2153 | 2205 | cgi_set_parameter("REMOTE_ADDR", "127.0.0.1"); |
| 2154 | 2206 | cgi_handle_http_request(0); |
| 2155 | - process_one_web_page(0, 0); | |
| 2207 | + process_one_web_page(0, 0, 0); | |
| 2156 | 2208 | } |
| 2157 | 2209 | } |
| 2158 | 2210 | |
| 2159 | 2211 | #if !defined(_WIN32) |
| 2160 | 2212 | #if !defined(__DARWIN__) && !defined(__APPLE__) && !defined(__HAIKU__) |
| @@ -2211,16 +2263,15 @@ | ||
| 2211 | 2263 | ** "*.fossil*" will be served as static content. With the "ui" command, |
| 2212 | 2264 | ** the REPOSITORY can only be a directory if the --notfound option is |
| 2213 | 2265 | ** also present. |
| 2214 | 2266 | ** |
| 2215 | 2267 | ** 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. | |
| 2222 | 2273 | ** |
| 2223 | 2274 | ** Options: |
| 2224 | 2275 | ** --baseurl URL Use URL as the base (useful for reverse proxies) |
| 2225 | 2276 | ** --files GLOBLIST Comma-separated list of glob patterns for static files |
| 2226 | 2277 | ** --localauth enable automatic login for requests from localhost |
| @@ -2227,10 +2278,11 @@ | ||
| 2227 | 2278 | ** --localhost listen on 127.0.0.1 only (always true for "ui") |
| 2228 | 2279 | ** --nojail Drop root privileges but do not enter the chroot jail |
| 2229 | 2280 | ** --notfound URL Redirect |
| 2230 | 2281 | ** -P|--port TCPPORT listen to request on port TCPPORT |
| 2231 | 2282 | ** --th-trace trace TH1 execution (for debugging purposes) |
| 2283 | +** --repolist If REPOSITORY is dir, URL "/" lists repos. | |
| 2232 | 2284 | ** --scgi Accept SCGI rather than HTTP |
| 2233 | 2285 | ** --skin LABEL Use override skin LABEL |
| 2234 | 2286 | |
| 2235 | 2287 | ** |
| 2236 | 2288 | ** See also: cgi, http, winsrv |
| @@ -2244,10 +2296,11 @@ | ||
| 2244 | 2296 | const char *zNotFound; /* The --notfound option or NULL */ |
| 2245 | 2297 | int flags = 0; /* Server flags */ |
| 2246 | 2298 | #if !defined(_WIN32) |
| 2247 | 2299 | int noJail; /* Do not enter the chroot jail */ |
| 2248 | 2300 | #endif |
| 2301 | + int allowRepoList; /* List repositories on URL "/" */ | |
| 2249 | 2302 | const char *zAltBase; /* Argument to the --baseurl option */ |
| 2250 | 2303 | const char *zFileGlob; /* Static content must match this */ |
| 2251 | 2304 | char *zIpAddr = 0; /* Bind to this IP address */ |
| 2252 | 2305 | |
| 2253 | 2306 | #if defined(_WIN32) |
| @@ -2269,10 +2322,11 @@ | ||
| 2269 | 2322 | #endif |
| 2270 | 2323 | g.useLocalauth = find_option("localauth", 0, 0)!=0; |
| 2271 | 2324 | Th_InitTraceLog(); |
| 2272 | 2325 | zPort = find_option("port", "P", 1); |
| 2273 | 2326 | zNotFound = find_option("notfound", 0, 1); |
| 2327 | + allowRepoList = find_option("repolist",0,0)!=0; | |
| 2274 | 2328 | zAltBase = find_option("baseurl", 0, 1); |
| 2275 | 2329 | if( find_option("scgi", 0, 0)!=0 ) flags |= HTTP_SERVER_SCGI; |
| 2276 | 2330 | if( zAltBase ){ |
| 2277 | 2331 | set_base_url(zAltBase); |
| 2278 | 2332 | } |
| @@ -2284,14 +2338,15 @@ | ||
| 2284 | 2338 | verify_all_options(); |
| 2285 | 2339 | |
| 2286 | 2340 | if( g.argc!=2 && g.argc!=3 ) usage("?REPOSITORY?"); |
| 2287 | 2341 | isUiCmd = g.argv[1][0]=='u'; |
| 2288 | 2342 | if( isUiCmd ){ |
| 2289 | - flags |= HTTP_SERVER_LOCALHOST; | |
| 2343 | + flags |= HTTP_SERVER_LOCALHOST|HTTP_SERVER_REPOLIST; | |
| 2290 | 2344 | g.useLocalauth = 1; |
| 2345 | + allowRepoList = 1; | |
| 2291 | 2346 | } |
| 2292 | - find_server_repository(isUiCmd && zNotFound==0, 2); | |
| 2347 | + find_server_repository(2); | |
| 2293 | 2348 | if( zPort ){ |
| 2294 | 2349 | int i; |
| 2295 | 2350 | for(i=strlen(zPort)-1; i>=0 && zPort[i]!=':'; i--){} |
| 2296 | 2351 | if( i>0 ){ |
| 2297 | 2352 | zIpAddr = mprintf("%.*s", i, zPort); |
| @@ -2341,20 +2396,21 @@ | ||
| 2341 | 2396 | g.httpOut = stdout; |
| 2342 | 2397 | if( g.fHttpTrace || g.fSqlTrace ){ |
| 2343 | 2398 | fprintf(stderr, "====== SERVER pid %d =======\n", getpid()); |
| 2344 | 2399 | } |
| 2345 | 2400 | g.cgiOutput = 1; |
| 2346 | - find_server_repository(isUiCmd && zNotFound==0, 2); | |
| 2401 | + find_server_repository(2); | |
| 2347 | 2402 | g.zRepositoryName = enter_chroot_jail(g.zRepositoryName, noJail); |
| 2348 | 2403 | if( flags & HTTP_SERVER_SCGI ){ |
| 2349 | 2404 | cgi_handle_scgi_request(); |
| 2350 | 2405 | }else{ |
| 2351 | 2406 | cgi_handle_http_request(0); |
| 2352 | 2407 | } |
| 2353 | - process_one_web_page(zNotFound, glob_create(zFileGlob)); | |
| 2408 | + process_one_web_page(zNotFound, glob_create(zFileGlob), allowRepoList); | |
| 2354 | 2409 | #else |
| 2355 | 2410 | /* Win32 implementation */ |
| 2411 | + (void)allowRepoList; /* Suppress warning */ | |
| 2356 | 2412 | if( isUiCmd ){ |
| 2357 | 2413 | zBrowser = db_get("web-browser", "start"); |
| 2358 | 2414 | if( zIpAddr ){ |
| 2359 | 2415 | zBrowserCmd = mprintf("%s http://%s:%%d/ &", zBrowser, zIpAddr); |
| 2360 | 2416 | }else{ |
| 2361 | 2417 |
| --- 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 @@ | ||
| 450 | 450 | -DSQLITE_ENABLE_LOCKING_STYLE=0 \ |
| 451 | 451 | -DSQLITE_THREADSAFE=0 \ |
| 452 | 452 | -DSQLITE_DEFAULT_FILE_FORMAT=4 \ |
| 453 | 453 | -DSQLITE_OMIT_DEPRECATED \ |
| 454 | 454 | -DSQLITE_ENABLE_EXPLAIN_COMMENTS \ |
| 455 | - -DSQLITE_ENABLE_FTS4 | |
| 455 | + -DSQLITE_ENABLE_FTS4 \ | |
| 456 | + -DSQLITE_ENABLE_FTS3_PARENTHESIS | |
| 456 | 457 | |
| 457 | 458 | # Setup the options used to compile the included SQLite shell. |
| 458 | 459 | SHELL_OPTIONS = -Dmain=sqlite3_shell \ |
| 459 | 460 | -DSQLITE_OMIT_LOAD_EXTENSION=1 \ |
| 460 | 461 | -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \ |
| @@ -491,11 +492,11 @@ | ||
| 491 | 492 | $(OBJDIR)/cson_amalgamation.o |
| 492 | 493 | |
| 493 | 494 | |
| 494 | 495 | $(APPNAME): $(OBJDIR)/headers $(OBJDIR)/codecheck1 $(OBJ) $(EXTRAOBJ) |
| 495 | 496 | $(OBJDIR)/codecheck1 $(TRANS_SRC) |
| 496 | - $(TCC) $(CFLAGS) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) | |
| 497 | + $(TCC) -o $(APPNAME) $(OBJ) $(EXTRAOBJ) $(LIB) | |
| 497 | 498 | |
| 498 | 499 | # This rule prevents make from using its default rules to try build |
| 499 | 500 | # an executable named "manifest" out of the file named "manifest.c" |
| 500 | 501 | # |
| 501 | 502 | $(SRCDIR)/../manifest: |
| 502 | 503 |
| --- 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 |
+1
| --- src/makemake.tcl | ||
| +++ src/makemake.tcl | ||
| @@ -158,10 +158,11 @@ | ||
| 158 | 158 | -DSQLITE_THREADSAFE=0 |
| 159 | 159 | -DSQLITE_DEFAULT_FILE_FORMAT=4 |
| 160 | 160 | -DSQLITE_OMIT_DEPRECATED |
| 161 | 161 | -DSQLITE_ENABLE_EXPLAIN_COMMENTS |
| 162 | 162 | -DSQLITE_ENABLE_FTS4 |
| 163 | + -DSQLITE_ENABLE_FTS3_PARENTHESIS | |
| 163 | 164 | } |
| 164 | 165 | #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1 |
| 165 | 166 | #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4 |
| 166 | 167 | #lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI |
| 167 | 168 | #lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096 |
| 168 | 169 |
| --- 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 |
+5
-2
| --- src/markdown_html.c | ||
| +++ src/markdown_html.c | ||
| @@ -82,14 +82,18 @@ | ||
| 82 | 82 | } |
| 83 | 83 | } |
| 84 | 84 | |
| 85 | 85 | |
| 86 | 86 | /* HTML block tags */ |
| 87 | + | |
| 88 | +/* Size of the prolog: "<div class='markdown'>\n" */ | |
| 89 | +#define PROLOG_SIZE 23 | |
| 87 | 90 | |
| 88 | 91 | static void html_prolog(struct Blob *ob, void *opaque){ |
| 89 | 92 | INTER_BLOCK(ob); |
| 90 | 93 | BLOB_APPEND_LITTERAL(ob, "<div class=\"markdown\">\n"); |
| 94 | + assert( blob_size(ob)==PROLOG_SIZE ); | |
| 91 | 95 | } |
| 92 | 96 | |
| 93 | 97 | static void html_epilog(struct Blob *ob, void *opaque){ |
| 94 | 98 | INTER_BLOCK(ob); |
| 95 | 99 | BLOB_APPEND_LITTERAL(ob, "</div>\n"); |
| @@ -126,13 +130,12 @@ | ||
| 126 | 130 | void *opaque |
| 127 | 131 | ){ |
| 128 | 132 | struct Blob *title = opaque; |
| 129 | 133 | /* The first header at the beginning of a text is considered as |
| 130 | 134 | * 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 ){ | |
| 132 | 136 | BLOB_APPEND_BLOB(title, text); |
| 133 | - return; | |
| 134 | 137 | } |
| 135 | 138 | INTER_BLOCK(ob); |
| 136 | 139 | blob_appendf(ob, "<h%d>", level); |
| 137 | 140 | BLOB_APPEND_BLOB(ob, text); |
| 138 | 141 | blob_appendf(ob, "</h%d>", level); |
| 139 | 142 |
| --- 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 @@ | ||
| 60 | 60 | ** |
| 61 | 61 | ** The following static variable holds the name of the alternative skin, |
| 62 | 62 | ** or NULL if the skin should be as configured. |
| 63 | 63 | */ |
| 64 | 64 | static struct BuiltinSkin *pAltSkin = 0; |
| 65 | +static char *zAltSkinDir = 0; | |
| 65 | 66 | |
| 66 | 67 | /* |
| 67 | 68 | ** Invoke this routine to set the alternative skin. Return NULL if the |
| 68 | 69 | ** alternative was successfully installed. Return a string listing all |
| 69 | 70 | ** available skins if zName does not match an available skin. Memory |
| 70 | 71 | ** for the returned string comes from fossil_malloc() and should be freed |
| 71 | 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. | |
| 72 | 78 | */ |
| 73 | 79 | char *skin_use_alternative(const char *zName){ |
| 74 | 80 | int i; |
| 75 | - Blob err; | |
| 81 | + Blob err = BLOB_INITIALIZER; | |
| 82 | + if( strchr(zName, '/')!=0 ){ | |
| 83 | + zAltSkinDir = fossil_strdup(zName); | |
| 84 | + return 0; | |
| 85 | + } | |
| 76 | 86 | for(i=0; i<ArraySize(aBuiltinSkin); i++){ |
| 77 | 87 | if( fossil_strcmp(aBuiltinSkin[i].zLabel, zName)==0 ){ |
| 78 | 88 | pAltSkin = &aBuiltinSkin[i]; |
| 79 | 89 | return 0; |
| 80 | 90 | } |
| 81 | 91 | } |
| 82 | - blob_init(&err, aBuiltinSkin[0].zLabel, -1); | |
| 92 | + blob_appendf(&err, "available skins: %s", aBuiltinSkin[0].zLabel); | |
| 83 | 93 | for(i=1; i<ArraySize(aBuiltinSkin); i++){ |
| 84 | 94 | blob_append(&err, " ", 1); |
| 85 | 95 | blob_append(&err, aBuiltinSkin[i].zLabel, -1); |
| 86 | 96 | } |
| 87 | 97 | return blob_str(&err); |
| @@ -93,11 +103,11 @@ | ||
| 93 | 103 | */ |
| 94 | 104 | void skin_override(void){ |
| 95 | 105 | const char *zSkin = find_option("skin",0,1); |
| 96 | 106 | if( zSkin ){ |
| 97 | 107 | char *zErr = skin_use_alternative(zSkin); |
| 98 | - if( zErr ) fossil_fatal("available skins: %s", zErr); | |
| 108 | + if( zErr ) fossil_fatal("%s", zErr); | |
| 99 | 109 | } |
| 100 | 110 | } |
| 101 | 111 | |
| 102 | 112 | /* |
| 103 | 113 | ** The following routines return the various components of the skin |
| @@ -104,10 +114,20 @@ | ||
| 104 | 114 | ** that should be used for the current run. |
| 105 | 115 | */ |
| 106 | 116 | const char *skin_get(const char *zWhat){ |
| 107 | 117 | const char *zOut; |
| 108 | 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 | + } | |
| 109 | 129 | if( pAltSkin ){ |
| 110 | 130 | z = mprintf("skins/%s/%s.txt", pAltSkin->zLabel, zWhat); |
| 111 | 131 | zOut = builtin_text(z); |
| 112 | 132 | fossil_free(z); |
| 113 | 133 | }else{ |
| 114 | 134 |
| --- 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 |
-1
| --- src/style.c | ||
| +++ src/style.c | ||
| @@ -1264,11 +1264,10 @@ | ||
| 1264 | 1264 | @ padding-left: 1em; |
| 1265 | 1265 | @ padding-right: 1em; |
| 1266 | 1266 | }, |
| 1267 | 1267 | { ".fileage td:nth-child(3)", |
| 1268 | 1268 | "fileage third column (the check-in comment)", |
| 1269 | - @ word-break: break-all; | |
| 1270 | 1269 | @ word-wrap: break-word; |
| 1271 | 1270 | @ max-width: 50%; |
| 1272 | 1271 | }, |
| 1273 | 1272 | { ".brlist table", "The list of branches", |
| 1274 | 1273 | @ border-spacing: 0; |
| 1275 | 1274 |
| --- 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 |
+1
-1
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -1802,11 +1802,11 @@ | ||
| 1802 | 1802 | ** before |
| 1803 | 1803 | ** after |
| 1804 | 1804 | ** descendants | children |
| 1805 | 1805 | ** ancestors | parents |
| 1806 | 1806 | ** |
| 1807 | -** The BASELINE can be any unique prefix of 4 characters or more. | |
| 1807 | +** The CHECKIN can be any unique prefix of 4 characters or more. | |
| 1808 | 1808 | ** The DATETIME should be in the ISO8601 format. For |
| 1809 | 1809 | ** examples: "2007-08-18 07:21:21". You can also say "current" |
| 1810 | 1810 | ** for the current version or "now" for the current time. |
| 1811 | 1811 | ** |
| 1812 | 1812 | ** Options: |
| 1813 | 1813 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -1802,11 +1802,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: |
| 1813 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -1802,11 +1802,11 @@ | |
| 1802 | ** before |
| 1803 | ** after |
| 1804 | ** descendants | children |
| 1805 | ** ancestors | parents |
| 1806 | ** |
| 1807 | ** The CHECKIN 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: |
| 1813 |
+2
| --- src/wiki.c | ||
| +++ src/wiki.c | ||
| @@ -147,13 +147,15 @@ | ||
| 147 | 147 | wiki_convert(pWiki, 0, 0); |
| 148 | 148 | }else if( fossil_strcmp(zMimetype, "text/x-markdown")==0 ){ |
| 149 | 149 | Blob title = BLOB_INITIALIZER; |
| 150 | 150 | Blob tail = BLOB_INITIALIZER; |
| 151 | 151 | markdown_to_html(pWiki, &title, &tail); |
| 152 | +#if 0 | |
| 152 | 153 | if( blob_size(&title)>0 ){ |
| 153 | 154 | @ <h1>%s(blob_str(&title))</h1> |
| 154 | 155 | } |
| 156 | +#endif | |
| 155 | 157 | @ %s(blob_str(&tail)) |
| 156 | 158 | blob_reset(&title); |
| 157 | 159 | blob_reset(&tail); |
| 158 | 160 | }else{ |
| 159 | 161 | @ <pre> |
| 160 | 162 |
| --- 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 |
+6
-5
| --- src/wikiformat.c | ||
| +++ src/wikiformat.c | ||
| @@ -762,11 +762,11 @@ | ||
| 762 | 762 | ** Parse this element into the p structure. |
| 763 | 763 | ** |
| 764 | 764 | ** The content of z[] might be modified by converting characters |
| 765 | 765 | ** to lowercase and by inserting some "\000" characters. |
| 766 | 766 | */ |
| 767 | -static void parseMarkup(ParsedMarkup *p, char *z){ | |
| 767 | +static int parseMarkup(ParsedMarkup *p, char *z){ | |
| 768 | 768 | int i, j, c; |
| 769 | 769 | int iACode; |
| 770 | 770 | char *zValue; |
| 771 | 771 | int seen = 0; |
| 772 | 772 | char zTag[100]; |
| @@ -794,11 +794,11 @@ | ||
| 794 | 794 | p->aAttr[0].zValue = &z[i]; |
| 795 | 795 | while( fossil_isalnum(z[i]) ){ i++; } |
| 796 | 796 | p->aAttr[0].cTerm = c = z[i]; |
| 797 | 797 | z[i++] = 0; |
| 798 | 798 | p->nAttr = 1; |
| 799 | - if( c=='>' ) return; | |
| 799 | + if( c=='>' ) return 0; | |
| 800 | 800 | } |
| 801 | 801 | while( fossil_isspace(z[i]) ){ i++; } |
| 802 | 802 | while( c!='>' && p->nAttr<8 && fossil_isalpha(z[i]) ){ |
| 803 | 803 | int attrOk; /* True to preserve attribute. False to ignore it */ |
| 804 | 804 | j = 0; |
| @@ -841,10 +841,11 @@ | ||
| 841 | 841 | p->nAttr++; |
| 842 | 842 | } |
| 843 | 843 | while( fossil_isspace(z[i]) ){ i++; } |
| 844 | 844 | if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break; |
| 845 | 845 | } |
| 846 | + return seen; | |
| 846 | 847 | } |
| 847 | 848 | |
| 848 | 849 | /* |
| 849 | 850 | ** Render markup on the given blob. |
| 850 | 851 | */ |
| @@ -960,11 +961,11 @@ | ||
| 960 | 961 | static void popStack(Renderer *p){ |
| 961 | 962 | if( p->nStack ){ |
| 962 | 963 | int iCode; |
| 963 | 964 | p->nStack--; |
| 964 | 965 | 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 ){ | |
| 966 | 967 | blob_appendf(p->pOut, "</%s>", aMarkup[iCode].zName); |
| 967 | 968 | } |
| 968 | 969 | } |
| 969 | 970 | } |
| 970 | 971 | |
| @@ -1480,11 +1481,11 @@ | ||
| 1480 | 1481 | break; |
| 1481 | 1482 | } |
| 1482 | 1483 | case TOKEN_MARKUP: { |
| 1483 | 1484 | const char *zId; |
| 1484 | 1485 | int iDiv; |
| 1485 | - parseMarkup(&markup, z); | |
| 1486 | + int mAttr = parseMarkup(&markup, z); | |
| 1486 | 1487 | |
| 1487 | 1488 | /* Convert <title> to <h1 align='center'> */ |
| 1488 | 1489 | if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){ |
| 1489 | 1490 | markup.iCode = MARKUP_H1; |
| 1490 | 1491 | markup.nAttr = 1; |
| @@ -1567,11 +1568,11 @@ | ||
| 1567 | 1568 | popStackToTag(p, markup.iCode); |
| 1568 | 1569 | }else |
| 1569 | 1570 | |
| 1570 | 1571 | /* Push <div> markup onto the stack together with the id=ID attribute. |
| 1571 | 1572 | */ |
| 1572 | - if( markup.iCode==MARKUP_DIV ){ | |
| 1573 | + if( markup.iCode==MARKUP_DIV && (mAttr & ATTR_ID)!=0 ){ | |
| 1573 | 1574 | pushStackWithId(p, markup.iCode, markupId(&markup), |
| 1574 | 1575 | (p->state & ALLOW_WIKI)!=0); |
| 1575 | 1576 | }else |
| 1576 | 1577 | |
| 1577 | 1578 | /* Enter <verbatim> processing. With verbatim enabled, all other |
| 1578 | 1579 |
| --- 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 |
+3
| --- src/winhttp.c | ||
| +++ src/winhttp.c | ||
| @@ -260,10 +260,13 @@ | ||
| 260 | 260 | blob_appendf(&options, " --files-urlenc %T", zFileGlob); |
| 261 | 261 | } |
| 262 | 262 | if( g.useLocalauth ){ |
| 263 | 263 | blob_appendf(&options, " --localauth"); |
| 264 | 264 | } |
| 265 | + if( flags & HTTP_SERVER_REPOLIST ){ | |
| 266 | + blob_appendf(&options, " --repolist"); | |
| 267 | + } | |
| 265 | 268 | if( WSAStartup(MAKEWORD(1,1), &wd) ){ |
| 266 | 269 | fossil_fatal("unable to initialize winsock"); |
| 267 | 270 | } |
| 268 | 271 | while( iPort<=mxPort ){ |
| 269 | 272 | s = socket(AF_INET, SOCK_STREAM, 0); |
| 270 | 273 |
| --- 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 |
+1
-1
| --- win/Makefile.PellesCGMake | ||
| +++ win/Makefile.PellesCGMake | ||
| @@ -83,11 +83,11 @@ | ||
| 83 | 83 | |
| 84 | 84 | # define the SQLite files, which need special flags on compile |
| 85 | 85 | SQLITESRC=sqlite3.c |
| 86 | 86 | ORIGSQLITESRC=$(foreach sf,$(SQLITESRC),$(SRCDIR)$(sf)) |
| 87 | 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 | |
| 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 | 89 | |
| 90 | 90 | # define the SQLite shell files, which need special flags on compile |
| 91 | 91 | SQLITESHELLSRC=shell.c |
| 92 | 92 | ORIGSQLITESHELLSRC=$(foreach sf,$(SQLITESHELLSRC),$(SRCDIR)$(sf)) |
| 93 | 93 | SQLITESHELLOBJ=$(foreach sf,$(SQLITESHELLSRC),$(sf:.c=.obj)) |
| 94 | 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_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 |
+1
-1
| --- win/Makefile.dmc | ||
| +++ win/Makefile.dmc | ||
| @@ -24,11 +24,11 @@ | ||
| 24 | 24 | CFLAGS = -o |
| 25 | 25 | BCC = $(DMDIR)\bin\dmc $(CFLAGS) |
| 26 | 26 | TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL) |
| 27 | 27 | LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32 |
| 28 | 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 | |
| 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 | 30 | |
| 31 | 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 | 32 | |
| 33 | 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 | 34 | |
| 35 | 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 |
| 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 |
+1
| --- win/Makefile.mingw | ||
| +++ win/Makefile.mingw | ||
| @@ -2025,10 +2025,11 @@ | ||
| 2025 | 2025 | -DSQLITE_THREADSAFE=0 \ |
| 2026 | 2026 | -DSQLITE_DEFAULT_FILE_FORMAT=4 \ |
| 2027 | 2027 | -DSQLITE_OMIT_DEPRECATED \ |
| 2028 | 2028 | -DSQLITE_ENABLE_EXPLAIN_COMMENTS \ |
| 2029 | 2029 | -DSQLITE_ENABLE_FTS4 \ |
| 2030 | + -DSQLITE_ENABLE_FTS3_PARENTHESIS \ | |
| 2030 | 2031 | -DSQLITE_WIN32_NO_ANSI \ |
| 2031 | 2032 | -D_HAVE__MINGW_H \ |
| 2032 | 2033 | -DSQLITE_USE_MALLOC_H \ |
| 2033 | 2034 | -DSQLITE_USE_MSIZE |
| 2034 | 2035 | |
| 2035 | 2036 |
| --- 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 @@ | ||
| 2024 | 2024 | -DSQLITE_ENABLE_LOCKING_STYLE=0 \ |
| 2025 | 2025 | -DSQLITE_THREADSAFE=0 \ |
| 2026 | 2026 | -DSQLITE_DEFAULT_FILE_FORMAT=4 \ |
| 2027 | 2027 | -DSQLITE_OMIT_DEPRECATED \ |
| 2028 | 2028 | -DSQLITE_ENABLE_EXPLAIN_COMMENTS \ |
| 2029 | + -DSQLITE_ENABLE_FTS4 \ | |
| 2030 | + -DSQLITE_ENABLE_FTS3_PARENTHESIS \ | |
| 2029 | 2031 | -DSQLITE_WIN32_NO_ANSI \ |
| 2030 | 2032 | -D_HAVE__MINGW_H \ |
| 2031 | 2033 | -DSQLITE_USE_MALLOC_H \ |
| 2032 | 2034 | -DSQLITE_USE_MSIZE |
| 2033 | 2035 | |
| 2034 | 2036 |
| --- 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 |
+1
| --- win/Makefile.msc | ||
| +++ win/Makefile.msc | ||
| @@ -190,10 +190,11 @@ | ||
| 190 | 190 | /DSQLITE_THREADSAFE=0 \ |
| 191 | 191 | /DSQLITE_DEFAULT_FILE_FORMAT=4 \ |
| 192 | 192 | /DSQLITE_OMIT_DEPRECATED \ |
| 193 | 193 | /DSQLITE_ENABLE_EXPLAIN_COMMENTS \ |
| 194 | 194 | /DSQLITE_ENABLE_FTS4 \ |
| 195 | + /DSQLITE_ENABLE_FTS3_PARENTHESIS \ | |
| 195 | 196 | /DSQLITE_WIN32_NO_ANSI |
| 196 | 197 | |
| 197 | 198 | SHELL_OPTIONS = /Dmain=sqlite3_shell \ |
| 198 | 199 | /DSQLITE_OMIT_LOAD_EXTENSION=1 \ |
| 199 | 200 | /DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \ |
| 200 | 201 |
| --- 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 |
+1
-1
| --- www/branching.wiki | ||
| +++ www/branching.wiki | ||
| @@ -180,11 +180,11 @@ | ||
| 180 | 180 | |
| 181 | 181 | A tag can be a one-time tag, a propagating tag or a cancellation tag. |
| 182 | 182 | A one-time tag only applies to the check-in to which it is attached. A |
| 183 | 183 | propagating tag applies to the check-in to which it is attached and also |
| 184 | 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 | |
| 185 | +is a descendant through direct children. Tag propagation does not | |
| 186 | 186 | cross merges. Tag propagation also stops as soon |
| 187 | 187 | as it encounters another check-in with the same tag. A cancellation tag |
| 188 | 188 | is attached to a single check-in in order to either override a one-time |
| 189 | 189 | tag that was previously placed on that same check-in, or to block |
| 190 | 190 | tag propagation from an ancestor. |
| 191 | 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. 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 |
+25
-64
| --- www/concepts.wiki | ||
| +++ www/concepts.wiki | ||
| @@ -197,11 +197,15 @@ | ||
| 197 | 197 | is identified by your VISUAL environment variable. Fossil will also |
| 198 | 198 | use GPG to clearsign your manifests if you happen to have it installed, |
| 199 | 199 | but fossil will skip that step if GPG missing from your system. |
| 200 | 200 | You can optionally set up fossil to use external "diff" programs, |
| 201 | 201 | 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 | + | |
| 203 | 207 | |
| 204 | 208 | To uninstall fossil, simply delete the executable. |
| 205 | 209 | |
| 206 | 210 | To upgrade an older version of fossil to a newer version, just |
| 207 | 211 | replace the old executable with the new one. You might need to |
| @@ -391,75 +395,32 @@ | ||
| 391 | 395 | <h2>5.0 Setting Up A Fossil Server</h2> |
| 392 | 396 | |
| 393 | 397 | With other configuration management software, setting up a server is |
| 394 | 398 | a lot of work and normally takes time, patience, and a lot of system |
| 395 | 399 | 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> | |
| 397 | 401 | |
| 398 | 402 | <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. | |
| 461 | 422 | |
| 462 | 423 | <h2>6.0 Review Of Key Concepts</h2> |
| 463 | 424 | |
| 464 | 425 | <ul> |
| 465 | 426 | <li>The <b>fossil</b> program is a self-contained stand-alone executable. |
| 466 | 427 | |
| 467 | 428 | 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 |
+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. |
| --- 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. |
+56
-11
| --- www/fossil-v-git.wiki | ||
| +++ www/fossil-v-git.wiki | ||
| @@ -17,17 +17,20 @@ | ||
| 17 | 17 | <h2>2.0 Executive Summary:</h2> |
| 18 | 18 | |
| 19 | 19 | <blockquote><center><table border=1 cellpadding=5> |
| 20 | 20 | <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr> |
| 21 | 21 | <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> | |
| 23 | 23 | <tr><td>Sharding</td><td>Replicating</td></tr> |
| 24 | 24 | <tr><td>Developer branches</td><td>Feature branches</td></tr> |
| 25 | 25 | <tr><td>Complex</td><td>Intuitive</td></tr> |
| 26 | 26 | <tr><td>Separate web tools</td><td>Integrated Web interface</td></tr> |
| 27 | 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> | |
| 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> | |
| 29 | 32 | <tr><td>Uses "<tt>rebase</tt>"</td><td>Immutable</td></tr> |
| 30 | 33 | <tr><td>GPL</td><td>BSD</td></tr> |
| 31 | 34 | </table></center></blockquote> |
| 32 | 35 | |
| 33 | 36 | <h2>3.0 Discussion</h2> |
| @@ -36,11 +39,11 @@ | ||
| 36 | 39 | |
| 37 | 40 | Git provides file versioning services only, whereas Fossil adds an |
| 38 | 41 | integrated [./wikitheory.wiki | wiki], |
| 39 | 42 | [./bugtheory.wiki | ticketing & bug tracking], |
| 40 | 43 | [./embeddeddoc.wiki | embedded documentation], and |
| 41 | -[./event.wiki | News/Blog features]. | |
| 44 | +[./event.wiki | Technical notes]. | |
| 42 | 45 | These additional capabilities are available for Git as 3rd-party |
| 43 | 46 | user-installed add-ons, but with Fossil they are integrated into |
| 44 | 47 | the design. One way to describe Fossil is that it is |
| 45 | 48 | "[https://github.com/ | github]-in-a-box". |
| 46 | 49 | |
| @@ -148,10 +151,13 @@ | ||
| 148 | 151 | Fossil strives for simplicity. Fossil wants to be easy to learn and to |
| 149 | 152 | require little thinking about how to operating it. |
| 150 | 153 | [./quotes.wiki | Reports from the field] |
| 151 | 154 | indicate that Fossil is mostly successful at this effort. |
| 152 | 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 | + | |
| 153 | 159 | <h3>3.5 Web Interface</h3> |
| 154 | 160 | |
| 155 | 161 | Git has a web interface, but it requires a fair amount of setup and an |
| 156 | 162 | external web server. Fossil comes with a fully functional |
| 157 | 163 | [./webui.wiki | built-in web-server] |
| @@ -189,11 +195,27 @@ | ||
| 189 | 195 | repository can serve multiple simultaneous working checkouts. |
| 190 | 196 | A Fossil repository is an SQLite database, so it is highly resistant |
| 191 | 197 | to damage from a power-loss or system crash - incomplete transactions |
| 192 | 198 | are simply rolled back after the system reboots. |
| 193 | 199 | |
| 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> | |
| 195 | 217 | |
| 196 | 218 | Git features the "rebase" command which can be used to change the |
| 197 | 219 | sequence of check-ins in the repository. Rebase can be used to "clean up" |
| 198 | 220 | a complex sequence of check-ins to make their intent easier for others |
| 199 | 221 | to understand. This is important if you view the history of a project |
| @@ -204,24 +226,47 @@ | ||
| 204 | 226 | Fossil allows mistakes to be corrected (for example, check-in comments |
| 205 | 227 | can be revised, and check-ins can be moved onto new branches even after |
| 206 | 228 | the check-in has occurred) but the correction is an addition to the repository |
| 207 | 229 | and the original actions are preserved and displayed alongside |
| 208 | 230 | 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 | + | |
| 212 | 234 | |
| 213 | 235 | To put it another way, Git remembers what you should have done whereas |
| 214 | 236 | Fossil remembers what you actually did. |
| 215 | 237 | |
| 216 | 238 | The lack of a "rebase" command and the inability to rewrite history |
| 217 | 239 | is considered a feature of Fossil, not an omission or bug. |
| 218 | 240 | |
| 219 | -<h3>3.9 License</h3> | |
| 241 | +<h3>3.10 License</h3> | |
| 220 | 242 | |
| 221 | 243 | Both Git and Fossil are open-source. Git is under |
| 222 | 244 | [http://www.gnu.org/licenses/gpl.html | GPL] whereas Fossil is |
| 223 | 245 | under the |
| 224 | 246 | [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. | |
| 228 | 273 |
| --- 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 & 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 & 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 @@ | ||
| 2 | 2 | |
| 3 | 3 | The following links are of interest to programmers who want to modify |
| 4 | 4 | or enhance Fossil. Ordinary users can safely ignore this information. |
| 5 | 5 | |
| 6 | 6 | * [./build.wiki | How To Compile And Install Fossil] |
| 7 | + * [./customskin.md | Theming Fossil] | |
| 7 | 8 | * [./makefile.wiki | The Fossil Build Process] |
| 8 | 9 | * [./tech_overview.wiki | A Technical Overview of Fossil] |
| 9 | 10 | * [./adding_code.wiki | Adding Features To Fossil] |
| 10 | 11 | * [./contribute.wiki|Contributing Code Or Enhancements To The Fossil Project] |
| 11 | 12 | * [./style.wiki | Coding Style Guidelines] |
| 12 | 13 |
| --- 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;'> | |
| 18 | 6 | <ul> |
| 19 | 7 | <li> [http://www.fossil-scm.org/download.html | Download] |
| 20 | 8 | <li> [./quickstart.wiki | Quick Start] |
| 21 | 9 | <li> [./build.wiki | Install] |
| 22 | 10 | <li> [../COPYRIGHT-BSD2.txt | License] |
| 23 | -<li> [/timeline | Recent changes] | |
| 24 | 11 | <li> [./faq.wiki | FAQ] |
| 25 | -<li> [./hacker-howto.wiki | Hacker How-To] | |
| 26 | 12 | <li> [./changes.wiki | Change Log] |
| 13 | +<li> [./hacker-howto.wiki | Hacker How-To] | |
| 27 | 14 | <li> [./hints.wiki | Tip & Hints] |
| 28 | 15 | <li> [./permutedindex.html | Documentation Index] |
| 29 | 16 | <li> [http://www.fossil-scm.org/schimpf-book/home | Jim Schimpf's book] |
| 30 | 17 | <li> Mailing list |
| 31 | 18 | <ul> |
| 32 | 19 | <li> [http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users | sign-up] |
| 33 | 20 | <li> [http://www.mail-archive.com/[email protected] | archives] |
| 34 | - <ul> | |
| 21 | + </ul> | |
| 35 | 22 | </ul> |
| 36 | -</td></tr> | |
| 37 | -<tr><td> | |
| 38 | 23 | <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> - | |
| 47 | 30 | In addition to doing [./concepts.wiki | distributed version control] |
| 48 | 31 | 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 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¹ | |
| 64 | 41 | is just a running instance of Fossil. The pages you see here |
| 65 | 42 | are all [./wikitheory.wiki | wiki] or |
| 66 | 43 | [./embeddeddoc.wiki | embedded documentation]. |
| 67 | 44 | When you clone Fossil from one of its |
| 68 | 45 | [./selfhost.wiki | self-hosting repositories], |
| 69 | 46 | you get more than just source code - you get this entire website. |
| 47 | + <span style='font-size:75%;'>(¹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]. | |
| 70 | 69 | |
| 71 | - 3. <b>Autosync</b> - | |
| 70 | + 6. <b>Autosync</b> - | |
| 72 | 71 | Fossil supports [./concepts.wiki#workflow | "autosync" mode] |
| 73 | 72 | which helps to keep projects moving |
| 74 | 73 | forward by reducing the amount of needless |
| 75 | 74 | [./branching.wiki | forking and merging] often |
| 76 | 75 | associated with distributed projects. |
| 77 | 76 | |
| 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 | 77 | 7. <b>Robust & Reliable</b> - |
| 104 | 78 | Fossil stores content using an [./fileformat.wiki | enduring file format] |
| 105 | 79 | 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 | |
| 109 | 83 | of operation, no work has ever been lost after having been committed to |
| 110 | 84 | a Fossil repository. |
| 85 | + | |
| 86 | + 8. <b>Free and Open-Source</b> - Uses the [../COPYRIGHT-BSD2.txt|2-clause BSD license]. | |
| 111 | 87 | |
| 112 | 88 | <hr> |
| 113 | 89 | <h3>Links For Fossil Users:</h3> |
| 114 | 90 | |
| 115 | 91 | * "Fuel" is cross-platform GUI front-end for Fossil |
| @@ -159,11 +135,11 @@ | ||
| 159 | 135 | * [./fossil-v-git.wiki | Fossil versus Git]. |
| 160 | 136 | * [./fiveminutes.wiki | Up and running in 5 minutes as a single user] |
| 161 | 137 | (contributed by Gilles Ganault on 2013-01-08). |
| 162 | 138 | * [./antibot.wiki | How Fossil defends against abuse by spiders and bots]. |
| 163 | 139 | |
| 164 | -<h3>Links For Fossil Developer:</h3> | |
| 140 | +<h3>Links For Fossil Developers:</h3> | |
| 165 | 141 | |
| 166 | 142 | * [./contribute.wiki | Contributing] code or documentation to the |
| 167 | 143 | Fossil project. |
| 168 | 144 | * [./theory1.wiki | Thoughts On The Design Of Fossil]. |
| 169 | 145 | * [./pop.wiki | Principles Of Operation] |
| 170 | 146 |
| --- 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 & 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 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 & 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 & 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¹ |
| 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%;'>(¹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 & 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 |
+11
| --- www/inout.wiki | ||
| +++ www/inout.wiki | ||
| @@ -48,5 +48,16 @@ | ||
| 48 | 48 | since the git-fast-export file format is currently the only VCS interchange |
| 49 | 49 | format that Fossil will generate. However, |
| 50 | 50 | future versions of Fossil might add the ability to generate other |
| 51 | 51 | VCS interchange formats, and so for compatibility, the use of the --git |
| 52 | 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> | |
| 53 | 64 |
| --- 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 @@ | ||
| 5 | 5 | # |
| 6 | 6 | # |
| 7 | 7 | set out [open download.html w] |
| 8 | 8 | fconfigure $out -encoding utf-8 -translation lf |
| 9 | 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"> | |
| 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"> | |
| 27 | 26 | <a href='/fossil/doc/trunk/www/index.wiki'>Home</a> |
| 28 | 27 | <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> | |
| 32 | 30 | <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> | |
| 35 | 34 | </div> |
| 36 | 35 | <div class="content"> |
| 37 | 36 | <p> |
| 38 | 37 | |
| 39 | 38 | <center><font size=4>} |
| 40 | 39 | puts $out \ |
| 41 | -"<b>To install Fossil \u2192</b> download the stand-alone executable" | |
| 40 | +"<b>To install Fossil →</b> download the stand-alone executable" | |
| 42 | 41 | puts $out \ |
| 43 | 42 | {and put it on your $PATH. |
| 44 | 43 | </font><p><small> |
| 45 | 44 | RPMs available |
| 46 | 45 | <a href="http://download.opensuse.org/repositories/home:/rmax:/fossil/"> |
| @@ -111,11 +110,11 @@ | ||
| 111 | 110 | puts $out "</td></tr>" |
| 112 | 111 | } |
| 113 | 112 | } |
| 114 | 113 | puts $out "<tr><td colspan=5><hr></td></tr>" |
| 115 | 114 | |
| 116 | -puts $out {</table> | |
| 115 | +puts $out {</table></div> | |
| 117 | 116 | </body> |
| 118 | 117 | </html> |
| 119 | 118 | } |
| 120 | 119 | |
| 121 | 120 | close $out |
| 122 | 121 |
| --- 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 →</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 |
+2
| --- www/mkindex.tcl | ||
| +++ www/mkindex.tcl | ||
| @@ -17,10 +17,11 @@ | ||
| 17 | 17 | checkin.wiki {Check-in Checklist} |
| 18 | 18 | changes.wiki {Fossil Changelog} |
| 19 | 19 | copyright-release.html {Contributor License Agreement} |
| 20 | 20 | concepts.wiki {Fossil Core Concepts} |
| 21 | 21 | contribute.wiki {Contributing Code or Documentation To The Fossil Project} |
| 22 | + customskin.md {Theming: Customizing The Appearance of Web Pages} | |
| 22 | 23 | custom_ticket.wiki {Customizing The Ticket System} |
| 23 | 24 | delta_encoder_algorithm.wiki {Fossil Delta Encoding Algorithm} |
| 24 | 25 | delta_format.wiki {Fossil Delta Format} |
| 25 | 26 | embeddeddoc.wiki {Embedded Project Documentation} |
| 26 | 27 | event.wiki {Events} |
| @@ -55,10 +56,11 @@ | ||
| 55 | 56 | ssl.wiki {Using SSL with Fossil} |
| 56 | 57 | sync.wiki {The Fossil Sync Protocol} |
| 57 | 58 | tech_overview.wiki {A Technical Overview Of The Design And Implementation |
| 58 | 59 | Of Fossil} |
| 59 | 60 | tech_overview.wiki {SQLite Databases Used By Fossil} |
| 61 | + th1.md {The TH1 Scripting Language} | |
| 60 | 62 | tickets.wiki {The Fossil Ticket System} |
| 61 | 63 | theory1.wiki {Thoughts On The Design Of The Fossil DVCS} |
| 62 | 64 | webui.wiki {The Fossil Web Interface} |
| 63 | 65 | wikitheory.wiki {Wiki In Fossil} |
| 64 | 66 | } |
| 65 | 67 |
| --- 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 @@ | ||
| 24 | 24 | <li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li> |
| 25 | 25 | <li><a href="adding_code.wiki">Adding New Features To Fossil</a></li> |
| 26 | 26 | <li><a href="antibot.wiki">against Spiders and Bots — Defense</a></li> |
| 27 | 27 | <li><a href="copyright-release.html">Agreement — Contributor License</a></li> |
| 28 | 28 | <li><a href="delta_encoder_algorithm.wiki">Algorithm — Fossil Delta Encoding</a></li> |
| 29 | +<li><a href="customskin.md">Appearance of Web Pages — Theming: Customizing The</a></li> | |
| 29 | 30 | <li><a href="fiveminutes.wiki">as a Single User — Update and Running in 5 Minutes</a></li> |
| 30 | 31 | <li><a href="faq.wiki">Asked Questions — Frequently</a></li> |
| 31 | 32 | <li><a href="password.wiki">Authentication — Password Management And</a></li> |
| 32 | 33 | <li><a href="antibot.wiki">Bots — Defense against Spiders and</a></li> |
| 33 | 34 | <li><a href="private.wiki">Branches — Creating, Syncing, and Deleting Private</a></li> |
| @@ -51,10 +52,11 @@ | ||
| 51 | 52 | <li><a href="copyright-release.html">Contributor License Agreement</a></li> |
| 52 | 53 | <li><a href="concepts.wiki">Core Concepts — Fossil</a></li> |
| 53 | 54 | <li><a href="newrepo.wiki">Create A New Fossil Repository — How To</a></li> |
| 54 | 55 | <li><a href="private.wiki">Creating, Syncing, and Deleting Private Branches</a></li> |
| 55 | 56 | <li><a href="qandc.wiki">Criticisms — Questions And</a></li> |
| 57 | +<li><a href="customskin.md">Customizing The Appearance of Web Pages — Theming:</a></li> | |
| 56 | 58 | <li><a href="custom_ticket.wiki">Customizing The Ticket System</a></li> |
| 57 | 59 | <li><a href="tech_overview.wiki">Databases Used By Fossil — SQLite</a></li> |
| 58 | 60 | <li><a href="antibot.wiki">Defense against Spiders and Bots</a></li> |
| 59 | 61 | <li><a href="shunning.wiki">Deleting Content From Fossil — Shunning:</a></li> |
| 60 | 62 | <li><a href="private.wiki">Deleting Private Branches — Creating, Syncing, and</a></li> |
| @@ -110,10 +112,11 @@ | ||
| 110 | 112 | <li><a href="inout.wiki">Import And Export To And From Git</a></li> |
| 111 | 113 | <li><a href="build.wiki">Installing Fossil — Compiling and</a></li> |
| 112 | 114 | <li><a href="fossil-from-msvc.wiki">Integrating Fossil in the Microsoft Express 2010 IDE</a></li> |
| 113 | 115 | <li><a href="selfcheck.wiki">Integrity Self Checks — Fossil Repository</a></li> |
| 114 | 116 | <li><a href="webui.wiki">Interface — The Fossil Web</a></li> |
| 117 | +<li><a href="th1.md">Language — The TH1 Scripting</a></li> | |
| 115 | 118 | <li><a href="copyright-release.html">License Agreement — Contributor</a></li> |
| 116 | 119 | <li><a href="password.wiki">Management And Authentication — Password</a></li> |
| 117 | 120 | <li><a href="branching.wiki">Merging, and Tagging — Branching, Forking,</a></li> |
| 118 | 121 | <li><a href="fossil-from-msvc.wiki">Microsoft Express 2010 IDE — Integrating Fossil in the</a></li> |
| 119 | 122 | <li><a href="fiveminutes.wiki">Minutes as a Single User — Update and Running in 5</a></li> |
| @@ -122,10 +125,11 @@ | ||
| 122 | 125 | <li><a href="newrepo.wiki">New Fossil Repository — How To Create A</a></li> |
| 123 | 126 | <li><a href="foss-cklist.wiki">Open-Source Projects — Checklist For Successful</a></li> |
| 124 | 127 | <li><a href="pop.wiki">Operations — Principles Of</a></li> |
| 125 | 128 | <li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil — A Technical</a></li> |
| 126 | 129 | <li><a href="index.wiki">Page — Home</a></li> |
| 130 | +<li><a href="customskin.md">Pages — Theming: Customizing The Appearance of Web</a></li> | |
| 127 | 131 | <li><a href="password.wiki">Password Management And Authentication</a></li> |
| 128 | 132 | <li><a href="quotes.wiki">People Are Saying About Fossil, Git, and DVCSes in General — Quotes: What</a></li> |
| 129 | 133 | <li><a href="stats.wiki">Performance Statistics</a></li> |
| 130 | 134 | <li><a href="../test/release-checklist.wiki">Pre-Release Testing Checklist</a></li> |
| 131 | 135 | <li><a href="pop.wiki">Principles Of Operations</a></li> |
| @@ -143,10 +147,11 @@ | ||
| 143 | 147 | <li><a href="newrepo.wiki">Repository — How To Create A New Fossil</a></li> |
| 144 | 148 | <li><a href="selfcheck.wiki">Repository Integrity Self Checks — Fossil</a></li> |
| 145 | 149 | <li><a href="reviews.wiki">Reviews</a></li> |
| 146 | 150 | <li><a href="fiveminutes.wiki">Running in 5 Minutes as a Single User — Update and</a></li> |
| 147 | 151 | <li><a href="quotes.wiki">Saying About Fossil, Git, and DVCSes in General — Quotes: What People Are</a></li> |
| 152 | +<li><a href="th1.md">Scripting Language — The TH1</a></li> | |
| 148 | 153 | <li><a href="selfcheck.wiki">Self Checks — Fossil Repository Integrity</a></li> |
| 149 | 154 | <li><a href="selfhost.wiki">Self Hosting Repositories — Fossil</a></li> |
| 150 | 155 | <li><a href="server.wiki">Server — How To Configure A Fossil</a></li> |
| 151 | 156 | <li><a href="settings.wiki">Settings — Fossil</a></li> |
| 152 | 157 | <li><a href="shunning.wiki">Shunning: Deleting Content From Fossil</a></li> |
| @@ -164,14 +169,17 @@ | ||
| 164 | 169 | <li><a href="custom_ticket.wiki">System — Customizing The Ticket</a></li> |
| 165 | 170 | <li><a href="tickets.wiki">System — The Fossil Ticket</a></li> |
| 166 | 171 | <li><a href="branching.wiki">Tagging — Branching, Forking, Merging, and</a></li> |
| 167 | 172 | <li><a href="tech_overview.wiki">Technical Overview Of The Design And Implementation Of Fossil — A</a></li> |
| 168 | 173 | <li><a href="../test/release-checklist.wiki">Testing Checklist — Pre-Release</a></li> |
| 174 | +<li><a href="th1.md">TH1 Scripting Language — The</a></li> | |
| 169 | 175 | <li><a href="makefile.wiki">The Fossil Build Process</a></li> |
| 170 | 176 | <li><a href="sync.wiki">The Fossil Sync Protocol</a></li> |
| 171 | 177 | <li><a href="tickets.wiki">The Fossil Ticket System</a></li> |
| 172 | 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> | |
| 173 | 181 | <li><a href="theory1.wiki">Thoughts On The Design Of The Fossil DVCS</a></li> |
| 174 | 182 | <li><a href="custom_ticket.wiki">Ticket System — Customizing The</a></li> |
| 175 | 183 | <li><a href="tickets.wiki">Ticket System — The Fossil</a></li> |
| 176 | 184 | <li><a href="hints.wiki">Tips And Usage Hints — Fossil</a></li> |
| 177 | 185 | <li><a href="bugtheory.wiki">Tracking In Fossil — Bug</a></li> |
| @@ -180,9 +188,10 @@ | ||
| 180 | 188 | <li><a href="fiveminutes.wiki">User — Update and Running in 5 Minutes as a Single</a></li> |
| 181 | 189 | <li><a href="ssl.wiki">Using SSL with Fossil</a></li> |
| 182 | 190 | <li><a href="checkin_names.wiki">Version Names — Checkin And</a></li> |
| 183 | 191 | <li><a href="fossil-v-git.wiki">Versus Git — Fossil</a></li> |
| 184 | 192 | <li><a href="webui.wiki">Web Interface — The Fossil</a></li> |
| 193 | +<li><a href="customskin.md">Web Pages — Theming: Customizing The Appearance of</a></li> | |
| 185 | 194 | <li><a href="quotes.wiki">What People Are Saying About Fossil, Git, and DVCSes in General — Quotes:</a></li> |
| 186 | 195 | <li><a href="wikitheory.wiki">Wiki In Fossil</a></li> |
| 187 | 196 | <li><a href="ssl.wiki">with Fossil — Using SSL</a></li> |
| 188 | 197 | </ul></div> |
| 189 | 198 |
| --- 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 — Defense</a></li> |
| 27 | <li><a href="copyright-release.html">Agreement — Contributor License</a></li> |
| 28 | <li><a href="delta_encoder_algorithm.wiki">Algorithm — Fossil Delta Encoding</a></li> |
| 29 | <li><a href="fiveminutes.wiki">as a Single User — Update and Running in 5 Minutes</a></li> |
| 30 | <li><a href="faq.wiki">Asked Questions — Frequently</a></li> |
| 31 | <li><a href="password.wiki">Authentication — Password Management And</a></li> |
| 32 | <li><a href="antibot.wiki">Bots — Defense against Spiders and</a></li> |
| 33 | <li><a href="private.wiki">Branches — 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 — Fossil</a></li> |
| 53 | <li><a href="newrepo.wiki">Create A New Fossil Repository — 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 — 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 — 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 — Shunning:</a></li> |
| 60 | <li><a href="private.wiki">Deleting Private Branches — 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 — 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 — Fossil Repository</a></li> |
| 114 | <li><a href="webui.wiki">Interface — The Fossil Web</a></li> |
| 115 | <li><a href="copyright-release.html">License Agreement — Contributor</a></li> |
| 116 | <li><a href="password.wiki">Management And Authentication — Password</a></li> |
| 117 | <li><a href="branching.wiki">Merging, and Tagging — Branching, Forking,</a></li> |
| 118 | <li><a href="fossil-from-msvc.wiki">Microsoft Express 2010 IDE — Integrating Fossil in the</a></li> |
| 119 | <li><a href="fiveminutes.wiki">Minutes as a Single User — Update and Running in 5</a></li> |
| @@ -122,10 +125,11 @@ | |
| 122 | <li><a href="newrepo.wiki">New Fossil Repository — How To Create A</a></li> |
| 123 | <li><a href="foss-cklist.wiki">Open-Source Projects — Checklist For Successful</a></li> |
| 124 | <li><a href="pop.wiki">Operations — Principles Of</a></li> |
| 125 | <li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil — A Technical</a></li> |
| 126 | <li><a href="index.wiki">Page — 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 — 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 — How To Create A New Fossil</a></li> |
| 144 | <li><a href="selfcheck.wiki">Repository Integrity Self Checks — 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 — Update and</a></li> |
| 147 | <li><a href="quotes.wiki">Saying About Fossil, Git, and DVCSes in General — Quotes: What People Are</a></li> |
| 148 | <li><a href="selfcheck.wiki">Self Checks — Fossil Repository Integrity</a></li> |
| 149 | <li><a href="selfhost.wiki">Self Hosting Repositories — Fossil</a></li> |
| 150 | <li><a href="server.wiki">Server — How To Configure A Fossil</a></li> |
| 151 | <li><a href="settings.wiki">Settings — 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 — Customizing The Ticket</a></li> |
| 165 | <li><a href="tickets.wiki">System — The Fossil Ticket</a></li> |
| 166 | <li><a href="branching.wiki">Tagging — Branching, Forking, Merging, and</a></li> |
| 167 | <li><a href="tech_overview.wiki">Technical Overview Of The Design And Implementation Of Fossil — A</a></li> |
| 168 | <li><a href="../test/release-checklist.wiki">Testing Checklist — 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 — Customizing The</a></li> |
| 175 | <li><a href="tickets.wiki">Ticket System — The Fossil</a></li> |
| 176 | <li><a href="hints.wiki">Tips And Usage Hints — Fossil</a></li> |
| 177 | <li><a href="bugtheory.wiki">Tracking In Fossil — Bug</a></li> |
| @@ -180,9 +188,10 @@ | |
| 180 | <li><a href="fiveminutes.wiki">User — 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 — Checkin And</a></li> |
| 183 | <li><a href="fossil-v-git.wiki">Versus Git — Fossil</a></li> |
| 184 | <li><a href="webui.wiki">Web Interface — The Fossil</a></li> |
| 185 | <li><a href="quotes.wiki">What People Are Saying About Fossil, Git, and DVCSes in General — Quotes:</a></li> |
| 186 | <li><a href="wikitheory.wiki">Wiki In Fossil</a></li> |
| 187 | <li><a href="ssl.wiki">with Fossil — 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 — Defense</a></li> |
| 27 | <li><a href="copyright-release.html">Agreement — Contributor License</a></li> |
| 28 | <li><a href="delta_encoder_algorithm.wiki">Algorithm — Fossil Delta Encoding</a></li> |
| 29 | <li><a href="customskin.md">Appearance of Web Pages — Theming: Customizing The</a></li> |
| 30 | <li><a href="fiveminutes.wiki">as a Single User — Update and Running in 5 Minutes</a></li> |
| 31 | <li><a href="faq.wiki">Asked Questions — Frequently</a></li> |
| 32 | <li><a href="password.wiki">Authentication — Password Management And</a></li> |
| 33 | <li><a href="antibot.wiki">Bots — Defense against Spiders and</a></li> |
| 34 | <li><a href="private.wiki">Branches — 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 — Fossil</a></li> |
| 54 | <li><a href="newrepo.wiki">Create A New Fossil Repository — 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 — Questions And</a></li> |
| 57 | <li><a href="customskin.md">Customizing The Appearance of Web Pages — 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 — 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 — Shunning:</a></li> |
| 62 | <li><a href="private.wiki">Deleting Private Branches — 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 — 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 — Fossil Repository</a></li> |
| 116 | <li><a href="webui.wiki">Interface — The Fossil Web</a></li> |
| 117 | <li><a href="th1.md">Language — The TH1 Scripting</a></li> |
| 118 | <li><a href="copyright-release.html">License Agreement — Contributor</a></li> |
| 119 | <li><a href="password.wiki">Management And Authentication — Password</a></li> |
| 120 | <li><a href="branching.wiki">Merging, and Tagging — Branching, Forking,</a></li> |
| 121 | <li><a href="fossil-from-msvc.wiki">Microsoft Express 2010 IDE — Integrating Fossil in the</a></li> |
| 122 | <li><a href="fiveminutes.wiki">Minutes as a Single User — Update and Running in 5</a></li> |
| @@ -122,10 +125,11 @@ | |
| 125 | <li><a href="newrepo.wiki">New Fossil Repository — How To Create A</a></li> |
| 126 | <li><a href="foss-cklist.wiki">Open-Source Projects — Checklist For Successful</a></li> |
| 127 | <li><a href="pop.wiki">Operations — Principles Of</a></li> |
| 128 | <li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil — A Technical</a></li> |
| 129 | <li><a href="index.wiki">Page — Home</a></li> |
| 130 | <li><a href="customskin.md">Pages — 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 — 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 — How To Create A New Fossil</a></li> |
| 148 | <li><a href="selfcheck.wiki">Repository Integrity Self Checks — 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 — Update and</a></li> |
| 151 | <li><a href="quotes.wiki">Saying About Fossil, Git, and DVCSes in General — Quotes: What People Are</a></li> |
| 152 | <li><a href="th1.md">Scripting Language — The TH1</a></li> |
| 153 | <li><a href="selfcheck.wiki">Self Checks — Fossil Repository Integrity</a></li> |
| 154 | <li><a href="selfhost.wiki">Self Hosting Repositories — Fossil</a></li> |
| 155 | <li><a href="server.wiki">Server — How To Configure A Fossil</a></li> |
| 156 | <li><a href="settings.wiki">Settings — 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 — Customizing The Ticket</a></li> |
| 170 | <li><a href="tickets.wiki">System — The Fossil Ticket</a></li> |
| 171 | <li><a href="branching.wiki">Tagging — Branching, Forking, Merging, and</a></li> |
| 172 | <li><a href="tech_overview.wiki">Technical Overview Of The Design And Implementation Of Fossil — A</a></li> |
| 173 | <li><a href="../test/release-checklist.wiki">Testing Checklist — Pre-Release</a></li> |
| 174 | <li><a href="th1.md">TH1 Scripting Language — 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 — Customizing The</a></li> |
| 183 | <li><a href="tickets.wiki">Ticket System — The Fossil</a></li> |
| 184 | <li><a href="hints.wiki">Tips And Usage Hints — Fossil</a></li> |
| 185 | <li><a href="bugtheory.wiki">Tracking In Fossil — Bug</a></li> |
| @@ -180,9 +188,10 @@ | |
| 188 | <li><a href="fiveminutes.wiki">User — 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 — Checkin And</a></li> |
| 191 | <li><a href="fossil-v-git.wiki">Versus Git — Fossil</a></li> |
| 192 | <li><a href="webui.wiki">Web Interface — The Fossil</a></li> |
| 193 | <li><a href="customskin.md">Web Pages — Theming: Customizing The Appearance of</a></li> |
| 194 | <li><a href="quotes.wiki">What People Are Saying About Fossil, Git, and DVCSes in General — Quotes:</a></li> |
| 195 | <li><a href="wikitheory.wiki">Wiki In Fossil</a></li> |
| 196 | <li><a href="ssl.wiki">with Fossil — Using SSL</a></li> |
| 197 | </ul></div> |
| 198 |
+1
-1
| --- www/selfcheck.wiki | ||
| +++ www/selfcheck.wiki | ||
| @@ -44,11 +44,11 @@ | ||
| 44 | 44 | new delta-encoding mechanism designed expressly for fossil. We want |
| 45 | 45 | to make sure that bugs in these encoding mechanisms do not lead to |
| 46 | 46 | loss of data. |
| 47 | 47 | |
| 48 | 48 | 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 | |
| 50 | 50 | of every content file that it changes just prior to transaction |
| 51 | 51 | commit. So during the course of check-in (or other repository |
| 52 | 52 | operation) many different files |
| 53 | 53 | in the repository might be modified. Some files are simply |
| 54 | 54 | compressed. Other files are delta encoded and then compressed. |
| 55 | 55 | |
| 56 | 56 | ADDED www/th1.md |
| 57 | 57 | 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. |
+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> → | |
| 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> → | |
| 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> → | |
| 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> → | |
| 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> → |
| 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> → |
| 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> → |
| 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> → |
| 60 | S |
+2
-2
| --- www/webui.wiki | ||
| +++ www/webui.wiki | ||
| @@ -8,19 +8,19 @@ | ||
| 8 | 8 | * [./wikitheory.wiki | Wiki] |
| 9 | 9 | * [./embeddeddoc.wiki | On-line documentation] |
| 10 | 10 | * Status information |
| 11 | 11 | * Timelines |
| 12 | 12 | * Graphs of revision and branching history |
| 13 | - * [./event.wiki | Blogs, News, and Announcements] | |
| 13 | + * [./event.wiki | Technical notes] | |
| 14 | 14 | * File and version lists and differences |
| 15 | 15 | * Download historical versions as ZIP archives |
| 16 | 16 | * Historical change data |
| 17 | 17 | * Add and remove tags on checkins |
| 18 | 18 | * Move checkins between branches |
| 19 | 19 | * Revise checkin comments |
| 20 | 20 | * Manage user credentials and access permissions |
| 21 | - * And so forth... | |
| 21 | + * And so forth... (some [./webpage-ex.md|examples]) | |
| 22 | 22 | |
| 23 | 23 | You get all of this, and more, for free when you use Fossil. |
| 24 | 24 | There are no extra programs to install or setup. |
| 25 | 25 | Everything you need is already pre-configured and built into the |
| 26 | 26 | self-contained, stand-alone Fossil executable. |
| 27 | 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 | 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 |