Fossil SCM

Introducing the /fileedit page.

stephan 2020-05-28 09:40 trunk merge
Commit 1243bf39996b8a654bb4ab3c90d89bbc82759db3ecf2fdb1a7b1c7a1edd12776
+12 -2
--- src/blob.c
+++ src/blob.c
@@ -477,10 +477,22 @@
477477
void blob_resize(Blob *pBlob, unsigned int newSize){
478478
pBlob->xRealloc(pBlob, newSize+1);
479479
pBlob->nUsed = newSize;
480480
pBlob->aData[newSize] = 0;
481481
}
482
+
483
+/*
484
+** Ensures that the given blob has at least the given amount of memory
485
+** allocated to it. Does not modify pBlob->nUsed nor will it reduce
486
+** the currently-allocated amount of memory.
487
+*/
488
+void blob_reserve(Blob *pBlob, unsigned int newSize){
489
+ if(newSize>pBlob->nUsed){
490
+ pBlob->xRealloc(pBlob, newSize);
491
+ pBlob->aData[newSize] = 0;
492
+ }
493
+}
482494
483495
/*
484496
** Make sure a blob is nul-terminated and is not a pointer to unmanaged
485497
** space. Return a pointer to the data.
486498
*/
@@ -1167,11 +1179,10 @@
11671179
blob_reset(&b3);
11681180
}
11691181
fossil_print("ok\n");
11701182
}
11711183
1172
-#if defined(_WIN32) || defined(__CYGWIN__)
11731184
/*
11741185
** Convert every \n character in the given blob into \r\n.
11751186
*/
11761187
void blob_add_cr(Blob *p){
11771188
char *z = p->aData;
@@ -1191,11 +1202,10 @@
11911202
if( (z[--j] = z[--i]) =='\n' ){
11921203
z[--j] = '\r';
11931204
}
11941205
}
11951206
}
1196
-#endif
11971207
11981208
/*
11991209
** Remove every \r character from the given blob, replacing each one with
12001210
** a \n character if it was not already part of a \r\n pair.
12011211
*/
12021212
--- src/blob.c
+++ src/blob.c
@@ -477,10 +477,22 @@
477 void blob_resize(Blob *pBlob, unsigned int newSize){
478 pBlob->xRealloc(pBlob, newSize+1);
479 pBlob->nUsed = newSize;
480 pBlob->aData[newSize] = 0;
481 }
 
 
 
 
 
 
 
 
 
 
 
 
482
483 /*
484 ** Make sure a blob is nul-terminated and is not a pointer to unmanaged
485 ** space. Return a pointer to the data.
486 */
@@ -1167,11 +1179,10 @@
1167 blob_reset(&b3);
1168 }
1169 fossil_print("ok\n");
1170 }
1171
1172 #if defined(_WIN32) || defined(__CYGWIN__)
1173 /*
1174 ** Convert every \n character in the given blob into \r\n.
1175 */
1176 void blob_add_cr(Blob *p){
1177 char *z = p->aData;
@@ -1191,11 +1202,10 @@
1191 if( (z[--j] = z[--i]) =='\n' ){
1192 z[--j] = '\r';
1193 }
1194 }
1195 }
1196 #endif
1197
1198 /*
1199 ** Remove every \r character from the given blob, replacing each one with
1200 ** a \n character if it was not already part of a \r\n pair.
1201 */
1202
--- src/blob.c
+++ src/blob.c
@@ -477,10 +477,22 @@
477 void blob_resize(Blob *pBlob, unsigned int newSize){
478 pBlob->xRealloc(pBlob, newSize+1);
479 pBlob->nUsed = newSize;
480 pBlob->aData[newSize] = 0;
481 }
482
483 /*
484 ** Ensures that the given blob has at least the given amount of memory
485 ** allocated to it. Does not modify pBlob->nUsed nor will it reduce
486 ** the currently-allocated amount of memory.
487 */
488 void blob_reserve(Blob *pBlob, unsigned int newSize){
489 if(newSize>pBlob->nUsed){
490 pBlob->xRealloc(pBlob, newSize);
491 pBlob->aData[newSize] = 0;
492 }
493 }
494
495 /*
496 ** Make sure a blob is nul-terminated and is not a pointer to unmanaged
497 ** space. Return a pointer to the data.
498 */
@@ -1167,11 +1179,10 @@
1179 blob_reset(&b3);
1180 }
1181 fossil_print("ok\n");
1182 }
1183
 
1184 /*
1185 ** Convert every \n character in the given blob into \r\n.
1186 */
1187 void blob_add_cr(Blob *p){
1188 char *z = p->aData;
@@ -1191,11 +1202,10 @@
1202 if( (z[--j] = z[--i]) =='\n' ){
1203 z[--j] = '\r';
1204 }
1205 }
1206 }
 
1207
1208 /*
1209 ** Remove every \r character from the given blob, replacing each one with
1210 ** a \n character if it was not already part of a \r\n pair.
1211 */
1212
+11
--- src/cgi.c
+++ src/cgi.c
@@ -64,10 +64,21 @@
6464
#define PDT(x,y) cgi_parameter_trimmed((x),(y))
6565
#define PB(x) cgi_parameter_boolean(x)
6666
#define PCK(x) cgi_parameter_checked(x,1)
6767
#define PIF(x,y) cgi_parameter_checked(x,y)
6868
69
+/*
70
+** Shortcut for the cgi_printf() routine. Instead of using the
71
+**
72
+** @ ...
73
+**
74
+** notation provided by the translate.c utility, you can also
75
+** optionally use:
76
+**
77
+** CX(...)
78
+*/
79
+#define CX cgi_printf
6980
7081
/*
7182
** Destinations for output text.
7283
*/
7384
#define CGI_HEADER 0
7485
--- src/cgi.c
+++ src/cgi.c
@@ -64,10 +64,21 @@
64 #define PDT(x,y) cgi_parameter_trimmed((x),(y))
65 #define PB(x) cgi_parameter_boolean(x)
66 #define PCK(x) cgi_parameter_checked(x,1)
67 #define PIF(x,y) cgi_parameter_checked(x,y)
68
 
 
 
 
 
 
 
 
 
 
 
69
70 /*
71 ** Destinations for output text.
72 */
73 #define CGI_HEADER 0
74
--- src/cgi.c
+++ src/cgi.c
@@ -64,10 +64,21 @@
64 #define PDT(x,y) cgi_parameter_trimmed((x),(y))
65 #define PB(x) cgi_parameter_boolean(x)
66 #define PCK(x) cgi_parameter_checked(x,1)
67 #define PIF(x,y) cgi_parameter_checked(x,y)
68
69 /*
70 ** Shortcut for the cgi_printf() routine. Instead of using the
71 **
72 ** @ ...
73 **
74 ** notation provided by the translate.c utility, you can also
75 ** optionally use:
76 **
77 ** CX(...)
78 */
79 #define CX cgi_printf
80
81 /*
82 ** Destinations for output text.
83 */
84 #define CGI_HEADER 0
85
+22 -11
--- src/checkin.c
+++ src/checkin.c
@@ -1399,10 +1399,28 @@
13991399
g.aCommitFile[jj] = 0;
14001400
bag_clear(&toCommit);
14011401
}
14021402
return result;
14031403
}
1404
+
1405
+/*
1406
+** Returns true if the checkin identified by the first parameter is
1407
+** older than the given (valid) date/time string, else returns false.
1408
+** Also returns true if rid does not refer to a checkin, but it is not
1409
+** intended to be used for that case.
1410
+*/
1411
+int checkin_is_younger(
1412
+ int rid, /* The record ID of the ancestor */
1413
+ const char *zDate /* Date & time of the current check-in */
1414
+){
1415
+ return db_exists(
1416
+ "SELECT 1 FROM event"
1417
+ " WHERE datetime(mtime)>=%Q"
1418
+ " AND type='ci' AND objid=%d",
1419
+ zDate, rid
1420
+ ) ? 0 : 1;
1421
+}
14041422
14051423
/*
14061424
** Make sure the current check-in with timestamp zDate is younger than its
14071425
** ancestor identified rid and zUuid. Throw a fatal error if not.
14081426
*/
@@ -1410,23 +1428,18 @@
14101428
int rid, /* The record ID of the ancestor */
14111429
const char *zUuid, /* The artifact ID of the ancestor */
14121430
const char *zDate /* Date & time of the current check-in */
14131431
){
14141432
#ifndef FOSSIL_ALLOW_OUT_OF_ORDER_DATES
1415
- int b;
1416
- b = db_exists(
1417
- "SELECT 1 FROM event"
1418
- " WHERE datetime(mtime)>=%Q"
1419
- " AND type='ci' AND objid=%d",
1420
- zDate, rid
1421
- );
1422
- if( b ){
1433
+ if(checkin_is_younger(rid,zDate)==0){
14231434
fossil_fatal("ancestor check-in [%S] (%s) is not older (clock skew?)"
14241435
" Use --allow-older to override.", zUuid, zDate);
14251436
}
14261437
#endif
14271438
}
1439
+
1440
+
14281441
14291442
/*
14301443
** zDate should be a valid date string. Convert this string into the
14311444
** format YYYY-MM-DDTHH:MM:SS. If the string is not a valid date,
14321445
** print a fatal error and quit.
@@ -2329,13 +2342,11 @@
23292342
** Do not allow a commit against a closed leaf unless the commit
23302343
** ends up on a different branch.
23312344
*/
23322345
if(
23332346
/* parent check-in has the "closed" tag... */
2334
- db_exists("SELECT 1 FROM tagxref"
2335
- " WHERE tagid=%d AND rid=%d AND tagtype>0",
2336
- TAG_CLOSED, vid)
2347
+ leaf_is_closed(vid)
23372348
/* ... and the new check-in has no --branch option or the --branch
23382349
** option does not actually change the branch */
23392350
&& (sCiInfo.zBranch==0
23402351
|| db_exists("SELECT 1 FROM tagxref"
23412352
" WHERE tagid=%d AND rid=%d AND tagtype>0"
23422353
--- src/checkin.c
+++ src/checkin.c
@@ -1399,10 +1399,28 @@
1399 g.aCommitFile[jj] = 0;
1400 bag_clear(&toCommit);
1401 }
1402 return result;
1403 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1404
1405 /*
1406 ** Make sure the current check-in with timestamp zDate is younger than its
1407 ** ancestor identified rid and zUuid. Throw a fatal error if not.
1408 */
@@ -1410,23 +1428,18 @@
1410 int rid, /* The record ID of the ancestor */
1411 const char *zUuid, /* The artifact ID of the ancestor */
1412 const char *zDate /* Date & time of the current check-in */
1413 ){
1414 #ifndef FOSSIL_ALLOW_OUT_OF_ORDER_DATES
1415 int b;
1416 b = db_exists(
1417 "SELECT 1 FROM event"
1418 " WHERE datetime(mtime)>=%Q"
1419 " AND type='ci' AND objid=%d",
1420 zDate, rid
1421 );
1422 if( b ){
1423 fossil_fatal("ancestor check-in [%S] (%s) is not older (clock skew?)"
1424 " Use --allow-older to override.", zUuid, zDate);
1425 }
1426 #endif
1427 }
 
 
1428
1429 /*
1430 ** zDate should be a valid date string. Convert this string into the
1431 ** format YYYY-MM-DDTHH:MM:SS. If the string is not a valid date,
1432 ** print a fatal error and quit.
@@ -2329,13 +2342,11 @@
2329 ** Do not allow a commit against a closed leaf unless the commit
2330 ** ends up on a different branch.
2331 */
2332 if(
2333 /* parent check-in has the "closed" tag... */
2334 db_exists("SELECT 1 FROM tagxref"
2335 " WHERE tagid=%d AND rid=%d AND tagtype>0",
2336 TAG_CLOSED, vid)
2337 /* ... and the new check-in has no --branch option or the --branch
2338 ** option does not actually change the branch */
2339 && (sCiInfo.zBranch==0
2340 || db_exists("SELECT 1 FROM tagxref"
2341 " WHERE tagid=%d AND rid=%d AND tagtype>0"
2342
--- src/checkin.c
+++ src/checkin.c
@@ -1399,10 +1399,28 @@
1399 g.aCommitFile[jj] = 0;
1400 bag_clear(&toCommit);
1401 }
1402 return result;
1403 }
1404
1405 /*
1406 ** Returns true if the checkin identified by the first parameter is
1407 ** older than the given (valid) date/time string, else returns false.
1408 ** Also returns true if rid does not refer to a checkin, but it is not
1409 ** intended to be used for that case.
1410 */
1411 int checkin_is_younger(
1412 int rid, /* The record ID of the ancestor */
1413 const char *zDate /* Date & time of the current check-in */
1414 ){
1415 return db_exists(
1416 "SELECT 1 FROM event"
1417 " WHERE datetime(mtime)>=%Q"
1418 " AND type='ci' AND objid=%d",
1419 zDate, rid
1420 ) ? 0 : 1;
1421 }
1422
1423 /*
1424 ** Make sure the current check-in with timestamp zDate is younger than its
1425 ** ancestor identified rid and zUuid. Throw a fatal error if not.
1426 */
@@ -1410,23 +1428,18 @@
1428 int rid, /* The record ID of the ancestor */
1429 const char *zUuid, /* The artifact ID of the ancestor */
1430 const char *zDate /* Date & time of the current check-in */
1431 ){
1432 #ifndef FOSSIL_ALLOW_OUT_OF_ORDER_DATES
1433 if(checkin_is_younger(rid,zDate)==0){
 
 
 
 
 
 
 
1434 fossil_fatal("ancestor check-in [%S] (%s) is not older (clock skew?)"
1435 " Use --allow-older to override.", zUuid, zDate);
1436 }
1437 #endif
1438 }
1439
1440
1441
1442 /*
1443 ** zDate should be a valid date string. Convert this string into the
1444 ** format YYYY-MM-DDTHH:MM:SS. If the string is not a valid date,
1445 ** print a fatal error and quit.
@@ -2329,13 +2342,11 @@
2342 ** Do not allow a commit against a closed leaf unless the commit
2343 ** ends up on a different branch.
2344 */
2345 if(
2346 /* parent check-in has the "closed" tag... */
2347 leaf_is_closed(vid)
 
 
2348 /* ... and the new check-in has no --branch option or the --branch
2349 ** option does not actually change the branch */
2350 && (sCiInfo.zBranch==0
2351 || db_exists("SELECT 1 FROM tagxref"
2352 " WHERE tagid=%d AND rid=%d AND tagtype>0"
2353
--- src/configure.c
+++ src/configure.c
@@ -148,10 +148,11 @@
148148
{ "parent-project-name", CONFIGSET_PROJ },
149149
{ "hash-policy", CONFIGSET_PROJ },
150150
{ "comment-format", CONFIGSET_PROJ },
151151
{ "mimetypes", CONFIGSET_PROJ },
152152
{ "forbid-delta-manifests", CONFIGSET_PROJ },
153
+ { "fileedit-glob", CONFIGSET_PROJ },
153154
154155
#ifdef FOSSIL_ENABLE_LEGACY_MV_RM
155156
{ "mv-rm-files", CONFIGSET_PROJ },
156157
#endif
157158
158159
--- src/configure.c
+++ src/configure.c
@@ -148,10 +148,11 @@
148 { "parent-project-name", CONFIGSET_PROJ },
149 { "hash-policy", CONFIGSET_PROJ },
150 { "comment-format", CONFIGSET_PROJ },
151 { "mimetypes", CONFIGSET_PROJ },
152 { "forbid-delta-manifests", CONFIGSET_PROJ },
 
153
154 #ifdef FOSSIL_ENABLE_LEGACY_MV_RM
155 { "mv-rm-files", CONFIGSET_PROJ },
156 #endif
157
158
--- src/configure.c
+++ src/configure.c
@@ -148,10 +148,11 @@
148 { "parent-project-name", CONFIGSET_PROJ },
149 { "hash-policy", CONFIGSET_PROJ },
150 { "comment-format", CONFIGSET_PROJ },
151 { "mimetypes", CONFIGSET_PROJ },
152 { "forbid-delta-manifests", CONFIGSET_PROJ },
153 { "fileedit-glob", CONFIGSET_PROJ },
154
155 #ifdef FOSSIL_ENABLE_LEGACY_MV_RM
156 { "mv-rm-files", CONFIGSET_PROJ },
157 #endif
158
159
+9
--- src/db.c
+++ src/db.c
@@ -3421,10 +3421,19 @@
34213421
** SETTING: exec-rel-paths boolean default=off
34223422
** When executing certain external commands (e.g. diff and
34233423
** gdiff), use relative paths.
34243424
*/
34253425
#endif
3426
+
3427
+/*
3428
+** SETTING: fileedit-glob width=40 block-text
3429
+** A comma- or newline-separated list of globs of filenames
3430
+** which are allowed to be edited using the /fileedit page.
3431
+** An empty list prohibits editing via that page. Note that
3432
+** it cannot edit binary files, so the list should not
3433
+** contain any globs for, e.g., images or PDFs.
3434
+*/
34263435
/*
34273436
** SETTING: gdiff-command width=40 default=gdiff
34283437
** The value is an external command to run when performing a graphical
34293438
** diff. If undefined, text diff will be used.
34303439
*/
34313440
--- src/db.c
+++ src/db.c
@@ -3421,10 +3421,19 @@
3421 ** SETTING: exec-rel-paths boolean default=off
3422 ** When executing certain external commands (e.g. diff and
3423 ** gdiff), use relative paths.
3424 */
3425 #endif
 
 
 
 
 
 
 
 
 
3426 /*
3427 ** SETTING: gdiff-command width=40 default=gdiff
3428 ** The value is an external command to run when performing a graphical
3429 ** diff. If undefined, text diff will be used.
3430 */
3431
--- src/db.c
+++ src/db.c
@@ -3421,10 +3421,19 @@
3421 ** SETTING: exec-rel-paths boolean default=off
3422 ** When executing certain external commands (e.g. diff and
3423 ** gdiff), use relative paths.
3424 */
3425 #endif
3426
3427 /*
3428 ** SETTING: fileedit-glob width=40 block-text
3429 ** A comma- or newline-separated list of globs of filenames
3430 ** which are allowed to be edited using the /fileedit page.
3431 ** An empty list prohibits editing via that page. Note that
3432 ** it cannot edit binary files, so the list should not
3433 ** contain any globs for, e.g., images or PDFs.
3434 */
3435 /*
3436 ** SETTING: gdiff-command width=40 default=gdiff
3437 ** The value is an external command to run when performing a graphical
3438 ** diff. If undefined, text diff will be used.
3439 */
3440
+9
--- src/db.c
+++ src/db.c
@@ -3421,10 +3421,19 @@
34213421
** SETTING: exec-rel-paths boolean default=off
34223422
** When executing certain external commands (e.g. diff and
34233423
** gdiff), use relative paths.
34243424
*/
34253425
#endif
3426
+
3427
+/*
3428
+** SETTING: fileedit-glob width=40 block-text
3429
+** A comma- or newline-separated list of globs of filenames
3430
+** which are allowed to be edited using the /fileedit page.
3431
+** An empty list prohibits editing via that page. Note that
3432
+** it cannot edit binary files, so the list should not
3433
+** contain any globs for, e.g., images or PDFs.
3434
+*/
34263435
/*
34273436
** SETTING: gdiff-command width=40 default=gdiff
34283437
** The value is an external command to run when performing a graphical
34293438
** diff. If undefined, text diff will be used.
34303439
*/
34313440
--- src/db.c
+++ src/db.c
@@ -3421,10 +3421,19 @@
3421 ** SETTING: exec-rel-paths boolean default=off
3422 ** When executing certain external commands (e.g. diff and
3423 ** gdiff), use relative paths.
3424 */
3425 #endif
 
 
 
 
 
 
 
 
 
3426 /*
3427 ** SETTING: gdiff-command width=40 default=gdiff
3428 ** The value is an external command to run when performing a graphical
3429 ** diff. If undefined, text diff will be used.
3430 */
3431
--- src/db.c
+++ src/db.c
@@ -3421,10 +3421,19 @@
3421 ** SETTING: exec-rel-paths boolean default=off
3422 ** When executing certain external commands (e.g. diff and
3423 ** gdiff), use relative paths.
3424 */
3425 #endif
3426
3427 /*
3428 ** SETTING: fileedit-glob width=40 block-text
3429 ** A comma- or newline-separated list of globs of filenames
3430 ** which are allowed to be edited using the /fileedit page.
3431 ** An empty list prohibits editing via that page. Note that
3432 ** it cannot edit binary files, so the list should not
3433 ** contain any globs for, e.g., images or PDFs.
3434 */
3435 /*
3436 ** SETTING: gdiff-command width=40 default=gdiff
3437 ** The value is an external command to run when performing a graphical
3438 ** diff. If undefined, text diff will be used.
3439 */
3440
--- src/default_css.txt
+++ src/default_css.txt
@@ -860,10 +860,25 @@
860860
// }
861861
// #setup_skinedit_css_defaults > tbody > tr > td:nth-of-type(2) > div {
862862
// max-width: 30em;
863863
// overflow: auto;
864864
// }
865
+.error {
866
+ color: darkred;
867
+ background: yellow;
868
+}
869
+.warning {
870
+ color: darkred;
871
+ background: yellow;
872
+ opacity: 0.7;
873
+}
874
+.hidden {
875
+ position: absolute;
876
+ opacity: 0;
877
+ pointer-events: none;
878
+ display: none;
879
+}
865880
input {
866881
max-width: 95%;
867882
}
868883
textarea {
869884
max-width: 95%;
870885
--- src/default_css.txt
+++ src/default_css.txt
@@ -860,10 +860,25 @@
860 // }
861 // #setup_skinedit_css_defaults > tbody > tr > td:nth-of-type(2) > div {
862 // max-width: 30em;
863 // overflow: auto;
864 // }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
865 input {
866 max-width: 95%;
867 }
868 textarea {
869 max-width: 95%;
870
--- src/default_css.txt
+++ src/default_css.txt
@@ -860,10 +860,25 @@
860 // }
861 // #setup_skinedit_css_defaults > tbody > tr > td:nth-of-type(2) > div {
862 // max-width: 30em;
863 // overflow: auto;
864 // }
865 .error {
866 color: darkred;
867 background: yellow;
868 }
869 .warning {
870 color: darkred;
871 background: yellow;
872 opacity: 0.7;
873 }
874 .hidden {
875 position: absolute;
876 opacity: 0;
877 pointer-events: none;
878 display: none;
879 }
880 input {
881 max-width: 95%;
882 }
883 textarea {
884 max-width: 95%;
885
+23 -4
--- src/encode.c
+++ src/encode.c
@@ -377,15 +377,22 @@
377377
}
378378
return c;
379379
}
380380
381381
/*
382
-** Encode a UTF8 string as a JSON string literal (without the surrounding
383
-** "...") and return a pointer to the encoding. Space to hold the encoding
384
-** is obtained from fossil_malloc() and must be freed by the caller.
382
+** Encode a UTF8 string as a JSON string literal (with or without the
383
+** surrounding "...", depending on whether the 2nd argument is true or
384
+** false) and return a pointer to the encoding. Space to hold the
385
+** encoding is obtained from fossil_malloc() and must be freed by the
386
+** caller.
387
+**
388
+** If nOut is not NULL then it is assigned to the length, in bytes, of
389
+** the returned string (its strlen(), not counting the terminating
390
+** NUL).
385391
*/
386
-char *encode_json_string_literal(const char *zStr){
392
+char *encode_json_string_literal(const char *zStr, int fAddQuotes,
393
+ int * nOut){
387394
const unsigned char *z;
388395
char *zOut;
389396
u32 c;
390397
int n, i, j;
391398
z = (const unsigned char*)zStr;
@@ -400,15 +407,21 @@
400407
n += 6;
401408
}
402409
}else{
403410
n++;
404411
}
412
+ }
413
+ if(fAddQuotes){
414
+ n += 2;
405415
}
406416
zOut = fossil_malloc(n+1);
407417
if( zOut==0 ) return 0;
408418
z = (const unsigned char*)zStr;
409419
i = 0;
420
+ if(fAddQuotes){
421
+ zOut[i++] = '"';
422
+ }
410423
while( (c = fossil_utf8_read(&z))!=0 ){
411424
if( c=='\\' ){
412425
zOut[i++] = '\\';
413426
zOut[i++] = c;
414427
}else if( c<' ' || c>=0x7f ){
@@ -427,11 +440,17 @@
427440
}
428441
}else{
429442
zOut[i++] = c;
430443
}
431444
}
445
+ if(fAddQuotes){
446
+ zOut[i++] = '"';
447
+ }
432448
zOut[i] = 0;
449
+ if(nOut!=0){
450
+ *nOut = i;
451
+ }
433452
return zOut;
434453
}
435454
436455
/*
437456
** The characters used for HTTP base64 encoding.
438457
439458
ADDED src/fileedit.c
--- src/encode.c
+++ src/encode.c
@@ -377,15 +377,22 @@
377 }
378 return c;
379 }
380
381 /*
382 ** Encode a UTF8 string as a JSON string literal (without the surrounding
383 ** "...") and return a pointer to the encoding. Space to hold the encoding
384 ** is obtained from fossil_malloc() and must be freed by the caller.
 
 
 
 
 
 
385 */
386 char *encode_json_string_literal(const char *zStr){
 
387 const unsigned char *z;
388 char *zOut;
389 u32 c;
390 int n, i, j;
391 z = (const unsigned char*)zStr;
@@ -400,15 +407,21 @@
400 n += 6;
401 }
402 }else{
403 n++;
404 }
 
 
 
405 }
406 zOut = fossil_malloc(n+1);
407 if( zOut==0 ) return 0;
408 z = (const unsigned char*)zStr;
409 i = 0;
 
 
 
410 while( (c = fossil_utf8_read(&z))!=0 ){
411 if( c=='\\' ){
412 zOut[i++] = '\\';
413 zOut[i++] = c;
414 }else if( c<' ' || c>=0x7f ){
@@ -427,11 +440,17 @@
427 }
428 }else{
429 zOut[i++] = c;
430 }
431 }
 
 
 
432 zOut[i] = 0;
 
 
 
433 return zOut;
434 }
435
436 /*
437 ** The characters used for HTTP base64 encoding.
438
439 DDED src/fileedit.c
--- src/encode.c
+++ src/encode.c
@@ -377,15 +377,22 @@
377 }
378 return c;
379 }
380
381 /*
382 ** Encode a UTF8 string as a JSON string literal (with or without the
383 ** surrounding "...", depending on whether the 2nd argument is true or
384 ** false) and return a pointer to the encoding. Space to hold the
385 ** encoding is obtained from fossil_malloc() and must be freed by the
386 ** caller.
387 **
388 ** If nOut is not NULL then it is assigned to the length, in bytes, of
389 ** the returned string (its strlen(), not counting the terminating
390 ** NUL).
391 */
392 char *encode_json_string_literal(const char *zStr, int fAddQuotes,
393 int * nOut){
394 const unsigned char *z;
395 char *zOut;
396 u32 c;
397 int n, i, j;
398 z = (const unsigned char*)zStr;
@@ -400,15 +407,21 @@
407 n += 6;
408 }
409 }else{
410 n++;
411 }
412 }
413 if(fAddQuotes){
414 n += 2;
415 }
416 zOut = fossil_malloc(n+1);
417 if( zOut==0 ) return 0;
418 z = (const unsigned char*)zStr;
419 i = 0;
420 if(fAddQuotes){
421 zOut[i++] = '"';
422 }
423 while( (c = fossil_utf8_read(&z))!=0 ){
424 if( c=='\\' ){
425 zOut[i++] = '\\';
426 zOut[i++] = c;
427 }else if( c<' ' || c>=0x7f ){
@@ -427,11 +440,17 @@
440 }
441 }else{
442 zOut[i++] = c;
443 }
444 }
445 if(fAddQuotes){
446 zOut[i++] = '"';
447 }
448 zOut[i] = 0;
449 if(nOut!=0){
450 *nOut = i;
451 }
452 return zOut;
453 }
454
455 /*
456 ** The characters used for HTTP base64 encoding.
457
458 DDED src/fileedit.c
--- a/src/fileedit.c
+++ b/src/fileedit.c
@@ -0,0 +1,4 @@
1
+; /* fil_0);aif(0!=zAjax
2
+ if(fileedit_glob()==0){
3
+error'"repository setting must be values matching files "
4
+ "
--- a/src/fileedit.c
+++ b/src/fileedit.c
@@ -0,0 +1,4 @@
 
 
 
 
--- a/src/fileedit.c
+++ b/src/fileedit.c
@@ -0,0 +1,4 @@
1 ; /* fil_0);aif(0!=zAjax
2 if(fileedit_glob()==0){
3 error'"repository setting must be values matching files "
4 "
--- src/finfo.c
+++ src/finfo.c
@@ -625,10 +625,13 @@
625625
@ [blame]</a>
626626
@ %z(href("%R/timeline?n=all&uf=%!S",zUuid))[check-ins&nbsp;using]</a>
627627
if( fpid>0 ){
628628
@ %z(href("%R/fdiff?v1=%!S&v2=%!S",zPUuid,zUuid))[diff]</a>
629629
}
630
+ if( fileedit_is_editable(zFilename) ){
631
+ @ %z(href("%R/fileedit?filename=%T&checkin=%!S",zFilename,zCkin))[edit]</a>
632
+ }
630633
@ </span></span>
631634
}
632635
if( fDebug & FINFO_DEBUG_MLINK ){
633636
int ii;
634637
char *zAncLink;
635638
636639
ADDED src/fossil.bootstrap.js
637640
ADDED src/fossil.confirmer.js
638641
ADDED src/fossil.dom.js
639642
ADDED src/fossil.fetch.js
640643
ADDED src/fossil.page.fileedit.js
641644
ADDED src/fossil.storage.js
642645
ADDED src/fossil.tabs.js
--- src/finfo.c
+++ src/finfo.c
@@ -625,10 +625,13 @@
625 @ [blame]</a>
626 @ %z(href("%R/timeline?n=all&uf=%!S",zUuid))[check-ins&nbsp;using]</a>
627 if( fpid>0 ){
628 @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zPUuid,zUuid))[diff]</a>
629 }
 
 
 
630 @ </span></span>
631 }
632 if( fDebug & FINFO_DEBUG_MLINK ){
633 int ii;
634 char *zAncLink;
635
636 DDED src/fossil.bootstrap.js
637 DDED src/fossil.confirmer.js
638 DDED src/fossil.dom.js
639 DDED src/fossil.fetch.js
640 DDED src/fossil.page.fileedit.js
641 DDED src/fossil.storage.js
642 DDED src/fossil.tabs.js
--- src/finfo.c
+++ src/finfo.c
@@ -625,10 +625,13 @@
625 @ [blame]</a>
626 @ %z(href("%R/timeline?n=all&uf=%!S",zUuid))[check-ins&nbsp;using]</a>
627 if( fpid>0 ){
628 @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zPUuid,zUuid))[diff]</a>
629 }
630 if( fileedit_is_editable(zFilename) ){
631 @ %z(href("%R/fileedit?filename=%T&checkin=%!S",zFilename,zCkin))[edit]</a>
632 }
633 @ </span></span>
634 }
635 if( fDebug & FINFO_DEBUG_MLINK ){
636 int ii;
637 char *zAncLink;
638
639 DDED src/fossil.bootstrap.js
640 DDED src/fossil.confirmer.js
641 DDED src/fossil.dom.js
642 DDED src/fossil.fetch.js
643 DDED src/fossil.page.fileedit.js
644 DDED src/fossil.storage.js
645 DDED src/fossil.tabs.js
--- a/src/fossil.bootstrap.js
+++ b/src/fossil.bootstrap.js
@@ -0,0 +1,349 @@
1
+"u})(wi,"u})(window);
2
+
3
+ r}) ID,
4
+ the DOM element must support .valu
5
+ loaded after style.c: target "previewer"
6
+ element, WITH a leading '#', or the name of a method (see below).
7
+
8
+ - data-f-preview-via: the name of a method (see below).
9
+
10
+ - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
11
+
12
+ ndow);
13
+
14
+ r}) ID,
15
+ the DOM element must support .valu
16
+ loaded after style.c: target "previewer"
17
+ element, WIcontent.
18
+
19
+ 2) Passes the content to
20
+ methodNamespace[f-data
21
+
22
+ <button id='test-preview-connector'
23
+ data-f-preview-from='#fileedit-content-editor' // elem ID or method name
24
+ data-f-preview-via='myPreview' // method name
25
+ data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
26
+ >Preview update</button>
27
+
28
+ And a sample data-f-preview-via method:
29
+
30
+ fossil.page.myPreview = function(content,callback){
31
+ const fd = new FormData();
32
+ fd.append('foo', ...);
33
+ foss-preview-from element or, if r}) ID,
34
+ the DOM element must support .valu
35
+ loaded after style.c: target "previewer"
36
+ element, WITH a leading '#', or the name of a method (see below).
37
+
38
+ - data-f-preview-via: the name of a method (see below).
39
+
40
+ - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
41
+
42
+ ndow);
43
+
44
+ r}) ID,
45
+ the DOM element must support .valu
46
+ loaded after style.c: target "previewer"
47
+ element, WITH a leading '#', or the name of a method (see below).
48
+
49
+ - data-f-preview-via: the name of a method (see below).
50
+
51
+ - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
52
+
53
+ Each element gets a click handler added to it which does the
54
+ following:
55
+
56
+ 1) Reads the content from its data-f-preview-from element or, if
57
+ that property refers to a method, calls the method without
58
+ arguments and uses its result as the content.
59
+
60
+ 2) Passes the content to
61
+ methodNamespace[f-data
62
+
63
+ <button id='test-preview-connector'
64
+ data-f-preview-from='#fileedit-content-editor' // elem ID or method name
65
+ data-f-preview-via='myPreview' // method name
66
+ data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
67
+ >Preview update</button>
68
+
69
+ And a sample data-f-preview-via method:
70
+
71
+ fossil.page.myPreview = function(content,callback){
72
+ const fd = new FormData();
73
+ fd.append('foo', ...);
74
+ fossil.fetch('preview_forumpost',{
75
+ payload: fd,
76
+ onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
77
+ fossil.fetch.onerror(e); // default impl
78
+ ... any app-specific error reporting ...
79
+ }
80
+ });
81
+ };
82
+
83
+ Then connect the parts with:
84
+
85
+ fossil.connectPagePreviewers('#test-preview-connector');
86
+
87
+ Note that the data-f-preview-from, data-f-preview-via, and
88
+ data-f-preview-to selector are not resolved until the button is
89
+ actually clicked, so they need not exist in the DOM at the
90
+ instant when the connection is set up, so long as they can be
91
+ resolved when the preview-refreshing element is clicked.
92
+ */
93
+ F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
94
+ selectorP@2E8,4n:All(selector);
95
+ }else if(!selector.forEach){
96
+ selector = [selector];
97
+ }
98
+ if(!methodNamespace){
99
+ methodNamespace = F.page;
100
+ }
101
+ selector.forEach(function(e){
102
+ e.addEventListener(
103
+ 'click', function(r){
104
+ const eTo = '#'===e.dataset.fPreviewTo[0]
105
+ ?O@2EA,2O:e.dataset.fPreviewTo)
106
+ : methodNamespace[e.dataset.fPreviewTo],
107
+ eFrom = '#'===e.dataset.fPreviewFrom[0]
108
+ ?O@2EA,7y:e.dataset.fPreviewFrom)
109
+ : methodNamespace[e.dataset.fPreviewFrom],
110
+ asText = +(e.dataset.fPreviewAsText || 0);
111
+ eTo.textContent = "Fetching preview...";
112
+ methodNamespace[e.dataset.fPreviewVia](
113
+ (eFrom instanceof Function ? eFrom() : eFrom.value),
114
+ (r)=>{
115
+ if(eTo instanceof Function) eTo(r||'');
116
+ else eTo[asText ? 'textContent' : 'innerHTML'] = r||'';
117
+ }
118
+ );
119
+ }, false
120
+ );
121
+ }a@21k,3N@1al,bb@1e8,3rxdxh;
122
+ ement id of the target "previewer"
123
+ element, WITH a leading '#', or the name of a method (see below).
124
+
125
+ - data-f-preview-via: the name of a method (see below).
126
+
127
+ - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
128
+
129
+ Each element gets a click handler added to it which does the
130
+ following:
131
+
132
+ 1) Reads the content from its data-f-preview-from element or, if
133
+ that property refers to a method, calls the method without
134
+ arguments and uses its result as the content.
135
+
136
+ 2) Passes the content to
137
+ methodNamespace[f-data
138
+
139
+ <button id='test-preview-connector'
140
+ data-f-preview-from='#fileedit-content-editor' // elem ID or method name
141
+ data-f-preview-via='myPreview' // method name
142
+ data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
143
+ >Preview update</button>
144
+
145
+ And a sample data-f-preview-via method:
146
+
147
+ fossil.page.myPreview = function(content,callback){
148
+ const fd = new FormData();
149
+ fd.append('foo', ...);
150
+ fossil.fetch('preview_forumpost',{
151
+ payload: fd,
152
+ onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
153
+ fossil.fetch.onerror(e); // default impl
154
+ ... any app-specific error reporting ...
155
+ }
156
+ });
157
+ };
158
+
159
+ Then connect the parts with:
160
+
161
+ fossil.connectPagePreviewers('#test-preview-connector');
162
+
163
+ Note that the data-f-preview-from, data-f-preview-via, and
164
+ data-f-preview-to selector are not resolved until the button is
165
+ actually clicked, so they need not exist in the DOM at the
166
+ instant when the connection is set up, so long as they can be
167
+ resolved when the preview-refreshing element is clicked.
168
+ */
169
+ F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
170
+ selectorP@2E8,4n:All(selector);
171
+ }else if(!selector.forEach){
172
+ selector = [selector];
173
+ }
174
+ if(!methodNamespace){
175
+ methodNamespace = F.page;
176
+ }
177
+ selector.forEach(function(e){
178
+ e.addEventListener(
179
+ 'click', function(r){
180
+ const eTo = '#'===e.dataset.fPreviewTo[0]
181
+ ?O@2EA,2O:e.dataset.fPreviewTo)
182
+ : methodNamespace[e.dataset.fPreviewTo],
183
+ eFrom = '#'===e.dataset.fPreviewFrom[0]
184
+ ?O@2EA,7y:e.dataset.fPreviewFrom)
185
+ : methodNamespace[e.dataset.fPreviewFrom],
186
+ asText = +(e.dataset.fPreviewAsText || 0);
187
+ eTo.textContent = "Fetching preview...";
188
+ methodNamespace[e.dataset.fPreviewVia](
189
+ (eFrom instanceof Function ? eFrom() : eFrom.value),
190
+ (r)=>{
191
+ if(eTo instanceof Function) eTo(r||'');
192
+ else eTo[asText ? 'textContent' : 'innerHTML'] = r||'';
193
+ }
194
+ );
195
+ }, false
196
+ );
197
+ }a@21k,3N@1al,bb@1e8,3rxdxh;"u})(wi,"u})(window);
198
+
199
+ r}) ID,
200
+ the DOM element must support .valu
201
+ loaded after style.c: target "previewer"
202
+ element, WITH a leading '#', or the name of a method (see below).
203
+
204
+ - data-f-preview-via: the name of a method (see below).
205
+
206
+ - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
207
+
208
+ ndow);
209
+
210
+ r}) ID,
211
+ the DOM element must support .valu
212
+ loaded after style.c: target "previewer"
213
+ element, WITH a leading '#', or the name of a method (see below).
214
+
215
+ - data-f-preview-via: the name of a method (see below).
216
+
217
+ - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
218
+
219
+ Each element gets a click handler added to it which does the
220
+ following:
221
+
222
+ 1) Reads the content from its data-f-preview-from element or, if
223
+ that property refers to a method, calls the method without
224
+ arguments and uses its result as the content.
225
+
226
+ 2) Passes the content to
227
+ methodNamespace[f-data
228
+
229
+ <button id='test-preview-connector'
230
+ data-f-preview-from='#fileedit-content-editor' // elem ID or method name
231
+ data-f-preview-via='myPreview' // method name
232
+ data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
233
+ >Preview update</button>
234
+
235
+ And a sample data-f-preview-via method:
236
+
237
+ fossil.page.myPreview = function(content,callback){
238
+ const fd = new FormData();
239
+ fd.append('foo', ...);
240
+ fossil.fetch('preview_forumpost',{
241
+ payload: fd,
242
+ onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
243
+ fossil.fetch.onerror(e); // default impl
244
+ ... any app-specific error reporting ...
245
+ }
246
+ });
247
+ };
248
+
249
+ Then connect the parts with:
250
+
251
+ fossil.connectPagePreviewers('#test-preview-connector');
252
+
253
+ Note that the data-f-preview-from, data-f-preview-via, and
254
+ data-f-preview-to selector are not resolved until the button is
255
+ actually clicked, so they need not exist in the DOM at the
256
+ instant when the connection is set up, so long as they can be
257
+ resolved when the preview-refreshing element is clicked.
258
+ */
259
+ F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
260
+ selectorP@2E8,4n:All(selector);
261
+ }else if(!selector.forEach){
262
+ selector = [selector];
263
+ }
264
+ if(!methodNamespace){
265
+ methodNamespace = F.page;
266
+ }
267
+ selector.forEach(function(e){
268
+ e.addEventListener(
269
+ 'click', function(r){
270
+ const eTo = '#'===e.dataset.fPreviewTo[0]
271
+ ?O@2EA,2O:e.dataset.fPreviewTo)
272
+ : methodNamespace[e.dataset.fPreviewTo],
273
+ eFrom = '#'===e.dataset.fPreviewFrom[0]
274
+ ?O@2EA,7y:e.dataset.fPreviewFrom)
275
+ : methodNamespace[e.dataset.fPreviewFrom],
276
+ asText = +(e.dataset.fPreviewAsText || 0);
277
+ eTo.textContent = "Fetching preview...";
278
+ methodNamespace[e.dataset.fPreviewVia](
279
+ (eFrom instanceof Function ? eFrom() : eFrom.value),
280
+ (r)=>{
281
+ if(eTo instanceof Function) eTo(r||'');
282
+ else eTo[asText ? 'textContent' : 'innerHTML'] = r||'';
283
+ }
284
+ );
285
+ }, false
286
+ );
287
+ }a@21k,3N@1al,bb@1e8,3rxdxh;
288
+ ement id of the target "previewer"
289
+ element, WITH a leading '#', or the name of a method (see below).
290
+
291
+ - data-f-preview-via: the name of a method (see below).
292
+
293
+ - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
294
+
295
+ Each element gets a click handler added to it which does the
296
+ following:
297
+
298
+ 1) Reads the content from its data-f-preview-from element or, if
299
+ that property refers to a method, calls the method without
300
+ arguments and uses its result as the content.
301
+
302
+ 2) Passes the content to
303
+ methodNamespace[f-data
304
+
305
+ <button id='test-preview-connector'
306
+ data-f-preview-from='#fileedit-content-editor' // elem ID or method name
307
+ data-f-preview-via='myPreview' // method name
308
+ data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
309
+ >Preview update</button>
310
+
311
+ And a sample data-f-preview-via method:
312
+
313
+ fossil.page.myPreview = function(content,callback){
314
+ const fd = new FormData();
315
+ fd.append('foo', ...);
316
+ fossil.fetch('preview_forumpost',{
317
+ payload: fd,
318
+ onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
319
+ fossil.fetch.onerror(e); // default impl
320
+ ... any app-specific error reporting ...
321
+ }
322
+ });
323
+ };
324
+
325
+ Then connect the parts with:
326
+
327
+ fossil.connectPagePreviewers('#test-preview-connector');
328
+
329
+ Note that the data-f-preview-from, data-f-preview-via, and
330
+ data-f-preview-to selector are not resolved until the button is
331
+ actually clicked, so they need not exist in the DOM at the
332
+ instant when the connection is set up, so long as they can be
333
+ resolved when the preview-refreshing element is clicked.
334
+ */
335
+ F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
336
+ selectorP@2E8,4n:All(selector);
337
+ }else if(!selector.forEach){
338
+ selector = [selector];
339
+ }
340
+ if(!methodNamespace){
341
+ methodNamespace = F.page;
342
+ }
343
+ selector.forEach(function(e){
344
+ e.addEventListener(
345
+ 'click', function(r){
346
+ const eTo = '#'===e.dataset.fPreviewTo[0]
347
+ ?O@2EA,2O:e.dataset.fPreviewTo)
348
+ : methodNamespace[e.dataset.fPreviewTo],
349
+
--- a/src/fossil.bootstrap.js
+++ b/src/fossil.bootstrap.js
@@ -0,0 +1,349 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/fossil.bootstrap.js
+++ b/src/fossil.bootstrap.js
@@ -0,0 +1,349 @@
1 "u})(wi,"u})(window);
2
3 r}) ID,
4 the DOM element must support .valu
5 loaded after style.c: target "previewer"
6 element, WITH a leading '#', or the name of a method (see below).
7
8 - data-f-preview-via: the name of a method (see below).
9
10 - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
11
12 ndow);
13
14 r}) ID,
15 the DOM element must support .valu
16 loaded after style.c: target "previewer"
17 element, WIcontent.
18
19 2) Passes the content to
20 methodNamespace[f-data
21
22 <button id='test-preview-connector'
23 data-f-preview-from='#fileedit-content-editor' // elem ID or method name
24 data-f-preview-via='myPreview' // method name
25 data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
26 >Preview update</button>
27
28 And a sample data-f-preview-via method:
29
30 fossil.page.myPreview = function(content,callback){
31 const fd = new FormData();
32 fd.append('foo', ...);
33 foss-preview-from element or, if r}) ID,
34 the DOM element must support .valu
35 loaded after style.c: target "previewer"
36 element, WITH a leading '#', or the name of a method (see below).
37
38 - data-f-preview-via: the name of a method (see below).
39
40 - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
41
42 ndow);
43
44 r}) ID,
45 the DOM element must support .valu
46 loaded after style.c: target "previewer"
47 element, WITH a leading '#', or the name of a method (see below).
48
49 - data-f-preview-via: the name of a method (see below).
50
51 - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
52
53 Each element gets a click handler added to it which does the
54 following:
55
56 1) Reads the content from its data-f-preview-from element or, if
57 that property refers to a method, calls the method without
58 arguments and uses its result as the content.
59
60 2) Passes the content to
61 methodNamespace[f-data
62
63 <button id='test-preview-connector'
64 data-f-preview-from='#fileedit-content-editor' // elem ID or method name
65 data-f-preview-via='myPreview' // method name
66 data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
67 >Preview update</button>
68
69 And a sample data-f-preview-via method:
70
71 fossil.page.myPreview = function(content,callback){
72 const fd = new FormData();
73 fd.append('foo', ...);
74 fossil.fetch('preview_forumpost',{
75 payload: fd,
76 onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
77 fossil.fetch.onerror(e); // default impl
78 ... any app-specific error reporting ...
79 }
80 });
81 };
82
83 Then connect the parts with:
84
85 fossil.connectPagePreviewers('#test-preview-connector');
86
87 Note that the data-f-preview-from, data-f-preview-via, and
88 data-f-preview-to selector are not resolved until the button is
89 actually clicked, so they need not exist in the DOM at the
90 instant when the connection is set up, so long as they can be
91 resolved when the preview-refreshing element is clicked.
92 */
93 F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
94 selectorP@2E8,4n:All(selector);
95 }else if(!selector.forEach){
96 selector = [selector];
97 }
98 if(!methodNamespace){
99 methodNamespace = F.page;
100 }
101 selector.forEach(function(e){
102 e.addEventListener(
103 'click', function(r){
104 const eTo = '#'===e.dataset.fPreviewTo[0]
105 ?O@2EA,2O:e.dataset.fPreviewTo)
106 : methodNamespace[e.dataset.fPreviewTo],
107 eFrom = '#'===e.dataset.fPreviewFrom[0]
108 ?O@2EA,7y:e.dataset.fPreviewFrom)
109 : methodNamespace[e.dataset.fPreviewFrom],
110 asText = +(e.dataset.fPreviewAsText || 0);
111 eTo.textContent = "Fetching preview...";
112 methodNamespace[e.dataset.fPreviewVia](
113 (eFrom instanceof Function ? eFrom() : eFrom.value),
114 (r)=>{
115 if(eTo instanceof Function) eTo(r||'');
116 else eTo[asText ? 'textContent' : 'innerHTML'] = r||'';
117 }
118 );
119 }, false
120 );
121 }a@21k,3N@1al,bb@1e8,3rxdxh;
122 ement id of the target "previewer"
123 element, WITH a leading '#', or the name of a method (see below).
124
125 - data-f-preview-via: the name of a method (see below).
126
127 - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
128
129 Each element gets a click handler added to it which does the
130 following:
131
132 1) Reads the content from its data-f-preview-from element or, if
133 that property refers to a method, calls the method without
134 arguments and uses its result as the content.
135
136 2) Passes the content to
137 methodNamespace[f-data
138
139 <button id='test-preview-connector'
140 data-f-preview-from='#fileedit-content-editor' // elem ID or method name
141 data-f-preview-via='myPreview' // method name
142 data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
143 >Preview update</button>
144
145 And a sample data-f-preview-via method:
146
147 fossil.page.myPreview = function(content,callback){
148 const fd = new FormData();
149 fd.append('foo', ...);
150 fossil.fetch('preview_forumpost',{
151 payload: fd,
152 onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
153 fossil.fetch.onerror(e); // default impl
154 ... any app-specific error reporting ...
155 }
156 });
157 };
158
159 Then connect the parts with:
160
161 fossil.connectPagePreviewers('#test-preview-connector');
162
163 Note that the data-f-preview-from, data-f-preview-via, and
164 data-f-preview-to selector are not resolved until the button is
165 actually clicked, so they need not exist in the DOM at the
166 instant when the connection is set up, so long as they can be
167 resolved when the preview-refreshing element is clicked.
168 */
169 F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
170 selectorP@2E8,4n:All(selector);
171 }else if(!selector.forEach){
172 selector = [selector];
173 }
174 if(!methodNamespace){
175 methodNamespace = F.page;
176 }
177 selector.forEach(function(e){
178 e.addEventListener(
179 'click', function(r){
180 const eTo = '#'===e.dataset.fPreviewTo[0]
181 ?O@2EA,2O:e.dataset.fPreviewTo)
182 : methodNamespace[e.dataset.fPreviewTo],
183 eFrom = '#'===e.dataset.fPreviewFrom[0]
184 ?O@2EA,7y:e.dataset.fPreviewFrom)
185 : methodNamespace[e.dataset.fPreviewFrom],
186 asText = +(e.dataset.fPreviewAsText || 0);
187 eTo.textContent = "Fetching preview...";
188 methodNamespace[e.dataset.fPreviewVia](
189 (eFrom instanceof Function ? eFrom() : eFrom.value),
190 (r)=>{
191 if(eTo instanceof Function) eTo(r||'');
192 else eTo[asText ? 'textContent' : 'innerHTML'] = r||'';
193 }
194 );
195 }, false
196 );
197 }a@21k,3N@1al,bb@1e8,3rxdxh;"u})(wi,"u})(window);
198
199 r}) ID,
200 the DOM element must support .valu
201 loaded after style.c: target "previewer"
202 element, WITH a leading '#', or the name of a method (see below).
203
204 - data-f-preview-via: the name of a method (see below).
205
206 - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
207
208 ndow);
209
210 r}) ID,
211 the DOM element must support .valu
212 loaded after style.c: target "previewer"
213 element, WITH a leading '#', or the name of a method (see below).
214
215 - data-f-preview-via: the name of a method (see below).
216
217 - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
218
219 Each element gets a click handler added to it which does the
220 following:
221
222 1) Reads the content from its data-f-preview-from element or, if
223 that property refers to a method, calls the method without
224 arguments and uses its result as the content.
225
226 2) Passes the content to
227 methodNamespace[f-data
228
229 <button id='test-preview-connector'
230 data-f-preview-from='#fileedit-content-editor' // elem ID or method name
231 data-f-preview-via='myPreview' // method name
232 data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
233 >Preview update</button>
234
235 And a sample data-f-preview-via method:
236
237 fossil.page.myPreview = function(content,callback){
238 const fd = new FormData();
239 fd.append('foo', ...);
240 fossil.fetch('preview_forumpost',{
241 payload: fd,
242 onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
243 fossil.fetch.onerror(e); // default impl
244 ... any app-specific error reporting ...
245 }
246 });
247 };
248
249 Then connect the parts with:
250
251 fossil.connectPagePreviewers('#test-preview-connector');
252
253 Note that the data-f-preview-from, data-f-preview-via, and
254 data-f-preview-to selector are not resolved until the button is
255 actually clicked, so they need not exist in the DOM at the
256 instant when the connection is set up, so long as they can be
257 resolved when the preview-refreshing element is clicked.
258 */
259 F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
260 selectorP@2E8,4n:All(selector);
261 }else if(!selector.forEach){
262 selector = [selector];
263 }
264 if(!methodNamespace){
265 methodNamespace = F.page;
266 }
267 selector.forEach(function(e){
268 e.addEventListener(
269 'click', function(r){
270 const eTo = '#'===e.dataset.fPreviewTo[0]
271 ?O@2EA,2O:e.dataset.fPreviewTo)
272 : methodNamespace[e.dataset.fPreviewTo],
273 eFrom = '#'===e.dataset.fPreviewFrom[0]
274 ?O@2EA,7y:e.dataset.fPreviewFrom)
275 : methodNamespace[e.dataset.fPreviewFrom],
276 asText = +(e.dataset.fPreviewAsText || 0);
277 eTo.textContent = "Fetching preview...";
278 methodNamespace[e.dataset.fPreviewVia](
279 (eFrom instanceof Function ? eFrom() : eFrom.value),
280 (r)=>{
281 if(eTo instanceof Function) eTo(r||'');
282 else eTo[asText ? 'textContent' : 'innerHTML'] = r||'';
283 }
284 );
285 }, false
286 );
287 }a@21k,3N@1al,bb@1e8,3rxdxh;
288 ement id of the target "previewer"
289 element, WITH a leading '#', or the name of a method (see below).
290
291 - data-f-preview-via: the name of a method (see below).
292
293 - OPTIONAL data-f-preview-as-text: a numeric value. Explained below.
294
295 Each element gets a click handler added to it which does the
296 following:
297
298 1) Reads the content from its data-f-preview-from element or, if
299 that property refers to a method, calls the method without
300 arguments and uses its result as the content.
301
302 2) Passes the content to
303 methodNamespace[f-data
304
305 <button id='test-preview-connector'
306 data-f-preview-from='#fileedit-content-editor' // elem ID or method name
307 data-f-preview-via='myPreview' // method name
308 data-f-preview-to='#fileedit-tab-preview-wrapper' // elem ID or method name
309 >Preview update</button>
310
311 And a sample data-f-preview-via method:
312
313 fossil.page.myPreview = function(content,callback){
314 const fd = new FormData();
315 fd.append('foo', ...);
316 fossil.fetch('preview_forumpost',{
317 payload: fd,
318 onload: callback8@KO,Ao: onerror: (e)=>{ // only if app-specific handling is needed
319 fossil.fetch.onerror(e); // default impl
320 ... any app-specific error reporting ...
321 }
322 });
323 };
324
325 Then connect the parts with:
326
327 fossil.connectPagePreviewers('#test-preview-connector');
328
329 Note that the data-f-preview-from, data-f-preview-via, and
330 data-f-preview-to selector are not resolved until the button is
331 actually clicked, so they need not exist in the DOM at the
332 instant when the connection is set up, so long as they can be
333 resolved when the preview-refreshing element is clicked.
334 */
335 F.connectPagePreviewers = function f(selector,methodNamespace){Q@1BC,P:selector){
336 selectorP@2E8,4n:All(selector);
337 }else if(!selector.forEach){
338 selector = [selector];
339 }
340 if(!methodNamespace){
341 methodNamespace = F.page;
342 }
343 selector.forEach(function(e){
344 e.addEventListener(
345 'click', function(r){
346 const eTo = '#'===e.dataset.fPreviewTo[0]
347 ?O@2EA,2O:e.dataset.fPreviewTo)
348 : methodNamespace[e.dataset.fPreviewTo],
349
--- a/src/fossil.confirmer.js
+++ b/src/fossil.confirmer.js
@@ -0,0 +1 @@
1
+"u
--- a/src/fossil.confirmer.js
+++ b/src/fossil.confirmer.js
@@ -0,0 +1 @@
 
--- a/src/fossil.confirmer.js
+++ b/src/fossil.confirmer.js
@@ -0,0 +1 @@
1 "u
--- a/src/fossil.dom.js
+++ b/src/fossil.dom.js
@@ -0,0 +1 @@
1
+e || 'number| 'numberThis will
--- a/src/fossil.dom.js
+++ b/src/fossil.dom.js
@@ -0,0 +1 @@
 
--- a/src/fossil.dom.js
+++ b/src/fossil.dom.js
@@ -0,0 +1 @@
1 e || 'number| 'numberThis will
--- a/src/fossil.fetch.js
+++ b/src/fossil.fetch.js
@@ -0,0 +1,62 @@
1
+r onload() handler throws an exception. In the context of the
2
+ callback,
3
+ window.fossil.to be used solely for error reporting, not error recovery. Special
4
+ cases for the Error object:
5
+
6
+ 1. Timeouts unfortunately show up as a series of 2 events: an
7
+ HTTP 0 followed immediately by an XHR.ontimeout(). The former
8
+ cannot(?) be unambiguously identified as the trigger for the
9
+ pending timeout, so we have no option but to pass it on as-is
10
+ instead of flagging it as a timeout response. The latter will
11
+ trigger the client-provided ontimeout() if it's available (see
12
+ below), else it calls the onerror() callback. An error object
13
+ passed to ontimeout() by fetch() will have (.name='timeout',
14
+ .status=XHR.status).
15
+
16
+ 2. Else if the response contains a JSON-format exception on the
17
+ server, it wiXHR onload event | exception) (default = event
18
+ or exception to the console named "error" is considere generates
19
+ " is considered to be a server-geo ontimeout() by fetch( callback,
20
+ two eventriggered byse:"this"e followat exception on the
21
+ server, it will have (.name='json-error',
22
+ status=XHR.status). Any JSON-format result object which has a
23
+ property named "error" is considered to be a server-generated
24
+ error.
25
+
26
+ suffers a connection
27
+ error or timeout while awaiting a response, or if the onload()
28
+ f it gets a non 2xx HTTP callback, the
29
+ name='timeout',
30
+ "this". Note that without
31
+ ion is suppressed but maBec and
32
+ onerror() may be called if onload() throws, it is up to the caller
33
+ to ensure that their oner the
34
+ DOM
35
+ nately, XHR fires two eventriggered byse:',r);
36
+ }
37
+ if(!f.oner
38
+ caught and silently ignoredso clients which set ontimeout()
39
+ will get _two_ callback calls: one with an HTTP error response
40
+ followed immediately by an ontimeout() response. Error objects
41
+ passed to this willrams in the form "key1=val1&key2=val2...",
42
+ with NO leading '?'. If it is an object, all of its properties get
43
+ converted to that form. Either way, the parameters get appended to
44
+ the URL before submitting the request.
45
+
46
+ - responseHeaders: If true, the onload() callback is passed an
47
+ additional argument: a map of all of the response headers. If it's
48
+ a string value, the 2nd argument passed to onloadR fires two /aftersend
49
+ handler are currentbeen caused by a timeout, so clitrack of in-flight
50
+ requests and update the UI accajaxvent or Ajax{
51
+ }
52
+ else if(e.originalTarget && e.originalTarget.responseType==='text'){
53
+ const txt = e.originalTarget.responseText;
54
+ /* The convention from the /fi return error responses in JSON form if possible:
55
+ {error: "..."}
56
+ */
57
+ txt);
58
+ console.error("Error JSON:",j);
59
+ if(j.error){ F.error(j.error) };
60
+ }catch(e){/* Try harder */
61
+ F.eload = function(e){this.status){thisthisthis.response)
62
+ ? JSON.
--- a/src/fossil.fetch.js
+++ b/src/fossil.fetch.js
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/fossil.fetch.js
+++ b/src/fossil.fetch.js
@@ -0,0 +1,62 @@
1 r onload() handler throws an exception. In the context of the
2 callback,
3 window.fossil.to be used solely for error reporting, not error recovery. Special
4 cases for the Error object:
5
6 1. Timeouts unfortunately show up as a series of 2 events: an
7 HTTP 0 followed immediately by an XHR.ontimeout(). The former
8 cannot(?) be unambiguously identified as the trigger for the
9 pending timeout, so we have no option but to pass it on as-is
10 instead of flagging it as a timeout response. The latter will
11 trigger the client-provided ontimeout() if it's available (see
12 below), else it calls the onerror() callback. An error object
13 passed to ontimeout() by fetch() will have (.name='timeout',
14 .status=XHR.status).
15
16 2. Else if the response contains a JSON-format exception on the
17 server, it wiXHR onload event | exception) (default = event
18 or exception to the console named "error" is considere generates
19 " is considered to be a server-geo ontimeout() by fetch( callback,
20 two eventriggered byse:"this"e followat exception on the
21 server, it will have (.name='json-error',
22 status=XHR.status). Any JSON-format result object which has a
23 property named "error" is considered to be a server-generated
24 error.
25
26 suffers a connection
27 error or timeout while awaiting a response, or if the onload()
28 f it gets a non 2xx HTTP callback, the
29 name='timeout',
30 "this". Note that without
31 ion is suppressed but maBec and
32 onerror() may be called if onload() throws, it is up to the caller
33 to ensure that their oner the
34 DOM
35 nately, XHR fires two eventriggered byse:',r);
36 }
37 if(!f.oner
38 caught and silently ignoredso clients which set ontimeout()
39 will get _two_ callback calls: one with an HTTP error response
40 followed immediately by an ontimeout() response. Error objects
41 passed to this willrams in the form "key1=val1&key2=val2...",
42 with NO leading '?'. If it is an object, all of its properties get
43 converted to that form. Either way, the parameters get appended to
44 the URL before submitting the request.
45
46 - responseHeaders: If true, the onload() callback is passed an
47 additional argument: a map of all of the response headers. If it's
48 a string value, the 2nd argument passed to onloadR fires two /aftersend
49 handler are currentbeen caused by a timeout, so clitrack of in-flight
50 requests and update the UI accajaxvent or Ajax{
51 }
52 else if(e.originalTarget && e.originalTarget.responseType==='text'){
53 const txt = e.originalTarget.responseText;
54 /* The convention from the /fi return error responses in JSON form if possible:
55 {error: "..."}
56 */
57 txt);
58 console.error("Error JSON:",j);
59 if(j.error){ F.error(j.error) };
60 }catch(e){/* Try harder */
61 F.eload = function(e){this.status){thisthisthis.response)
62 ? JSON.
--- a/src/fossil.page.fileedit.js
+++ b/src/fossil.page.fileedit.js
@@ -0,0 +1,42 @@
1
+'leaves': function(list){
2
+ fossi if(!nssilfossilClear"ELETE all loc });
3
+etJSON(self }
4
+ }div(),}, 6aves': function(list){
5
+ fossi if(!nssilfossilClear"ELETE all loc });
6
+etJSON(self }
7
+ }div){
8
+ fossi if(!nssilfoss{
9
+ if( }()3fsFileVersionDetai E('#file-version-detailCi@5hR,a@5xy,3I@5uh,1e@6Bw,1g@5~g,Pp@61j,1:3Sy@6R~,15@6ug,5P@6vu,g: //P.e.tabs.fileSelect.querySelector("h1")128@70D,F:(file,rev){
10
+ Q@8fx,2Y@85H,Z@9C0,_@88B,Z@86h,12@89S,X:eTgt = this.e.fsFileVersionDetailH@84F,6:div'),B@2XW,6:rHumanJ@8DT,h@8DC,J@8Ak,6:eTgt);L@8Gl,F:eTgt, "File: ",G@3pl,6:D.codeG@3AW,I@8IE,Z@8GB,L:,
11
+ D.br()
12
+ );L@8Gl,I:eTgt, "Checkin: ",G@3pl,9:D.code(),a@8IG,1:)8@91z,5:" [",Q@2pl,j:m:rUrl}), "timeline"),"]",
13
+ D.br()
14
+ );L@8Gl,J:eTgt, "Mimetype: ",G@3pl,A:D.code(), J@7ZV,T:||'???'),
15
+ D.br()
16
+ );L@8Gl,5:eTgt,G@3pl,R@2pL,I@8IE,e@8K3,1:
17
+J@3r0,I:'annotate'), "]"),G@3pl,R@2pL,I@8IE,b@8LE,1:
18
+J@3r0,D:'blame'), "]"2v@8Lw,C:
19
+ eTgt,G@3pl,6:D.codeG@3AW,h: "[",D.a(purl,"Editor permalink"),"]")
20
+ Z@8PS,Q@9Ml,U@9a0,Pw@8Qk,fO@8qD,O@76V,1H_@9WZ,1:}Z@AaG,37@AoH,DO@Arz,2Jj_mz;File/undefined /*check for and remove/replace olcan be removed once the test pode(),a@8Idoing so, be sure to replacegetJSON() call with {}. */
21
+ const oldName = F.page.name+':index';
22
+ oldName,undefinedoldName);
23
+ this.index = {}aves': function(list){
24
+i if(!nssilfossilClear"ELETE all loc });
25
+etJSON(self }
26
+ }div(),}, 6aves': function(list){
27
+ fossi if(!nssilfossilClear"ELETE all loc });
28
+etJSON(self }
29
+ }div){
30
+ fossi if(!nssilfoss{
31
+ if( }()3fsFileVersionDetai E('#file-version-detailCi@5hR,a@5xy,3I@5uh,1e@6Bw,1g@5~g,Pp@61j,1:3Sy@6R~,15@6ug,5P@6vu,g: //P.e.tabs.fileSelect.querySelector("h1")128@70D,F:(file,rev){
32
+ Q@8fx,2Y@85H,Z@9C0,_@88B,Z@86h,12@89S,X:eTgt = this.e.fsFileVersionDetailH@84F,6:div'),B@2XW,6:rHumanJ@8DT,h@8DC,J@8Ak,6:eTgt);L@8Gl,F:eTgt, "File: ",G@3pl,6:D.codeG@3AW,I@8IE,Z@8GB,L:,
33
+ D.br()
34
+ );L@8Gl,I:eTgt, "Checkin: ",G@3pl,9:D.code(),a@8IG,1:)8@91z,5:" [",Q@2pl,j:m:rUrl}), "timeline"),"]",
35
+ D.br()
36
+ );L@8Gl,J:eTgt, "Mimetype: ",G@3pl,A:D.code(), J@7ZV,T:||'???'),
37
+ D.br()
38
+ );L@8Gl,5:eTgt,G@3pl,R@2pL,I@8IE,e@8K3,1:
39
+J@3r0,I:'annotate'), "]"),G@3pl,R@2pL,I@8IE,b@8LE,1:
40
+J@3r0,D:'blame'), "]"2v@8Lw,C:
41
+ eTgt,G@3pl,6:D.codeG@3AW,h: "[",D.a(purl,"Editor permalink"),"]")
42
+ Z@8PS,Q@9Ml,U@9a0,Pw@8Qk,fO@8qD,O@76V,1H_@9WZ,1:}Z@AaG,37@AoH,DO@Arz,2Jj_mz;File/btnLoadfileedit/previewHeaders: 'x-fileedit
--- a/src/fossil.page.fileedit.js
+++ b/src/fossil.page.fileedit.js
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/fossil.page.fileedit.js
+++ b/src/fossil.page.fileedit.js
@@ -0,0 +1,42 @@
1 'leaves': function(list){
2 fossi if(!nssilfossilClear"ELETE all loc });
3 etJSON(self }
4 }div(),}, 6aves': function(list){
5 fossi if(!nssilfossilClear"ELETE all loc });
6 etJSON(self }
7 }div){
8 fossi if(!nssilfoss{
9 if( }()3fsFileVersionDetai E('#file-version-detailCi@5hR,a@5xy,3I@5uh,1e@6Bw,1g@5~g,Pp@61j,1:3Sy@6R~,15@6ug,5P@6vu,g: //P.e.tabs.fileSelect.querySelector("h1")128@70D,F:(file,rev){
10 Q@8fx,2Y@85H,Z@9C0,_@88B,Z@86h,12@89S,X:eTgt = this.e.fsFileVersionDetailH@84F,6:div'),B@2XW,6:rHumanJ@8DT,h@8DC,J@8Ak,6:eTgt);L@8Gl,F:eTgt, "File: ",G@3pl,6:D.codeG@3AW,I@8IE,Z@8GB,L:,
11 D.br()
12 );L@8Gl,I:eTgt, "Checkin: ",G@3pl,9:D.code(),a@8IG,1:)8@91z,5:" [",Q@2pl,j:m:rUrl}), "timeline"),"]",
13 D.br()
14 );L@8Gl,J:eTgt, "Mimetype: ",G@3pl,A:D.code(), J@7ZV,T:||'???'),
15 D.br()
16 );L@8Gl,5:eTgt,G@3pl,R@2pL,I@8IE,e@8K3,1:
17 J@3r0,I:'annotate'), "]"),G@3pl,R@2pL,I@8IE,b@8LE,1:
18 J@3r0,D:'blame'), "]"2v@8Lw,C:
19 eTgt,G@3pl,6:D.codeG@3AW,h: "[",D.a(purl,"Editor permalink"),"]")
20 Z@8PS,Q@9Ml,U@9a0,Pw@8Qk,fO@8qD,O@76V,1H_@9WZ,1:}Z@AaG,37@AoH,DO@Arz,2Jj_mz;File/undefined /*check for and remove/replace olcan be removed once the test pode(),a@8Idoing so, be sure to replacegetJSON() call with {}. */
21 const oldName = F.page.name+':index';
22 oldName,undefinedoldName);
23 this.index = {}aves': function(list){
24 i if(!nssilfossilClear"ELETE all loc });
25 etJSON(self }
26 }div(),}, 6aves': function(list){
27 fossi if(!nssilfossilClear"ELETE all loc });
28 etJSON(self }
29 }div){
30 fossi if(!nssilfoss{
31 if( }()3fsFileVersionDetai E('#file-version-detailCi@5hR,a@5xy,3I@5uh,1e@6Bw,1g@5~g,Pp@61j,1:3Sy@6R~,15@6ug,5P@6vu,g: //P.e.tabs.fileSelect.querySelector("h1")128@70D,F:(file,rev){
32 Q@8fx,2Y@85H,Z@9C0,_@88B,Z@86h,12@89S,X:eTgt = this.e.fsFileVersionDetailH@84F,6:div'),B@2XW,6:rHumanJ@8DT,h@8DC,J@8Ak,6:eTgt);L@8Gl,F:eTgt, "File: ",G@3pl,6:D.codeG@3AW,I@8IE,Z@8GB,L:,
33 D.br()
34 );L@8Gl,I:eTgt, "Checkin: ",G@3pl,9:D.code(),a@8IG,1:)8@91z,5:" [",Q@2pl,j:m:rUrl}), "timeline"),"]",
35 D.br()
36 );L@8Gl,J:eTgt, "Mimetype: ",G@3pl,A:D.code(), J@7ZV,T:||'???'),
37 D.br()
38 );L@8Gl,5:eTgt,G@3pl,R@2pL,I@8IE,e@8K3,1:
39 J@3r0,I:'annotate'), "]"),G@3pl,R@2pL,I@8IE,b@8LE,1:
40 J@3r0,D:'blame'), "]"2v@8Lw,C:
41 eTgt,G@3pl,6:D.codeG@3AW,h: "[",D.a(purl,"Editor permalink"),"]")
42 Z@8PS,Q@9Ml,U@9a0,Pw@8Qk,fO@8qD,O@76V,1H_@9WZ,1:}Z@AaG,37@AoH,DO@Arz,2Jj_mz;File/btnLoadfileedit/previewHeaders: 'x-fileedit
--- a/src/fossil.storage.js
+++ b/src/fossil.storage.js
@@ -0,0 +1,8 @@
1
+){
2
+ /**
3
+ fossil.storage is a basic wrapper around localStorage
4
+ or
5
+ sessions).
6
+ (orfossil$storage.clear(/* We must not use localStorage on0e794dbb91
7
+
8
+ ||*/') ? $storage.k) ? $storage.getItem(||
--- a/src/fossil.storage.js
+++ b/src/fossil.storage.js
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
--- a/src/fossil.storage.js
+++ b/src/fossil.storage.js
@@ -0,0 +1,8 @@
1 ){
2 /**
3 fossil.storage is a basic wrapper around localStorage
4 or
5 sessions).
6 (orfossil$storage.clear(/* We must not use localStorage on0e794dbb91
7
8 ||*/') ? $storage.k) ? $storage.getItem(||
--- a/src/fossil.tabs.js
+++ b/src/fossil.tabs.js
@@ -0,0 +1,4 @@
1
+"
2
+ to areturn arg;
3
+ };
4
+D[yes ? 'removeClass'
--- a/src/fossil.tabs.js
+++ b/src/fossil.tabs.js
@@ -0,0 +1,4 @@
 
 
 
 
--- a/src/fossil.tabs.js
+++ b/src/fossil.tabs.js
@@ -0,0 +1,4 @@
1 "
2 to areturn arg;
3 };
4 D[yes ? 'removeClass'
+8
--- src/info.c
+++ src/info.c
@@ -1447,10 +1447,13 @@
14471447
@ %z(href("%R/annotate?filename=%T&checkin=%!S",zName,zVers))
14481448
@ [annotate]</a>
14491449
@ %z(href("%R/blame?filename=%T&checkin=%!S",zName,zVers))
14501450
@ [blame]</a>
14511451
@ %z(href("%R/timeline?n=all&uf=%!S",zUuid))[check-ins&nbsp;using]</a>
1452
+ if( fileedit_is_editable(zName) ){
1453
+ @ %z(href("%R/fileedit?filename=%T&checkin=%!S",zName,zVers))[edit]</a>
1454
+ }
14521455
}
14531456
cnt++;
14541457
if( pDownloadName && blob_size(pDownloadName)==0 ){
14551458
blob_append(pDownloadName, zName, -1);
14561459
}
@@ -2344,10 +2347,15 @@
23442347
}else{
23452348
renderAsWiki = 1;
23462349
style_submenu_element("Text", "%s", url_render(&url, "txt", "1", 0, 0));
23472350
}
23482351
}
2352
+ if( fileedit_is_editable(zName) ){
2353
+ style_submenu_element("Edit",
2354
+ "%R/fileedit?filename=%T&checkin=%!S",
2355
+ zName, zCI);
2356
+ }
23492357
}
23502358
if( (objType & (OBJTYPE_WIKI|OBJTYPE_TICKET))!=0 ){
23512359
style_submenu_element("Parsed", "%R/info/%s", zUuid);
23522360
}
23532361
if( descOnly ){
23542362
--- src/info.c
+++ src/info.c
@@ -1447,10 +1447,13 @@
1447 @ %z(href("%R/annotate?filename=%T&checkin=%!S",zName,zVers))
1448 @ [annotate]</a>
1449 @ %z(href("%R/blame?filename=%T&checkin=%!S",zName,zVers))
1450 @ [blame]</a>
1451 @ %z(href("%R/timeline?n=all&uf=%!S",zUuid))[check-ins&nbsp;using]</a>
 
 
 
1452 }
1453 cnt++;
1454 if( pDownloadName && blob_size(pDownloadName)==0 ){
1455 blob_append(pDownloadName, zName, -1);
1456 }
@@ -2344,10 +2347,15 @@
2344 }else{
2345 renderAsWiki = 1;
2346 style_submenu_element("Text", "%s", url_render(&url, "txt", "1", 0, 0));
2347 }
2348 }
 
 
 
 
 
2349 }
2350 if( (objType & (OBJTYPE_WIKI|OBJTYPE_TICKET))!=0 ){
2351 style_submenu_element("Parsed", "%R/info/%s", zUuid);
2352 }
2353 if( descOnly ){
2354
--- src/info.c
+++ src/info.c
@@ -1447,10 +1447,13 @@
1447 @ %z(href("%R/annotate?filename=%T&checkin=%!S",zName,zVers))
1448 @ [annotate]</a>
1449 @ %z(href("%R/blame?filename=%T&checkin=%!S",zName,zVers))
1450 @ [blame]</a>
1451 @ %z(href("%R/timeline?n=all&uf=%!S",zUuid))[check-ins&nbsp;using]</a>
1452 if( fileedit_is_editable(zName) ){
1453 @ %z(href("%R/fileedit?filename=%T&checkin=%!S",zName,zVers))[edit]</a>
1454 }
1455 }
1456 cnt++;
1457 if( pDownloadName && blob_size(pDownloadName)==0 ){
1458 blob_append(pDownloadName, zName, -1);
1459 }
@@ -2344,10 +2347,15 @@
2347 }else{
2348 renderAsWiki = 1;
2349 style_submenu_element("Text", "%s", url_render(&url, "txt", "1", 0, 0));
2350 }
2351 }
2352 if( fileedit_is_editable(zName) ){
2353 style_submenu_element("Edit",
2354 "%R/fileedit?filename=%T&checkin=%!S",
2355 zName, zCI);
2356 }
2357 }
2358 if( (objType & (OBJTYPE_WIKI|OBJTYPE_TICKET))!=0 ){
2359 style_submenu_element("Parsed", "%R/info/%s", zUuid);
2360 }
2361 if( descOnly ){
2362
+11
--- src/leaf.c
+++ src/leaf.c
@@ -152,10 +152,21 @@
152152
" AND tx.tagid=%d"
153153
" AND tx.tagtype>0)",
154154
zVar, TAG_CLOSED
155155
);
156156
}
157
+
158
+/*
159
+** Returns true if vid refers to a closed leaf, else false. vid is
160
+** assumed to refer to a manifest, but this function does not verify
161
+** that.
162
+*/
163
+int leaf_is_closed(int vid){
164
+ return db_exists("SELECT 1 FROM tagxref"
165
+ " WHERE tagid=%d AND rid=%d AND tagtype>0",
166
+ TAG_CLOSED, vid);
167
+}
157168
158169
/*
159170
** Schedule a leaf check for "rid" and its parents.
160171
*/
161172
void leaf_eventually_check(int rid){
162173
--- src/leaf.c
+++ src/leaf.c
@@ -152,10 +152,21 @@
152 " AND tx.tagid=%d"
153 " AND tx.tagtype>0)",
154 zVar, TAG_CLOSED
155 );
156 }
 
 
 
 
 
 
 
 
 
 
 
157
158 /*
159 ** Schedule a leaf check for "rid" and its parents.
160 */
161 void leaf_eventually_check(int rid){
162
--- src/leaf.c
+++ src/leaf.c
@@ -152,10 +152,21 @@
152 " AND tx.tagid=%d"
153 " AND tx.tagtype>0)",
154 zVar, TAG_CLOSED
155 );
156 }
157
158 /*
159 ** Returns true if vid refers to a closed leaf, else false. vid is
160 ** assumed to refer to a manifest, but this function does not verify
161 ** that.
162 */
163 int leaf_is_closed(int vid){
164 return db_exists("SELECT 1 FROM tagxref"
165 " WHERE tagid=%d AND rid=%d AND tagtype>0",
166 TAG_CLOSED, vid);
167 }
168
169 /*
170 ** Schedule a leaf check for "rid" and its parents.
171 */
172 void leaf_eventually_check(int rid){
173
+3 -3
--- src/main.c
+++ src/main.c
@@ -2812,17 +2812,17 @@
28122812
}
28132813
#else
28142814
zBrowser = db_get("web-browser", "open");
28152815
#endif
28162816
if( zIpAddr==0 ){
2817
- zBrowserCmd = mprintf("%s http://localhost:%%d/%s &",
2817
+ zBrowserCmd = mprintf("%s \"http://localhost:%%d/%s\" &",
28182818
zBrowser, zInitPage);
28192819
}else if( strchr(zIpAddr,':') ){
2820
- zBrowserCmd = mprintf("%s http://[%s]:%%d/%s &",
2820
+ zBrowserCmd = mprintf("%s \"http://[%s]:%%d/%s\" &",
28212821
zBrowser, zIpAddr, zInitPage);
28222822
}else{
2823
- zBrowserCmd = mprintf("%s http://%s:%%d/%s &",
2823
+ zBrowserCmd = mprintf("%s \"http://%s:%%d/%s\" &",
28242824
zBrowser, zIpAddr, zInitPage);
28252825
}
28262826
}
28272827
if( g.repositoryOpen ) flags |= HTTP_SERVER_HAD_REPOSITORY;
28282828
if( g.localOpen ) flags |= HTTP_SERVER_HAD_CHECKOUT;
28292829
--- src/main.c
+++ src/main.c
@@ -2812,17 +2812,17 @@
2812 }
2813 #else
2814 zBrowser = db_get("web-browser", "open");
2815 #endif
2816 if( zIpAddr==0 ){
2817 zBrowserCmd = mprintf("%s http://localhost:%%d/%s &",
2818 zBrowser, zInitPage);
2819 }else if( strchr(zIpAddr,':') ){
2820 zBrowserCmd = mprintf("%s http://[%s]:%%d/%s &",
2821 zBrowser, zIpAddr, zInitPage);
2822 }else{
2823 zBrowserCmd = mprintf("%s http://%s:%%d/%s &",
2824 zBrowser, zIpAddr, zInitPage);
2825 }
2826 }
2827 if( g.repositoryOpen ) flags |= HTTP_SERVER_HAD_REPOSITORY;
2828 if( g.localOpen ) flags |= HTTP_SERVER_HAD_CHECKOUT;
2829
--- src/main.c
+++ src/main.c
@@ -2812,17 +2812,17 @@
2812 }
2813 #else
2814 zBrowser = db_get("web-browser", "open");
2815 #endif
2816 if( zIpAddr==0 ){
2817 zBrowserCmd = mprintf("%s \"http://localhost:%%d/%s\" &",
2818 zBrowser, zInitPage);
2819 }else if( strchr(zIpAddr,':') ){
2820 zBrowserCmd = mprintf("%s \"http://[%s]:%%d/%s\" &",
2821 zBrowser, zIpAddr, zInitPage);
2822 }else{
2823 zBrowserCmd = mprintf("%s \"http://%s:%%d/%s\" &",
2824 zBrowser, zIpAddr, zInitPage);
2825 }
2826 }
2827 if( g.repositoryOpen ) flags |= HTTP_SERVER_HAD_REPOSITORY;
2828 if( g.localOpen ) flags |= HTTP_SERVER_HAD_CHECKOUT;
2829
+20
--- src/main.mk
+++ src/main.mk
@@ -54,10 +54,11 @@
5454
$(SRCDIR)/etag.c \
5555
$(SRCDIR)/event.c \
5656
$(SRCDIR)/export.c \
5757
$(SRCDIR)/extcgi.c \
5858
$(SRCDIR)/file.c \
59
+ $(SRCDIR)/fileedit.c \
5960
$(SRCDIR)/finfo.c \
6061
$(SRCDIR)/foci.c \
6162
$(SRCDIR)/forum.c \
6263
$(SRCDIR)/fshell.c \
6364
$(SRCDIR)/fusefs.c \
@@ -218,10 +219,17 @@
218219
$(SRCDIR)/accordion.js \
219220
$(SRCDIR)/ci_edit.js \
220221
$(SRCDIR)/copybtn.js \
221222
$(SRCDIR)/diff.tcl \
222223
$(SRCDIR)/forum.js \
224
+ $(SRCDIR)/fossil.bootstrap.js \
225
+ $(SRCDIR)/fossil.confirmer.js \
226
+ $(SRCDIR)/fossil.dom.js \
227
+ $(SRCDIR)/fossil.fetch.js \
228
+ $(SRCDIR)/fossil.page.fileedit.js \
229
+ $(SRCDIR)/fossil.storage.js \
230
+ $(SRCDIR)/fossil.tabs.js \
223231
$(SRCDIR)/graph.js \
224232
$(SRCDIR)/href.js \
225233
$(SRCDIR)/login.js \
226234
$(SRCDIR)/markdown.md \
227235
$(SRCDIR)/menu.js \
@@ -244,10 +252,11 @@
244252
$(SRCDIR)/sounds/c.wav \
245253
$(SRCDIR)/sounds/d.wav \
246254
$(SRCDIR)/sounds/e.wav \
247255
$(SRCDIR)/sounds/f.wav \
248256
$(SRCDIR)/style.admin_log.css \
257
+ $(SRCDIR)/style.fileedit.css \
249258
$(SRCDIR)/tree.js \
250259
$(SRCDIR)/useredit.js \
251260
$(SRCDIR)/wiki.wiki
252261
253262
TRANS_SRC = \
@@ -289,10 +298,11 @@
289298
$(OBJDIR)/etag_.c \
290299
$(OBJDIR)/event_.c \
291300
$(OBJDIR)/export_.c \
292301
$(OBJDIR)/extcgi_.c \
293302
$(OBJDIR)/file_.c \
303
+ $(OBJDIR)/fileedit_.c \
294304
$(OBJDIR)/finfo_.c \
295305
$(OBJDIR)/foci_.c \
296306
$(OBJDIR)/forum_.c \
297307
$(OBJDIR)/fshell_.c \
298308
$(OBJDIR)/fusefs_.c \
@@ -432,10 +442,11 @@
432442
$(OBJDIR)/etag.o \
433443
$(OBJDIR)/event.o \
434444
$(OBJDIR)/export.o \
435445
$(OBJDIR)/extcgi.o \
436446
$(OBJDIR)/file.o \
447
+ $(OBJDIR)/fileedit.o \
437448
$(OBJDIR)/finfo.o \
438449
$(OBJDIR)/foci.o \
439450
$(OBJDIR)/forum.o \
440451
$(OBJDIR)/fshell.o \
441452
$(OBJDIR)/fusefs.o \
@@ -770,10 +781,11 @@
770781
$(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
771782
$(OBJDIR)/event_.c:$(OBJDIR)/event.h \
772783
$(OBJDIR)/export_.c:$(OBJDIR)/export.h \
773784
$(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
774785
$(OBJDIR)/file_.c:$(OBJDIR)/file.h \
786
+ $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
775787
$(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
776788
$(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
777789
$(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
778790
$(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
779791
$(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1197,10 +1209,18 @@
11971209
11981210
$(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
11991211
$(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
12001212
12011213
$(OBJDIR)/file.h: $(OBJDIR)/headers
1214
+
1215
+$(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(OBJDIR)/translate
1216
+ $(OBJDIR)/translate $(SRCDIR)/fileedit.c >$@
1217
+
1218
+$(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1219
+ $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1220
+
1221
+$(OBJDIR)/fileedit.h: $(OBJDIR)/headers
12021222
12031223
$(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(OBJDIR)/translate
12041224
$(OBJDIR)/translate $(SRCDIR)/finfo.c >$@
12051225
12061226
$(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
12071227
--- src/main.mk
+++ src/main.mk
@@ -54,10 +54,11 @@
54 $(SRCDIR)/etag.c \
55 $(SRCDIR)/event.c \
56 $(SRCDIR)/export.c \
57 $(SRCDIR)/extcgi.c \
58 $(SRCDIR)/file.c \
 
59 $(SRCDIR)/finfo.c \
60 $(SRCDIR)/foci.c \
61 $(SRCDIR)/forum.c \
62 $(SRCDIR)/fshell.c \
63 $(SRCDIR)/fusefs.c \
@@ -218,10 +219,17 @@
218 $(SRCDIR)/accordion.js \
219 $(SRCDIR)/ci_edit.js \
220 $(SRCDIR)/copybtn.js \
221 $(SRCDIR)/diff.tcl \
222 $(SRCDIR)/forum.js \
 
 
 
 
 
 
 
223 $(SRCDIR)/graph.js \
224 $(SRCDIR)/href.js \
225 $(SRCDIR)/login.js \
226 $(SRCDIR)/markdown.md \
227 $(SRCDIR)/menu.js \
@@ -244,10 +252,11 @@
244 $(SRCDIR)/sounds/c.wav \
245 $(SRCDIR)/sounds/d.wav \
246 $(SRCDIR)/sounds/e.wav \
247 $(SRCDIR)/sounds/f.wav \
248 $(SRCDIR)/style.admin_log.css \
 
249 $(SRCDIR)/tree.js \
250 $(SRCDIR)/useredit.js \
251 $(SRCDIR)/wiki.wiki
252
253 TRANS_SRC = \
@@ -289,10 +298,11 @@
289 $(OBJDIR)/etag_.c \
290 $(OBJDIR)/event_.c \
291 $(OBJDIR)/export_.c \
292 $(OBJDIR)/extcgi_.c \
293 $(OBJDIR)/file_.c \
 
294 $(OBJDIR)/finfo_.c \
295 $(OBJDIR)/foci_.c \
296 $(OBJDIR)/forum_.c \
297 $(OBJDIR)/fshell_.c \
298 $(OBJDIR)/fusefs_.c \
@@ -432,10 +442,11 @@
432 $(OBJDIR)/etag.o \
433 $(OBJDIR)/event.o \
434 $(OBJDIR)/export.o \
435 $(OBJDIR)/extcgi.o \
436 $(OBJDIR)/file.o \
 
437 $(OBJDIR)/finfo.o \
438 $(OBJDIR)/foci.o \
439 $(OBJDIR)/forum.o \
440 $(OBJDIR)/fshell.o \
441 $(OBJDIR)/fusefs.o \
@@ -770,10 +781,11 @@
770 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
771 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
772 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
773 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
774 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
 
775 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
776 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
777 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
778 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
779 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1197,10 +1209,18 @@
1197
1198 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1199 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1200
1201 $(OBJDIR)/file.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1202
1203 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(OBJDIR)/translate
1204 $(OBJDIR)/translate $(SRCDIR)/finfo.c >$@
1205
1206 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1207
--- src/main.mk
+++ src/main.mk
@@ -54,10 +54,11 @@
54 $(SRCDIR)/etag.c \
55 $(SRCDIR)/event.c \
56 $(SRCDIR)/export.c \
57 $(SRCDIR)/extcgi.c \
58 $(SRCDIR)/file.c \
59 $(SRCDIR)/fileedit.c \
60 $(SRCDIR)/finfo.c \
61 $(SRCDIR)/foci.c \
62 $(SRCDIR)/forum.c \
63 $(SRCDIR)/fshell.c \
64 $(SRCDIR)/fusefs.c \
@@ -218,10 +219,17 @@
219 $(SRCDIR)/accordion.js \
220 $(SRCDIR)/ci_edit.js \
221 $(SRCDIR)/copybtn.js \
222 $(SRCDIR)/diff.tcl \
223 $(SRCDIR)/forum.js \
224 $(SRCDIR)/fossil.bootstrap.js \
225 $(SRCDIR)/fossil.confirmer.js \
226 $(SRCDIR)/fossil.dom.js \
227 $(SRCDIR)/fossil.fetch.js \
228 $(SRCDIR)/fossil.page.fileedit.js \
229 $(SRCDIR)/fossil.storage.js \
230 $(SRCDIR)/fossil.tabs.js \
231 $(SRCDIR)/graph.js \
232 $(SRCDIR)/href.js \
233 $(SRCDIR)/login.js \
234 $(SRCDIR)/markdown.md \
235 $(SRCDIR)/menu.js \
@@ -244,10 +252,11 @@
252 $(SRCDIR)/sounds/c.wav \
253 $(SRCDIR)/sounds/d.wav \
254 $(SRCDIR)/sounds/e.wav \
255 $(SRCDIR)/sounds/f.wav \
256 $(SRCDIR)/style.admin_log.css \
257 $(SRCDIR)/style.fileedit.css \
258 $(SRCDIR)/tree.js \
259 $(SRCDIR)/useredit.js \
260 $(SRCDIR)/wiki.wiki
261
262 TRANS_SRC = \
@@ -289,10 +298,11 @@
298 $(OBJDIR)/etag_.c \
299 $(OBJDIR)/event_.c \
300 $(OBJDIR)/export_.c \
301 $(OBJDIR)/extcgi_.c \
302 $(OBJDIR)/file_.c \
303 $(OBJDIR)/fileedit_.c \
304 $(OBJDIR)/finfo_.c \
305 $(OBJDIR)/foci_.c \
306 $(OBJDIR)/forum_.c \
307 $(OBJDIR)/fshell_.c \
308 $(OBJDIR)/fusefs_.c \
@@ -432,10 +442,11 @@
442 $(OBJDIR)/etag.o \
443 $(OBJDIR)/event.o \
444 $(OBJDIR)/export.o \
445 $(OBJDIR)/extcgi.o \
446 $(OBJDIR)/file.o \
447 $(OBJDIR)/fileedit.o \
448 $(OBJDIR)/finfo.o \
449 $(OBJDIR)/foci.o \
450 $(OBJDIR)/forum.o \
451 $(OBJDIR)/fshell.o \
452 $(OBJDIR)/fusefs.o \
@@ -770,10 +781,11 @@
781 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
782 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
783 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
784 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
785 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
786 $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
787 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
788 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
789 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
790 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
791 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1197,10 +1209,18 @@
1209
1210 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1211 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1212
1213 $(OBJDIR)/file.h: $(OBJDIR)/headers
1214
1215 $(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(OBJDIR)/translate
1216 $(OBJDIR)/translate $(SRCDIR)/fileedit.c >$@
1217
1218 $(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1219 $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1220
1221 $(OBJDIR)/fileedit.h: $(OBJDIR)/headers
1222
1223 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(OBJDIR)/translate
1224 $(OBJDIR)/translate $(SRCDIR)/finfo.c >$@
1225
1226 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1227
+20
--- src/main.mk
+++ src/main.mk
@@ -54,10 +54,11 @@
5454
$(SRCDIR)/etag.c \
5555
$(SRCDIR)/event.c \
5656
$(SRCDIR)/export.c \
5757
$(SRCDIR)/extcgi.c \
5858
$(SRCDIR)/file.c \
59
+ $(SRCDIR)/fileedit.c \
5960
$(SRCDIR)/finfo.c \
6061
$(SRCDIR)/foci.c \
6162
$(SRCDIR)/forum.c \
6263
$(SRCDIR)/fshell.c \
6364
$(SRCDIR)/fusefs.c \
@@ -218,10 +219,17 @@
218219
$(SRCDIR)/accordion.js \
219220
$(SRCDIR)/ci_edit.js \
220221
$(SRCDIR)/copybtn.js \
221222
$(SRCDIR)/diff.tcl \
222223
$(SRCDIR)/forum.js \
224
+ $(SRCDIR)/fossil.bootstrap.js \
225
+ $(SRCDIR)/fossil.confirmer.js \
226
+ $(SRCDIR)/fossil.dom.js \
227
+ $(SRCDIR)/fossil.fetch.js \
228
+ $(SRCDIR)/fossil.page.fileedit.js \
229
+ $(SRCDIR)/fossil.storage.js \
230
+ $(SRCDIR)/fossil.tabs.js \
223231
$(SRCDIR)/graph.js \
224232
$(SRCDIR)/href.js \
225233
$(SRCDIR)/login.js \
226234
$(SRCDIR)/markdown.md \
227235
$(SRCDIR)/menu.js \
@@ -244,10 +252,11 @@
244252
$(SRCDIR)/sounds/c.wav \
245253
$(SRCDIR)/sounds/d.wav \
246254
$(SRCDIR)/sounds/e.wav \
247255
$(SRCDIR)/sounds/f.wav \
248256
$(SRCDIR)/style.admin_log.css \
257
+ $(SRCDIR)/style.fileedit.css \
249258
$(SRCDIR)/tree.js \
250259
$(SRCDIR)/useredit.js \
251260
$(SRCDIR)/wiki.wiki
252261
253262
TRANS_SRC = \
@@ -289,10 +298,11 @@
289298
$(OBJDIR)/etag_.c \
290299
$(OBJDIR)/event_.c \
291300
$(OBJDIR)/export_.c \
292301
$(OBJDIR)/extcgi_.c \
293302
$(OBJDIR)/file_.c \
303
+ $(OBJDIR)/fileedit_.c \
294304
$(OBJDIR)/finfo_.c \
295305
$(OBJDIR)/foci_.c \
296306
$(OBJDIR)/forum_.c \
297307
$(OBJDIR)/fshell_.c \
298308
$(OBJDIR)/fusefs_.c \
@@ -432,10 +442,11 @@
432442
$(OBJDIR)/etag.o \
433443
$(OBJDIR)/event.o \
434444
$(OBJDIR)/export.o \
435445
$(OBJDIR)/extcgi.o \
436446
$(OBJDIR)/file.o \
447
+ $(OBJDIR)/fileedit.o \
437448
$(OBJDIR)/finfo.o \
438449
$(OBJDIR)/foci.o \
439450
$(OBJDIR)/forum.o \
440451
$(OBJDIR)/fshell.o \
441452
$(OBJDIR)/fusefs.o \
@@ -770,10 +781,11 @@
770781
$(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
771782
$(OBJDIR)/event_.c:$(OBJDIR)/event.h \
772783
$(OBJDIR)/export_.c:$(OBJDIR)/export.h \
773784
$(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
774785
$(OBJDIR)/file_.c:$(OBJDIR)/file.h \
786
+ $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
775787
$(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
776788
$(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
777789
$(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
778790
$(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
779791
$(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1197,10 +1209,18 @@
11971209
11981210
$(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
11991211
$(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
12001212
12011213
$(OBJDIR)/file.h: $(OBJDIR)/headers
1214
+
1215
+$(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(OBJDIR)/translate
1216
+ $(OBJDIR)/translate $(SRCDIR)/fileedit.c >$@
1217
+
1218
+$(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1219
+ $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1220
+
1221
+$(OBJDIR)/fileedit.h: $(OBJDIR)/headers
12021222
12031223
$(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(OBJDIR)/translate
12041224
$(OBJDIR)/translate $(SRCDIR)/finfo.c >$@
12051225
12061226
$(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
12071227
--- src/main.mk
+++ src/main.mk
@@ -54,10 +54,11 @@
54 $(SRCDIR)/etag.c \
55 $(SRCDIR)/event.c \
56 $(SRCDIR)/export.c \
57 $(SRCDIR)/extcgi.c \
58 $(SRCDIR)/file.c \
 
59 $(SRCDIR)/finfo.c \
60 $(SRCDIR)/foci.c \
61 $(SRCDIR)/forum.c \
62 $(SRCDIR)/fshell.c \
63 $(SRCDIR)/fusefs.c \
@@ -218,10 +219,17 @@
218 $(SRCDIR)/accordion.js \
219 $(SRCDIR)/ci_edit.js \
220 $(SRCDIR)/copybtn.js \
221 $(SRCDIR)/diff.tcl \
222 $(SRCDIR)/forum.js \
 
 
 
 
 
 
 
223 $(SRCDIR)/graph.js \
224 $(SRCDIR)/href.js \
225 $(SRCDIR)/login.js \
226 $(SRCDIR)/markdown.md \
227 $(SRCDIR)/menu.js \
@@ -244,10 +252,11 @@
244 $(SRCDIR)/sounds/c.wav \
245 $(SRCDIR)/sounds/d.wav \
246 $(SRCDIR)/sounds/e.wav \
247 $(SRCDIR)/sounds/f.wav \
248 $(SRCDIR)/style.admin_log.css \
 
249 $(SRCDIR)/tree.js \
250 $(SRCDIR)/useredit.js \
251 $(SRCDIR)/wiki.wiki
252
253 TRANS_SRC = \
@@ -289,10 +298,11 @@
289 $(OBJDIR)/etag_.c \
290 $(OBJDIR)/event_.c \
291 $(OBJDIR)/export_.c \
292 $(OBJDIR)/extcgi_.c \
293 $(OBJDIR)/file_.c \
 
294 $(OBJDIR)/finfo_.c \
295 $(OBJDIR)/foci_.c \
296 $(OBJDIR)/forum_.c \
297 $(OBJDIR)/fshell_.c \
298 $(OBJDIR)/fusefs_.c \
@@ -432,10 +442,11 @@
432 $(OBJDIR)/etag.o \
433 $(OBJDIR)/event.o \
434 $(OBJDIR)/export.o \
435 $(OBJDIR)/extcgi.o \
436 $(OBJDIR)/file.o \
 
437 $(OBJDIR)/finfo.o \
438 $(OBJDIR)/foci.o \
439 $(OBJDIR)/forum.o \
440 $(OBJDIR)/fshell.o \
441 $(OBJDIR)/fusefs.o \
@@ -770,10 +781,11 @@
770 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
771 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
772 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
773 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
774 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
 
775 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
776 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
777 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
778 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
779 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1197,10 +1209,18 @@
1197
1198 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1199 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1200
1201 $(OBJDIR)/file.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1202
1203 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(OBJDIR)/translate
1204 $(OBJDIR)/translate $(SRCDIR)/finfo.c >$@
1205
1206 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1207
--- src/main.mk
+++ src/main.mk
@@ -54,10 +54,11 @@
54 $(SRCDIR)/etag.c \
55 $(SRCDIR)/event.c \
56 $(SRCDIR)/export.c \
57 $(SRCDIR)/extcgi.c \
58 $(SRCDIR)/file.c \
59 $(SRCDIR)/fileedit.c \
60 $(SRCDIR)/finfo.c \
61 $(SRCDIR)/foci.c \
62 $(SRCDIR)/forum.c \
63 $(SRCDIR)/fshell.c \
64 $(SRCDIR)/fusefs.c \
@@ -218,10 +219,17 @@
219 $(SRCDIR)/accordion.js \
220 $(SRCDIR)/ci_edit.js \
221 $(SRCDIR)/copybtn.js \
222 $(SRCDIR)/diff.tcl \
223 $(SRCDIR)/forum.js \
224 $(SRCDIR)/fossil.bootstrap.js \
225 $(SRCDIR)/fossil.confirmer.js \
226 $(SRCDIR)/fossil.dom.js \
227 $(SRCDIR)/fossil.fetch.js \
228 $(SRCDIR)/fossil.page.fileedit.js \
229 $(SRCDIR)/fossil.storage.js \
230 $(SRCDIR)/fossil.tabs.js \
231 $(SRCDIR)/graph.js \
232 $(SRCDIR)/href.js \
233 $(SRCDIR)/login.js \
234 $(SRCDIR)/markdown.md \
235 $(SRCDIR)/menu.js \
@@ -244,10 +252,11 @@
252 $(SRCDIR)/sounds/c.wav \
253 $(SRCDIR)/sounds/d.wav \
254 $(SRCDIR)/sounds/e.wav \
255 $(SRCDIR)/sounds/f.wav \
256 $(SRCDIR)/style.admin_log.css \
257 $(SRCDIR)/style.fileedit.css \
258 $(SRCDIR)/tree.js \
259 $(SRCDIR)/useredit.js \
260 $(SRCDIR)/wiki.wiki
261
262 TRANS_SRC = \
@@ -289,10 +298,11 @@
298 $(OBJDIR)/etag_.c \
299 $(OBJDIR)/event_.c \
300 $(OBJDIR)/export_.c \
301 $(OBJDIR)/extcgi_.c \
302 $(OBJDIR)/file_.c \
303 $(OBJDIR)/fileedit_.c \
304 $(OBJDIR)/finfo_.c \
305 $(OBJDIR)/foci_.c \
306 $(OBJDIR)/forum_.c \
307 $(OBJDIR)/fshell_.c \
308 $(OBJDIR)/fusefs_.c \
@@ -432,10 +442,11 @@
442 $(OBJDIR)/etag.o \
443 $(OBJDIR)/event.o \
444 $(OBJDIR)/export.o \
445 $(OBJDIR)/extcgi.o \
446 $(OBJDIR)/file.o \
447 $(OBJDIR)/fileedit.o \
448 $(OBJDIR)/finfo.o \
449 $(OBJDIR)/foci.o \
450 $(OBJDIR)/forum.o \
451 $(OBJDIR)/fshell.o \
452 $(OBJDIR)/fusefs.o \
@@ -770,10 +781,11 @@
781 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
782 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
783 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
784 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
785 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
786 $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
787 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
788 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
789 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
790 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
791 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1197,10 +1209,18 @@
1209
1210 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1211 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1212
1213 $(OBJDIR)/file.h: $(OBJDIR)/headers
1214
1215 $(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(OBJDIR)/translate
1216 $(OBJDIR)/translate $(SRCDIR)/fileedit.c >$@
1217
1218 $(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1219 $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1220
1221 $(OBJDIR)/fileedit.h: $(OBJDIR)/headers
1222
1223 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(OBJDIR)/translate
1224 $(OBJDIR)/translate $(SRCDIR)/finfo.c >$@
1225
1226 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1227
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -65,10 +65,11 @@
6565
etag
6666
event
6767
extcgi
6868
export
6969
file
70
+ fileedit
7071
finfo
7172
foci
7273
forum
7374
fshell
7475
fusefs
7576
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -65,10 +65,11 @@
65 etag
66 event
67 extcgi
68 export
69 file
 
70 finfo
71 foci
72 forum
73 fshell
74 fusefs
75
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -65,10 +65,11 @@
65 etag
66 event
67 extcgi
68 export
69 file
70 fileedit
71 finfo
72 foci
73 forum
74 fshell
75 fusefs
76
+2 -2
--- src/manifest.c
+++ src/manifest.c
@@ -1064,11 +1064,11 @@
10641064
if( !isRepeat ) g.parseCnt[p->type]++;
10651065
return p;
10661066
10671067
manifest_syntax_error:
10681068
{
1069
- char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
1069
+ char *zUuid = rid_to_uuid(rid);
10701070
if( zUuid ){
10711071
blob_appendf(pErr, "artifact [%s] ", zUuid);
10721072
fossil_free(zUuid);
10731073
}
10741074
}
@@ -1327,11 +1327,11 @@
13271327
13281328
/*
13291329
** Compute an appropriate mlink.mperm integer for the permission string
13301330
** of a file.
13311331
*/
1332
-int manifest_file_mperm(ManifestFile *pFile){
1332
+int manifest_file_mperm(const ManifestFile *pFile){
13331333
int mperm = PERM_REG;
13341334
if( pFile && pFile->zPerm){
13351335
if( strstr(pFile->zPerm,"x")!=0 ){
13361336
mperm = PERM_EXE;
13371337
}else if( strstr(pFile->zPerm,"l")!=0 ){
13381338
--- src/manifest.c
+++ src/manifest.c
@@ -1064,11 +1064,11 @@
1064 if( !isRepeat ) g.parseCnt[p->type]++;
1065 return p;
1066
1067 manifest_syntax_error:
1068 {
1069 char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
1070 if( zUuid ){
1071 blob_appendf(pErr, "artifact [%s] ", zUuid);
1072 fossil_free(zUuid);
1073 }
1074 }
@@ -1327,11 +1327,11 @@
1327
1328 /*
1329 ** Compute an appropriate mlink.mperm integer for the permission string
1330 ** of a file.
1331 */
1332 int manifest_file_mperm(ManifestFile *pFile){
1333 int mperm = PERM_REG;
1334 if( pFile && pFile->zPerm){
1335 if( strstr(pFile->zPerm,"x")!=0 ){
1336 mperm = PERM_EXE;
1337 }else if( strstr(pFile->zPerm,"l")!=0 ){
1338
--- src/manifest.c
+++ src/manifest.c
@@ -1064,11 +1064,11 @@
1064 if( !isRepeat ) g.parseCnt[p->type]++;
1065 return p;
1066
1067 manifest_syntax_error:
1068 {
1069 char *zUuid = rid_to_uuid(rid);
1070 if( zUuid ){
1071 blob_appendf(pErr, "artifact [%s] ", zUuid);
1072 fossil_free(zUuid);
1073 }
1074 }
@@ -1327,11 +1327,11 @@
1327
1328 /*
1329 ** Compute an appropriate mlink.mperm integer for the permission string
1330 ** of a file.
1331 */
1332 int manifest_file_mperm(const ManifestFile *pFile){
1333 int mperm = PERM_REG;
1334 if( pFile && pFile->zPerm){
1335 if( strstr(pFile->zPerm,"x")!=0 ){
1336 mperm = PERM_EXE;
1337 }else if( strstr(pFile->zPerm,"l")!=0 ){
1338
+4 -3
--- src/printf.c
+++ src/printf.c
@@ -99,11 +99,12 @@
9999
#define etFOSSILIZE 20 /* The fossil header encoding format. */
100100
#define etPATH 21 /* Path type */
101101
#define etWIKISTR 22 /* Timeline comment text rendered from a char*: %W */
102102
#define etSTRINGID 23 /* String with length limit for a UUID prefix: %S */
103103
#define etROOT 24 /* String value of g.zTop: %R */
104
-#define etJSONSTR 25 /* String encoded as a JSON string literal: %j */
104
+#define etJSONSTR 25 /* String encoded as a JSON string literal: %j
105
+ Use %!j to include double-quotes around it. */
105106
106107
107108
/*
108109
** An "etByte" is an 8-bit unsigned value.
109110
*/
@@ -798,12 +799,12 @@
798799
/* Ignore the limit flag, if set, for JSON string
799800
** output. This block exists to squelch the associated
800801
** "unused variable" compiler warning. */
801802
}
802803
if( zMem==0 ) zMem = "";
803
- zExtra = bufpt = encode_json_string_literal(zMem);
804
- length = strlen(bufpt);
804
+ zExtra = bufpt =
805
+ encode_json_string_literal(zMem, flag_altform2, &length);
805806
if( precision>=0 && precision<length ) length = precision;
806807
break;
807808
}
808809
case etWIKISTR: {
809810
int limit = flag_alternateform ? va_arg(ap,int) : -1;
810811
--- src/printf.c
+++ src/printf.c
@@ -99,11 +99,12 @@
99 #define etFOSSILIZE 20 /* The fossil header encoding format. */
100 #define etPATH 21 /* Path type */
101 #define etWIKISTR 22 /* Timeline comment text rendered from a char*: %W */
102 #define etSTRINGID 23 /* String with length limit for a UUID prefix: %S */
103 #define etROOT 24 /* String value of g.zTop: %R */
104 #define etJSONSTR 25 /* String encoded as a JSON string literal: %j */
 
105
106
107 /*
108 ** An "etByte" is an 8-bit unsigned value.
109 */
@@ -798,12 +799,12 @@
798 /* Ignore the limit flag, if set, for JSON string
799 ** output. This block exists to squelch the associated
800 ** "unused variable" compiler warning. */
801 }
802 if( zMem==0 ) zMem = "";
803 zExtra = bufpt = encode_json_string_literal(zMem);
804 length = strlen(bufpt);
805 if( precision>=0 && precision<length ) length = precision;
806 break;
807 }
808 case etWIKISTR: {
809 int limit = flag_alternateform ? va_arg(ap,int) : -1;
810
--- src/printf.c
+++ src/printf.c
@@ -99,11 +99,12 @@
99 #define etFOSSILIZE 20 /* The fossil header encoding format. */
100 #define etPATH 21 /* Path type */
101 #define etWIKISTR 22 /* Timeline comment text rendered from a char*: %W */
102 #define etSTRINGID 23 /* String with length limit for a UUID prefix: %S */
103 #define etROOT 24 /* String value of g.zTop: %R */
104 #define etJSONSTR 25 /* String encoded as a JSON string literal: %j
105 Use %!j to include double-quotes around it. */
106
107
108 /*
109 ** An "etByte" is an 8-bit unsigned value.
110 */
@@ -798,12 +799,12 @@
799 /* Ignore the limit flag, if set, for JSON string
800 ** output. This block exists to squelch the associated
801 ** "unused variable" compiler warning. */
802 }
803 if( zMem==0 ) zMem = "";
804 zExtra = bufpt =
805 encode_json_string_literal(zMem, flag_altform2, &length);
806 if( precision>=0 && precision<length ) length = precision;
807 break;
808 }
809 case etWIKISTR: {
810 int limit = flag_alternateform ? va_arg(ap,int) : -1;
811
+8 -5
--- src/sbsdiff.js
+++ src/sbsdiff.js
@@ -6,11 +6,12 @@
66
var SCROLL_LEN = 25;
77
function initSbsDiff(diff){
88
var txtCols = diff.querySelectorAll('.difftxtcol');
99
var txtPres = diff.querySelectorAll('.difftxtcol pre');
1010
var width = Math.max(txtPres[0].scrollWidth, txtPres[1].scrollWidth);
11
- for(var i=0; i<2; i++){
11
+ var i;
12
+ for(i=0; i<2; i++){
1213
txtPres[i].style.width = width + 'px';
1314
txtCols[i].onscroll = function(e){
1415
txtCols[0].scrollLeft = txtCols[1].scrollLeft = this.scrollLeft;
1516
};
1617
}
@@ -21,10 +22,12 @@
2122
if( !len ) return;
2223
txtCols[0].scrollLeft += len;
2324
return false;
2425
};
2526
}
26
- var diffs = document.querySelectorAll('.sbsdiffcols');
27
- for(var i=0; i<diffs.length; i++){
28
- initSbsDiff(diffs[i]);
27
+ document.querySelectorAll('.sbsdiffcols').forEach(initSbsDiff);
28
+ if(window.fossil && fossil.page){
29
+ fossil.page.tweakSbsDiffs = function(){
30
+ document.querySelectorAll('.sbsdiffcols').forEach(initSbsDiff);
31
+ };
2932
}
30
-}())
33
+})();
3134
--- src/sbsdiff.js
+++ src/sbsdiff.js
@@ -6,11 +6,12 @@
6 var SCROLL_LEN = 25;
7 function initSbsDiff(diff){
8 var txtCols = diff.querySelectorAll('.difftxtcol');
9 var txtPres = diff.querySelectorAll('.difftxtcol pre');
10 var width = Math.max(txtPres[0].scrollWidth, txtPres[1].scrollWidth);
11 for(var i=0; i<2; i++){
 
12 txtPres[i].style.width = width + 'px';
13 txtCols[i].onscroll = function(e){
14 txtCols[0].scrollLeft = txtCols[1].scrollLeft = this.scrollLeft;
15 };
16 }
@@ -21,10 +22,12 @@
21 if( !len ) return;
22 txtCols[0].scrollLeft += len;
23 return false;
24 };
25 }
26 var diffs = document.querySelectorAll('.sbsdiffcols');
27 for(var i=0; i<diffs.length; i++){
28 initSbsDiff(diffs[i]);
 
 
29 }
30 }())
31
--- src/sbsdiff.js
+++ src/sbsdiff.js
@@ -6,11 +6,12 @@
6 var SCROLL_LEN = 25;
7 function initSbsDiff(diff){
8 var txtCols = diff.querySelectorAll('.difftxtcol');
9 var txtPres = diff.querySelectorAll('.difftxtcol pre');
10 var width = Math.max(txtPres[0].scrollWidth, txtPres[1].scrollWidth);
11 var i;
12 for(i=0; i<2; i++){
13 txtPres[i].style.width = width + 'px';
14 txtCols[i].onscroll = function(e){
15 txtCols[0].scrollLeft = txtCols[1].scrollLeft = this.scrollLeft;
16 };
17 }
@@ -21,10 +22,12 @@
22 if( !len ) return;
23 txtCols[0].scrollLeft += len;
24 return false;
25 };
26 }
27 document.querySelectorAll('.sbsdiffcols').forEach(initSbsDiff);
28 if(window.fossil && fossil.page){
29 fossil.page.tweakSbsDiffs = function(){
30 document.querySelectorAll('.sbsdiffcols').forEach(initSbsDiff);
31 };
32 }
33 })();
34
+395
--- src/style.c
+++ src/style.c
@@ -1331,5 +1331,400 @@
13311331
}
13321332
13331333
#if INTERFACE
13341334
# define webpage_assert(T) if(!(T)){webpage_assert_page(__FILE__,__LINE__,#T);}
13351335
#endif
1336
+
1337
+/*
1338
+** Returns a pseudo-random input field ID, for use in associating an
1339
+** ID-less input field with a label. The memory is owned by the
1340
+** caller.
1341
+*/
1342
+static char * style_next_input_id(){
1343
+ static int inputID = 0;
1344
+ ++inputID;
1345
+ return mprintf("input-id-%d", inputID);
1346
+}
1347
+
1348
+/*
1349
+** Outputs a labeled checkbox element. zWrapperId is an optional ID
1350
+** value for the containing element (see below). zFieldName is the
1351
+** form element name. zLabel is the label for the checkbox. zValue is
1352
+** the optional value for the checkbox. zTip is an optional tooltip,
1353
+** which gets set as the "title" attribute of the outermost
1354
+** element. If isChecked is true, the checkbox gets the "checked"
1355
+** attribute set, else it is not.
1356
+**
1357
+** Resulting structure:
1358
+**
1359
+** <span class='input-with-label' title={{zTip}} id={{zWrapperId}}>
1360
+** <input type='checkbox' name={{zFieldName}} value={{zValue}}
1361
+** id='A RANDOM VALUE'
1362
+** {{isChecked ? " checked : ""}}/>
1363
+** <label for='ID OF THE INPUT FIELD'>{{zLabel}}</label>
1364
+** </span>
1365
+**
1366
+** zLabel, and zValue are required. zFieldName, zWrapperId, and zTip
1367
+** are may be NULL or empty.
1368
+**
1369
+** Be sure that the input-with-label CSS class is defined sensibly, in
1370
+** particular, having its display:inline-block is useful for alignment
1371
+** purposes.
1372
+*/
1373
+void style_labeled_checkbox(const char * zWrapperId,
1374
+ const char *zFieldName, const char * zLabel,
1375
+ const char * zValue, int isChecked,
1376
+ const char * zTip){
1377
+ char * zLabelID = style_next_input_id();
1378
+ CX("<span class='input-with-label'");
1379
+ if(zTip && *zTip){
1380
+ CX(" title='%h'", zTip);
1381
+ }
1382
+ if(zWrapperId && *zWrapperId){
1383
+ CX(" id='%s'",zWrapperId);
1384
+ }
1385
+ CX("><input type='checkbox' id='%s' ", zLabelID);
1386
+ if(zFieldName && *zFieldName){
1387
+ CX("name='%s' ",zFieldName);
1388
+ }
1389
+ CX("value='%T'%s/>",
1390
+ zValue ? zValue : "", isChecked ? " checked" : "");
1391
+ CX("<label for='%s'>%h</label></span>", zLabelID, zLabel);
1392
+ fossil_free(zLabelID);
1393
+}
1394
+
1395
+/*
1396
+** Outputs a SELECT list from a compile-time list of integers.
1397
+** The vargs must be a list of (const char *, int) pairs, terminated
1398
+** with a single NULL. Each pair is interpreted as...
1399
+**
1400
+** If the (const char *) is NULL, it is the end of the list, else
1401
+** a new OPTION entry is created. If the string is empty, the
1402
+** label and value of the OPTION is the integer part of the pair.
1403
+** If the string is not empty, it becomes the label and the integer
1404
+** the value. If that value == selectedValue then that OPTION
1405
+** element gets the 'selected' attribute.
1406
+**
1407
+** Note that the pairs are not in (int, const char *) order because
1408
+** there is no well-known integer value which we can definitively use
1409
+** as a list terminator.
1410
+**
1411
+** zWrapperId is an optional ID value for the containing element (see
1412
+** below).
1413
+**
1414
+** zFieldName is the value of the form element's name attribute. Note
1415
+** that fossil prefers underscores over '-' for separators in form
1416
+** element names.
1417
+**
1418
+** zLabel is an optional string to use as a "label" for the element
1419
+** (see below).
1420
+**
1421
+** zTooltip is an optional value for the SELECT's title attribute.
1422
+**
1423
+** The structure of the emitted HTML is:
1424
+**
1425
+** <span class='input-with-label' title={{zToolTip}} id={{zWrapperId}}>
1426
+** <label for='SELECT ELEMENT ID'>{{zLabel}}</label>
1427
+** <select id='RANDOM ID' name={{zFieldName}}>...</select>
1428
+** </span>
1429
+**
1430
+** Example:
1431
+**
1432
+** style_select_list_int("my-grapes", "my_grapes", "Grapes",
1433
+** "Select the number of grapes",
1434
+** atoi(PD("my_field","0")),
1435
+** "", 1, "2", 2, "Three", 3,
1436
+** NULL);
1437
+**
1438
+*/
1439
+void style_select_list_int(const char * zWrapperId,
1440
+ const char *zFieldName, const char * zLabel,
1441
+ const char * zToolTip, int selectedVal,
1442
+ ... ){
1443
+ char * zLabelID = style_next_input_id();
1444
+ va_list vargs;
1445
+
1446
+ va_start(vargs,selectedVal);
1447
+ CX("<span class='input-with-label'");
1448
+ if(zToolTip && *zToolTip){
1449
+ CX(" title='%h'",zToolTip);
1450
+ }
1451
+ if(zWrapperId && *zWrapperId){
1452
+ CX(" id='%s'",zWrapperId);
1453
+ }
1454
+ CX(">");
1455
+ if(zLabel && *zLabel){
1456
+ CX("<label label='%s'>%h</label>", zLabelID, zLabel);
1457
+ }
1458
+ CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1459
+ while(1){
1460
+ const char * zOption = va_arg(vargs,char *);
1461
+ int v;
1462
+ if(NULL==zOption){
1463
+ break;
1464
+ }
1465
+ v = va_arg(vargs,int);
1466
+ CX("<option value='%d'%s>",
1467
+ v, v==selectedVal ? " selected" : "");
1468
+ if(*zOption){
1469
+ CX("%s", zOption);
1470
+ }else{
1471
+ CX("%d",v);
1472
+ }
1473
+ CX("</option>\n");
1474
+ }
1475
+ CX("</select>\n");
1476
+ CX("</span>\n");
1477
+ va_end(vargs);
1478
+ fossil_free(zLabelID);
1479
+}
1480
+
1481
+/*
1482
+** The C-string counterpart of style_select_list_int(), this variant
1483
+** differs only in that its variadic arguments are C-strings in pairs
1484
+** of (optionLabel, optionValue). If a given optionLabel is an empty
1485
+** string, the corresponding optionValue is used as its label. If any
1486
+** given value matches zSelectedVal, that option gets preselected. If
1487
+** no options match zSelectedVal then the first entry is selected by
1488
+** default.
1489
+**
1490
+** Any of (zWrapperId, zTooltip, zSelectedVal) may be NULL or empty.
1491
+**
1492
+** Example:
1493
+**
1494
+** style_select_list_str("my-grapes", "my_grapes", "Grapes",
1495
+** "Select the number of grapes",
1496
+** P("my_field"),
1497
+** "1", "One", "2", "Two", "", "3",
1498
+** NULL);
1499
+*/
1500
+void style_select_list_str(const char * zWrapperId,
1501
+ const char *zFieldName, const char * zLabel,
1502
+ const char * zToolTip, char const * zSelectedVal,
1503
+ ... ){
1504
+ char * zLabelID = style_next_input_id();
1505
+ va_list vargs;
1506
+
1507
+ va_start(vargs,zSelectedVal);
1508
+ if(!zSelectedVal){
1509
+ zSelectedVal = __FILE__/*some string we'll never match*/;
1510
+ }
1511
+ CX("<span class='input-with-label'");
1512
+ if(zToolTip && *zToolTip){
1513
+ CX(" title='%h'",zToolTip);
1514
+ }
1515
+ if(zWrapperId && *zWrapperId){
1516
+ CX(" id='%s'",zWrapperId);
1517
+ }
1518
+ CX(">");
1519
+ if(zLabel && *zLabel){
1520
+ CX("<label for='%s'>%h</label>", zLabelID, zLabel);
1521
+ }
1522
+ CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1523
+ while(1){
1524
+ const char * zLabel = va_arg(vargs,char *);
1525
+ const char * zVal;
1526
+ if(NULL==zLabel){
1527
+ break;
1528
+ }
1529
+ zVal = va_arg(vargs,char *);
1530
+ CX("<option value='%T'%s>",
1531
+ zVal, 0==fossil_strcmp(zVal, zSelectedVal) ? " selected" : "");
1532
+ if(*zLabel){
1533
+ CX("%s", zLabel);
1534
+ }else{
1535
+ CX("%h",zVal);
1536
+ }
1537
+ CX("</option>\n");
1538
+ }
1539
+ CX("</select>\n");
1540
+ CX("</span>\n");
1541
+ va_end(vargs);
1542
+ fossil_free(zLabelID);
1543
+}
1544
+
1545
+
1546
+/*
1547
+** The first time this is called, it emits code to install and
1548
+** bootstrap the window.fossil object, using the built-in file
1549
+** fossil.bootstrap.js (not to be confused with bootstrap.js).
1550
+**
1551
+** Subsequent calls are no-ops.
1552
+**
1553
+** If passed a true value, it emits the contents directly to the page
1554
+** output, else it emits a script tag with a src=builtin/... to load
1555
+** the script. It always outputs a small pre-bootstrap element in its
1556
+** own script tag to initialize parts which need C-runtime-level
1557
+** information, before loading the main fossil.bootstrap.js either
1558
+** inline or via a <script src=...>, as specified by the first
1559
+** argument.
1560
+*/
1561
+void style_emit_script_fossil_bootstrap(int asInline){
1562
+ static int once = 0;
1563
+ if(0==once++){
1564
+ /* Set up the generic/app-agnostic parts of window.fossil
1565
+ ** which require C-level state... */
1566
+ style_emit_script_tag(0,0);
1567
+ CX("(function(){\n"
1568
+ "if(!window.fossil) window.fossil={};\n"
1569
+ "window.fossil.version = %!j;\n"
1570
+ /* fossil.rootPath is the top-most CGI/server path,
1571
+ ** including a trailing slash. */
1572
+ "window.fossil.rootPath = %!j+'/';\n",
1573
+ get_version(), g.zTop);
1574
+ /* fossil.config = {...various config-level options...} */
1575
+ CX("window.fossil.config = {"
1576
+ "hashDigits: %d, hashDigitsUrl: %d"
1577
+ "};\n", hash_digits(0), hash_digits(1));
1578
+#if 0
1579
+ /* Is it safe to emit the CSRF token here? Some pages add it
1580
+ ** as a hidden form field. */
1581
+ if(g.zCsrfToken[0]!=0){
1582
+ CX("window.fossil.csrfToken = %!j;\n",
1583
+ g.zCsrfToken);
1584
+ }
1585
+#endif
1586
+ /*
1587
+ ** fossil.page holds info about the current page. This is also
1588
+ ** where the current page "should" store any of its own
1589
+ ** page-specific state, and it is reserved for that purpose.
1590
+ */
1591
+ CX("window.fossil.page = {"
1592
+ "name:\"%T\""
1593
+ "};\n", g.zPath);
1594
+ CX("})();\n");
1595
+ /* The remaining fossil object bootstrap code is not dependent on
1596
+ ** C-runtime state... */
1597
+ if(asInline){
1598
+ CX("%s\n", builtin_text("fossil.bootstrap.js"));
1599
+ }
1600
+ style_emit_script_tag(1,0);
1601
+ if(asInline==0){
1602
+ style_emit_script_builtin(0, "fossil.bootstrap.js");
1603
+ }
1604
+ }
1605
+}
1606
+
1607
+/*
1608
+** If passed 0 as its first argument, it emits a script opener tag
1609
+** with this request's nonce. If passed non-0 it emits a script
1610
+** closing tag. Mnemonic for remembering the order in which to pass 0
1611
+** or 1 as the first argument to this function: 0 comes before 1.
1612
+**
1613
+** If passed 0 as its first argument and a non-NULL/non-empty zSrc,
1614
+** then it instead emits:
1615
+**
1616
+** <script src='%R/{{zSrc}}'></script>
1617
+**
1618
+** zSrc is always assumed to be a repository-relative path without
1619
+** a leading slash, and has %R/ prepended to it.
1620
+**
1621
+** Meaning that no follow-up call to pass a non-0 first argument
1622
+** to close the tag. zSrc is ignored if the first argument is not
1623
+** 0.
1624
+**
1625
+*/
1626
+void style_emit_script_tag(int isCloser, const char * zSrc){
1627
+ if(0==isCloser){
1628
+ if(zSrc!=0 && zSrc[0]!=0){
1629
+ CX("<script src='%R/%T'></script>\n", zSrc);
1630
+ }else{
1631
+ CX("<script nonce='%s'>", style_nonce());
1632
+ }
1633
+ }else{
1634
+ CX("</script>\n");
1635
+ }
1636
+}
1637
+
1638
+/*
1639
+** Emits a script tag which uses content from a builtin script file.
1640
+**
1641
+** If asInline is true, it is emitted directly as an opening tag, the
1642
+** content of the zName builtin file, and a closing tag.
1643
+**
1644
+** If it is false, a script tag loading it via
1645
+** src=builtin/{{zName}}?cache=XYZ is emitted, where XYZ is a
1646
+** build-time-dependent cache-buster value.
1647
+*/
1648
+void style_emit_script_builtin(int asInline, char const * zName){
1649
+ if(asInline){
1650
+ style_emit_script_tag(0,0);
1651
+ CX("%s", builtin_text(zName));
1652
+ style_emit_script_tag(1,0);
1653
+ }else{
1654
+ char * zFullName = mprintf("builtin/%s",zName);
1655
+ const char * zHash = fossil_exe_id();
1656
+ CX("<script src='%R/%T?cache=%.8s'></script>\n",
1657
+ zFullName, zHash);
1658
+ fossil_free(zFullName);
1659
+ }
1660
+}
1661
+
1662
+/*
1663
+** The first time this is called it emits the JS code from the
1664
+** built-in file fossil.fossil.js. Subsequent calls are no-ops.
1665
+**
1666
+** If passed a true value, it emits the contents directly
1667
+** to the page output, else it emits a script tag with a
1668
+** src=builtin/... to load the script.
1669
+**
1670
+** Note that this code relies on that loaded via
1671
+** style_emit_script_fossil_bootstrap() but it does not call that
1672
+** routine.
1673
+*/
1674
+void style_emit_script_fetch(int asInline){
1675
+ static int once = 0;
1676
+ if(0==once++){
1677
+ style_emit_script_builtin(asInline, "fossil.fetch.js");
1678
+ }
1679
+}
1680
+
1681
+/*
1682
+** The first time this is called it emits the JS code from the
1683
+** built-in file fossil.dom.js. Subsequent calls are no-ops.
1684
+**
1685
+** If passed a true value, it emits the contents directly
1686
+** to the page output, else it emits a script tag with a
1687
+** src=builtin/... to load the script.
1688
+**
1689
+** Note that this code relies on that loaded via
1690
+** style_emit_script_fossil_bootstrap(), but it does not call that
1691
+** routine.
1692
+*/
1693
+void style_emit_script_dom(int asInline){
1694
+ static int once = 0;
1695
+ if(0==once++){
1696
+ style_emit_script_builtin(asInline, "fossil.dom.js");
1697
+ }
1698
+}
1699
+
1700
+/*
1701
+** The first time this is called, it calls style_emit_script_dom(),
1702
+** passing it the given asInline value, and emits the JS code from the
1703
+** built-in file fossil.tabs.js. Subsequent calls are no-ops.
1704
+**
1705
+** If passed a true value, it emits the contents directly
1706
+** to the page output, else it emits a script tag with a
1707
+** src=builtin/... to load the script.
1708
+*/
1709
+void style_emit_script_tabs(int asInline){
1710
+ static int once = 0;
1711
+ if(0==once++){
1712
+ style_emit_script_dom(asInline);
1713
+ style_emit_script_builtin(asInline, "fossil.tabs.js");
1714
+ }
1715
+}
1716
+
1717
+/*
1718
+** The first time this is called it emits the JS code from the
1719
+** built-in file fossil.confirmer.js. Subsequent calls are no-ops.
1720
+**
1721
+** If passed a true value, it emits the contents directly
1722
+** to the page output, else it emits a script tag with a
1723
+** src=builtin/... to load the script.
1724
+*/
1725
+void style_emit_script_confirmer(int asInline){
1726
+ static int once = 0;
1727
+ if(0==once++){
1728
+ style_emit_script_builtin(asInline, "fossil.confirmer.js");
1729
+ }
1730
+}
13361731
13371732
ADDED src/style.fileedit.css
--- src/style.c
+++ src/style.c
@@ -1331,5 +1331,400 @@
1331 }
1332
1333 #if INTERFACE
1334 # define webpage_assert(T) if(!(T)){webpage_assert_page(__FILE__,__LINE__,#T);}
1335 #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1336
1337 DDED src/style.fileedit.css
--- src/style.c
+++ src/style.c
@@ -1331,5 +1331,400 @@
1331 }
1332
1333 #if INTERFACE
1334 # define webpage_assert(T) if(!(T)){webpage_assert_page(__FILE__,__LINE__,#T);}
1335 #endif
1336
1337 /*
1338 ** Returns a pseudo-random input field ID, for use in associating an
1339 ** ID-less input field with a label. The memory is owned by the
1340 ** caller.
1341 */
1342 static char * style_next_input_id(){
1343 static int inputID = 0;
1344 ++inputID;
1345 return mprintf("input-id-%d", inputID);
1346 }
1347
1348 /*
1349 ** Outputs a labeled checkbox element. zWrapperId is an optional ID
1350 ** value for the containing element (see below). zFieldName is the
1351 ** form element name. zLabel is the label for the checkbox. zValue is
1352 ** the optional value for the checkbox. zTip is an optional tooltip,
1353 ** which gets set as the "title" attribute of the outermost
1354 ** element. If isChecked is true, the checkbox gets the "checked"
1355 ** attribute set, else it is not.
1356 **
1357 ** Resulting structure:
1358 **
1359 ** <span class='input-with-label' title={{zTip}} id={{zWrapperId}}>
1360 ** <input type='checkbox' name={{zFieldName}} value={{zValue}}
1361 ** id='A RANDOM VALUE'
1362 ** {{isChecked ? " checked : ""}}/>
1363 ** <label for='ID OF THE INPUT FIELD'>{{zLabel}}</label>
1364 ** </span>
1365 **
1366 ** zLabel, and zValue are required. zFieldName, zWrapperId, and zTip
1367 ** are may be NULL or empty.
1368 **
1369 ** Be sure that the input-with-label CSS class is defined sensibly, in
1370 ** particular, having its display:inline-block is useful for alignment
1371 ** purposes.
1372 */
1373 void style_labeled_checkbox(const char * zWrapperId,
1374 const char *zFieldName, const char * zLabel,
1375 const char * zValue, int isChecked,
1376 const char * zTip){
1377 char * zLabelID = style_next_input_id();
1378 CX("<span class='input-with-label'");
1379 if(zTip && *zTip){
1380 CX(" title='%h'", zTip);
1381 }
1382 if(zWrapperId && *zWrapperId){
1383 CX(" id='%s'",zWrapperId);
1384 }
1385 CX("><input type='checkbox' id='%s' ", zLabelID);
1386 if(zFieldName && *zFieldName){
1387 CX("name='%s' ",zFieldName);
1388 }
1389 CX("value='%T'%s/>",
1390 zValue ? zValue : "", isChecked ? " checked" : "");
1391 CX("<label for='%s'>%h</label></span>", zLabelID, zLabel);
1392 fossil_free(zLabelID);
1393 }
1394
1395 /*
1396 ** Outputs a SELECT list from a compile-time list of integers.
1397 ** The vargs must be a list of (const char *, int) pairs, terminated
1398 ** with a single NULL. Each pair is interpreted as...
1399 **
1400 ** If the (const char *) is NULL, it is the end of the list, else
1401 ** a new OPTION entry is created. If the string is empty, the
1402 ** label and value of the OPTION is the integer part of the pair.
1403 ** If the string is not empty, it becomes the label and the integer
1404 ** the value. If that value == selectedValue then that OPTION
1405 ** element gets the 'selected' attribute.
1406 **
1407 ** Note that the pairs are not in (int, const char *) order because
1408 ** there is no well-known integer value which we can definitively use
1409 ** as a list terminator.
1410 **
1411 ** zWrapperId is an optional ID value for the containing element (see
1412 ** below).
1413 **
1414 ** zFieldName is the value of the form element's name attribute. Note
1415 ** that fossil prefers underscores over '-' for separators in form
1416 ** element names.
1417 **
1418 ** zLabel is an optional string to use as a "label" for the element
1419 ** (see below).
1420 **
1421 ** zTooltip is an optional value for the SELECT's title attribute.
1422 **
1423 ** The structure of the emitted HTML is:
1424 **
1425 ** <span class='input-with-label' title={{zToolTip}} id={{zWrapperId}}>
1426 ** <label for='SELECT ELEMENT ID'>{{zLabel}}</label>
1427 ** <select id='RANDOM ID' name={{zFieldName}}>...</select>
1428 ** </span>
1429 **
1430 ** Example:
1431 **
1432 ** style_select_list_int("my-grapes", "my_grapes", "Grapes",
1433 ** "Select the number of grapes",
1434 ** atoi(PD("my_field","0")),
1435 ** "", 1, "2", 2, "Three", 3,
1436 ** NULL);
1437 **
1438 */
1439 void style_select_list_int(const char * zWrapperId,
1440 const char *zFieldName, const char * zLabel,
1441 const char * zToolTip, int selectedVal,
1442 ... ){
1443 char * zLabelID = style_next_input_id();
1444 va_list vargs;
1445
1446 va_start(vargs,selectedVal);
1447 CX("<span class='input-with-label'");
1448 if(zToolTip && *zToolTip){
1449 CX(" title='%h'",zToolTip);
1450 }
1451 if(zWrapperId && *zWrapperId){
1452 CX(" id='%s'",zWrapperId);
1453 }
1454 CX(">");
1455 if(zLabel && *zLabel){
1456 CX("<label label='%s'>%h</label>", zLabelID, zLabel);
1457 }
1458 CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1459 while(1){
1460 const char * zOption = va_arg(vargs,char *);
1461 int v;
1462 if(NULL==zOption){
1463 break;
1464 }
1465 v = va_arg(vargs,int);
1466 CX("<option value='%d'%s>",
1467 v, v==selectedVal ? " selected" : "");
1468 if(*zOption){
1469 CX("%s", zOption);
1470 }else{
1471 CX("%d",v);
1472 }
1473 CX("</option>\n");
1474 }
1475 CX("</select>\n");
1476 CX("</span>\n");
1477 va_end(vargs);
1478 fossil_free(zLabelID);
1479 }
1480
1481 /*
1482 ** The C-string counterpart of style_select_list_int(), this variant
1483 ** differs only in that its variadic arguments are C-strings in pairs
1484 ** of (optionLabel, optionValue). If a given optionLabel is an empty
1485 ** string, the corresponding optionValue is used as its label. If any
1486 ** given value matches zSelectedVal, that option gets preselected. If
1487 ** no options match zSelectedVal then the first entry is selected by
1488 ** default.
1489 **
1490 ** Any of (zWrapperId, zTooltip, zSelectedVal) may be NULL or empty.
1491 **
1492 ** Example:
1493 **
1494 ** style_select_list_str("my-grapes", "my_grapes", "Grapes",
1495 ** "Select the number of grapes",
1496 ** P("my_field"),
1497 ** "1", "One", "2", "Two", "", "3",
1498 ** NULL);
1499 */
1500 void style_select_list_str(const char * zWrapperId,
1501 const char *zFieldName, const char * zLabel,
1502 const char * zToolTip, char const * zSelectedVal,
1503 ... ){
1504 char * zLabelID = style_next_input_id();
1505 va_list vargs;
1506
1507 va_start(vargs,zSelectedVal);
1508 if(!zSelectedVal){
1509 zSelectedVal = __FILE__/*some string we'll never match*/;
1510 }
1511 CX("<span class='input-with-label'");
1512 if(zToolTip && *zToolTip){
1513 CX(" title='%h'",zToolTip);
1514 }
1515 if(zWrapperId && *zWrapperId){
1516 CX(" id='%s'",zWrapperId);
1517 }
1518 CX(">");
1519 if(zLabel && *zLabel){
1520 CX("<label for='%s'>%h</label>", zLabelID, zLabel);
1521 }
1522 CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1523 while(1){
1524 const char * zLabel = va_arg(vargs,char *);
1525 const char * zVal;
1526 if(NULL==zLabel){
1527 break;
1528 }
1529 zVal = va_arg(vargs,char *);
1530 CX("<option value='%T'%s>",
1531 zVal, 0==fossil_strcmp(zVal, zSelectedVal) ? " selected" : "");
1532 if(*zLabel){
1533 CX("%s", zLabel);
1534 }else{
1535 CX("%h",zVal);
1536 }
1537 CX("</option>\n");
1538 }
1539 CX("</select>\n");
1540 CX("</span>\n");
1541 va_end(vargs);
1542 fossil_free(zLabelID);
1543 }
1544
1545
1546 /*
1547 ** The first time this is called, it emits code to install and
1548 ** bootstrap the window.fossil object, using the built-in file
1549 ** fossil.bootstrap.js (not to be confused with bootstrap.js).
1550 **
1551 ** Subsequent calls are no-ops.
1552 **
1553 ** If passed a true value, it emits the contents directly to the page
1554 ** output, else it emits a script tag with a src=builtin/... to load
1555 ** the script. It always outputs a small pre-bootstrap element in its
1556 ** own script tag to initialize parts which need C-runtime-level
1557 ** information, before loading the main fossil.bootstrap.js either
1558 ** inline or via a <script src=...>, as specified by the first
1559 ** argument.
1560 */
1561 void style_emit_script_fossil_bootstrap(int asInline){
1562 static int once = 0;
1563 if(0==once++){
1564 /* Set up the generic/app-agnostic parts of window.fossil
1565 ** which require C-level state... */
1566 style_emit_script_tag(0,0);
1567 CX("(function(){\n"
1568 "if(!window.fossil) window.fossil={};\n"
1569 "window.fossil.version = %!j;\n"
1570 /* fossil.rootPath is the top-most CGI/server path,
1571 ** including a trailing slash. */
1572 "window.fossil.rootPath = %!j+'/';\n",
1573 get_version(), g.zTop);
1574 /* fossil.config = {...various config-level options...} */
1575 CX("window.fossil.config = {"
1576 "hashDigits: %d, hashDigitsUrl: %d"
1577 "};\n", hash_digits(0), hash_digits(1));
1578 #if 0
1579 /* Is it safe to emit the CSRF token here? Some pages add it
1580 ** as a hidden form field. */
1581 if(g.zCsrfToken[0]!=0){
1582 CX("window.fossil.csrfToken = %!j;\n",
1583 g.zCsrfToken);
1584 }
1585 #endif
1586 /*
1587 ** fossil.page holds info about the current page. This is also
1588 ** where the current page "should" store any of its own
1589 ** page-specific state, and it is reserved for that purpose.
1590 */
1591 CX("window.fossil.page = {"
1592 "name:\"%T\""
1593 "};\n", g.zPath);
1594 CX("})();\n");
1595 /* The remaining fossil object bootstrap code is not dependent on
1596 ** C-runtime state... */
1597 if(asInline){
1598 CX("%s\n", builtin_text("fossil.bootstrap.js"));
1599 }
1600 style_emit_script_tag(1,0);
1601 if(asInline==0){
1602 style_emit_script_builtin(0, "fossil.bootstrap.js");
1603 }
1604 }
1605 }
1606
1607 /*
1608 ** If passed 0 as its first argument, it emits a script opener tag
1609 ** with this request's nonce. If passed non-0 it emits a script
1610 ** closing tag. Mnemonic for remembering the order in which to pass 0
1611 ** or 1 as the first argument to this function: 0 comes before 1.
1612 **
1613 ** If passed 0 as its first argument and a non-NULL/non-empty zSrc,
1614 ** then it instead emits:
1615 **
1616 ** <script src='%R/{{zSrc}}'></script>
1617 **
1618 ** zSrc is always assumed to be a repository-relative path without
1619 ** a leading slash, and has %R/ prepended to it.
1620 **
1621 ** Meaning that no follow-up call to pass a non-0 first argument
1622 ** to close the tag. zSrc is ignored if the first argument is not
1623 ** 0.
1624 **
1625 */
1626 void style_emit_script_tag(int isCloser, const char * zSrc){
1627 if(0==isCloser){
1628 if(zSrc!=0 && zSrc[0]!=0){
1629 CX("<script src='%R/%T'></script>\n", zSrc);
1630 }else{
1631 CX("<script nonce='%s'>", style_nonce());
1632 }
1633 }else{
1634 CX("</script>\n");
1635 }
1636 }
1637
1638 /*
1639 ** Emits a script tag which uses content from a builtin script file.
1640 **
1641 ** If asInline is true, it is emitted directly as an opening tag, the
1642 ** content of the zName builtin file, and a closing tag.
1643 **
1644 ** If it is false, a script tag loading it via
1645 ** src=builtin/{{zName}}?cache=XYZ is emitted, where XYZ is a
1646 ** build-time-dependent cache-buster value.
1647 */
1648 void style_emit_script_builtin(int asInline, char const * zName){
1649 if(asInline){
1650 style_emit_script_tag(0,0);
1651 CX("%s", builtin_text(zName));
1652 style_emit_script_tag(1,0);
1653 }else{
1654 char * zFullName = mprintf("builtin/%s",zName);
1655 const char * zHash = fossil_exe_id();
1656 CX("<script src='%R/%T?cache=%.8s'></script>\n",
1657 zFullName, zHash);
1658 fossil_free(zFullName);
1659 }
1660 }
1661
1662 /*
1663 ** The first time this is called it emits the JS code from the
1664 ** built-in file fossil.fossil.js. Subsequent calls are no-ops.
1665 **
1666 ** If passed a true value, it emits the contents directly
1667 ** to the page output, else it emits a script tag with a
1668 ** src=builtin/... to load the script.
1669 **
1670 ** Note that this code relies on that loaded via
1671 ** style_emit_script_fossil_bootstrap() but it does not call that
1672 ** routine.
1673 */
1674 void style_emit_script_fetch(int asInline){
1675 static int once = 0;
1676 if(0==once++){
1677 style_emit_script_builtin(asInline, "fossil.fetch.js");
1678 }
1679 }
1680
1681 /*
1682 ** The first time this is called it emits the JS code from the
1683 ** built-in file fossil.dom.js. Subsequent calls are no-ops.
1684 **
1685 ** If passed a true value, it emits the contents directly
1686 ** to the page output, else it emits a script tag with a
1687 ** src=builtin/... to load the script.
1688 **
1689 ** Note that this code relies on that loaded via
1690 ** style_emit_script_fossil_bootstrap(), but it does not call that
1691 ** routine.
1692 */
1693 void style_emit_script_dom(int asInline){
1694 static int once = 0;
1695 if(0==once++){
1696 style_emit_script_builtin(asInline, "fossil.dom.js");
1697 }
1698 }
1699
1700 /*
1701 ** The first time this is called, it calls style_emit_script_dom(),
1702 ** passing it the given asInline value, and emits the JS code from the
1703 ** built-in file fossil.tabs.js. Subsequent calls are no-ops.
1704 **
1705 ** If passed a true value, it emits the contents directly
1706 ** to the page output, else it emits a script tag with a
1707 ** src=builtin/... to load the script.
1708 */
1709 void style_emit_script_tabs(int asInline){
1710 static int once = 0;
1711 if(0==once++){
1712 style_emit_script_dom(asInline);
1713 style_emit_script_builtin(asInline, "fossil.tabs.js");
1714 }
1715 }
1716
1717 /*
1718 ** The first time this is called it emits the JS code from the
1719 ** built-in file fossil.confirmer.js. Subsequent calls are no-ops.
1720 **
1721 ** If passed a true value, it emits the contents directly
1722 ** to the page output, else it emits a script tag with a
1723 ** src=builtin/... to load the script.
1724 */
1725 void style_emit_script_confirmer(int asInline){
1726 static int once = 0;
1727 if(0==once++){
1728 style_emit_script_builtin(asInline, "fossil.confirmer.js");
1729 }
1730 }
1731
1732 DDED src/style.fileedit.css
+395
--- src/style.c
+++ src/style.c
@@ -1331,5 +1331,400 @@
13311331
}
13321332
13331333
#if INTERFACE
13341334
# define webpage_assert(T) if(!(T)){webpage_assert_page(__FILE__,__LINE__,#T);}
13351335
#endif
1336
+
1337
+/*
1338
+** Returns a pseudo-random input field ID, for use in associating an
1339
+** ID-less input field with a label. The memory is owned by the
1340
+** caller.
1341
+*/
1342
+static char * style_next_input_id(){
1343
+ static int inputID = 0;
1344
+ ++inputID;
1345
+ return mprintf("input-id-%d", inputID);
1346
+}
1347
+
1348
+/*
1349
+** Outputs a labeled checkbox element. zWrapperId is an optional ID
1350
+** value for the containing element (see below). zFieldName is the
1351
+** form element name. zLabel is the label for the checkbox. zValue is
1352
+** the optional value for the checkbox. zTip is an optional tooltip,
1353
+** which gets set as the "title" attribute of the outermost
1354
+** element. If isChecked is true, the checkbox gets the "checked"
1355
+** attribute set, else it is not.
1356
+**
1357
+** Resulting structure:
1358
+**
1359
+** <span class='input-with-label' title={{zTip}} id={{zWrapperId}}>
1360
+** <input type='checkbox' name={{zFieldName}} value={{zValue}}
1361
+** id='A RANDOM VALUE'
1362
+** {{isChecked ? " checked : ""}}/>
1363
+** <label for='ID OF THE INPUT FIELD'>{{zLabel}}</label>
1364
+** </span>
1365
+**
1366
+** zLabel, and zValue are required. zFieldName, zWrapperId, and zTip
1367
+** are may be NULL or empty.
1368
+**
1369
+** Be sure that the input-with-label CSS class is defined sensibly, in
1370
+** particular, having its display:inline-block is useful for alignment
1371
+** purposes.
1372
+*/
1373
+void style_labeled_checkbox(const char * zWrapperId,
1374
+ const char *zFieldName, const char * zLabel,
1375
+ const char * zValue, int isChecked,
1376
+ const char * zTip){
1377
+ char * zLabelID = style_next_input_id();
1378
+ CX("<span class='input-with-label'");
1379
+ if(zTip && *zTip){
1380
+ CX(" title='%h'", zTip);
1381
+ }
1382
+ if(zWrapperId && *zWrapperId){
1383
+ CX(" id='%s'",zWrapperId);
1384
+ }
1385
+ CX("><input type='checkbox' id='%s' ", zLabelID);
1386
+ if(zFieldName && *zFieldName){
1387
+ CX("name='%s' ",zFieldName);
1388
+ }
1389
+ CX("value='%T'%s/>",
1390
+ zValue ? zValue : "", isChecked ? " checked" : "");
1391
+ CX("<label for='%s'>%h</label></span>", zLabelID, zLabel);
1392
+ fossil_free(zLabelID);
1393
+}
1394
+
1395
+/*
1396
+** Outputs a SELECT list from a compile-time list of integers.
1397
+** The vargs must be a list of (const char *, int) pairs, terminated
1398
+** with a single NULL. Each pair is interpreted as...
1399
+**
1400
+** If the (const char *) is NULL, it is the end of the list, else
1401
+** a new OPTION entry is created. If the string is empty, the
1402
+** label and value of the OPTION is the integer part of the pair.
1403
+** If the string is not empty, it becomes the label and the integer
1404
+** the value. If that value == selectedValue then that OPTION
1405
+** element gets the 'selected' attribute.
1406
+**
1407
+** Note that the pairs are not in (int, const char *) order because
1408
+** there is no well-known integer value which we can definitively use
1409
+** as a list terminator.
1410
+**
1411
+** zWrapperId is an optional ID value for the containing element (see
1412
+** below).
1413
+**
1414
+** zFieldName is the value of the form element's name attribute. Note
1415
+** that fossil prefers underscores over '-' for separators in form
1416
+** element names.
1417
+**
1418
+** zLabel is an optional string to use as a "label" for the element
1419
+** (see below).
1420
+**
1421
+** zTooltip is an optional value for the SELECT's title attribute.
1422
+**
1423
+** The structure of the emitted HTML is:
1424
+**
1425
+** <span class='input-with-label' title={{zToolTip}} id={{zWrapperId}}>
1426
+** <label for='SELECT ELEMENT ID'>{{zLabel}}</label>
1427
+** <select id='RANDOM ID' name={{zFieldName}}>...</select>
1428
+** </span>
1429
+**
1430
+** Example:
1431
+**
1432
+** style_select_list_int("my-grapes", "my_grapes", "Grapes",
1433
+** "Select the number of grapes",
1434
+** atoi(PD("my_field","0")),
1435
+** "", 1, "2", 2, "Three", 3,
1436
+** NULL);
1437
+**
1438
+*/
1439
+void style_select_list_int(const char * zWrapperId,
1440
+ const char *zFieldName, const char * zLabel,
1441
+ const char * zToolTip, int selectedVal,
1442
+ ... ){
1443
+ char * zLabelID = style_next_input_id();
1444
+ va_list vargs;
1445
+
1446
+ va_start(vargs,selectedVal);
1447
+ CX("<span class='input-with-label'");
1448
+ if(zToolTip && *zToolTip){
1449
+ CX(" title='%h'",zToolTip);
1450
+ }
1451
+ if(zWrapperId && *zWrapperId){
1452
+ CX(" id='%s'",zWrapperId);
1453
+ }
1454
+ CX(">");
1455
+ if(zLabel && *zLabel){
1456
+ CX("<label label='%s'>%h</label>", zLabelID, zLabel);
1457
+ }
1458
+ CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1459
+ while(1){
1460
+ const char * zOption = va_arg(vargs,char *);
1461
+ int v;
1462
+ if(NULL==zOption){
1463
+ break;
1464
+ }
1465
+ v = va_arg(vargs,int);
1466
+ CX("<option value='%d'%s>",
1467
+ v, v==selectedVal ? " selected" : "");
1468
+ if(*zOption){
1469
+ CX("%s", zOption);
1470
+ }else{
1471
+ CX("%d",v);
1472
+ }
1473
+ CX("</option>\n");
1474
+ }
1475
+ CX("</select>\n");
1476
+ CX("</span>\n");
1477
+ va_end(vargs);
1478
+ fossil_free(zLabelID);
1479
+}
1480
+
1481
+/*
1482
+** The C-string counterpart of style_select_list_int(), this variant
1483
+** differs only in that its variadic arguments are C-strings in pairs
1484
+** of (optionLabel, optionValue). If a given optionLabel is an empty
1485
+** string, the corresponding optionValue is used as its label. If any
1486
+** given value matches zSelectedVal, that option gets preselected. If
1487
+** no options match zSelectedVal then the first entry is selected by
1488
+** default.
1489
+**
1490
+** Any of (zWrapperId, zTooltip, zSelectedVal) may be NULL or empty.
1491
+**
1492
+** Example:
1493
+**
1494
+** style_select_list_str("my-grapes", "my_grapes", "Grapes",
1495
+** "Select the number of grapes",
1496
+** P("my_field"),
1497
+** "1", "One", "2", "Two", "", "3",
1498
+** NULL);
1499
+*/
1500
+void style_select_list_str(const char * zWrapperId,
1501
+ const char *zFieldName, const char * zLabel,
1502
+ const char * zToolTip, char const * zSelectedVal,
1503
+ ... ){
1504
+ char * zLabelID = style_next_input_id();
1505
+ va_list vargs;
1506
+
1507
+ va_start(vargs,zSelectedVal);
1508
+ if(!zSelectedVal){
1509
+ zSelectedVal = __FILE__/*some string we'll never match*/;
1510
+ }
1511
+ CX("<span class='input-with-label'");
1512
+ if(zToolTip && *zToolTip){
1513
+ CX(" title='%h'",zToolTip);
1514
+ }
1515
+ if(zWrapperId && *zWrapperId){
1516
+ CX(" id='%s'",zWrapperId);
1517
+ }
1518
+ CX(">");
1519
+ if(zLabel && *zLabel){
1520
+ CX("<label for='%s'>%h</label>", zLabelID, zLabel);
1521
+ }
1522
+ CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1523
+ while(1){
1524
+ const char * zLabel = va_arg(vargs,char *);
1525
+ const char * zVal;
1526
+ if(NULL==zLabel){
1527
+ break;
1528
+ }
1529
+ zVal = va_arg(vargs,char *);
1530
+ CX("<option value='%T'%s>",
1531
+ zVal, 0==fossil_strcmp(zVal, zSelectedVal) ? " selected" : "");
1532
+ if(*zLabel){
1533
+ CX("%s", zLabel);
1534
+ }else{
1535
+ CX("%h",zVal);
1536
+ }
1537
+ CX("</option>\n");
1538
+ }
1539
+ CX("</select>\n");
1540
+ CX("</span>\n");
1541
+ va_end(vargs);
1542
+ fossil_free(zLabelID);
1543
+}
1544
+
1545
+
1546
+/*
1547
+** The first time this is called, it emits code to install and
1548
+** bootstrap the window.fossil object, using the built-in file
1549
+** fossil.bootstrap.js (not to be confused with bootstrap.js).
1550
+**
1551
+** Subsequent calls are no-ops.
1552
+**
1553
+** If passed a true value, it emits the contents directly to the page
1554
+** output, else it emits a script tag with a src=builtin/... to load
1555
+** the script. It always outputs a small pre-bootstrap element in its
1556
+** own script tag to initialize parts which need C-runtime-level
1557
+** information, before loading the main fossil.bootstrap.js either
1558
+** inline or via a <script src=...>, as specified by the first
1559
+** argument.
1560
+*/
1561
+void style_emit_script_fossil_bootstrap(int asInline){
1562
+ static int once = 0;
1563
+ if(0==once++){
1564
+ /* Set up the generic/app-agnostic parts of window.fossil
1565
+ ** which require C-level state... */
1566
+ style_emit_script_tag(0,0);
1567
+ CX("(function(){\n"
1568
+ "if(!window.fossil) window.fossil={};\n"
1569
+ "window.fossil.version = %!j;\n"
1570
+ /* fossil.rootPath is the top-most CGI/server path,
1571
+ ** including a trailing slash. */
1572
+ "window.fossil.rootPath = %!j+'/';\n",
1573
+ get_version(), g.zTop);
1574
+ /* fossil.config = {...various config-level options...} */
1575
+ CX("window.fossil.config = {"
1576
+ "hashDigits: %d, hashDigitsUrl: %d"
1577
+ "};\n", hash_digits(0), hash_digits(1));
1578
+#if 0
1579
+ /* Is it safe to emit the CSRF token here? Some pages add it
1580
+ ** as a hidden form field. */
1581
+ if(g.zCsrfToken[0]!=0){
1582
+ CX("window.fossil.csrfToken = %!j;\n",
1583
+ g.zCsrfToken);
1584
+ }
1585
+#endif
1586
+ /*
1587
+ ** fossil.page holds info about the current page. This is also
1588
+ ** where the current page "should" store any of its own
1589
+ ** page-specific state, and it is reserved for that purpose.
1590
+ */
1591
+ CX("window.fossil.page = {"
1592
+ "name:\"%T\""
1593
+ "};\n", g.zPath);
1594
+ CX("})();\n");
1595
+ /* The remaining fossil object bootstrap code is not dependent on
1596
+ ** C-runtime state... */
1597
+ if(asInline){
1598
+ CX("%s\n", builtin_text("fossil.bootstrap.js"));
1599
+ }
1600
+ style_emit_script_tag(1,0);
1601
+ if(asInline==0){
1602
+ style_emit_script_builtin(0, "fossil.bootstrap.js");
1603
+ }
1604
+ }
1605
+}
1606
+
1607
+/*
1608
+** If passed 0 as its first argument, it emits a script opener tag
1609
+** with this request's nonce. If passed non-0 it emits a script
1610
+** closing tag. Mnemonic for remembering the order in which to pass 0
1611
+** or 1 as the first argument to this function: 0 comes before 1.
1612
+**
1613
+** If passed 0 as its first argument and a non-NULL/non-empty zSrc,
1614
+** then it instead emits:
1615
+**
1616
+** <script src='%R/{{zSrc}}'></script>
1617
+**
1618
+** zSrc is always assumed to be a repository-relative path without
1619
+** a leading slash, and has %R/ prepended to it.
1620
+**
1621
+** Meaning that no follow-up call to pass a non-0 first argument
1622
+** to close the tag. zSrc is ignored if the first argument is not
1623
+** 0.
1624
+**
1625
+*/
1626
+void style_emit_script_tag(int isCloser, const char * zSrc){
1627
+ if(0==isCloser){
1628
+ if(zSrc!=0 && zSrc[0]!=0){
1629
+ CX("<script src='%R/%T'></script>\n", zSrc);
1630
+ }else{
1631
+ CX("<script nonce='%s'>", style_nonce());
1632
+ }
1633
+ }else{
1634
+ CX("</script>\n");
1635
+ }
1636
+}
1637
+
1638
+/*
1639
+** Emits a script tag which uses content from a builtin script file.
1640
+**
1641
+** If asInline is true, it is emitted directly as an opening tag, the
1642
+** content of the zName builtin file, and a closing tag.
1643
+**
1644
+** If it is false, a script tag loading it via
1645
+** src=builtin/{{zName}}?cache=XYZ is emitted, where XYZ is a
1646
+** build-time-dependent cache-buster value.
1647
+*/
1648
+void style_emit_script_builtin(int asInline, char const * zName){
1649
+ if(asInline){
1650
+ style_emit_script_tag(0,0);
1651
+ CX("%s", builtin_text(zName));
1652
+ style_emit_script_tag(1,0);
1653
+ }else{
1654
+ char * zFullName = mprintf("builtin/%s",zName);
1655
+ const char * zHash = fossil_exe_id();
1656
+ CX("<script src='%R/%T?cache=%.8s'></script>\n",
1657
+ zFullName, zHash);
1658
+ fossil_free(zFullName);
1659
+ }
1660
+}
1661
+
1662
+/*
1663
+** The first time this is called it emits the JS code from the
1664
+** built-in file fossil.fossil.js. Subsequent calls are no-ops.
1665
+**
1666
+** If passed a true value, it emits the contents directly
1667
+** to the page output, else it emits a script tag with a
1668
+** src=builtin/... to load the script.
1669
+**
1670
+** Note that this code relies on that loaded via
1671
+** style_emit_script_fossil_bootstrap() but it does not call that
1672
+** routine.
1673
+*/
1674
+void style_emit_script_fetch(int asInline){
1675
+ static int once = 0;
1676
+ if(0==once++){
1677
+ style_emit_script_builtin(asInline, "fossil.fetch.js");
1678
+ }
1679
+}
1680
+
1681
+/*
1682
+** The first time this is called it emits the JS code from the
1683
+** built-in file fossil.dom.js. Subsequent calls are no-ops.
1684
+**
1685
+** If passed a true value, it emits the contents directly
1686
+** to the page output, else it emits a script tag with a
1687
+** src=builtin/... to load the script.
1688
+**
1689
+** Note that this code relies on that loaded via
1690
+** style_emit_script_fossil_bootstrap(), but it does not call that
1691
+** routine.
1692
+*/
1693
+void style_emit_script_dom(int asInline){
1694
+ static int once = 0;
1695
+ if(0==once++){
1696
+ style_emit_script_builtin(asInline, "fossil.dom.js");
1697
+ }
1698
+}
1699
+
1700
+/*
1701
+** The first time this is called, it calls style_emit_script_dom(),
1702
+** passing it the given asInline value, and emits the JS code from the
1703
+** built-in file fossil.tabs.js. Subsequent calls are no-ops.
1704
+**
1705
+** If passed a true value, it emits the contents directly
1706
+** to the page output, else it emits a script tag with a
1707
+** src=builtin/... to load the script.
1708
+*/
1709
+void style_emit_script_tabs(int asInline){
1710
+ static int once = 0;
1711
+ if(0==once++){
1712
+ style_emit_script_dom(asInline);
1713
+ style_emit_script_builtin(asInline, "fossil.tabs.js");
1714
+ }
1715
+}
1716
+
1717
+/*
1718
+** The first time this is called it emits the JS code from the
1719
+** built-in file fossil.confirmer.js. Subsequent calls are no-ops.
1720
+**
1721
+** If passed a true value, it emits the contents directly
1722
+** to the page output, else it emits a script tag with a
1723
+** src=builtin/... to load the script.
1724
+*/
1725
+void style_emit_script_confirmer(int asInline){
1726
+ static int once = 0;
1727
+ if(0==once++){
1728
+ style_emit_script_builtin(asInline, "fossil.confirmer.js");
1729
+ }
1730
+}
13361731
13371732
ADDED src/style.fileedit.css
--- src/style.c
+++ src/style.c
@@ -1331,5 +1331,400 @@
1331 }
1332
1333 #if INTERFACE
1334 # define webpage_assert(T) if(!(T)){webpage_assert_page(__FILE__,__LINE__,#T);}
1335 #endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1336
1337 DDED src/style.fileedit.css
--- src/style.c
+++ src/style.c
@@ -1331,5 +1331,400 @@
1331 }
1332
1333 #if INTERFACE
1334 # define webpage_assert(T) if(!(T)){webpage_assert_page(__FILE__,__LINE__,#T);}
1335 #endif
1336
1337 /*
1338 ** Returns a pseudo-random input field ID, for use in associating an
1339 ** ID-less input field with a label. The memory is owned by the
1340 ** caller.
1341 */
1342 static char * style_next_input_id(){
1343 static int inputID = 0;
1344 ++inputID;
1345 return mprintf("input-id-%d", inputID);
1346 }
1347
1348 /*
1349 ** Outputs a labeled checkbox element. zWrapperId is an optional ID
1350 ** value for the containing element (see below). zFieldName is the
1351 ** form element name. zLabel is the label for the checkbox. zValue is
1352 ** the optional value for the checkbox. zTip is an optional tooltip,
1353 ** which gets set as the "title" attribute of the outermost
1354 ** element. If isChecked is true, the checkbox gets the "checked"
1355 ** attribute set, else it is not.
1356 **
1357 ** Resulting structure:
1358 **
1359 ** <span class='input-with-label' title={{zTip}} id={{zWrapperId}}>
1360 ** <input type='checkbox' name={{zFieldName}} value={{zValue}}
1361 ** id='A RANDOM VALUE'
1362 ** {{isChecked ? " checked : ""}}/>
1363 ** <label for='ID OF THE INPUT FIELD'>{{zLabel}}</label>
1364 ** </span>
1365 **
1366 ** zLabel, and zValue are required. zFieldName, zWrapperId, and zTip
1367 ** are may be NULL or empty.
1368 **
1369 ** Be sure that the input-with-label CSS class is defined sensibly, in
1370 ** particular, having its display:inline-block is useful for alignment
1371 ** purposes.
1372 */
1373 void style_labeled_checkbox(const char * zWrapperId,
1374 const char *zFieldName, const char * zLabel,
1375 const char * zValue, int isChecked,
1376 const char * zTip){
1377 char * zLabelID = style_next_input_id();
1378 CX("<span class='input-with-label'");
1379 if(zTip && *zTip){
1380 CX(" title='%h'", zTip);
1381 }
1382 if(zWrapperId && *zWrapperId){
1383 CX(" id='%s'",zWrapperId);
1384 }
1385 CX("><input type='checkbox' id='%s' ", zLabelID);
1386 if(zFieldName && *zFieldName){
1387 CX("name='%s' ",zFieldName);
1388 }
1389 CX("value='%T'%s/>",
1390 zValue ? zValue : "", isChecked ? " checked" : "");
1391 CX("<label for='%s'>%h</label></span>", zLabelID, zLabel);
1392 fossil_free(zLabelID);
1393 }
1394
1395 /*
1396 ** Outputs a SELECT list from a compile-time list of integers.
1397 ** The vargs must be a list of (const char *, int) pairs, terminated
1398 ** with a single NULL. Each pair is interpreted as...
1399 **
1400 ** If the (const char *) is NULL, it is the end of the list, else
1401 ** a new OPTION entry is created. If the string is empty, the
1402 ** label and value of the OPTION is the integer part of the pair.
1403 ** If the string is not empty, it becomes the label and the integer
1404 ** the value. If that value == selectedValue then that OPTION
1405 ** element gets the 'selected' attribute.
1406 **
1407 ** Note that the pairs are not in (int, const char *) order because
1408 ** there is no well-known integer value which we can definitively use
1409 ** as a list terminator.
1410 **
1411 ** zWrapperId is an optional ID value for the containing element (see
1412 ** below).
1413 **
1414 ** zFieldName is the value of the form element's name attribute. Note
1415 ** that fossil prefers underscores over '-' for separators in form
1416 ** element names.
1417 **
1418 ** zLabel is an optional string to use as a "label" for the element
1419 ** (see below).
1420 **
1421 ** zTooltip is an optional value for the SELECT's title attribute.
1422 **
1423 ** The structure of the emitted HTML is:
1424 **
1425 ** <span class='input-with-label' title={{zToolTip}} id={{zWrapperId}}>
1426 ** <label for='SELECT ELEMENT ID'>{{zLabel}}</label>
1427 ** <select id='RANDOM ID' name={{zFieldName}}>...</select>
1428 ** </span>
1429 **
1430 ** Example:
1431 **
1432 ** style_select_list_int("my-grapes", "my_grapes", "Grapes",
1433 ** "Select the number of grapes",
1434 ** atoi(PD("my_field","0")),
1435 ** "", 1, "2", 2, "Three", 3,
1436 ** NULL);
1437 **
1438 */
1439 void style_select_list_int(const char * zWrapperId,
1440 const char *zFieldName, const char * zLabel,
1441 const char * zToolTip, int selectedVal,
1442 ... ){
1443 char * zLabelID = style_next_input_id();
1444 va_list vargs;
1445
1446 va_start(vargs,selectedVal);
1447 CX("<span class='input-with-label'");
1448 if(zToolTip && *zToolTip){
1449 CX(" title='%h'",zToolTip);
1450 }
1451 if(zWrapperId && *zWrapperId){
1452 CX(" id='%s'",zWrapperId);
1453 }
1454 CX(">");
1455 if(zLabel && *zLabel){
1456 CX("<label label='%s'>%h</label>", zLabelID, zLabel);
1457 }
1458 CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1459 while(1){
1460 const char * zOption = va_arg(vargs,char *);
1461 int v;
1462 if(NULL==zOption){
1463 break;
1464 }
1465 v = va_arg(vargs,int);
1466 CX("<option value='%d'%s>",
1467 v, v==selectedVal ? " selected" : "");
1468 if(*zOption){
1469 CX("%s", zOption);
1470 }else{
1471 CX("%d",v);
1472 }
1473 CX("</option>\n");
1474 }
1475 CX("</select>\n");
1476 CX("</span>\n");
1477 va_end(vargs);
1478 fossil_free(zLabelID);
1479 }
1480
1481 /*
1482 ** The C-string counterpart of style_select_list_int(), this variant
1483 ** differs only in that its variadic arguments are C-strings in pairs
1484 ** of (optionLabel, optionValue). If a given optionLabel is an empty
1485 ** string, the corresponding optionValue is used as its label. If any
1486 ** given value matches zSelectedVal, that option gets preselected. If
1487 ** no options match zSelectedVal then the first entry is selected by
1488 ** default.
1489 **
1490 ** Any of (zWrapperId, zTooltip, zSelectedVal) may be NULL or empty.
1491 **
1492 ** Example:
1493 **
1494 ** style_select_list_str("my-grapes", "my_grapes", "Grapes",
1495 ** "Select the number of grapes",
1496 ** P("my_field"),
1497 ** "1", "One", "2", "Two", "", "3",
1498 ** NULL);
1499 */
1500 void style_select_list_str(const char * zWrapperId,
1501 const char *zFieldName, const char * zLabel,
1502 const char * zToolTip, char const * zSelectedVal,
1503 ... ){
1504 char * zLabelID = style_next_input_id();
1505 va_list vargs;
1506
1507 va_start(vargs,zSelectedVal);
1508 if(!zSelectedVal){
1509 zSelectedVal = __FILE__/*some string we'll never match*/;
1510 }
1511 CX("<span class='input-with-label'");
1512 if(zToolTip && *zToolTip){
1513 CX(" title='%h'",zToolTip);
1514 }
1515 if(zWrapperId && *zWrapperId){
1516 CX(" id='%s'",zWrapperId);
1517 }
1518 CX(">");
1519 if(zLabel && *zLabel){
1520 CX("<label for='%s'>%h</label>", zLabelID, zLabel);
1521 }
1522 CX("<select name='%s' id='%s'>",zFieldName, zLabelID);
1523 while(1){
1524 const char * zLabel = va_arg(vargs,char *);
1525 const char * zVal;
1526 if(NULL==zLabel){
1527 break;
1528 }
1529 zVal = va_arg(vargs,char *);
1530 CX("<option value='%T'%s>",
1531 zVal, 0==fossil_strcmp(zVal, zSelectedVal) ? " selected" : "");
1532 if(*zLabel){
1533 CX("%s", zLabel);
1534 }else{
1535 CX("%h",zVal);
1536 }
1537 CX("</option>\n");
1538 }
1539 CX("</select>\n");
1540 CX("</span>\n");
1541 va_end(vargs);
1542 fossil_free(zLabelID);
1543 }
1544
1545
1546 /*
1547 ** The first time this is called, it emits code to install and
1548 ** bootstrap the window.fossil object, using the built-in file
1549 ** fossil.bootstrap.js (not to be confused with bootstrap.js).
1550 **
1551 ** Subsequent calls are no-ops.
1552 **
1553 ** If passed a true value, it emits the contents directly to the page
1554 ** output, else it emits a script tag with a src=builtin/... to load
1555 ** the script. It always outputs a small pre-bootstrap element in its
1556 ** own script tag to initialize parts which need C-runtime-level
1557 ** information, before loading the main fossil.bootstrap.js either
1558 ** inline or via a <script src=...>, as specified by the first
1559 ** argument.
1560 */
1561 void style_emit_script_fossil_bootstrap(int asInline){
1562 static int once = 0;
1563 if(0==once++){
1564 /* Set up the generic/app-agnostic parts of window.fossil
1565 ** which require C-level state... */
1566 style_emit_script_tag(0,0);
1567 CX("(function(){\n"
1568 "if(!window.fossil) window.fossil={};\n"
1569 "window.fossil.version = %!j;\n"
1570 /* fossil.rootPath is the top-most CGI/server path,
1571 ** including a trailing slash. */
1572 "window.fossil.rootPath = %!j+'/';\n",
1573 get_version(), g.zTop);
1574 /* fossil.config = {...various config-level options...} */
1575 CX("window.fossil.config = {"
1576 "hashDigits: %d, hashDigitsUrl: %d"
1577 "};\n", hash_digits(0), hash_digits(1));
1578 #if 0
1579 /* Is it safe to emit the CSRF token here? Some pages add it
1580 ** as a hidden form field. */
1581 if(g.zCsrfToken[0]!=0){
1582 CX("window.fossil.csrfToken = %!j;\n",
1583 g.zCsrfToken);
1584 }
1585 #endif
1586 /*
1587 ** fossil.page holds info about the current page. This is also
1588 ** where the current page "should" store any of its own
1589 ** page-specific state, and it is reserved for that purpose.
1590 */
1591 CX("window.fossil.page = {"
1592 "name:\"%T\""
1593 "};\n", g.zPath);
1594 CX("})();\n");
1595 /* The remaining fossil object bootstrap code is not dependent on
1596 ** C-runtime state... */
1597 if(asInline){
1598 CX("%s\n", builtin_text("fossil.bootstrap.js"));
1599 }
1600 style_emit_script_tag(1,0);
1601 if(asInline==0){
1602 style_emit_script_builtin(0, "fossil.bootstrap.js");
1603 }
1604 }
1605 }
1606
1607 /*
1608 ** If passed 0 as its first argument, it emits a script opener tag
1609 ** with this request's nonce. If passed non-0 it emits a script
1610 ** closing tag. Mnemonic for remembering the order in which to pass 0
1611 ** or 1 as the first argument to this function: 0 comes before 1.
1612 **
1613 ** If passed 0 as its first argument and a non-NULL/non-empty zSrc,
1614 ** then it instead emits:
1615 **
1616 ** <script src='%R/{{zSrc}}'></script>
1617 **
1618 ** zSrc is always assumed to be a repository-relative path without
1619 ** a leading slash, and has %R/ prepended to it.
1620 **
1621 ** Meaning that no follow-up call to pass a non-0 first argument
1622 ** to close the tag. zSrc is ignored if the first argument is not
1623 ** 0.
1624 **
1625 */
1626 void style_emit_script_tag(int isCloser, const char * zSrc){
1627 if(0==isCloser){
1628 if(zSrc!=0 && zSrc[0]!=0){
1629 CX("<script src='%R/%T'></script>\n", zSrc);
1630 }else{
1631 CX("<script nonce='%s'>", style_nonce());
1632 }
1633 }else{
1634 CX("</script>\n");
1635 }
1636 }
1637
1638 /*
1639 ** Emits a script tag which uses content from a builtin script file.
1640 **
1641 ** If asInline is true, it is emitted directly as an opening tag, the
1642 ** content of the zName builtin file, and a closing tag.
1643 **
1644 ** If it is false, a script tag loading it via
1645 ** src=builtin/{{zName}}?cache=XYZ is emitted, where XYZ is a
1646 ** build-time-dependent cache-buster value.
1647 */
1648 void style_emit_script_builtin(int asInline, char const * zName){
1649 if(asInline){
1650 style_emit_script_tag(0,0);
1651 CX("%s", builtin_text(zName));
1652 style_emit_script_tag(1,0);
1653 }else{
1654 char * zFullName = mprintf("builtin/%s",zName);
1655 const char * zHash = fossil_exe_id();
1656 CX("<script src='%R/%T?cache=%.8s'></script>\n",
1657 zFullName, zHash);
1658 fossil_free(zFullName);
1659 }
1660 }
1661
1662 /*
1663 ** The first time this is called it emits the JS code from the
1664 ** built-in file fossil.fossil.js. Subsequent calls are no-ops.
1665 **
1666 ** If passed a true value, it emits the contents directly
1667 ** to the page output, else it emits a script tag with a
1668 ** src=builtin/... to load the script.
1669 **
1670 ** Note that this code relies on that loaded via
1671 ** style_emit_script_fossil_bootstrap() but it does not call that
1672 ** routine.
1673 */
1674 void style_emit_script_fetch(int asInline){
1675 static int once = 0;
1676 if(0==once++){
1677 style_emit_script_builtin(asInline, "fossil.fetch.js");
1678 }
1679 }
1680
1681 /*
1682 ** The first time this is called it emits the JS code from the
1683 ** built-in file fossil.dom.js. Subsequent calls are no-ops.
1684 **
1685 ** If passed a true value, it emits the contents directly
1686 ** to the page output, else it emits a script tag with a
1687 ** src=builtin/... to load the script.
1688 **
1689 ** Note that this code relies on that loaded via
1690 ** style_emit_script_fossil_bootstrap(), but it does not call that
1691 ** routine.
1692 */
1693 void style_emit_script_dom(int asInline){
1694 static int once = 0;
1695 if(0==once++){
1696 style_emit_script_builtin(asInline, "fossil.dom.js");
1697 }
1698 }
1699
1700 /*
1701 ** The first time this is called, it calls style_emit_script_dom(),
1702 ** passing it the given asInline value, and emits the JS code from the
1703 ** built-in file fossil.tabs.js. Subsequent calls are no-ops.
1704 **
1705 ** If passed a true value, it emits the contents directly
1706 ** to the page output, else it emits a script tag with a
1707 ** src=builtin/... to load the script.
1708 */
1709 void style_emit_script_tabs(int asInline){
1710 static int once = 0;
1711 if(0==once++){
1712 style_emit_script_dom(asInline);
1713 style_emit_script_builtin(asInline, "fossil.tabs.js");
1714 }
1715 }
1716
1717 /*
1718 ** The first time this is called it emits the JS code from the
1719 ** built-in file fossil.confirmer.js. Subsequent calls are no-ops.
1720 **
1721 ** If passed a true value, it emits the contents directly
1722 ** to the page output, else it emits a script tag with a
1723 ** src=builtin/... to load the script.
1724 */
1725 void style_emit_script_confirmer(int asInline){
1726 static int once = 0;
1727 if(0==once++){
1728 style_emit_script_builtin(asInline, "fossil.confirmer.js");
1729 }
1730 }
1731
1732 DDED src/style.fileedit.css
--- a/src/style.fileedit.css
+++ b/src/style.fileedit.css
@@ -0,0 +1,220 @@
1
+/** Styles specific to /fileedit... */
2
+body.fileedit.waiting * {
3
+ /* Triggered during AJAX requests. */
4
+ cursor: wait;
5
+}
6
+body.fileedit .error {
7
+ padding: 0.25em;
8
+}
9
+body.fileedit .warning {
10
+ padding: 0.25em;
11
+}
12
+body.fileedit textarea {
13
+ font-family: monospace;
14
+ flex: 10 1 auto;
15
+ height: initial/*undo damage from some skins*/;
16
+entually need totextarea:focus,
17
+body.fileedit input:focus{
18
+ /* The sudden appearance of a border (as in the Ardoise skin)
19
+ shifts the layout in;
20
+ border-radius: 0.5em;
21
+ border-color: inherit;
22
+ border-width: 1px;
23
+ font-size: 90%;
24
+ overflow: auto;
25
+}
26
+body.fileedit fieldset > legend {
27
+ margin: 0 0 0 1em;
28
+ padding: 0 0.5em 0 0.5em;
29
+}
30
+body.fileedit fieldset > div {
31
+ margin: 0 0.25em 0 0.25em;
32
+ padding: 0;
33
+ overflow: auto;
34
+}
35
+body.fileedit fieldset > div > .input-with-label {
36
+ margin: 0.25em 0.5em;
37
+}
38
+body.fileedit fieldset > div > button {
39
+ margin: 0.25em 0.5em;
40
+}
41
+body.fileedit .fileedit-hint {
42
+ font-size: 80%;
43
+ opacity: 0.75;
44
+}
45
+body.fileedit .fileedit-error-report {
46
+ background: yellow;
47
+ color: darkred;
48
+ margin: 1em 0;
49
+ padding: 0.5em;
50
+ border-radius: 0.5em;
51
+}
52
+body.fileedit code.fileedit-manifest {
53
+ display: block;
54
+ height: 16em;
55
+ overflow: auto;
56
+ white-space: pre;
57
+}
58
+body.fileedit div.filr-style: inset;
59
+ border-radius: 0.5em;
60
+in: 0.25em 0.5em;
61
+}
62
+body.fileedit .fileedit-hint {
63
+ font-size: 80%;
64
+ opacity: 0.75;
65
+}
66
+body.fileedit .fileedit-error-report {
67
+ background: yelck;
68
+ height: 16em;
69
+ overflow: auto;
70
+ white-space: pre;
71
+}
72
+body.rgin: 0;
73
+ padeedit div.fileedit-preview {
74
+ margin: 0;
75
+ padding: 0;
76
+}
77
+body.fileedit #fileedit-tabs {
78
+ margin: 0.5em 0 0 0;
79
+}
80
+body.fileedit #fileedit-tab-preview-wrapper {
81
+ overflow: auto;
82
+}
83
+body.fileedioverflow: autoed;
84
+ overflow: auto;
85
+etch;
86
+}
87
+body.fileedit #fileedit-tab-0 1 auto;
88
+}
89
+body.fileedit /column;
90
+}
91
+body.fileedit #fileedit-tab- font-size: 1.c to /fileedit... */
92
+body.filee/** Styles specifi/column;
93
+}
94
+body.fileedit #
95
+/**
96
+ Styles for fossil.tabs.js. As of this writing, currently
97
+ only used by /fileedit, but it is anticipated that these
98
+ will eventually need to migrate to default_css.txt for use
99
+ in the wiki and/or forum pages when implementing tabbed
100
+ ajax-based previews.
101
+*/
102
+.tab 100%;h@tl,Q: align-items: stretch;
103
+}
104
+H@XW,I:#fossil-status-barK@VT,2:}
105
+N@XW,L@2G,C: margin: 0;h@tl,a@gv,5:outseS@gU,2:}
106
+_@XW,a:{
107
+ align-self: stretch;
108
+ flex: 10 1I@vk,9:block;
109
+}
110
+L@XW,4:-barb@tj,14:row;
111
+ flex: 1 10 auto;
112
+ align-self: stretch;
113
+ flex-wrap: wrap;
114
+}
115
+L@XW,h:-bar > .tab-button {
116
+ display: inline-blockK@V~,Y:.5em 0.5em 0 0;
117
+ margin: 0 0.1em;I@2~,V: 0.75em;
118
+ align-self: baselineu@gV,r:bottom: none;
119
+ border-top-style: inset;
120
+ border-leftP@hN,t:ight-style: inset;
121
+ cursor: pointer;
122
+ opacity: 0.6;
123
+}
124
+L@XW,1O:-bar > .tab-button.selected {
125
+ text-decoration: underline;
126
+ opacity: 1.0;
127
+ border-top8@X0,L:outset;
128
+ border-left8@X0,M:outset;
129
+ border-right8@X0,5g:outset;
130
+}
131
+
132
+/**
133
+ Styles developed for /fileedit but which have wider
134
+ applicability...
135
+
136
+ As of this writing, these are only used by /fileedit, but it is
137
+ anticipated that they will eventually need to be migrated over to
138
+ default_css.txt for use in other pages (specifically wiki and forum
139
+ page/post editors).
140
+*/
141
+.flex-container {
142
+ display: flex;
143
+}
144
+T@dq,f@ps,N:justify-content: centerH@wV,2n:center;
145
+}
146
+.flex-container .flex-grow {
147
+ flex-grow: 10;
148
+ flex-shrink: 0;
149
+}
150
+.flex-container .flex-shrink {
151
+ flex-grow: 0;
152
+ flex-shrink: 10;
153
+}
154
+.flex-container.flex-row.stretch {i@qB,18: justify-content: stretch;
155
+ margin: 0;
156
+}
157
+.flex-container.flex-column {T@10A,J@qE,N:justify-content: centerH@wV,k:center;
158
+}
159
+.flex-container.flex-column.stretch {R@RG,h:margin: 0;
160
+}
161
+.flex-container.child-gap-smallN@n~,M:;
162
+}
163
+#fossil-status-barN@Kg,Q@sG,o@gx,t:color: inherit;
164
+ min-height: 1.5em;
165
+ font-size: 1.2em;F@2~,3:em;H@S~,8B: 0;
166
+ flex: 0 0 auto;
167
+}
168
+.font-size-100 {
169
+ font-size: 100%;
170
+}
171
+.font-size-125 {
172
+ font-size: 125%;
173
+}
174
+.font-size-150 {
175
+ font-size: 150%;
176
+}
177
+.font-size-175 {
178
+ font-size: 175%;
179
+}
180
+.font-size-200 {
181
+ font-size: 200%;
182
+}
183
+
184
+/**
185
+ .input-with-label is intended to be a wrapper element which
186
+ contain both a LABEL tag and an INPUT or SELECT control.
187
+ The wrapper is "necessary", as opposed to placing the INPUT
188
+ in the LABEL, so that we can include multiple INPUT
189
+ elements (e.g. a set of radio buttons).
190
+*/
191
+.input-with-labelD@lp,H:1px inset #808080K@V~,5:.5em;I@2~,1U: 0.4em;
192
+ margin: 0 0.5em;
193
+ display: inline-block;
194
+ cursor: default;
195
+}
196
+.input-with-label > *T@YW,3A:}
197
+.input-with-label > label {
198
+ display: inline; /* some skins set label display to block! */
199
+}
200
+.input-with-label > input {
201
+ margin: 0;
202
+}
203
+.input-with-label > button {
204
+ margin: 0;
205
+}
206
+.input-with-label >L@rW,2G:;
207
+}
208
+.input-with-label > input[type=text] {
209
+ margin: 0;
210
+}
211
+.input-with-label > textarea {
212
+ margin: 0;
213
+}
214
+.input-with-label > input[type=checkbox]L@YW,h:sub;
215
+}
216
+.input-with-label > input[type=radio]L@YW,g:sub;
217
+}
218
+.input-with-label > label {
219
+ font-wI@j~,T@Dg,O@bg,2:}
220
+1Ggqo_;
--- a/src/style.fileedit.css
+++ b/src/style.fileedit.css
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/style.fileedit.css
+++ b/src/style.fileedit.css
@@ -0,0 +1,220 @@
1 /** Styles specific to /fileedit... */
2 body.fileedit.waiting * {
3 /* Triggered during AJAX requests. */
4 cursor: wait;
5 }
6 body.fileedit .error {
7 padding: 0.25em;
8 }
9 body.fileedit .warning {
10 padding: 0.25em;
11 }
12 body.fileedit textarea {
13 font-family: monospace;
14 flex: 10 1 auto;
15 height: initial/*undo damage from some skins*/;
16 entually need totextarea:focus,
17 body.fileedit input:focus{
18 /* The sudden appearance of a border (as in the Ardoise skin)
19 shifts the layout in;
20 border-radius: 0.5em;
21 border-color: inherit;
22 border-width: 1px;
23 font-size: 90%;
24 overflow: auto;
25 }
26 body.fileedit fieldset > legend {
27 margin: 0 0 0 1em;
28 padding: 0 0.5em 0 0.5em;
29 }
30 body.fileedit fieldset > div {
31 margin: 0 0.25em 0 0.25em;
32 padding: 0;
33 overflow: auto;
34 }
35 body.fileedit fieldset > div > .input-with-label {
36 margin: 0.25em 0.5em;
37 }
38 body.fileedit fieldset > div > button {
39 margin: 0.25em 0.5em;
40 }
41 body.fileedit .fileedit-hint {
42 font-size: 80%;
43 opacity: 0.75;
44 }
45 body.fileedit .fileedit-error-report {
46 background: yellow;
47 color: darkred;
48 margin: 1em 0;
49 padding: 0.5em;
50 border-radius: 0.5em;
51 }
52 body.fileedit code.fileedit-manifest {
53 display: block;
54 height: 16em;
55 overflow: auto;
56 white-space: pre;
57 }
58 body.fileedit div.filr-style: inset;
59 border-radius: 0.5em;
60 in: 0.25em 0.5em;
61 }
62 body.fileedit .fileedit-hint {
63 font-size: 80%;
64 opacity: 0.75;
65 }
66 body.fileedit .fileedit-error-report {
67 background: yelck;
68 height: 16em;
69 overflow: auto;
70 white-space: pre;
71 }
72 body.rgin: 0;
73 padeedit div.fileedit-preview {
74 margin: 0;
75 padding: 0;
76 }
77 body.fileedit #fileedit-tabs {
78 margin: 0.5em 0 0 0;
79 }
80 body.fileedit #fileedit-tab-preview-wrapper {
81 overflow: auto;
82 }
83 body.fileedioverflow: autoed;
84 overflow: auto;
85 etch;
86 }
87 body.fileedit #fileedit-tab-0 1 auto;
88 }
89 body.fileedit /column;
90 }
91 body.fileedit #fileedit-tab- font-size: 1.c to /fileedit... */
92 body.filee/** Styles specifi/column;
93 }
94 body.fileedit #
95 /**
96 Styles for fossil.tabs.js. As of this writing, currently
97 only used by /fileedit, but it is anticipated that these
98 will eventually need to migrate to default_css.txt for use
99 in the wiki and/or forum pages when implementing tabbed
100 ajax-based previews.
101 */
102 .tab 100%;h@tl,Q: align-items: stretch;
103 }
104 H@XW,I:#fossil-status-barK@VT,2:}
105 N@XW,L@2G,C: margin: 0;h@tl,a@gv,5:outseS@gU,2:}
106 _@XW,a:{
107 align-self: stretch;
108 flex: 10 1I@vk,9:block;
109 }
110 L@XW,4:-barb@tj,14:row;
111 flex: 1 10 auto;
112 align-self: stretch;
113 flex-wrap: wrap;
114 }
115 L@XW,h:-bar > .tab-button {
116 display: inline-blockK@V~,Y:.5em 0.5em 0 0;
117 margin: 0 0.1em;I@2~,V: 0.75em;
118 align-self: baselineu@gV,r:bottom: none;
119 border-top-style: inset;
120 border-leftP@hN,t:ight-style: inset;
121 cursor: pointer;
122 opacity: 0.6;
123 }
124 L@XW,1O:-bar > .tab-button.selected {
125 text-decoration: underline;
126 opacity: 1.0;
127 border-top8@X0,L:outset;
128 border-left8@X0,M:outset;
129 border-right8@X0,5g:outset;
130 }
131
132 /**
133 Styles developed for /fileedit but which have wider
134 applicability...
135
136 As of this writing, these are only used by /fileedit, but it is
137 anticipated that they will eventually need to be migrated over to
138 default_css.txt for use in other pages (specifically wiki and forum
139 page/post editors).
140 */
141 .flex-container {
142 display: flex;
143 }
144 T@dq,f@ps,N:justify-content: centerH@wV,2n:center;
145 }
146 .flex-container .flex-grow {
147 flex-grow: 10;
148 flex-shrink: 0;
149 }
150 .flex-container .flex-shrink {
151 flex-grow: 0;
152 flex-shrink: 10;
153 }
154 .flex-container.flex-row.stretch {i@qB,18: justify-content: stretch;
155 margin: 0;
156 }
157 .flex-container.flex-column {T@10A,J@qE,N:justify-content: centerH@wV,k:center;
158 }
159 .flex-container.flex-column.stretch {R@RG,h:margin: 0;
160 }
161 .flex-container.child-gap-smallN@n~,M:;
162 }
163 #fossil-status-barN@Kg,Q@sG,o@gx,t:color: inherit;
164 min-height: 1.5em;
165 font-size: 1.2em;F@2~,3:em;H@S~,8B: 0;
166 flex: 0 0 auto;
167 }
168 .font-size-100 {
169 font-size: 100%;
170 }
171 .font-size-125 {
172 font-size: 125%;
173 }
174 .font-size-150 {
175 font-size: 150%;
176 }
177 .font-size-175 {
178 font-size: 175%;
179 }
180 .font-size-200 {
181 font-size: 200%;
182 }
183
184 /**
185 .input-with-label is intended to be a wrapper element which
186 contain both a LABEL tag and an INPUT or SELECT control.
187 The wrapper is "necessary", as opposed to placing the INPUT
188 in the LABEL, so that we can include multiple INPUT
189 elements (e.g. a set of radio buttons).
190 */
191 .input-with-labelD@lp,H:1px inset #808080K@V~,5:.5em;I@2~,1U: 0.4em;
192 margin: 0 0.5em;
193 display: inline-block;
194 cursor: default;
195 }
196 .input-with-label > *T@YW,3A:}
197 .input-with-label > label {
198 display: inline; /* some skins set label display to block! */
199 }
200 .input-with-label > input {
201 margin: 0;
202 }
203 .input-with-label > button {
204 margin: 0;
205 }
206 .input-with-label >L@rW,2G:;
207 }
208 .input-with-label > input[type=text] {
209 margin: 0;
210 }
211 .input-with-label > textarea {
212 margin: 0;
213 }
214 .input-with-label > input[type=checkbox]L@YW,h:sub;
215 }
216 .input-with-label > input[type=radio]L@YW,g:sub;
217 }
218 .input-with-label > label {
219 font-wI@j~,T@Dg,O@bg,2:}
220 1Ggqo_;
+10 -4
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
2828
2929
SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_DQS=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_TRUSTED_SCHEMA=0
3030
3131
SHELL_OPTIONS = -DNDEBUG=1 -DSQLITE_DQS=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_TRUSTED_SCHEMA=0 -Dmain=sqlite3_shell -DSQLITE_SHELL_IS_UTF8=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=sqlcmd_get_dbname -DSQLITE_SHELL_INIT_PROC=sqlcmd_init_proc -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
3232
33
-SRC = add_.c alerts_.c allrepo_.c attach_.c backlink_.c backoffice_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c capabilities_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c deltafunc_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c encode_.c etag_.c event_.c export_.c extcgi_.c file_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c fuzz_.c glob_.c graph_.c gzip_.c hname_.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 piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c repolist_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c setupuser_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c smtp_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c terminal_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c webmail_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
33
+SRC = add_.c alerts_.c allrepo_.c attach_.c backlink_.c backoffice_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c capabilities_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c deltafunc_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c encode_.c etag_.c event_.c export_.c extcgi_.c file_.c fileedit_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c fuzz_.c glob_.c graph_.c gzip_.c hname_.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 piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c repolist_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c setupuser_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c smtp_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c terminal_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c webmail_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
3434
35
-OBJ = $(OBJDIR)\add$O $(OBJDIR)\alerts$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\backlink$O $(OBJDIR)\backoffice$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\capabilities$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\deltafunc$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\extcgi$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\fuzz$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\repolist$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\setupuser$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\smtp$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\terminal$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\webmail$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
35
+OBJ = $(OBJDIR)\add$O $(OBJDIR)\alerts$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\backlink$O $(OBJDIR)\backoffice$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\capabilities$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\deltafunc$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\extcgi$O $(OBJDIR)\file$O $(OBJDIR)\fileedit$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\fuzz$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\repolist$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\setupuser$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\smtp$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\terminal$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\webmail$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
3636
3737
3838
RC=$(DMDIR)\bin\rcc
3939
RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
4040
@@ -49,11 +49,11 @@
4949
5050
$(OBJDIR)\fossil.res: $B\win\fossil.rc
5151
$(RC) $(RCFLAGS) -o$@ $**
5252
5353
$(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54
- +echo add alerts allrepo attach backlink backoffice bag bisect blob branch browse builtin bundle cache capabilities captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd deltafunc descendants diff diffcmd dispatch doc encode etag event export extcgi file finfo foci forum fshell fusefs fuzz glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp repolist report rss schema search security_audit setup setupuser sha1 sha1hard sha3 shun sitemap skins smtp sqlcmd stash stat statrep style sync tag tar terminal th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile webmail wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
54
+ +echo add alerts allrepo attach backlink backoffice bag bisect blob branch browse builtin bundle cache capabilities captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd deltafunc descendants diff diffcmd dispatch doc encode etag event export extcgi file fileedit finfo foci forum fshell fusefs fuzz glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp repolist report rss schema search security_audit setup setupuser sha1 sha1hard sha3 shun sitemap skins smtp sqlcmd stash stat statrep style sync tag tar terminal th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile webmail wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
5555
+echo fossil >> $@
5656
+echo fossil >> $@
5757
+echo $(LIBS) >> $@
5858
+echo. >> $@
5959
+echo fossil >> $@
@@ -368,10 +368,16 @@
368368
$(OBJDIR)\file$O : file_.c file.h
369369
$(TCC) -o$@ -c file_.c
370370
371371
file_.c : $(SRCDIR)\file.c
372372
+translate$E $** > $@
373
+
374
+$(OBJDIR)\fileedit$O : fileedit_.c fileedit.h
375
+ $(TCC) -o$@ -c fileedit_.c
376
+
377
+fileedit_.c : $(SRCDIR)\fileedit.c
378
+ +translate$E $** > $@
373379
374380
$(OBJDIR)\finfo$O : finfo_.c finfo.h
375381
$(TCC) -o$@ -c finfo_.c
376382
377383
finfo_.c : $(SRCDIR)\finfo.c
@@ -976,7 +982,7 @@
976982
977983
zip_.c : $(SRCDIR)\zip.c
978984
+translate$E $** > $@
979985
980986
headers: makeheaders$E page_index.h builtin_data.h default_css.h VERSION.h
981
- +makeheaders$E add_.c:add.h alerts_.c:alerts.h allrepo_.c:allrepo.h attach_.c:attach.h backlink_.c:backlink.h backoffice_.c:backoffice.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h capabilities_.c:capabilities.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h deltafunc_.c:deltafunc.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h extcgi_.c:extcgi.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h fuzz_.c:fuzz.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h repolist_.c:repolist.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h setupuser_.c:setupuser.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h smtp_.c:smtp.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h terminal_.c:terminal.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h webmail_.c:webmail.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
987
+ +makeheaders$E add_.c:add.h alerts_.c:alerts.h allrepo_.c:allrepo.h attach_.c:attach.h backlink_.c:backlink.h backoffice_.c:backoffice.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h capabilities_.c:capabilities.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h deltafunc_.c:deltafunc.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h extcgi_.c:extcgi.h file_.c:file.h fileedit_.c:fileedit.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h fuzz_.c:fuzz.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h repolist_.c:repolist.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h setupuser_.c:setupuser.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h smtp_.c:smtp.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h terminal_.c:terminal.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h webmail_.c:webmail.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
982988
@copy /Y nul: headers
983989
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_DQS=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_TRUSTED_SCHEMA=0
30
31 SHELL_OPTIONS = -DNDEBUG=1 -DSQLITE_DQS=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_TRUSTED_SCHEMA=0 -Dmain=sqlite3_shell -DSQLITE_SHELL_IS_UTF8=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=sqlcmd_get_dbname -DSQLITE_SHELL_INIT_PROC=sqlcmd_init_proc -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c alerts_.c allrepo_.c attach_.c backlink_.c backoffice_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c capabilities_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c deltafunc_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c encode_.c etag_.c event_.c export_.c extcgi_.c file_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c fuzz_.c glob_.c graph_.c gzip_.c hname_.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 piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c repolist_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c setupuser_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c smtp_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c terminal_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c webmail_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35 OBJ = $(OBJDIR)\add$O $(OBJDIR)\alerts$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\backlink$O $(OBJDIR)\backoffice$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\capabilities$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\deltafunc$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\extcgi$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\fuzz$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\repolist$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\setupuser$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\smtp$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\terminal$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\webmail$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
36
37
38 RC=$(DMDIR)\bin\rcc
39 RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
40
@@ -49,11 +49,11 @@
49
50 $(OBJDIR)\fossil.res: $B\win\fossil.rc
51 $(RC) $(RCFLAGS) -o$@ $**
52
53 $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54 +echo add alerts allrepo attach backlink backoffice bag bisect blob branch browse builtin bundle cache capabilities captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd deltafunc descendants diff diffcmd dispatch doc encode etag event export extcgi file finfo foci forum fshell fusefs fuzz glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp repolist report rss schema search security_audit setup setupuser sha1 sha1hard sha3 shun sitemap skins smtp sqlcmd stash stat statrep style sync tag tar terminal th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile webmail wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
55 +echo fossil >> $@
56 +echo fossil >> $@
57 +echo $(LIBS) >> $@
58 +echo. >> $@
59 +echo fossil >> $@
@@ -368,10 +368,16 @@
368 $(OBJDIR)\file$O : file_.c file.h
369 $(TCC) -o$@ -c file_.c
370
371 file_.c : $(SRCDIR)\file.c
372 +translate$E $** > $@
 
 
 
 
 
 
373
374 $(OBJDIR)\finfo$O : finfo_.c finfo.h
375 $(TCC) -o$@ -c finfo_.c
376
377 finfo_.c : $(SRCDIR)\finfo.c
@@ -976,7 +982,7 @@
976
977 zip_.c : $(SRCDIR)\zip.c
978 +translate$E $** > $@
979
980 headers: makeheaders$E page_index.h builtin_data.h default_css.h VERSION.h
981 +makeheaders$E add_.c:add.h alerts_.c:alerts.h allrepo_.c:allrepo.h attach_.c:attach.h backlink_.c:backlink.h backoffice_.c:backoffice.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h capabilities_.c:capabilities.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h deltafunc_.c:deltafunc.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h extcgi_.c:extcgi.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h fuzz_.c:fuzz.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h repolist_.c:repolist.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h setupuser_.c:setupuser.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h smtp_.c:smtp.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h terminal_.c:terminal.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h webmail_.c:webmail.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
982 @copy /Y nul: headers
983
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_DQS=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_TRUSTED_SCHEMA=0
30
31 SHELL_OPTIONS = -DNDEBUG=1 -DSQLITE_DQS=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_TRUSTED_SCHEMA=0 -Dmain=sqlite3_shell -DSQLITE_SHELL_IS_UTF8=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=sqlcmd_get_dbname -DSQLITE_SHELL_INIT_PROC=sqlcmd_init_proc -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c alerts_.c allrepo_.c attach_.c backlink_.c backoffice_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c capabilities_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c deltafunc_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c encode_.c etag_.c event_.c export_.c extcgi_.c file_.c fileedit_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c fuzz_.c glob_.c graph_.c gzip_.c hname_.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 piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c repolist_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c setupuser_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c smtp_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c terminal_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c webmail_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35 OBJ = $(OBJDIR)\add$O $(OBJDIR)\alerts$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\backlink$O $(OBJDIR)\backoffice$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\capabilities$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\deltafunc$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\extcgi$O $(OBJDIR)\file$O $(OBJDIR)\fileedit$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\fuzz$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\repolist$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\setupuser$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\smtp$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\terminal$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\webmail$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
36
37
38 RC=$(DMDIR)\bin\rcc
39 RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
40
@@ -49,11 +49,11 @@
49
50 $(OBJDIR)\fossil.res: $B\win\fossil.rc
51 $(RC) $(RCFLAGS) -o$@ $**
52
53 $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54 +echo add alerts allrepo attach backlink backoffice bag bisect blob branch browse builtin bundle cache capabilities captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd deltafunc descendants diff diffcmd dispatch doc encode etag event export extcgi file fileedit finfo foci forum fshell fusefs fuzz glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp repolist report rss schema search security_audit setup setupuser sha1 sha1hard sha3 shun sitemap skins smtp sqlcmd stash stat statrep style sync tag tar terminal th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile webmail wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
55 +echo fossil >> $@
56 +echo fossil >> $@
57 +echo $(LIBS) >> $@
58 +echo. >> $@
59 +echo fossil >> $@
@@ -368,10 +368,16 @@
368 $(OBJDIR)\file$O : file_.c file.h
369 $(TCC) -o$@ -c file_.c
370
371 file_.c : $(SRCDIR)\file.c
372 +translate$E $** > $@
373
374 $(OBJDIR)\fileedit$O : fileedit_.c fileedit.h
375 $(TCC) -o$@ -c fileedit_.c
376
377 fileedit_.c : $(SRCDIR)\fileedit.c
378 +translate$E $** > $@
379
380 $(OBJDIR)\finfo$O : finfo_.c finfo.h
381 $(TCC) -o$@ -c finfo_.c
382
383 finfo_.c : $(SRCDIR)\finfo.c
@@ -976,7 +982,7 @@
982
983 zip_.c : $(SRCDIR)\zip.c
984 +translate$E $** > $@
985
986 headers: makeheaders$E page_index.h builtin_data.h default_css.h VERSION.h
987 +makeheaders$E add_.c:add.h alerts_.c:alerts.h allrepo_.c:allrepo.h attach_.c:attach.h backlink_.c:backlink.h backoffice_.c:backoffice.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h capabilities_.c:capabilities.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h deltafunc_.c:deltafunc.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h extcgi_.c:extcgi.h file_.c:file.h fileedit_.c:fileedit.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h fuzz_.c:fuzz.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h repolist_.c:repolist.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h setupuser_.c:setupuser.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h smtp_.c:smtp.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h terminal_.c:terminal.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h webmail_.c:webmail.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
988 @copy /Y nul: headers
989
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -476,10 +476,11 @@
476476
$(SRCDIR)/etag.c \
477477
$(SRCDIR)/event.c \
478478
$(SRCDIR)/export.c \
479479
$(SRCDIR)/extcgi.c \
480480
$(SRCDIR)/file.c \
481
+ $(SRCDIR)/fileedit.c \
481482
$(SRCDIR)/finfo.c \
482483
$(SRCDIR)/foci.c \
483484
$(SRCDIR)/forum.c \
484485
$(SRCDIR)/fshell.c \
485486
$(SRCDIR)/fusefs.c \
@@ -640,10 +641,17 @@
640641
$(SRCDIR)/accordion.js \
641642
$(SRCDIR)/ci_edit.js \
642643
$(SRCDIR)/copybtn.js \
643644
$(SRCDIR)/diff.tcl \
644645
$(SRCDIR)/forum.js \
646
+ $(SRCDIR)/fossil.bootstrap.js \
647
+ $(SRCDIR)/fossil.confirmer.js \
648
+ $(SRCDIR)/fossil.dom.js \
649
+ $(SRCDIR)/fossil.fetch.js \
650
+ $(SRCDIR)/fossil.page.fileedit.js \
651
+ $(SRCDIR)/fossil.storage.js \
652
+ $(SRCDIR)/fossil.tabs.js \
645653
$(SRCDIR)/graph.js \
646654
$(SRCDIR)/href.js \
647655
$(SRCDIR)/login.js \
648656
$(SRCDIR)/markdown.md \
649657
$(SRCDIR)/menu.js \
@@ -666,10 +674,11 @@
666674
$(SRCDIR)/sounds/c.wav \
667675
$(SRCDIR)/sounds/d.wav \
668676
$(SRCDIR)/sounds/e.wav \
669677
$(SRCDIR)/sounds/f.wav \
670678
$(SRCDIR)/style.admin_log.css \
679
+ $(SRCDIR)/style.fileedit.css \
671680
$(SRCDIR)/tree.js \
672681
$(SRCDIR)/useredit.js \
673682
$(SRCDIR)/wiki.wiki
674683
675684
TRANS_SRC = \
@@ -711,10 +720,11 @@
711720
$(OBJDIR)/etag_.c \
712721
$(OBJDIR)/event_.c \
713722
$(OBJDIR)/export_.c \
714723
$(OBJDIR)/extcgi_.c \
715724
$(OBJDIR)/file_.c \
725
+ $(OBJDIR)/fileedit_.c \
716726
$(OBJDIR)/finfo_.c \
717727
$(OBJDIR)/foci_.c \
718728
$(OBJDIR)/forum_.c \
719729
$(OBJDIR)/fshell_.c \
720730
$(OBJDIR)/fusefs_.c \
@@ -854,10 +864,11 @@
854864
$(OBJDIR)/etag.o \
855865
$(OBJDIR)/event.o \
856866
$(OBJDIR)/export.o \
857867
$(OBJDIR)/extcgi.o \
858868
$(OBJDIR)/file.o \
869
+ $(OBJDIR)/fileedit.o \
859870
$(OBJDIR)/finfo.o \
860871
$(OBJDIR)/foci.o \
861872
$(OBJDIR)/forum.o \
862873
$(OBJDIR)/fshell.o \
863874
$(OBJDIR)/fusefs.o \
@@ -1217,10 +1228,11 @@
12171228
$(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
12181229
$(OBJDIR)/event_.c:$(OBJDIR)/event.h \
12191230
$(OBJDIR)/export_.c:$(OBJDIR)/export.h \
12201231
$(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
12211232
$(OBJDIR)/file_.c:$(OBJDIR)/file.h \
1233
+ $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
12221234
$(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
12231235
$(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
12241236
$(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
12251237
$(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
12261238
$(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1646,10 +1658,18 @@
16461658
16471659
$(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
16481660
$(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
16491661
16501662
$(OBJDIR)/file.h: $(OBJDIR)/headers
1663
+
1664
+$(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(TRANSLATE)
1665
+ $(TRANSLATE) $(SRCDIR)/fileedit.c >$@
1666
+
1667
+$(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1668
+ $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1669
+
1670
+$(OBJDIR)/fileedit.h: $(OBJDIR)/headers
16511671
16521672
$(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(TRANSLATE)
16531673
$(TRANSLATE) $(SRCDIR)/finfo.c >$@
16541674
16551675
$(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
16561676
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -476,10 +476,11 @@
476 $(SRCDIR)/etag.c \
477 $(SRCDIR)/event.c \
478 $(SRCDIR)/export.c \
479 $(SRCDIR)/extcgi.c \
480 $(SRCDIR)/file.c \
 
481 $(SRCDIR)/finfo.c \
482 $(SRCDIR)/foci.c \
483 $(SRCDIR)/forum.c \
484 $(SRCDIR)/fshell.c \
485 $(SRCDIR)/fusefs.c \
@@ -640,10 +641,17 @@
640 $(SRCDIR)/accordion.js \
641 $(SRCDIR)/ci_edit.js \
642 $(SRCDIR)/copybtn.js \
643 $(SRCDIR)/diff.tcl \
644 $(SRCDIR)/forum.js \
 
 
 
 
 
 
 
645 $(SRCDIR)/graph.js \
646 $(SRCDIR)/href.js \
647 $(SRCDIR)/login.js \
648 $(SRCDIR)/markdown.md \
649 $(SRCDIR)/menu.js \
@@ -666,10 +674,11 @@
666 $(SRCDIR)/sounds/c.wav \
667 $(SRCDIR)/sounds/d.wav \
668 $(SRCDIR)/sounds/e.wav \
669 $(SRCDIR)/sounds/f.wav \
670 $(SRCDIR)/style.admin_log.css \
 
671 $(SRCDIR)/tree.js \
672 $(SRCDIR)/useredit.js \
673 $(SRCDIR)/wiki.wiki
674
675 TRANS_SRC = \
@@ -711,10 +720,11 @@
711 $(OBJDIR)/etag_.c \
712 $(OBJDIR)/event_.c \
713 $(OBJDIR)/export_.c \
714 $(OBJDIR)/extcgi_.c \
715 $(OBJDIR)/file_.c \
 
716 $(OBJDIR)/finfo_.c \
717 $(OBJDIR)/foci_.c \
718 $(OBJDIR)/forum_.c \
719 $(OBJDIR)/fshell_.c \
720 $(OBJDIR)/fusefs_.c \
@@ -854,10 +864,11 @@
854 $(OBJDIR)/etag.o \
855 $(OBJDIR)/event.o \
856 $(OBJDIR)/export.o \
857 $(OBJDIR)/extcgi.o \
858 $(OBJDIR)/file.o \
 
859 $(OBJDIR)/finfo.o \
860 $(OBJDIR)/foci.o \
861 $(OBJDIR)/forum.o \
862 $(OBJDIR)/fshell.o \
863 $(OBJDIR)/fusefs.o \
@@ -1217,10 +1228,11 @@
1217 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
1218 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
1219 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
1220 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
1221 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
 
1222 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
1223 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
1224 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
1225 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
1226 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1646,10 +1658,18 @@
1646
1647 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1648 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1649
1650 $(OBJDIR)/file.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1651
1652 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(TRANSLATE)
1653 $(TRANSLATE) $(SRCDIR)/finfo.c >$@
1654
1655 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1656
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -476,10 +476,11 @@
476 $(SRCDIR)/etag.c \
477 $(SRCDIR)/event.c \
478 $(SRCDIR)/export.c \
479 $(SRCDIR)/extcgi.c \
480 $(SRCDIR)/file.c \
481 $(SRCDIR)/fileedit.c \
482 $(SRCDIR)/finfo.c \
483 $(SRCDIR)/foci.c \
484 $(SRCDIR)/forum.c \
485 $(SRCDIR)/fshell.c \
486 $(SRCDIR)/fusefs.c \
@@ -640,10 +641,17 @@
641 $(SRCDIR)/accordion.js \
642 $(SRCDIR)/ci_edit.js \
643 $(SRCDIR)/copybtn.js \
644 $(SRCDIR)/diff.tcl \
645 $(SRCDIR)/forum.js \
646 $(SRCDIR)/fossil.bootstrap.js \
647 $(SRCDIR)/fossil.confirmer.js \
648 $(SRCDIR)/fossil.dom.js \
649 $(SRCDIR)/fossil.fetch.js \
650 $(SRCDIR)/fossil.page.fileedit.js \
651 $(SRCDIR)/fossil.storage.js \
652 $(SRCDIR)/fossil.tabs.js \
653 $(SRCDIR)/graph.js \
654 $(SRCDIR)/href.js \
655 $(SRCDIR)/login.js \
656 $(SRCDIR)/markdown.md \
657 $(SRCDIR)/menu.js \
@@ -666,10 +674,11 @@
674 $(SRCDIR)/sounds/c.wav \
675 $(SRCDIR)/sounds/d.wav \
676 $(SRCDIR)/sounds/e.wav \
677 $(SRCDIR)/sounds/f.wav \
678 $(SRCDIR)/style.admin_log.css \
679 $(SRCDIR)/style.fileedit.css \
680 $(SRCDIR)/tree.js \
681 $(SRCDIR)/useredit.js \
682 $(SRCDIR)/wiki.wiki
683
684 TRANS_SRC = \
@@ -711,10 +720,11 @@
720 $(OBJDIR)/etag_.c \
721 $(OBJDIR)/event_.c \
722 $(OBJDIR)/export_.c \
723 $(OBJDIR)/extcgi_.c \
724 $(OBJDIR)/file_.c \
725 $(OBJDIR)/fileedit_.c \
726 $(OBJDIR)/finfo_.c \
727 $(OBJDIR)/foci_.c \
728 $(OBJDIR)/forum_.c \
729 $(OBJDIR)/fshell_.c \
730 $(OBJDIR)/fusefs_.c \
@@ -854,10 +864,11 @@
864 $(OBJDIR)/etag.o \
865 $(OBJDIR)/event.o \
866 $(OBJDIR)/export.o \
867 $(OBJDIR)/extcgi.o \
868 $(OBJDIR)/file.o \
869 $(OBJDIR)/fileedit.o \
870 $(OBJDIR)/finfo.o \
871 $(OBJDIR)/foci.o \
872 $(OBJDIR)/forum.o \
873 $(OBJDIR)/fshell.o \
874 $(OBJDIR)/fusefs.o \
@@ -1217,10 +1228,11 @@
1228 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
1229 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
1230 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
1231 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
1232 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
1233 $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
1234 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
1235 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
1236 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
1237 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
1238 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1646,10 +1658,18 @@
1658
1659 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1660 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1661
1662 $(OBJDIR)/file.h: $(OBJDIR)/headers
1663
1664 $(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(TRANSLATE)
1665 $(TRANSLATE) $(SRCDIR)/fileedit.c >$@
1666
1667 $(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1668 $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1669
1670 $(OBJDIR)/fileedit.h: $(OBJDIR)/headers
1671
1672 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(TRANSLATE)
1673 $(TRANSLATE) $(SRCDIR)/finfo.c >$@
1674
1675 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1676
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -476,10 +476,11 @@
476476
$(SRCDIR)/etag.c \
477477
$(SRCDIR)/event.c \
478478
$(SRCDIR)/export.c \
479479
$(SRCDIR)/extcgi.c \
480480
$(SRCDIR)/file.c \
481
+ $(SRCDIR)/fileedit.c \
481482
$(SRCDIR)/finfo.c \
482483
$(SRCDIR)/foci.c \
483484
$(SRCDIR)/forum.c \
484485
$(SRCDIR)/fshell.c \
485486
$(SRCDIR)/fusefs.c \
@@ -640,10 +641,17 @@
640641
$(SRCDIR)/accordion.js \
641642
$(SRCDIR)/ci_edit.js \
642643
$(SRCDIR)/copybtn.js \
643644
$(SRCDIR)/diff.tcl \
644645
$(SRCDIR)/forum.js \
646
+ $(SRCDIR)/fossil.bootstrap.js \
647
+ $(SRCDIR)/fossil.confirmer.js \
648
+ $(SRCDIR)/fossil.dom.js \
649
+ $(SRCDIR)/fossil.fetch.js \
650
+ $(SRCDIR)/fossil.page.fileedit.js \
651
+ $(SRCDIR)/fossil.storage.js \
652
+ $(SRCDIR)/fossil.tabs.js \
645653
$(SRCDIR)/graph.js \
646654
$(SRCDIR)/href.js \
647655
$(SRCDIR)/login.js \
648656
$(SRCDIR)/markdown.md \
649657
$(SRCDIR)/menu.js \
@@ -666,10 +674,11 @@
666674
$(SRCDIR)/sounds/c.wav \
667675
$(SRCDIR)/sounds/d.wav \
668676
$(SRCDIR)/sounds/e.wav \
669677
$(SRCDIR)/sounds/f.wav \
670678
$(SRCDIR)/style.admin_log.css \
679
+ $(SRCDIR)/style.fileedit.css \
671680
$(SRCDIR)/tree.js \
672681
$(SRCDIR)/useredit.js \
673682
$(SRCDIR)/wiki.wiki
674683
675684
TRANS_SRC = \
@@ -711,10 +720,11 @@
711720
$(OBJDIR)/etag_.c \
712721
$(OBJDIR)/event_.c \
713722
$(OBJDIR)/export_.c \
714723
$(OBJDIR)/extcgi_.c \
715724
$(OBJDIR)/file_.c \
725
+ $(OBJDIR)/fileedit_.c \
716726
$(OBJDIR)/finfo_.c \
717727
$(OBJDIR)/foci_.c \
718728
$(OBJDIR)/forum_.c \
719729
$(OBJDIR)/fshell_.c \
720730
$(OBJDIR)/fusefs_.c \
@@ -854,10 +864,11 @@
854864
$(OBJDIR)/etag.o \
855865
$(OBJDIR)/event.o \
856866
$(OBJDIR)/export.o \
857867
$(OBJDIR)/extcgi.o \
858868
$(OBJDIR)/file.o \
869
+ $(OBJDIR)/fileedit.o \
859870
$(OBJDIR)/finfo.o \
860871
$(OBJDIR)/foci.o \
861872
$(OBJDIR)/forum.o \
862873
$(OBJDIR)/fshell.o \
863874
$(OBJDIR)/fusefs.o \
@@ -1217,10 +1228,11 @@
12171228
$(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
12181229
$(OBJDIR)/event_.c:$(OBJDIR)/event.h \
12191230
$(OBJDIR)/export_.c:$(OBJDIR)/export.h \
12201231
$(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
12211232
$(OBJDIR)/file_.c:$(OBJDIR)/file.h \
1233
+ $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
12221234
$(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
12231235
$(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
12241236
$(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
12251237
$(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
12261238
$(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1646,10 +1658,18 @@
16461658
16471659
$(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
16481660
$(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
16491661
16501662
$(OBJDIR)/file.h: $(OBJDIR)/headers
1663
+
1664
+$(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(TRANSLATE)
1665
+ $(TRANSLATE) $(SRCDIR)/fileedit.c >$@
1666
+
1667
+$(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1668
+ $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1669
+
1670
+$(OBJDIR)/fileedit.h: $(OBJDIR)/headers
16511671
16521672
$(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(TRANSLATE)
16531673
$(TRANSLATE) $(SRCDIR)/finfo.c >$@
16541674
16551675
$(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
16561676
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -476,10 +476,11 @@
476 $(SRCDIR)/etag.c \
477 $(SRCDIR)/event.c \
478 $(SRCDIR)/export.c \
479 $(SRCDIR)/extcgi.c \
480 $(SRCDIR)/file.c \
 
481 $(SRCDIR)/finfo.c \
482 $(SRCDIR)/foci.c \
483 $(SRCDIR)/forum.c \
484 $(SRCDIR)/fshell.c \
485 $(SRCDIR)/fusefs.c \
@@ -640,10 +641,17 @@
640 $(SRCDIR)/accordion.js \
641 $(SRCDIR)/ci_edit.js \
642 $(SRCDIR)/copybtn.js \
643 $(SRCDIR)/diff.tcl \
644 $(SRCDIR)/forum.js \
 
 
 
 
 
 
 
645 $(SRCDIR)/graph.js \
646 $(SRCDIR)/href.js \
647 $(SRCDIR)/login.js \
648 $(SRCDIR)/markdown.md \
649 $(SRCDIR)/menu.js \
@@ -666,10 +674,11 @@
666 $(SRCDIR)/sounds/c.wav \
667 $(SRCDIR)/sounds/d.wav \
668 $(SRCDIR)/sounds/e.wav \
669 $(SRCDIR)/sounds/f.wav \
670 $(SRCDIR)/style.admin_log.css \
 
671 $(SRCDIR)/tree.js \
672 $(SRCDIR)/useredit.js \
673 $(SRCDIR)/wiki.wiki
674
675 TRANS_SRC = \
@@ -711,10 +720,11 @@
711 $(OBJDIR)/etag_.c \
712 $(OBJDIR)/event_.c \
713 $(OBJDIR)/export_.c \
714 $(OBJDIR)/extcgi_.c \
715 $(OBJDIR)/file_.c \
 
716 $(OBJDIR)/finfo_.c \
717 $(OBJDIR)/foci_.c \
718 $(OBJDIR)/forum_.c \
719 $(OBJDIR)/fshell_.c \
720 $(OBJDIR)/fusefs_.c \
@@ -854,10 +864,11 @@
854 $(OBJDIR)/etag.o \
855 $(OBJDIR)/event.o \
856 $(OBJDIR)/export.o \
857 $(OBJDIR)/extcgi.o \
858 $(OBJDIR)/file.o \
 
859 $(OBJDIR)/finfo.o \
860 $(OBJDIR)/foci.o \
861 $(OBJDIR)/forum.o \
862 $(OBJDIR)/fshell.o \
863 $(OBJDIR)/fusefs.o \
@@ -1217,10 +1228,11 @@
1217 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
1218 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
1219 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
1220 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
1221 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
 
1222 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
1223 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
1224 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
1225 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
1226 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1646,10 +1658,18 @@
1646
1647 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1648 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1649
1650 $(OBJDIR)/file.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1651
1652 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(TRANSLATE)
1653 $(TRANSLATE) $(SRCDIR)/finfo.c >$@
1654
1655 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1656
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -476,10 +476,11 @@
476 $(SRCDIR)/etag.c \
477 $(SRCDIR)/event.c \
478 $(SRCDIR)/export.c \
479 $(SRCDIR)/extcgi.c \
480 $(SRCDIR)/file.c \
481 $(SRCDIR)/fileedit.c \
482 $(SRCDIR)/finfo.c \
483 $(SRCDIR)/foci.c \
484 $(SRCDIR)/forum.c \
485 $(SRCDIR)/fshell.c \
486 $(SRCDIR)/fusefs.c \
@@ -640,10 +641,17 @@
641 $(SRCDIR)/accordion.js \
642 $(SRCDIR)/ci_edit.js \
643 $(SRCDIR)/copybtn.js \
644 $(SRCDIR)/diff.tcl \
645 $(SRCDIR)/forum.js \
646 $(SRCDIR)/fossil.bootstrap.js \
647 $(SRCDIR)/fossil.confirmer.js \
648 $(SRCDIR)/fossil.dom.js \
649 $(SRCDIR)/fossil.fetch.js \
650 $(SRCDIR)/fossil.page.fileedit.js \
651 $(SRCDIR)/fossil.storage.js \
652 $(SRCDIR)/fossil.tabs.js \
653 $(SRCDIR)/graph.js \
654 $(SRCDIR)/href.js \
655 $(SRCDIR)/login.js \
656 $(SRCDIR)/markdown.md \
657 $(SRCDIR)/menu.js \
@@ -666,10 +674,11 @@
674 $(SRCDIR)/sounds/c.wav \
675 $(SRCDIR)/sounds/d.wav \
676 $(SRCDIR)/sounds/e.wav \
677 $(SRCDIR)/sounds/f.wav \
678 $(SRCDIR)/style.admin_log.css \
679 $(SRCDIR)/style.fileedit.css \
680 $(SRCDIR)/tree.js \
681 $(SRCDIR)/useredit.js \
682 $(SRCDIR)/wiki.wiki
683
684 TRANS_SRC = \
@@ -711,10 +720,11 @@
720 $(OBJDIR)/etag_.c \
721 $(OBJDIR)/event_.c \
722 $(OBJDIR)/export_.c \
723 $(OBJDIR)/extcgi_.c \
724 $(OBJDIR)/file_.c \
725 $(OBJDIR)/fileedit_.c \
726 $(OBJDIR)/finfo_.c \
727 $(OBJDIR)/foci_.c \
728 $(OBJDIR)/forum_.c \
729 $(OBJDIR)/fshell_.c \
730 $(OBJDIR)/fusefs_.c \
@@ -854,10 +864,11 @@
864 $(OBJDIR)/etag.o \
865 $(OBJDIR)/event.o \
866 $(OBJDIR)/export.o \
867 $(OBJDIR)/extcgi.o \
868 $(OBJDIR)/file.o \
869 $(OBJDIR)/fileedit.o \
870 $(OBJDIR)/finfo.o \
871 $(OBJDIR)/foci.o \
872 $(OBJDIR)/forum.o \
873 $(OBJDIR)/fshell.o \
874 $(OBJDIR)/fusefs.o \
@@ -1217,10 +1228,11 @@
1228 $(OBJDIR)/etag_.c:$(OBJDIR)/etag.h \
1229 $(OBJDIR)/event_.c:$(OBJDIR)/event.h \
1230 $(OBJDIR)/export_.c:$(OBJDIR)/export.h \
1231 $(OBJDIR)/extcgi_.c:$(OBJDIR)/extcgi.h \
1232 $(OBJDIR)/file_.c:$(OBJDIR)/file.h \
1233 $(OBJDIR)/fileedit_.c:$(OBJDIR)/fileedit.h \
1234 $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h \
1235 $(OBJDIR)/foci_.c:$(OBJDIR)/foci.h \
1236 $(OBJDIR)/forum_.c:$(OBJDIR)/forum.h \
1237 $(OBJDIR)/fshell_.c:$(OBJDIR)/fshell.h \
1238 $(OBJDIR)/fusefs_.c:$(OBJDIR)/fusefs.h \
@@ -1646,10 +1658,18 @@
1658
1659 $(OBJDIR)/file.o: $(OBJDIR)/file_.c $(OBJDIR)/file.h $(SRCDIR)/config.h
1660 $(XTCC) -o $(OBJDIR)/file.o -c $(OBJDIR)/file_.c
1661
1662 $(OBJDIR)/file.h: $(OBJDIR)/headers
1663
1664 $(OBJDIR)/fileedit_.c: $(SRCDIR)/fileedit.c $(TRANSLATE)
1665 $(TRANSLATE) $(SRCDIR)/fileedit.c >$@
1666
1667 $(OBJDIR)/fileedit.o: $(OBJDIR)/fileedit_.c $(OBJDIR)/fileedit.h $(SRCDIR)/config.h
1668 $(XTCC) -o $(OBJDIR)/fileedit.o -c $(OBJDIR)/fileedit_.c
1669
1670 $(OBJDIR)/fileedit.h: $(OBJDIR)/headers
1671
1672 $(OBJDIR)/finfo_.c: $(SRCDIR)/finfo.c $(TRANSLATE)
1673 $(TRANSLATE) $(SRCDIR)/finfo.c >$@
1674
1675 $(OBJDIR)/finfo.o: $(OBJDIR)/finfo_.c $(OBJDIR)/finfo.h $(SRCDIR)/config.h
1676
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -384,10 +384,11 @@
384384
etag_.c \
385385
event_.c \
386386
export_.c \
387387
extcgi_.c \
388388
file_.c \
389
+ fileedit_.c \
389390
finfo_.c \
390391
foci_.c \
391392
forum_.c \
392393
fshell_.c \
393394
fusefs_.c \
@@ -547,10 +548,17 @@
547548
$(SRCDIR)\accordion.js \
548549
$(SRCDIR)\ci_edit.js \
549550
$(SRCDIR)\copybtn.js \
550551
$(SRCDIR)\diff.tcl \
551552
$(SRCDIR)\forum.js \
553
+ $(SRCDIR)\fossil.bootstrap.js \
554
+ $(SRCDIR)\fossil.confirmer.js \
555
+ $(SRCDIR)\fossil.dom.js \
556
+ $(SRCDIR)\fossil.fetch.js \
557
+ $(SRCDIR)\fossil.page.fileedit.js \
558
+ $(SRCDIR)\fossil.storage.js \
559
+ $(SRCDIR)\fossil.tabs.js \
552560
$(SRCDIR)\graph.js \
553561
$(SRCDIR)\href.js \
554562
$(SRCDIR)\login.js \
555563
$(SRCDIR)\markdown.md \
556564
$(SRCDIR)\menu.js \
@@ -573,10 +581,11 @@
573581
$(SRCDIR)\sounds\c.wav \
574582
$(SRCDIR)\sounds\d.wav \
575583
$(SRCDIR)\sounds\e.wav \
576584
$(SRCDIR)\sounds\f.wav \
577585
$(SRCDIR)\style.admin_log.css \
586
+ $(SRCDIR)\style.fileedit.css \
578587
$(SRCDIR)\tree.js \
579588
$(SRCDIR)\useredit.js \
580589
$(SRCDIR)\wiki.wiki
581590
582591
OBJ = $(OX)\add$O \
@@ -618,10 +627,11 @@
618627
$(OX)\etag$O \
619628
$(OX)\event$O \
620629
$(OX)\export$O \
621630
$(OX)\extcgi$O \
622631
$(OX)\file$O \
632
+ $(OX)\fileedit$O \
623633
$(OX)\finfo$O \
624634
$(OX)\foci$O \
625635
$(OX)\forum$O \
626636
$(OX)\fshell$O \
627637
$(OX)\fusefs$O \
@@ -823,10 +833,11 @@
823833
echo $(OX)\etag.obj >> $@
824834
echo $(OX)\event.obj >> $@
825835
echo $(OX)\export.obj >> $@
826836
echo $(OX)\extcgi.obj >> $@
827837
echo $(OX)\file.obj >> $@
838
+ echo $(OX)\fileedit.obj >> $@
828839
echo $(OX)\finfo.obj >> $@
829840
echo $(OX)\foci.obj >> $@
830841
echo $(OX)\forum.obj >> $@
831842
echo $(OX)\fshell.obj >> $@
832843
echo $(OX)\fusefs.obj >> $@
@@ -1286,10 +1297,16 @@
12861297
$(OX)\file$O : file_.c file.h
12871298
$(TCC) /Fo$@ -c file_.c
12881299
12891300
file_.c : $(SRCDIR)\file.c
12901301
translate$E $** > $@
1302
+
1303
+$(OX)\fileedit$O : fileedit_.c fileedit.h
1304
+ $(TCC) /Fo$@ -c fileedit_.c
1305
+
1306
+fileedit_.c : $(SRCDIR)\fileedit.c
1307
+ translate$E $** > $@
12911308
12921309
$(OX)\finfo$O : finfo_.c finfo.h
12931310
$(TCC) /Fo$@ -c finfo_.c
12941311
12951312
finfo_.c : $(SRCDIR)\finfo.c
@@ -1937,10 +1954,11 @@
19371954
etag_.c:etag.h \
19381955
event_.c:event.h \
19391956
export_.c:export.h \
19401957
extcgi_.c:extcgi.h \
19411958
file_.c:file.h \
1959
+ fileedit_.c:fileedit.h \
19421960
finfo_.c:finfo.h \
19431961
foci_.c:foci.h \
19441962
forum_.c:forum.h \
19451963
fshell_.c:fshell.h \
19461964
fusefs_.c:fusefs.h \
19471965
19481966
ADDED www/fileedit-page.md
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -384,10 +384,11 @@
384 etag_.c \
385 event_.c \
386 export_.c \
387 extcgi_.c \
388 file_.c \
 
389 finfo_.c \
390 foci_.c \
391 forum_.c \
392 fshell_.c \
393 fusefs_.c \
@@ -547,10 +548,17 @@
547 $(SRCDIR)\accordion.js \
548 $(SRCDIR)\ci_edit.js \
549 $(SRCDIR)\copybtn.js \
550 $(SRCDIR)\diff.tcl \
551 $(SRCDIR)\forum.js \
 
 
 
 
 
 
 
552 $(SRCDIR)\graph.js \
553 $(SRCDIR)\href.js \
554 $(SRCDIR)\login.js \
555 $(SRCDIR)\markdown.md \
556 $(SRCDIR)\menu.js \
@@ -573,10 +581,11 @@
573 $(SRCDIR)\sounds\c.wav \
574 $(SRCDIR)\sounds\d.wav \
575 $(SRCDIR)\sounds\e.wav \
576 $(SRCDIR)\sounds\f.wav \
577 $(SRCDIR)\style.admin_log.css \
 
578 $(SRCDIR)\tree.js \
579 $(SRCDIR)\useredit.js \
580 $(SRCDIR)\wiki.wiki
581
582 OBJ = $(OX)\add$O \
@@ -618,10 +627,11 @@
618 $(OX)\etag$O \
619 $(OX)\event$O \
620 $(OX)\export$O \
621 $(OX)\extcgi$O \
622 $(OX)\file$O \
 
623 $(OX)\finfo$O \
624 $(OX)\foci$O \
625 $(OX)\forum$O \
626 $(OX)\fshell$O \
627 $(OX)\fusefs$O \
@@ -823,10 +833,11 @@
823 echo $(OX)\etag.obj >> $@
824 echo $(OX)\event.obj >> $@
825 echo $(OX)\export.obj >> $@
826 echo $(OX)\extcgi.obj >> $@
827 echo $(OX)\file.obj >> $@
 
828 echo $(OX)\finfo.obj >> $@
829 echo $(OX)\foci.obj >> $@
830 echo $(OX)\forum.obj >> $@
831 echo $(OX)\fshell.obj >> $@
832 echo $(OX)\fusefs.obj >> $@
@@ -1286,10 +1297,16 @@
1286 $(OX)\file$O : file_.c file.h
1287 $(TCC) /Fo$@ -c file_.c
1288
1289 file_.c : $(SRCDIR)\file.c
1290 translate$E $** > $@
 
 
 
 
 
 
1291
1292 $(OX)\finfo$O : finfo_.c finfo.h
1293 $(TCC) /Fo$@ -c finfo_.c
1294
1295 finfo_.c : $(SRCDIR)\finfo.c
@@ -1937,10 +1954,11 @@
1937 etag_.c:etag.h \
1938 event_.c:event.h \
1939 export_.c:export.h \
1940 extcgi_.c:extcgi.h \
1941 file_.c:file.h \
 
1942 finfo_.c:finfo.h \
1943 foci_.c:foci.h \
1944 forum_.c:forum.h \
1945 fshell_.c:fshell.h \
1946 fusefs_.c:fusefs.h \
1947
1948 DDED www/fileedit-page.md
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -384,10 +384,11 @@
384 etag_.c \
385 event_.c \
386 export_.c \
387 extcgi_.c \
388 file_.c \
389 fileedit_.c \
390 finfo_.c \
391 foci_.c \
392 forum_.c \
393 fshell_.c \
394 fusefs_.c \
@@ -547,10 +548,17 @@
548 $(SRCDIR)\accordion.js \
549 $(SRCDIR)\ci_edit.js \
550 $(SRCDIR)\copybtn.js \
551 $(SRCDIR)\diff.tcl \
552 $(SRCDIR)\forum.js \
553 $(SRCDIR)\fossil.bootstrap.js \
554 $(SRCDIR)\fossil.confirmer.js \
555 $(SRCDIR)\fossil.dom.js \
556 $(SRCDIR)\fossil.fetch.js \
557 $(SRCDIR)\fossil.page.fileedit.js \
558 $(SRCDIR)\fossil.storage.js \
559 $(SRCDIR)\fossil.tabs.js \
560 $(SRCDIR)\graph.js \
561 $(SRCDIR)\href.js \
562 $(SRCDIR)\login.js \
563 $(SRCDIR)\markdown.md \
564 $(SRCDIR)\menu.js \
@@ -573,10 +581,11 @@
581 $(SRCDIR)\sounds\c.wav \
582 $(SRCDIR)\sounds\d.wav \
583 $(SRCDIR)\sounds\e.wav \
584 $(SRCDIR)\sounds\f.wav \
585 $(SRCDIR)\style.admin_log.css \
586 $(SRCDIR)\style.fileedit.css \
587 $(SRCDIR)\tree.js \
588 $(SRCDIR)\useredit.js \
589 $(SRCDIR)\wiki.wiki
590
591 OBJ = $(OX)\add$O \
@@ -618,10 +627,11 @@
627 $(OX)\etag$O \
628 $(OX)\event$O \
629 $(OX)\export$O \
630 $(OX)\extcgi$O \
631 $(OX)\file$O \
632 $(OX)\fileedit$O \
633 $(OX)\finfo$O \
634 $(OX)\foci$O \
635 $(OX)\forum$O \
636 $(OX)\fshell$O \
637 $(OX)\fusefs$O \
@@ -823,10 +833,11 @@
833 echo $(OX)\etag.obj >> $@
834 echo $(OX)\event.obj >> $@
835 echo $(OX)\export.obj >> $@
836 echo $(OX)\extcgi.obj >> $@
837 echo $(OX)\file.obj >> $@
838 echo $(OX)\fileedit.obj >> $@
839 echo $(OX)\finfo.obj >> $@
840 echo $(OX)\foci.obj >> $@
841 echo $(OX)\forum.obj >> $@
842 echo $(OX)\fshell.obj >> $@
843 echo $(OX)\fusefs.obj >> $@
@@ -1286,10 +1297,16 @@
1297 $(OX)\file$O : file_.c file.h
1298 $(TCC) /Fo$@ -c file_.c
1299
1300 file_.c : $(SRCDIR)\file.c
1301 translate$E $** > $@
1302
1303 $(OX)\fileedit$O : fileedit_.c fileedit.h
1304 $(TCC) /Fo$@ -c fileedit_.c
1305
1306 fileedit_.c : $(SRCDIR)\fileedit.c
1307 translate$E $** > $@
1308
1309 $(OX)\finfo$O : finfo_.c finfo.h
1310 $(TCC) /Fo$@ -c finfo_.c
1311
1312 finfo_.c : $(SRCDIR)\finfo.c
@@ -1937,10 +1954,11 @@
1954 etag_.c:etag.h \
1955 event_.c:event.h \
1956 export_.c:export.h \
1957 extcgi_.c:extcgi.h \
1958 file_.c:file.h \
1959 fileedit_.c:fileedit.h \
1960 finfo_.c:finfo.h \
1961 foci_.c:foci.h \
1962 forum_.c:forum.h \
1963 fshell_.c:fshell.h \
1964 fusefs_.c:fusefs.h \
1965
1966 DDED www/fileedit-page.md
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -384,10 +384,11 @@
384384
etag_.c \
385385
event_.c \
386386
export_.c \
387387
extcgi_.c \
388388
file_.c \
389
+ fileedit_.c \
389390
finfo_.c \
390391
foci_.c \
391392
forum_.c \
392393
fshell_.c \
393394
fusefs_.c \
@@ -547,10 +548,17 @@
547548
$(SRCDIR)\accordion.js \
548549
$(SRCDIR)\ci_edit.js \
549550
$(SRCDIR)\copybtn.js \
550551
$(SRCDIR)\diff.tcl \
551552
$(SRCDIR)\forum.js \
553
+ $(SRCDIR)\fossil.bootstrap.js \
554
+ $(SRCDIR)\fossil.confirmer.js \
555
+ $(SRCDIR)\fossil.dom.js \
556
+ $(SRCDIR)\fossil.fetch.js \
557
+ $(SRCDIR)\fossil.page.fileedit.js \
558
+ $(SRCDIR)\fossil.storage.js \
559
+ $(SRCDIR)\fossil.tabs.js \
552560
$(SRCDIR)\graph.js \
553561
$(SRCDIR)\href.js \
554562
$(SRCDIR)\login.js \
555563
$(SRCDIR)\markdown.md \
556564
$(SRCDIR)\menu.js \
@@ -573,10 +581,11 @@
573581
$(SRCDIR)\sounds\c.wav \
574582
$(SRCDIR)\sounds\d.wav \
575583
$(SRCDIR)\sounds\e.wav \
576584
$(SRCDIR)\sounds\f.wav \
577585
$(SRCDIR)\style.admin_log.css \
586
+ $(SRCDIR)\style.fileedit.css \
578587
$(SRCDIR)\tree.js \
579588
$(SRCDIR)\useredit.js \
580589
$(SRCDIR)\wiki.wiki
581590
582591
OBJ = $(OX)\add$O \
@@ -618,10 +627,11 @@
618627
$(OX)\etag$O \
619628
$(OX)\event$O \
620629
$(OX)\export$O \
621630
$(OX)\extcgi$O \
622631
$(OX)\file$O \
632
+ $(OX)\fileedit$O \
623633
$(OX)\finfo$O \
624634
$(OX)\foci$O \
625635
$(OX)\forum$O \
626636
$(OX)\fshell$O \
627637
$(OX)\fusefs$O \
@@ -823,10 +833,11 @@
823833
echo $(OX)\etag.obj >> $@
824834
echo $(OX)\event.obj >> $@
825835
echo $(OX)\export.obj >> $@
826836
echo $(OX)\extcgi.obj >> $@
827837
echo $(OX)\file.obj >> $@
838
+ echo $(OX)\fileedit.obj >> $@
828839
echo $(OX)\finfo.obj >> $@
829840
echo $(OX)\foci.obj >> $@
830841
echo $(OX)\forum.obj >> $@
831842
echo $(OX)\fshell.obj >> $@
832843
echo $(OX)\fusefs.obj >> $@
@@ -1286,10 +1297,16 @@
12861297
$(OX)\file$O : file_.c file.h
12871298
$(TCC) /Fo$@ -c file_.c
12881299
12891300
file_.c : $(SRCDIR)\file.c
12901301
translate$E $** > $@
1302
+
1303
+$(OX)\fileedit$O : fileedit_.c fileedit.h
1304
+ $(TCC) /Fo$@ -c fileedit_.c
1305
+
1306
+fileedit_.c : $(SRCDIR)\fileedit.c
1307
+ translate$E $** > $@
12911308
12921309
$(OX)\finfo$O : finfo_.c finfo.h
12931310
$(TCC) /Fo$@ -c finfo_.c
12941311
12951312
finfo_.c : $(SRCDIR)\finfo.c
@@ -1937,10 +1954,11 @@
19371954
etag_.c:etag.h \
19381955
event_.c:event.h \
19391956
export_.c:export.h \
19401957
extcgi_.c:extcgi.h \
19411958
file_.c:file.h \
1959
+ fileedit_.c:fileedit.h \
19421960
finfo_.c:finfo.h \
19431961
foci_.c:foci.h \
19441962
forum_.c:forum.h \
19451963
fshell_.c:fshell.h \
19461964
fusefs_.c:fusefs.h \
19471965
19481966
ADDED www/fileedit-page.md
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -384,10 +384,11 @@
384 etag_.c \
385 event_.c \
386 export_.c \
387 extcgi_.c \
388 file_.c \
 
389 finfo_.c \
390 foci_.c \
391 forum_.c \
392 fshell_.c \
393 fusefs_.c \
@@ -547,10 +548,17 @@
547 $(SRCDIR)\accordion.js \
548 $(SRCDIR)\ci_edit.js \
549 $(SRCDIR)\copybtn.js \
550 $(SRCDIR)\diff.tcl \
551 $(SRCDIR)\forum.js \
 
 
 
 
 
 
 
552 $(SRCDIR)\graph.js \
553 $(SRCDIR)\href.js \
554 $(SRCDIR)\login.js \
555 $(SRCDIR)\markdown.md \
556 $(SRCDIR)\menu.js \
@@ -573,10 +581,11 @@
573 $(SRCDIR)\sounds\c.wav \
574 $(SRCDIR)\sounds\d.wav \
575 $(SRCDIR)\sounds\e.wav \
576 $(SRCDIR)\sounds\f.wav \
577 $(SRCDIR)\style.admin_log.css \
 
578 $(SRCDIR)\tree.js \
579 $(SRCDIR)\useredit.js \
580 $(SRCDIR)\wiki.wiki
581
582 OBJ = $(OX)\add$O \
@@ -618,10 +627,11 @@
618 $(OX)\etag$O \
619 $(OX)\event$O \
620 $(OX)\export$O \
621 $(OX)\extcgi$O \
622 $(OX)\file$O \
 
623 $(OX)\finfo$O \
624 $(OX)\foci$O \
625 $(OX)\forum$O \
626 $(OX)\fshell$O \
627 $(OX)\fusefs$O \
@@ -823,10 +833,11 @@
823 echo $(OX)\etag.obj >> $@
824 echo $(OX)\event.obj >> $@
825 echo $(OX)\export.obj >> $@
826 echo $(OX)\extcgi.obj >> $@
827 echo $(OX)\file.obj >> $@
 
828 echo $(OX)\finfo.obj >> $@
829 echo $(OX)\foci.obj >> $@
830 echo $(OX)\forum.obj >> $@
831 echo $(OX)\fshell.obj >> $@
832 echo $(OX)\fusefs.obj >> $@
@@ -1286,10 +1297,16 @@
1286 $(OX)\file$O : file_.c file.h
1287 $(TCC) /Fo$@ -c file_.c
1288
1289 file_.c : $(SRCDIR)\file.c
1290 translate$E $** > $@
 
 
 
 
 
 
1291
1292 $(OX)\finfo$O : finfo_.c finfo.h
1293 $(TCC) /Fo$@ -c finfo_.c
1294
1295 finfo_.c : $(SRCDIR)\finfo.c
@@ -1937,10 +1954,11 @@
1937 etag_.c:etag.h \
1938 event_.c:event.h \
1939 export_.c:export.h \
1940 extcgi_.c:extcgi.h \
1941 file_.c:file.h \
 
1942 finfo_.c:finfo.h \
1943 foci_.c:foci.h \
1944 forum_.c:forum.h \
1945 fshell_.c:fshell.h \
1946 fusefs_.c:fusefs.h \
1947
1948 DDED www/fileedit-page.md
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -384,10 +384,11 @@
384 etag_.c \
385 event_.c \
386 export_.c \
387 extcgi_.c \
388 file_.c \
389 fileedit_.c \
390 finfo_.c \
391 foci_.c \
392 forum_.c \
393 fshell_.c \
394 fusefs_.c \
@@ -547,10 +548,17 @@
548 $(SRCDIR)\accordion.js \
549 $(SRCDIR)\ci_edit.js \
550 $(SRCDIR)\copybtn.js \
551 $(SRCDIR)\diff.tcl \
552 $(SRCDIR)\forum.js \
553 $(SRCDIR)\fossil.bootstrap.js \
554 $(SRCDIR)\fossil.confirmer.js \
555 $(SRCDIR)\fossil.dom.js \
556 $(SRCDIR)\fossil.fetch.js \
557 $(SRCDIR)\fossil.page.fileedit.js \
558 $(SRCDIR)\fossil.storage.js \
559 $(SRCDIR)\fossil.tabs.js \
560 $(SRCDIR)\graph.js \
561 $(SRCDIR)\href.js \
562 $(SRCDIR)\login.js \
563 $(SRCDIR)\markdown.md \
564 $(SRCDIR)\menu.js \
@@ -573,10 +581,11 @@
581 $(SRCDIR)\sounds\c.wav \
582 $(SRCDIR)\sounds\d.wav \
583 $(SRCDIR)\sounds\e.wav \
584 $(SRCDIR)\sounds\f.wav \
585 $(SRCDIR)\style.admin_log.css \
586 $(SRCDIR)\style.fileedit.css \
587 $(SRCDIR)\tree.js \
588 $(SRCDIR)\useredit.js \
589 $(SRCDIR)\wiki.wiki
590
591 OBJ = $(OX)\add$O \
@@ -618,10 +627,11 @@
627 $(OX)\etag$O \
628 $(OX)\event$O \
629 $(OX)\export$O \
630 $(OX)\extcgi$O \
631 $(OX)\file$O \
632 $(OX)\fileedit$O \
633 $(OX)\finfo$O \
634 $(OX)\foci$O \
635 $(OX)\forum$O \
636 $(OX)\fshell$O \
637 $(OX)\fusefs$O \
@@ -823,10 +833,11 @@
833 echo $(OX)\etag.obj >> $@
834 echo $(OX)\event.obj >> $@
835 echo $(OX)\export.obj >> $@
836 echo $(OX)\extcgi.obj >> $@
837 echo $(OX)\file.obj >> $@
838 echo $(OX)\fileedit.obj >> $@
839 echo $(OX)\finfo.obj >> $@
840 echo $(OX)\foci.obj >> $@
841 echo $(OX)\forum.obj >> $@
842 echo $(OX)\fshell.obj >> $@
843 echo $(OX)\fusefs.obj >> $@
@@ -1286,10 +1297,16 @@
1297 $(OX)\file$O : file_.c file.h
1298 $(TCC) /Fo$@ -c file_.c
1299
1300 file_.c : $(SRCDIR)\file.c
1301 translate$E $** > $@
1302
1303 $(OX)\fileedit$O : fileedit_.c fileedit.h
1304 $(TCC) /Fo$@ -c fileedit_.c
1305
1306 fileedit_.c : $(SRCDIR)\fileedit.c
1307 translate$E $** > $@
1308
1309 $(OX)\finfo$O : finfo_.c finfo.h
1310 $(TCC) /Fo$@ -c finfo_.c
1311
1312 finfo_.c : $(SRCDIR)\finfo.c
@@ -1937,10 +1954,11 @@
1954 etag_.c:etag.h \
1955 event_.c:event.h \
1956 export_.c:export.h \
1957 extcgi_.c:extcgi.h \
1958 file_.c:file.h \
1959 fileedit_.c:fileedit.h \
1960 finfo_.c:finfo.h \
1961 foci_.c:foci.h \
1962 forum_.c:forum.h \
1963 fshell_.c:fshell.h \
1964 fusefs_.c:fusefs.h \
1965
1966 DDED www/fileedit-page.md
--- a/www/fileedit-page.md
+++ b/www/fileedit-page.md
@@ -0,0 +1,30 @@
1
+# The fileedit Page
2
+
3
+This document describes the limitations of, caveats for, and
4
+disclaimers for the [](/fileedit) page, which provides users with
5
+[checkin p basic editing features for files
6
+via the web interface.
7
+
8
+# Important Caveats and Disclaimers
9
+
10
+Predictably, the ability to edit files in a repository from a web
11
+browser halfway around the world comes with several obligatory caveats
12
+and disclaimers...
13
+
14
+## by Default.
15
+
16
+In order to "activate" it, a user with [the "setup"
17
+permission](./caps/index.md) must se?cmd= the
18
+[fileedit-glob](/help/fileedit-glob) repository setting to a
19
+comma- or newline-delimited list of globs representing a whitelist of
20
+files which may be edited online. Any user with commit access may then
21
+edit files matching one of those globs. Certain pages within the UI
22
+get an "edit" link added to them when the current user's permissions
23
+and the whitelist both permit editing of that file.
24
+
25
+## <a id="'s blockchaindocument describes# # <a*Hypothetically*, though this is currently unproven "in the wild," it
26
+inject the custom editor widget into the UI, replacing
27
+the default editor widget"should"
28
+the after
29
+(re)loading a file content to
30
+. Those, in turn File
--- a/www/fileedit-page.md
+++ b/www/fileedit-page.md
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/www/fileedit-page.md
+++ b/www/fileedit-page.md
@@ -0,0 +1,30 @@
1 # The fileedit Page
2
3 This document describes the limitations of, caveats for, and
4 disclaimers for the [](/fileedit) page, which provides users with
5 [checkin p basic editing features for files
6 via the web interface.
7
8 # Important Caveats and Disclaimers
9
10 Predictably, the ability to edit files in a repository from a web
11 browser halfway around the world comes with several obligatory caveats
12 and disclaimers...
13
14 ## by Default.
15
16 In order to "activate" it, a user with [the "setup"
17 permission](./caps/index.md) must se?cmd= the
18 [fileedit-glob](/help/fileedit-glob) repository setting to a
19 comma- or newline-delimited list of globs representing a whitelist of
20 files which may be edited online. Any user with commit access may then
21 edit files matching one of those globs. Certain pages within the UI
22 get an "edit" link added to them when the current user's permissions
23 and the whitelist both permit editing of that file.
24
25 ## <a id="'s blockchaindocument describes# # <a*Hypothetically*, though this is currently unproven "in the wild," it
26 inject the custom editor widget into the UI, replacing
27 the default editor widget"should"
28 the after
29 (re)loading a file content to
30 . Those, in turn File
--- a/www/fileedit-page.md
+++ b/www/fileedit-page.md
@@ -27,5 +27,4 @@
2727
the default editor widget"should"
2828
the after
2929
(re)loading a file content to
30
-. Those, in turn Filedoing the
31
-following:ated events.
30
+. Those, in turn File
--- a/www/fileedit-page.md
+++ b/www/fileedit-page.md
@@ -27,5 +27,4 @@
27 the default editor widget"should"
28 the after
29 (re)loading a file content to
30 . Those, in turn Filedoing the
31 following:ated events.
--- a/www/fileedit-page.md
+++ b/www/fileedit-page.md
@@ -27,5 +27,4 @@
27 the default editor widget"should"
28 the after
29 (re)loading a file content to
30 . Those, in turn File
 
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -41,10 +41,11 @@
4141
embeddeddoc.wiki {Embedded Project Documentation}
4242
encryptedrepos.wiki {How To Use Encrypted Repositories}
4343
env-opts.md {Environment Variables and Global Options}
4444
event.wiki {Events}
4545
faq.wiki {Frequently Asked Questions}
46
+ fileedit-page.md {The fileedit Page}
4647
fileformat.wiki {Fossil File Format}
4748
fiveminutes.wiki {Up and Running in 5 Minutes as a Single User}
4849
forum.wiki {Fossil Forums}
4950
foss-cklist.wiki {Checklist For Successful Open-Source Projects}
5051
fossil-from-msvc.wiki {Integrating Fossil in the Microsoft Express 2010 IDE}
5152
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -41,10 +41,11 @@
41 embeddeddoc.wiki {Embedded Project Documentation}
42 encryptedrepos.wiki {How To Use Encrypted Repositories}
43 env-opts.md {Environment Variables and Global Options}
44 event.wiki {Events}
45 faq.wiki {Frequently Asked Questions}
 
46 fileformat.wiki {Fossil File Format}
47 fiveminutes.wiki {Up and Running in 5 Minutes as a Single User}
48 forum.wiki {Fossil Forums}
49 foss-cklist.wiki {Checklist For Successful Open-Source Projects}
50 fossil-from-msvc.wiki {Integrating Fossil in the Microsoft Express 2010 IDE}
51
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -41,10 +41,11 @@
41 embeddeddoc.wiki {Embedded Project Documentation}
42 encryptedrepos.wiki {How To Use Encrypted Repositories}
43 env-opts.md {Environment Variables and Global Options}
44 event.wiki {Events}
45 faq.wiki {Frequently Asked Questions}
46 fileedit-page.md {The fileedit Page}
47 fileformat.wiki {Fossil File Format}
48 fiveminutes.wiki {Up and Running in 5 Minutes as a Single User}
49 forum.wiki {Fossil Forums}
50 foss-cklist.wiki {Checklist For Successful Open-Source Projects}
51 fossil-from-msvc.wiki {Integrating Fossil in the Microsoft Express 2010 IDE}
52
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -41,10 +41,11 @@
4141
embeddeddoc.wiki {Embedded Project Documentation}
4242
encryptedrepos.wiki {How To Use Encrypted Repositories}
4343
env-opts.md {Environment Variables and Global Options}
4444
event.wiki {Events}
4545
faq.wiki {Frequently Asked Questions}
46
+ fileedit-page.md {The fileedit Page}
4647
fileformat.wiki {Fossil File Format}
4748
fiveminutes.wiki {Up and Running in 5 Minutes as a Single User}
4849
forum.wiki {Fossil Forums}
4950
foss-cklist.wiki {Checklist For Successful Open-Source Projects}
5051
fossil-from-msvc.wiki {Integrating Fossil in the Microsoft Express 2010 IDE}
5152
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -41,10 +41,11 @@
41 embeddeddoc.wiki {Embedded Project Documentation}
42 encryptedrepos.wiki {How To Use Encrypted Repositories}
43 env-opts.md {Environment Variables and Global Options}
44 event.wiki {Events}
45 faq.wiki {Frequently Asked Questions}
 
46 fileformat.wiki {Fossil File Format}
47 fiveminutes.wiki {Up and Running in 5 Minutes as a Single User}
48 forum.wiki {Fossil Forums}
49 foss-cklist.wiki {Checklist For Successful Open-Source Projects}
50 fossil-from-msvc.wiki {Integrating Fossil in the Microsoft Express 2010 IDE}
51
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -41,10 +41,11 @@
41 embeddeddoc.wiki {Embedded Project Documentation}
42 encryptedrepos.wiki {How To Use Encrypted Repositories}
43 env-opts.md {Environment Variables and Global Options}
44 event.wiki {Events}
45 faq.wiki {Frequently Asked Questions}
46 fileedit-page.md {The fileedit Page}
47 fileformat.wiki {Fossil File Format}
48 fiveminutes.wiki {Up and Running in 5 Minutes as a Single User}
49 forum.wiki {Fossil Forums}
50 foss-cklist.wiki {Checklist For Successful Open-Source Projects}
51 fossil-from-msvc.wiki {Integrating Fossil in the Microsoft Express 2010 IDE}
52
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -11,11 +11,11 @@
1111
<li> <a href='quickstart.wiki'>Quick-start Guide</a>
1212
<li> <a href='history.md'>Purpose and History of Fossil</a>
1313
<li> <a href='build.wiki'>Compiling and installing Fossil</a>
1414
<li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
1515
<li> <a href='$ROOT/help'>List of commands, web-pages, and settings</a>
16
-<li> <a href='userlinks.wiki'>Key Docs for Fossil Users</a>
16
+<li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
1717
<li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
1818
<li> <a href='http://www.fossil-scm.org/schimpf-book/home'>Jim Schimpf's
1919
book</a>
2020
</ul>
2121
<a name="pindex"></a>
@@ -113,10 +113,11 @@
113113
<li><a href="serverext.wiki">Extensions &mdash; CGI Server</a></li>
114114
<li><a href="serverext.wiki">Extensions To A Fossil Server Using CGI Scripts &mdash; Adding</a></li>
115115
<li><a href="adding_code.wiki">Features To Fossil &mdash; Adding New</a></li>
116116
<li><a href="fileformat.wiki">File Format &mdash; Fossil</a></li>
117117
<li><a href="globs.md"><b>File Name Glob Patterns</b></a></li>
118
+<li><a href="fileedit-page.md">fileedit Page &mdash; The</a></li>
118119
<li><a href="unvers.wiki">Files &mdash; Unversioned</a></li>
119120
<li><a href="branching.wiki">Forking, Merging, and Tagging &mdash; Branching,</a></li>
120121
<li><a href="delta_format.wiki">Format &mdash; Fossil Delta</a></li>
121122
<li><a href="fileformat.wiki">Format &mdash; Fossil File</a></li>
122123
<li><a href="image-format-vs-repo-size.md">Format vs Fossil Repo Size &mdash; Image</a></li>
@@ -206,10 +207,11 @@
206207
<li><a href="pop.wiki">Operation &mdash; Principles Of</a></li>
207208
<li><a href="cgi.wiki">Options &mdash; CGI Script Configuration</a></li>
208209
<li><a href="env-opts.md">Options &mdash; Environment Variables and Global</a></li>
209210
<li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil &mdash; A Technical</a></li>
210211
<li><a href="index.wiki">Page &mdash; Home</a></li>
212
+<li><a href="fileedit-page.md">Page &mdash; The fileedit</a></li>
211213
<li><a href="aboutdownload.wiki">Page Works &mdash; How The Download</a></li>
212214
<li><a href="customskin.md">Pages &mdash; Theming: Customizing The Appearance of Web</a></li>
213215
<li><a href="password.wiki"><b>Password Management And Authentication</b></a></li>
214216
<li><a href="globs.md">Patterns &mdash; File Name Glob</a></li>
215217
<li><a href="quotes.wiki">People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What</a></li>
@@ -281,10 +283,11 @@
281283
<li><a href="../test/release-checklist.wiki">Testing Checklist &mdash; Pre-Release</a></li>
282284
<li><a href="th1.md">TH1 Scripting Language &mdash; The</a></li>
283285
<li><a href="backoffice.md"><b>The "Backoffice" mechanism of Fossil</b></a></li>
284286
<li><a href="blame.wiki"><b>The Annotate/Blame Algorithm Of Fossil</b></a></li>
285287
<li><a href="defcsp.md"><b>The Default Content Security Policy</b></a></li>
288
+<li><a href="fileedit-page.md"><b>The fileedit Page</b></a></li>
286289
<li><a href="makefile.wiki"><b>The Fossil Build Process</b></a></li>
287290
<li><a href="sync.wiki"><b>The Fossil Sync Protocol</b></a></li>
288291
<li><a href="tickets.wiki"><b>The Fossil Ticket System</b></a></li>
289292
<li><a href="webui.wiki"><b>The Fossil Web Interface</b></a></li>
290293
<li><a href="history.md"><b>The Purpose And History Of Fossil</b></a></li>
291294
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -11,11 +11,11 @@
11 <li> <a href='quickstart.wiki'>Quick-start Guide</a>
12 <li> <a href='history.md'>Purpose and History of Fossil</a>
13 <li> <a href='build.wiki'>Compiling and installing Fossil</a>
14 <li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
15 <li> <a href='$ROOT/help'>List of commands, web-pages, and settings</a>
16 <li> <a href='userlinks.wiki'>Key Docs for Fossil Users</a>
17 <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
18 <li> <a href='http://www.fossil-scm.org/schimpf-book/home'>Jim Schimpf's
19 book</a>
20 </ul>
21 <a name="pindex"></a>
@@ -113,10 +113,11 @@
113 <li><a href="serverext.wiki">Extensions &mdash; CGI Server</a></li>
114 <li><a href="serverext.wiki">Extensions To A Fossil Server Using CGI Scripts &mdash; Adding</a></li>
115 <li><a href="adding_code.wiki">Features To Fossil &mdash; Adding New</a></li>
116 <li><a href="fileformat.wiki">File Format &mdash; Fossil</a></li>
117 <li><a href="globs.md"><b>File Name Glob Patterns</b></a></li>
 
118 <li><a href="unvers.wiki">Files &mdash; Unversioned</a></li>
119 <li><a href="branching.wiki">Forking, Merging, and Tagging &mdash; Branching,</a></li>
120 <li><a href="delta_format.wiki">Format &mdash; Fossil Delta</a></li>
121 <li><a href="fileformat.wiki">Format &mdash; Fossil File</a></li>
122 <li><a href="image-format-vs-repo-size.md">Format vs Fossil Repo Size &mdash; Image</a></li>
@@ -206,10 +207,11 @@
206 <li><a href="pop.wiki">Operation &mdash; Principles Of</a></li>
207 <li><a href="cgi.wiki">Options &mdash; CGI Script Configuration</a></li>
208 <li><a href="env-opts.md">Options &mdash; Environment Variables and Global</a></li>
209 <li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil &mdash; A Technical</a></li>
210 <li><a href="index.wiki">Page &mdash; Home</a></li>
 
211 <li><a href="aboutdownload.wiki">Page Works &mdash; How The Download</a></li>
212 <li><a href="customskin.md">Pages &mdash; Theming: Customizing The Appearance of Web</a></li>
213 <li><a href="password.wiki"><b>Password Management And Authentication</b></a></li>
214 <li><a href="globs.md">Patterns &mdash; File Name Glob</a></li>
215 <li><a href="quotes.wiki">People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What</a></li>
@@ -281,10 +283,11 @@
281 <li><a href="../test/release-checklist.wiki">Testing Checklist &mdash; Pre-Release</a></li>
282 <li><a href="th1.md">TH1 Scripting Language &mdash; The</a></li>
283 <li><a href="backoffice.md"><b>The "Backoffice" mechanism of Fossil</b></a></li>
284 <li><a href="blame.wiki"><b>The Annotate/Blame Algorithm Of Fossil</b></a></li>
285 <li><a href="defcsp.md"><b>The Default Content Security Policy</b></a></li>
 
286 <li><a href="makefile.wiki"><b>The Fossil Build Process</b></a></li>
287 <li><a href="sync.wiki"><b>The Fossil Sync Protocol</b></a></li>
288 <li><a href="tickets.wiki"><b>The Fossil Ticket System</b></a></li>
289 <li><a href="webui.wiki"><b>The Fossil Web Interface</b></a></li>
290 <li><a href="history.md"><b>The Purpose And History Of Fossil</b></a></li>
291
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -11,11 +11,11 @@
11 <li> <a href='quickstart.wiki'>Quick-start Guide</a>
12 <li> <a href='history.md'>Purpose and History of Fossil</a>
13 <li> <a href='build.wiki'>Compiling and installing Fossil</a>
14 <li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
15 <li> <a href='$ROOT/help'>List of commands, web-pages, and settings</a>
16 <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
17 <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
18 <li> <a href='http://www.fossil-scm.org/schimpf-book/home'>Jim Schimpf's
19 book</a>
20 </ul>
21 <a name="pindex"></a>
@@ -113,10 +113,11 @@
113 <li><a href="serverext.wiki">Extensions &mdash; CGI Server</a></li>
114 <li><a href="serverext.wiki">Extensions To A Fossil Server Using CGI Scripts &mdash; Adding</a></li>
115 <li><a href="adding_code.wiki">Features To Fossil &mdash; Adding New</a></li>
116 <li><a href="fileformat.wiki">File Format &mdash; Fossil</a></li>
117 <li><a href="globs.md"><b>File Name Glob Patterns</b></a></li>
118 <li><a href="fileedit-page.md">fileedit Page &mdash; The</a></li>
119 <li><a href="unvers.wiki">Files &mdash; Unversioned</a></li>
120 <li><a href="branching.wiki">Forking, Merging, and Tagging &mdash; Branching,</a></li>
121 <li><a href="delta_format.wiki">Format &mdash; Fossil Delta</a></li>
122 <li><a href="fileformat.wiki">Format &mdash; Fossil File</a></li>
123 <li><a href="image-format-vs-repo-size.md">Format vs Fossil Repo Size &mdash; Image</a></li>
@@ -206,10 +207,11 @@
207 <li><a href="pop.wiki">Operation &mdash; Principles Of</a></li>
208 <li><a href="cgi.wiki">Options &mdash; CGI Script Configuration</a></li>
209 <li><a href="env-opts.md">Options &mdash; Environment Variables and Global</a></li>
210 <li><a href="tech_overview.wiki">Overview Of The Design And Implementation Of Fossil &mdash; A Technical</a></li>
211 <li><a href="index.wiki">Page &mdash; Home</a></li>
212 <li><a href="fileedit-page.md">Page &mdash; The fileedit</a></li>
213 <li><a href="aboutdownload.wiki">Page Works &mdash; How The Download</a></li>
214 <li><a href="customskin.md">Pages &mdash; Theming: Customizing The Appearance of Web</a></li>
215 <li><a href="password.wiki"><b>Password Management And Authentication</b></a></li>
216 <li><a href="globs.md">Patterns &mdash; File Name Glob</a></li>
217 <li><a href="quotes.wiki">People Are Saying About Fossil, Git, and DVCSes in General &mdash; Quotes: What</a></li>
@@ -281,10 +283,11 @@
283 <li><a href="../test/release-checklist.wiki">Testing Checklist &mdash; Pre-Release</a></li>
284 <li><a href="th1.md">TH1 Scripting Language &mdash; The</a></li>
285 <li><a href="backoffice.md"><b>The "Backoffice" mechanism of Fossil</b></a></li>
286 <li><a href="blame.wiki"><b>The Annotate/Blame Algorithm Of Fossil</b></a></li>
287 <li><a href="defcsp.md"><b>The Default Content Security Policy</b></a></li>
288 <li><a href="fileedit-page.md"><b>The fileedit Page</b></a></li>
289 <li><a href="makefile.wiki"><b>The Fossil Build Process</b></a></li>
290 <li><a href="sync.wiki"><b>The Fossil Sync Protocol</b></a></li>
291 <li><a href="tickets.wiki"><b>The Fossil Ticket System</b></a></li>
292 <li><a href="webui.wiki"><b>The Fossil Web Interface</b></a></li>
293 <li><a href="history.md"><b>The Purpose And History Of Fossil</b></a></li>
294

Keyboard Shortcuts

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