Fossil SCM

Add the cgi_query_parameters_to_url() routine and use it to cause all query parameters on timeline to be exported. (Need to make this same changes for all other uses of url_render()). Make "context" timelines 11 entries by default. Other cleanups.

drh 2015-02-06 03:00 UTC form-submenu
Commit b6e1f61aaaefdef8e632574dcb72cffafdc28851
+13 -1
--- src/cgi.c
+++ src/cgi.c
@@ -1085,11 +1085,11 @@
10851085
** or "no" or "off".
10861086
*/
10871087
int cgi_parameter_boolean(const char *zName){
10881088
const char *zIn = cgi_parameter(zName, 0);
10891089
if( zIn==0 ) return 0;
1090
- return is_truth(zIn);
1090
+ return zIn[0]==0 || is_truth(zIn);
10911091
}
10921092
10931093
/*
10941094
** Return the name of the i-th CGI parameter. Return NULL if there
10951095
** are fewer than i registered CGI parameters.
@@ -1178,10 +1178,22 @@
11781178
zN = aParamQP[i].zName;
11791179
zV = aParamQP[i].zValue;
11801180
@ <input type="hidden" name="%h(zN)" value="%h(zV)">
11811181
}
11821182
}
1183
+
1184
+/*
1185
+** Export all untagged query parameters (but not cookies or environment
1186
+** variables) to the HQuery object.
1187
+*/
1188
+void cgi_query_parameters_to_url(HQuery *p){
1189
+ int i;
1190
+ for(i=0; i<nUsedQP; i++){
1191
+ if( aParamQP[i].isQP==0 || aParamQP[i].cTag ) continue;
1192
+ url_add_parameter(p, aParamQP[i].zName, aParamQP[i].zValue);
1193
+ }
1194
+}
11831195
11841196
/*
11851197
** Tag query parameter zName so that it is not exported by
11861198
** cgi_query_parameters_to_hidden(). Or if zName==0, then
11871199
** untag all query parameters.
11881200
--- src/cgi.c
+++ src/cgi.c
@@ -1085,11 +1085,11 @@
1085 ** or "no" or "off".
1086 */
1087 int cgi_parameter_boolean(const char *zName){
1088 const char *zIn = cgi_parameter(zName, 0);
1089 if( zIn==0 ) return 0;
1090 return is_truth(zIn);
1091 }
1092
1093 /*
1094 ** Return the name of the i-th CGI parameter. Return NULL if there
1095 ** are fewer than i registered CGI parameters.
@@ -1178,10 +1178,22 @@
1178 zN = aParamQP[i].zName;
1179 zV = aParamQP[i].zValue;
1180 @ <input type="hidden" name="%h(zN)" value="%h(zV)">
1181 }
1182 }
 
 
 
 
 
 
 
 
 
 
 
 
1183
1184 /*
1185 ** Tag query parameter zName so that it is not exported by
1186 ** cgi_query_parameters_to_hidden(). Or if zName==0, then
1187 ** untag all query parameters.
1188
--- src/cgi.c
+++ src/cgi.c
@@ -1085,11 +1085,11 @@
1085 ** or "no" or "off".
1086 */
1087 int cgi_parameter_boolean(const char *zName){
1088 const char *zIn = cgi_parameter(zName, 0);
1089 if( zIn==0 ) return 0;
1090 return zIn[0]==0 || is_truth(zIn);
1091 }
1092
1093 /*
1094 ** Return the name of the i-th CGI parameter. Return NULL if there
1095 ** are fewer than i registered CGI parameters.
@@ -1178,10 +1178,22 @@
1178 zN = aParamQP[i].zName;
1179 zV = aParamQP[i].zValue;
1180 @ <input type="hidden" name="%h(zN)" value="%h(zV)">
1181 }
1182 }
1183
1184 /*
1185 ** Export all untagged query parameters (but not cookies or environment
1186 ** variables) to the HQuery object.
1187 */
1188 void cgi_query_parameters_to_url(HQuery *p){
1189 int i;
1190 for(i=0; i<nUsedQP; i++){
1191 if( aParamQP[i].isQP==0 || aParamQP[i].cTag ) continue;
1192 url_add_parameter(p, aParamQP[i].zName, aParamQP[i].zValue);
1193 }
1194 }
1195
1196 /*
1197 ** Tag query parameter zName so that it is not exported by
1198 ** cgi_query_parameters_to_hidden(). Or if zName==0, then
1199 ** untag all query parameters.
1200
+1 -1
--- src/event.c
+++ src/event.c
@@ -129,11 +129,11 @@
129129
if( g.perm.WrWiki && g.perm.Write && nextRid==0 ){
130130
style_submenu_element("Edit", "Edit", "%s/eventedit?name=%s",
131131
g.zTop, zEventId);
132132
}
133133
zETime = db_text(0, "SELECT datetime(%.17g)", pEvent->rEventDate);
134
- style_submenu_element("Context", 0, "%R/timeline?c=%.20s&n=9", zEventId);
134
+ style_submenu_element("Context", 0, "%R/timeline?c=%.20s&n=11", zEventId);
135135
if( g.perm.Hyperlink ){
136136
if( verboseFlag ){
137137
style_submenu_element("Plain", 0, "%R/event?name=%.20s&aid=%s",
138138
zEventId, zUuid);
139139
if( nextRid ){
140140
--- src/event.c
+++ src/event.c
@@ -129,11 +129,11 @@
129 if( g.perm.WrWiki && g.perm.Write && nextRid==0 ){
130 style_submenu_element("Edit", "Edit", "%s/eventedit?name=%s",
131 g.zTop, zEventId);
132 }
133 zETime = db_text(0, "SELECT datetime(%.17g)", pEvent->rEventDate);
134 style_submenu_element("Context", 0, "%R/timeline?c=%.20s&n=9", zEventId);
135 if( g.perm.Hyperlink ){
136 if( verboseFlag ){
137 style_submenu_element("Plain", 0, "%R/event?name=%.20s&aid=%s",
138 zEventId, zUuid);
139 if( nextRid ){
140
--- src/event.c
+++ src/event.c
@@ -129,11 +129,11 @@
129 if( g.perm.WrWiki && g.perm.Write && nextRid==0 ){
130 style_submenu_element("Edit", "Edit", "%s/eventedit?name=%s",
131 g.zTop, zEventId);
132 }
133 zETime = db_text(0, "SELECT datetime(%.17g)", pEvent->rEventDate);
134 style_submenu_element("Context", 0, "%R/timeline?c=%.20s&n=11", zEventId);
135 if( g.perm.Hyperlink ){
136 if( verboseFlag ){
137 style_submenu_element("Plain", 0, "%R/event?name=%.20s&aid=%s",
138 zEventId, zUuid);
139 if( nextRid ){
140
+1 -1
--- src/info.c
+++ src/info.c
@@ -917,11 +917,11 @@
917917
blob_zero(&links);
918918
while( z && z[0] ){
919919
for(i=0; z[i] && (z[i]!=',' || z[i+1]!=' '); i++){}
920920
blob_appendf(&links,
921921
"%z%#h</a>%.2s",
922
- href("%R/timeline?r=%#t&nd&c=%t",i,z,zDate), i,z, &z[i]
922
+ href("%R/timeline?r=%#t&nd&c=%t&n=11",i,z,zDate), i,z, &z[i]
923923
);
924924
if( z[i]==0 ) break;
925925
z += i+2;
926926
}
927927
@ tags: %s(blob_str(&links)),
928928
--- src/info.c
+++ src/info.c
@@ -917,11 +917,11 @@
917 blob_zero(&links);
918 while( z && z[0] ){
919 for(i=0; z[i] && (z[i]!=',' || z[i+1]!=' '); i++){}
920 blob_appendf(&links,
921 "%z%#h</a>%.2s",
922 href("%R/timeline?r=%#t&nd&c=%t",i,z,zDate), i,z, &z[i]
923 );
924 if( z[i]==0 ) break;
925 z += i+2;
926 }
927 @ tags: %s(blob_str(&links)),
928
--- src/info.c
+++ src/info.c
@@ -917,11 +917,11 @@
917 blob_zero(&links);
918 while( z && z[0] ){
919 for(i=0; z[i] && (z[i]!=',' || z[i+1]!=' '); i++){}
920 blob_appendf(&links,
921 "%z%#h</a>%.2s",
922 href("%R/timeline?r=%#t&nd&c=%t&n=11",i,z,zDate), i,z, &z[i]
923 );
924 if( z[i]==0 ) break;
925 z += i+2;
926 }
927 @ tags: %s(blob_str(&links)),
928
+1 -1
--- src/search.c
+++ src/search.c
@@ -1322,11 +1322,11 @@
13221322
);
13231323
db_multi_exec(
13241324
"REPLACE INTO ftsdocs(rowid,idxed,type,rid,name,label,url,mtime)"
13251325
" SELECT ftsdocs.rowid, 1, 'c', ftsdocs.rid, NULL,"
13261326
" printf('Check-in [%%.16s] on %%s',blob.uuid,datetime(event.mtime)),"
1327
- " printf('/timeline?y=ci&n=9&c=%%.20s',blob.uuid),"
1327
+ " printf('/timeline?y=ci&n=11&c=%%.20s',blob.uuid),"
13281328
" event.mtime"
13291329
" FROM ftsdocs, event, blob"
13301330
" WHERE ftsdocs.type='c' AND NOT ftsdocs.idxed"
13311331
" AND event.objid=ftsdocs.rid"
13321332
" AND blob.rid=ftsdocs.rid"
13331333
--- src/search.c
+++ src/search.c
@@ -1322,11 +1322,11 @@
1322 );
1323 db_multi_exec(
1324 "REPLACE INTO ftsdocs(rowid,idxed,type,rid,name,label,url,mtime)"
1325 " SELECT ftsdocs.rowid, 1, 'c', ftsdocs.rid, NULL,"
1326 " printf('Check-in [%%.16s] on %%s',blob.uuid,datetime(event.mtime)),"
1327 " printf('/timeline?y=ci&n=9&c=%%.20s',blob.uuid),"
1328 " event.mtime"
1329 " FROM ftsdocs, event, blob"
1330 " WHERE ftsdocs.type='c' AND NOT ftsdocs.idxed"
1331 " AND event.objid=ftsdocs.rid"
1332 " AND blob.rid=ftsdocs.rid"
1333
--- src/search.c
+++ src/search.c
@@ -1322,11 +1322,11 @@
1322 );
1323 db_multi_exec(
1324 "REPLACE INTO ftsdocs(rowid,idxed,type,rid,name,label,url,mtime)"
1325 " SELECT ftsdocs.rowid, 1, 'c', ftsdocs.rid, NULL,"
1326 " printf('Check-in [%%.16s] on %%s',blob.uuid,datetime(event.mtime)),"
1327 " printf('/timeline?y=ci&n=11&c=%%.20s',blob.uuid),"
1328 " event.mtime"
1329 " FROM ftsdocs, event, blob"
1330 " WHERE ftsdocs.type='c' AND NOT ftsdocs.idxed"
1331 " AND event.objid=ftsdocs.rid"
1332 " AND blob.rid=ftsdocs.rid"
1333
+8 -36
--- src/timeline.c
+++ src/timeline.c
@@ -48,11 +48,11 @@
4848
** Generate a hyperlink to a date & time.
4949
*/
5050
void hyperlink_to_date(const char *zDate, const char *zSuffix){
5151
if( zSuffix==0 ) zSuffix = "";
5252
if( g.perm.Hyperlink ){
53
- @ %z(href("%R/timeline?c=%T",zDate))%s(zDate)</a>%s(zSuffix)
53
+ @ %z(href("%R/timeline?n=11&c=%T",zDate))%s(zDate)</a>%s(zSuffix)
5454
}else{
5555
@ %s(zDate)%s(zSuffix)
5656
}
5757
}
5858
@@ -494,10 +494,11 @@
494494
" (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm"
495495
" FROM mlink"
496496
" WHERE mid=:mid AND (pid!=fid OR pfnid>0)"
497497
" AND (fid>0 OR"
498498
" fnid NOT IN (SELECT pfnid FROM mlink WHERE mid=:mid))"
499
+ " AND NOT mlink.isaux"
499500
" ORDER BY 3 /*sort*/"
500501
);
501502
fchngQueryInit = 1;
502503
}
503504
db_bind_int(&fchngQuery, ":mid", rid);
@@ -1154,10 +1155,11 @@
11541155
if( !g.perm.Read && !g.perm.RdTkt && !g.perm.RdWiki ){
11551156
login_needed();
11561157
return;
11571158
}
11581159
url_initialize(&url, "timeline");
1160
+ cgi_query_parameters_to_url(&url);
11591161
if( zTagName && g.perm.Read ){
11601162
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'", zTagName);
11611163
zThisTag = zTagName;
11621164
}else if( zBrName && g.perm.Read ){
11631165
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName);
@@ -1174,32 +1176,26 @@
11741176
if( zType[0]=='a' ){
11751177
tmFlags |= TIMELINE_BRIEF | TIMELINE_GRAPH;
11761178
}else{
11771179
tmFlags |= TIMELINE_GRAPH;
11781180
}
1179
- if( nEntry>0 ) url_add_parameter(&url, "n", mprintf("%d", nEntry));
1180
- if( P("ng")!=0 || zSearch!=0 ){
1181
+ if( PB("ng") || zSearch!=0 ){
11811182
tmFlags &= ~TIMELINE_GRAPH;
1182
- url_add_parameter(&url, "ng", 0);
11831183
}
1184
- if( P("brbg")!=0 ){
1184
+ if( PB("brbg") ){
11851185
tmFlags |= TIMELINE_BRCOLOR;
1186
- url_add_parameter(&url, "brbg", 0);
11871186
}
1188
- if( P("unhide")!=0 ){
1187
+ if( PB("unhide") ){
11891188
tmFlags |= TIMELINE_UNHIDE;
1190
- url_add_parameter(&url, "unhide", 0);
11911189
}
1192
- if( P("ubg")!=0 ){
1190
+ if( PB("ubg") ){
11931191
tmFlags |= TIMELINE_UCOLOR;
1194
- url_add_parameter(&url, "ubg", 0);
11951192
}
11961193
if( zUses!=0 ){
11971194
int ufid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUses);
11981195
if( ufid ){
11991196
zUses = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ufid);
1200
- url_add_parameter(&url, "uf", zUses);
12011197
db_multi_exec("CREATE TEMP TABLE usesfile(rid INTEGER PRIMARY KEY)");
12021198
compute_uses_file("usesfile", ufid, 0);
12031199
zType = "ci";
12041200
}else{
12051201
zUses = 0;
@@ -1220,20 +1216,18 @@
12201216
blob_zero(&desc);
12211217
blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1);
12221218
blob_append(&sql, timeline_query_for_www(), -1);
12231219
if( PB("fc") || PB("v") || PB("detail") ){
12241220
tmFlags |= TIMELINE_FCHANGES;
1225
- url_add_parameter(&url, "v", 0);
12261221
}
12271222
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
12281223
blob_append_sql(&sql,
12291224
" AND NOT EXISTS(SELECT 1 FROM tagxref"
12301225
" WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
12311226
TAG_HIDDEN
12321227
);
12331228
}
1234
- if( !useDividers ) url_add_parameter(&url, "nd", 0);
12351229
if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
12361230
/* If from= and to= are present, display all nodes on a path connecting
12371231
** the two */
12381232
PathNode *p = 0;
12391233
const char *zFrom = 0;
@@ -1298,19 +1292,15 @@
12981292
}
12991293
if( d_rid==0 && useDividers ) timeline_add_dividers(0, p_rid);
13001294
}
13011295
blob_appendf(&desc, " of %z[%S]</a>",
13021296
href("%R/info/%s", zUuid), zUuid);
1303
- if( p_rid ){
1304
- url_add_parameter(&url, "p", zUuid);
1305
- }
13061297
if( d_rid ){
13071298
if( p_rid ){
13081299
/* If both p= and d= are set, we don't have the uuid of d yet. */
13091300
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid);
13101301
}
1311
- url_add_parameter(&url, "d", zUuid);
13121302
}
13131303
style_submenu_binary("v","With Files","Without Files");
13141304
style_submenu_entry("n","Lines",1);
13151305
timeline_y_submenu();
13161306
}else if( f_rid && g.perm.Read ){
@@ -1328,16 +1318,11 @@
13281318
if( useDividers ) timeline_add_dividers(0, f_rid);
13291319
blob_appendf(&desc, "Parents and children of check-in ");
13301320
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
13311321
blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%s", zUuid), zUuid);
13321322
tmFlags |= TIMELINE_DISJOINT;
1333
- url_add_parameter(&url, "f", zUuid);
1334
- if( tmFlags & TIMELINE_FCHANGES ){
1335
- timeline_submenu(&url, "Hide Files", "v", 0, 0);
1336
- }else{
1337
- timeline_submenu(&url, "Show Files", "v", "", 0);
1338
- }
1323
+ style_submenu_binary("v","With Files","Without Files");
13391324
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
13401325
timeline_submenu(&url, "Unhide", "unhide", "", 0);
13411326
}
13421327
}else{
13431328
/* Otherwise, a timeline based on a span of time */
@@ -1362,11 +1347,10 @@
13621347
blob_append_sql(&sql,
13631348
"AND (EXISTS(SELECT 1 FROM tagxref"
13641349
" WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
13651350
13661351
if( zBrName ){
1367
- url_add_parameter(&url, "r", zBrName);
13681352
/* The next two blob_appendf() calls add SQL that causes checkins that
13691353
** are not part of the branch which are parents or children of the
13701354
** branch to be included in the report. This related check-ins are
13711355
** useful in helping to visualize what has happened on a quiescent
13721356
** branch that is infrequently merged with a much more activate branch.
@@ -1394,15 +1378,11 @@
13941378
" AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
13951379
" WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
13961380
TAG_HIDDEN
13971381
);
13981382
}
1399
- }else{
1400
- url_add_parameter(&url, "mionly", "1");
14011383
}
1402
- }else{
1403
- url_add_parameter(&url, "t", zTagName);
14041384
}
14051385
blob_append_sql(&sql, ")");
14061386
}
14071387
if( (zType[0]=='w' && !g.perm.RdWiki)
14081388
|| (zType[0]=='t' && !g.perm.RdTkt)
@@ -1430,11 +1410,10 @@
14301410
}
14311411
blob_append_sql(&sql, ")");
14321412
}
14331413
}else{ /* zType!="all" */
14341414
blob_append_sql(&sql, " AND event.type=%Q", zType);
1435
- url_add_parameter(&url, "y", zType);
14361415
if( zType[0]=='c' ){
14371416
zEType = "checkin";
14381417
}else if( zType[0]=='w' ){
14391418
zEType = "wiki edit";
14401419
}else if( zType[0]=='t' ){
@@ -1452,41 +1431,35 @@
14521431
zCirca = zBefore = zAfter = 0;
14531432
nEntry = -1;
14541433
}
14551434
blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
14561435
zUser, zUser);
1457
- url_add_parameter(&url, "u", zUser);
14581436
zThisUser = zUser;
14591437
}
14601438
if( zSearch ){
14611439
blob_append_sql(&sql,
14621440
" AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
14631441
zSearch, zSearch);
1464
- url_add_parameter(&url, "s", zSearch);
14651442
}
14661443
rBefore = symbolic_name_to_mtime(zBefore);
14671444
rAfter = symbolic_name_to_mtime(zAfter);
14681445
rCirca = symbolic_name_to_mtime(zCirca);
14691446
if( rAfter>0.0 ){
14701447
if( rBefore>0.0 ){
14711448
blob_append_sql(&sql,
14721449
" AND event.mtime>=%.17g AND event.mtime<=%.17g"
14731450
" ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
1474
- url_add_parameter(&url, "a", zAfter);
1475
- url_add_parameter(&url, "b", zBefore);
14761451
nEntry = -1;
14771452
}else{
14781453
blob_append_sql(&sql,
14791454
" AND event.mtime>=%.17g ORDER BY event.mtime ASC",
14801455
rAfter-ONE_SECOND);
1481
- url_add_parameter(&url, "a", zAfter);
14821456
}
14831457
}else if( rBefore>0.0 ){
14841458
blob_append_sql(&sql,
14851459
" AND event.mtime<=%.17g ORDER BY event.mtime DESC",
14861460
rBefore+ONE_SECOND);
1487
- url_add_parameter(&url, "b", zBefore);
14881461
}else if( rCirca>0.0 ){
14891462
Blob sql2;
14901463
blob_init(&sql2, blob_sql_text(&sql), -1);
14911464
blob_append_sql(&sql2,
14921465
" AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
@@ -1498,11 +1471,10 @@
14981471
" AND event.mtime>=%f ORDER BY event.mtime ASC",
14991472
rCirca
15001473
);
15011474
nEntry -= (nEntry+1)/2;
15021475
if( useDividers ) timeline_add_dividers(rCirca, 0);
1503
- url_add_parameter(&url, "c", zCirca);
15041476
}else{
15051477
blob_append_sql(&sql, " ORDER BY event.mtime DESC");
15061478
}
15071479
if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
15081480
db_multi_exec("%s", blob_sql_text(&sql));
15091481
--- src/timeline.c
+++ src/timeline.c
@@ -48,11 +48,11 @@
48 ** Generate a hyperlink to a date & time.
49 */
50 void hyperlink_to_date(const char *zDate, const char *zSuffix){
51 if( zSuffix==0 ) zSuffix = "";
52 if( g.perm.Hyperlink ){
53 @ %z(href("%R/timeline?c=%T",zDate))%s(zDate)</a>%s(zSuffix)
54 }else{
55 @ %s(zDate)%s(zSuffix)
56 }
57 }
58
@@ -494,10 +494,11 @@
494 " (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm"
495 " FROM mlink"
496 " WHERE mid=:mid AND (pid!=fid OR pfnid>0)"
497 " AND (fid>0 OR"
498 " fnid NOT IN (SELECT pfnid FROM mlink WHERE mid=:mid))"
 
499 " ORDER BY 3 /*sort*/"
500 );
501 fchngQueryInit = 1;
502 }
503 db_bind_int(&fchngQuery, ":mid", rid);
@@ -1154,10 +1155,11 @@
1154 if( !g.perm.Read && !g.perm.RdTkt && !g.perm.RdWiki ){
1155 login_needed();
1156 return;
1157 }
1158 url_initialize(&url, "timeline");
 
1159 if( zTagName && g.perm.Read ){
1160 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'", zTagName);
1161 zThisTag = zTagName;
1162 }else if( zBrName && g.perm.Read ){
1163 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName);
@@ -1174,32 +1176,26 @@
1174 if( zType[0]=='a' ){
1175 tmFlags |= TIMELINE_BRIEF | TIMELINE_GRAPH;
1176 }else{
1177 tmFlags |= TIMELINE_GRAPH;
1178 }
1179 if( nEntry>0 ) url_add_parameter(&url, "n", mprintf("%d", nEntry));
1180 if( P("ng")!=0 || zSearch!=0 ){
1181 tmFlags &= ~TIMELINE_GRAPH;
1182 url_add_parameter(&url, "ng", 0);
1183 }
1184 if( P("brbg")!=0 ){
1185 tmFlags |= TIMELINE_BRCOLOR;
1186 url_add_parameter(&url, "brbg", 0);
1187 }
1188 if( P("unhide")!=0 ){
1189 tmFlags |= TIMELINE_UNHIDE;
1190 url_add_parameter(&url, "unhide", 0);
1191 }
1192 if( P("ubg")!=0 ){
1193 tmFlags |= TIMELINE_UCOLOR;
1194 url_add_parameter(&url, "ubg", 0);
1195 }
1196 if( zUses!=0 ){
1197 int ufid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUses);
1198 if( ufid ){
1199 zUses = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ufid);
1200 url_add_parameter(&url, "uf", zUses);
1201 db_multi_exec("CREATE TEMP TABLE usesfile(rid INTEGER PRIMARY KEY)");
1202 compute_uses_file("usesfile", ufid, 0);
1203 zType = "ci";
1204 }else{
1205 zUses = 0;
@@ -1220,20 +1216,18 @@
1220 blob_zero(&desc);
1221 blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1);
1222 blob_append(&sql, timeline_query_for_www(), -1);
1223 if( PB("fc") || PB("v") || PB("detail") ){
1224 tmFlags |= TIMELINE_FCHANGES;
1225 url_add_parameter(&url, "v", 0);
1226 }
1227 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1228 blob_append_sql(&sql,
1229 " AND NOT EXISTS(SELECT 1 FROM tagxref"
1230 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1231 TAG_HIDDEN
1232 );
1233 }
1234 if( !useDividers ) url_add_parameter(&url, "nd", 0);
1235 if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
1236 /* If from= and to= are present, display all nodes on a path connecting
1237 ** the two */
1238 PathNode *p = 0;
1239 const char *zFrom = 0;
@@ -1298,19 +1292,15 @@
1298 }
1299 if( d_rid==0 && useDividers ) timeline_add_dividers(0, p_rid);
1300 }
1301 blob_appendf(&desc, " of %z[%S]</a>",
1302 href("%R/info/%s", zUuid), zUuid);
1303 if( p_rid ){
1304 url_add_parameter(&url, "p", zUuid);
1305 }
1306 if( d_rid ){
1307 if( p_rid ){
1308 /* If both p= and d= are set, we don't have the uuid of d yet. */
1309 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid);
1310 }
1311 url_add_parameter(&url, "d", zUuid);
1312 }
1313 style_submenu_binary("v","With Files","Without Files");
1314 style_submenu_entry("n","Lines",1);
1315 timeline_y_submenu();
1316 }else if( f_rid && g.perm.Read ){
@@ -1328,16 +1318,11 @@
1328 if( useDividers ) timeline_add_dividers(0, f_rid);
1329 blob_appendf(&desc, "Parents and children of check-in ");
1330 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
1331 blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%s", zUuid), zUuid);
1332 tmFlags |= TIMELINE_DISJOINT;
1333 url_add_parameter(&url, "f", zUuid);
1334 if( tmFlags & TIMELINE_FCHANGES ){
1335 timeline_submenu(&url, "Hide Files", "v", 0, 0);
1336 }else{
1337 timeline_submenu(&url, "Show Files", "v", "", 0);
1338 }
1339 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1340 timeline_submenu(&url, "Unhide", "unhide", "", 0);
1341 }
1342 }else{
1343 /* Otherwise, a timeline based on a span of time */
@@ -1362,11 +1347,10 @@
1362 blob_append_sql(&sql,
1363 "AND (EXISTS(SELECT 1 FROM tagxref"
1364 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
1365
1366 if( zBrName ){
1367 url_add_parameter(&url, "r", zBrName);
1368 /* The next two blob_appendf() calls add SQL that causes checkins that
1369 ** are not part of the branch which are parents or children of the
1370 ** branch to be included in the report. This related check-ins are
1371 ** useful in helping to visualize what has happened on a quiescent
1372 ** branch that is infrequently merged with a much more activate branch.
@@ -1394,15 +1378,11 @@
1394 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1395 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1396 TAG_HIDDEN
1397 );
1398 }
1399 }else{
1400 url_add_parameter(&url, "mionly", "1");
1401 }
1402 }else{
1403 url_add_parameter(&url, "t", zTagName);
1404 }
1405 blob_append_sql(&sql, ")");
1406 }
1407 if( (zType[0]=='w' && !g.perm.RdWiki)
1408 || (zType[0]=='t' && !g.perm.RdTkt)
@@ -1430,11 +1410,10 @@
1430 }
1431 blob_append_sql(&sql, ")");
1432 }
1433 }else{ /* zType!="all" */
1434 blob_append_sql(&sql, " AND event.type=%Q", zType);
1435 url_add_parameter(&url, "y", zType);
1436 if( zType[0]=='c' ){
1437 zEType = "checkin";
1438 }else if( zType[0]=='w' ){
1439 zEType = "wiki edit";
1440 }else if( zType[0]=='t' ){
@@ -1452,41 +1431,35 @@
1452 zCirca = zBefore = zAfter = 0;
1453 nEntry = -1;
1454 }
1455 blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
1456 zUser, zUser);
1457 url_add_parameter(&url, "u", zUser);
1458 zThisUser = zUser;
1459 }
1460 if( zSearch ){
1461 blob_append_sql(&sql,
1462 " AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
1463 zSearch, zSearch);
1464 url_add_parameter(&url, "s", zSearch);
1465 }
1466 rBefore = symbolic_name_to_mtime(zBefore);
1467 rAfter = symbolic_name_to_mtime(zAfter);
1468 rCirca = symbolic_name_to_mtime(zCirca);
1469 if( rAfter>0.0 ){
1470 if( rBefore>0.0 ){
1471 blob_append_sql(&sql,
1472 " AND event.mtime>=%.17g AND event.mtime<=%.17g"
1473 " ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
1474 url_add_parameter(&url, "a", zAfter);
1475 url_add_parameter(&url, "b", zBefore);
1476 nEntry = -1;
1477 }else{
1478 blob_append_sql(&sql,
1479 " AND event.mtime>=%.17g ORDER BY event.mtime ASC",
1480 rAfter-ONE_SECOND);
1481 url_add_parameter(&url, "a", zAfter);
1482 }
1483 }else if( rBefore>0.0 ){
1484 blob_append_sql(&sql,
1485 " AND event.mtime<=%.17g ORDER BY event.mtime DESC",
1486 rBefore+ONE_SECOND);
1487 url_add_parameter(&url, "b", zBefore);
1488 }else if( rCirca>0.0 ){
1489 Blob sql2;
1490 blob_init(&sql2, blob_sql_text(&sql), -1);
1491 blob_append_sql(&sql2,
1492 " AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
@@ -1498,11 +1471,10 @@
1498 " AND event.mtime>=%f ORDER BY event.mtime ASC",
1499 rCirca
1500 );
1501 nEntry -= (nEntry+1)/2;
1502 if( useDividers ) timeline_add_dividers(rCirca, 0);
1503 url_add_parameter(&url, "c", zCirca);
1504 }else{
1505 blob_append_sql(&sql, " ORDER BY event.mtime DESC");
1506 }
1507 if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
1508 db_multi_exec("%s", blob_sql_text(&sql));
1509
--- src/timeline.c
+++ src/timeline.c
@@ -48,11 +48,11 @@
48 ** Generate a hyperlink to a date & time.
49 */
50 void hyperlink_to_date(const char *zDate, const char *zSuffix){
51 if( zSuffix==0 ) zSuffix = "";
52 if( g.perm.Hyperlink ){
53 @ %z(href("%R/timeline?n=11&c=%T",zDate))%s(zDate)</a>%s(zSuffix)
54 }else{
55 @ %s(zDate)%s(zSuffix)
56 }
57 }
58
@@ -494,10 +494,11 @@
494 " (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm"
495 " FROM mlink"
496 " WHERE mid=:mid AND (pid!=fid OR pfnid>0)"
497 " AND (fid>0 OR"
498 " fnid NOT IN (SELECT pfnid FROM mlink WHERE mid=:mid))"
499 " AND NOT mlink.isaux"
500 " ORDER BY 3 /*sort*/"
501 );
502 fchngQueryInit = 1;
503 }
504 db_bind_int(&fchngQuery, ":mid", rid);
@@ -1154,10 +1155,11 @@
1155 if( !g.perm.Read && !g.perm.RdTkt && !g.perm.RdWiki ){
1156 login_needed();
1157 return;
1158 }
1159 url_initialize(&url, "timeline");
1160 cgi_query_parameters_to_url(&url);
1161 if( zTagName && g.perm.Read ){
1162 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'", zTagName);
1163 zThisTag = zTagName;
1164 }else if( zBrName && g.perm.Read ){
1165 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName);
@@ -1174,32 +1176,26 @@
1176 if( zType[0]=='a' ){
1177 tmFlags |= TIMELINE_BRIEF | TIMELINE_GRAPH;
1178 }else{
1179 tmFlags |= TIMELINE_GRAPH;
1180 }
1181 if( PB("ng") || zSearch!=0 ){
 
1182 tmFlags &= ~TIMELINE_GRAPH;
 
1183 }
1184 if( PB("brbg") ){
1185 tmFlags |= TIMELINE_BRCOLOR;
 
1186 }
1187 if( PB("unhide") ){
1188 tmFlags |= TIMELINE_UNHIDE;
 
1189 }
1190 if( PB("ubg") ){
1191 tmFlags |= TIMELINE_UCOLOR;
 
1192 }
1193 if( zUses!=0 ){
1194 int ufid = db_int(0, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUses);
1195 if( ufid ){
1196 zUses = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ufid);
 
1197 db_multi_exec("CREATE TEMP TABLE usesfile(rid INTEGER PRIMARY KEY)");
1198 compute_uses_file("usesfile", ufid, 0);
1199 zType = "ci";
1200 }else{
1201 zUses = 0;
@@ -1220,20 +1216,18 @@
1216 blob_zero(&desc);
1217 blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1);
1218 blob_append(&sql, timeline_query_for_www(), -1);
1219 if( PB("fc") || PB("v") || PB("detail") ){
1220 tmFlags |= TIMELINE_FCHANGES;
 
1221 }
1222 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1223 blob_append_sql(&sql,
1224 " AND NOT EXISTS(SELECT 1 FROM tagxref"
1225 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)",
1226 TAG_HIDDEN
1227 );
1228 }
 
1229 if( ((from_rid && to_rid) || (me_rid && you_rid)) && g.perm.Read ){
1230 /* If from= and to= are present, display all nodes on a path connecting
1231 ** the two */
1232 PathNode *p = 0;
1233 const char *zFrom = 0;
@@ -1298,19 +1292,15 @@
1292 }
1293 if( d_rid==0 && useDividers ) timeline_add_dividers(0, p_rid);
1294 }
1295 blob_appendf(&desc, " of %z[%S]</a>",
1296 href("%R/info/%s", zUuid), zUuid);
 
 
 
1297 if( d_rid ){
1298 if( p_rid ){
1299 /* If both p= and d= are set, we don't have the uuid of d yet. */
1300 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid);
1301 }
 
1302 }
1303 style_submenu_binary("v","With Files","Without Files");
1304 style_submenu_entry("n","Lines",1);
1305 timeline_y_submenu();
1306 }else if( f_rid && g.perm.Read ){
@@ -1328,16 +1318,11 @@
1318 if( useDividers ) timeline_add_dividers(0, f_rid);
1319 blob_appendf(&desc, "Parents and children of check-in ");
1320 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
1321 blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%s", zUuid), zUuid);
1322 tmFlags |= TIMELINE_DISJOINT;
1323 style_submenu_binary("v","With Files","Without Files");
 
 
 
 
 
1324 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1325 timeline_submenu(&url, "Unhide", "unhide", "", 0);
1326 }
1327 }else{
1328 /* Otherwise, a timeline based on a span of time */
@@ -1362,11 +1347,10 @@
1347 blob_append_sql(&sql,
1348 "AND (EXISTS(SELECT 1 FROM tagxref"
1349 " WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
1350
1351 if( zBrName ){
 
1352 /* The next two blob_appendf() calls add SQL that causes checkins that
1353 ** are not part of the branch which are parents or children of the
1354 ** branch to be included in the report. This related check-ins are
1355 ** useful in helping to visualize what has happened on a quiescent
1356 ** branch that is infrequently merged with a much more activate branch.
@@ -1394,15 +1378,11 @@
1378 " AND NOT EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid"
1379 " WHERE tagid=%d AND tagtype>0 AND cid=blob.rid)",
1380 TAG_HIDDEN
1381 );
1382 }
 
 
1383 }
 
 
1384 }
1385 blob_append_sql(&sql, ")");
1386 }
1387 if( (zType[0]=='w' && !g.perm.RdWiki)
1388 || (zType[0]=='t' && !g.perm.RdTkt)
@@ -1430,11 +1410,10 @@
1410 }
1411 blob_append_sql(&sql, ")");
1412 }
1413 }else{ /* zType!="all" */
1414 blob_append_sql(&sql, " AND event.type=%Q", zType);
 
1415 if( zType[0]=='c' ){
1416 zEType = "checkin";
1417 }else if( zType[0]=='w' ){
1418 zEType = "wiki edit";
1419 }else if( zType[0]=='t' ){
@@ -1452,41 +1431,35 @@
1431 zCirca = zBefore = zAfter = 0;
1432 nEntry = -1;
1433 }
1434 blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
1435 zUser, zUser);
 
1436 zThisUser = zUser;
1437 }
1438 if( zSearch ){
1439 blob_append_sql(&sql,
1440 " AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
1441 zSearch, zSearch);
 
1442 }
1443 rBefore = symbolic_name_to_mtime(zBefore);
1444 rAfter = symbolic_name_to_mtime(zAfter);
1445 rCirca = symbolic_name_to_mtime(zCirca);
1446 if( rAfter>0.0 ){
1447 if( rBefore>0.0 ){
1448 blob_append_sql(&sql,
1449 " AND event.mtime>=%.17g AND event.mtime<=%.17g"
1450 " ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
 
 
1451 nEntry = -1;
1452 }else{
1453 blob_append_sql(&sql,
1454 " AND event.mtime>=%.17g ORDER BY event.mtime ASC",
1455 rAfter-ONE_SECOND);
 
1456 }
1457 }else if( rBefore>0.0 ){
1458 blob_append_sql(&sql,
1459 " AND event.mtime<=%.17g ORDER BY event.mtime DESC",
1460 rBefore+ONE_SECOND);
 
1461 }else if( rCirca>0.0 ){
1462 Blob sql2;
1463 blob_init(&sql2, blob_sql_text(&sql), -1);
1464 blob_append_sql(&sql2,
1465 " AND event.mtime<=%f ORDER BY event.mtime DESC LIMIT %d",
@@ -1498,11 +1471,10 @@
1471 " AND event.mtime>=%f ORDER BY event.mtime ASC",
1472 rCirca
1473 );
1474 nEntry -= (nEntry+1)/2;
1475 if( useDividers ) timeline_add_dividers(rCirca, 0);
 
1476 }else{
1477 blob_append_sql(&sql, " ORDER BY event.mtime DESC");
1478 }
1479 if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
1480 db_multi_exec("%s", blob_sql_text(&sql));
1481
+22 -8
--- src/url.c
+++ src/url.c
@@ -432,42 +432,56 @@
432432
** An instance of this object is used to build a URL with query parameters.
433433
*/
434434
struct HQuery {
435435
Blob url; /* The URL */
436436
const char *zBase; /* The base URL */
437
- int nParam; /* Number of parameters. Max 10 */
438
- const char *azName[15]; /* Parameter names */
439
- const char *azValue[15]; /* Parameter values */
437
+ int nParam; /* Number of parameters. */
438
+ int nAlloc; /* Number of allocated slots */
439
+ const char **azName; /* Parameter names */
440
+ const char **azValue; /* Parameter values */
440441
};
441442
#endif
442443
443444
/*
444445
** Initialize the URL object.
445446
*/
446447
void url_initialize(HQuery *p, const char *zBase){
448
+ memset(p, 0, sizeof(*p));
447449
blob_zero(&p->url);
448450
p->zBase = zBase;
449
- p->nParam = 0;
450451
}
451452
452453
/*
453454
** Resets the given URL object, deallocating any memory
454455
** it uses.
455456
*/
456457
void url_reset(HQuery *p){
457458
blob_reset(&p->url);
459
+ fossil_free(p->azName);
460
+ fossil_free(p->azValue);
458461
url_initialize(p, p->zBase);
459462
}
460463
461464
/*
462465
** Add a fixed parameter to an HQuery.
463466
*/
464467
void url_add_parameter(HQuery *p, const char *zName, const char *zValue){
465
- assert( p->nParam < count(p->azName) );
466
- assert( p->nParam < count(p->azValue) );
467
- p->azName[p->nParam] = zName;
468
- p->azValue[p->nParam] = zValue;
468
+ int i;
469
+ for(i=0; i<p->nParam; i++){
470
+ if( fossil_strcmp(p->azName[i],zName)==0 ){
471
+ p->azValue[i] = zValue;
472
+ return;
473
+ }
474
+ }
475
+ assert( i==p->nParam );
476
+ if( i>=p->nAlloc ){
477
+ p->nAlloc = p->nAlloc*2 + 10;
478
+ p->azName = fossil_realloc(p->azName, sizeof(p->azName[0])*p->nAlloc);
479
+ p->azValue = fossil_realloc(p->azValue, sizeof(p->azValue[0])*p->nAlloc);
480
+ }
481
+ p->azName[i] = zName;
482
+ p->azValue[i] = zValue;
469483
p->nParam++;
470484
}
471485
472486
/*
473487
** Render the URL with a parameter override.
474488
--- src/url.c
+++ src/url.c
@@ -432,42 +432,56 @@
432 ** An instance of this object is used to build a URL with query parameters.
433 */
434 struct HQuery {
435 Blob url; /* The URL */
436 const char *zBase; /* The base URL */
437 int nParam; /* Number of parameters. Max 10 */
438 const char *azName[15]; /* Parameter names */
439 const char *azValue[15]; /* Parameter values */
 
440 };
441 #endif
442
443 /*
444 ** Initialize the URL object.
445 */
446 void url_initialize(HQuery *p, const char *zBase){
 
447 blob_zero(&p->url);
448 p->zBase = zBase;
449 p->nParam = 0;
450 }
451
452 /*
453 ** Resets the given URL object, deallocating any memory
454 ** it uses.
455 */
456 void url_reset(HQuery *p){
457 blob_reset(&p->url);
 
 
458 url_initialize(p, p->zBase);
459 }
460
461 /*
462 ** Add a fixed parameter to an HQuery.
463 */
464 void url_add_parameter(HQuery *p, const char *zName, const char *zValue){
465 assert( p->nParam < count(p->azName) );
466 assert( p->nParam < count(p->azValue) );
467 p->azName[p->nParam] = zName;
468 p->azValue[p->nParam] = zValue;
 
 
 
 
 
 
 
 
 
 
 
469 p->nParam++;
470 }
471
472 /*
473 ** Render the URL with a parameter override.
474
--- src/url.c
+++ src/url.c
@@ -432,42 +432,56 @@
432 ** An instance of this object is used to build a URL with query parameters.
433 */
434 struct HQuery {
435 Blob url; /* The URL */
436 const char *zBase; /* The base URL */
437 int nParam; /* Number of parameters. */
438 int nAlloc; /* Number of allocated slots */
439 const char **azName; /* Parameter names */
440 const char **azValue; /* Parameter values */
441 };
442 #endif
443
444 /*
445 ** Initialize the URL object.
446 */
447 void url_initialize(HQuery *p, const char *zBase){
448 memset(p, 0, sizeof(*p));
449 blob_zero(&p->url);
450 p->zBase = zBase;
 
451 }
452
453 /*
454 ** Resets the given URL object, deallocating any memory
455 ** it uses.
456 */
457 void url_reset(HQuery *p){
458 blob_reset(&p->url);
459 fossil_free(p->azName);
460 fossil_free(p->azValue);
461 url_initialize(p, p->zBase);
462 }
463
464 /*
465 ** Add a fixed parameter to an HQuery.
466 */
467 void url_add_parameter(HQuery *p, const char *zName, const char *zValue){
468 int i;
469 for(i=0; i<p->nParam; i++){
470 if( fossil_strcmp(p->azName[i],zName)==0 ){
471 p->azValue[i] = zValue;
472 return;
473 }
474 }
475 assert( i==p->nParam );
476 if( i>=p->nAlloc ){
477 p->nAlloc = p->nAlloc*2 + 10;
478 p->azName = fossil_realloc(p->azName, sizeof(p->azName[0])*p->nAlloc);
479 p->azValue = fossil_realloc(p->azValue, sizeof(p->azValue[0])*p->nAlloc);
480 }
481 p->azName[i] = zName;
482 p->azValue[i] = zValue;
483 p->nParam++;
484 }
485
486 /*
487 ** Render the URL with a parameter override.
488
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -1252,11 +1252,11 @@
12521252
blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget));
12531253
zTerm = "]</a>";
12541254
}
12551255
}else if( strlen(zTarget)>=10 && fossil_isdigit(zTarget[0]) && zTarget[4]=='-'
12561256
&& db_int(0, "SELECT datetime(%Q) NOT NULL", zTarget) ){
1257
- blob_appendf(p->pOut, "<a href=\"%R/timeline?c=%T\">", zTarget);
1257
+ blob_appendf(p->pOut, "<a href=\"%R/timeline?n=11&c=%T\">", zTarget);
12581258
}else if( (z = validWikiPageName(p, zTarget))!=0 ){
12591259
blob_appendf(p->pOut, "<a href=\"%R/wiki?name=%T\">", z);
12601260
}else if( zTarget>=&zOrig[2] && !fossil_isspace(zTarget[-2]) ){
12611261
/* Probably an array subscript in code */
12621262
zTerm = "";
12631263
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -1252,11 +1252,11 @@
1252 blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget));
1253 zTerm = "]</a>";
1254 }
1255 }else if( strlen(zTarget)>=10 && fossil_isdigit(zTarget[0]) && zTarget[4]=='-'
1256 && db_int(0, "SELECT datetime(%Q) NOT NULL", zTarget) ){
1257 blob_appendf(p->pOut, "<a href=\"%R/timeline?c=%T\">", zTarget);
1258 }else if( (z = validWikiPageName(p, zTarget))!=0 ){
1259 blob_appendf(p->pOut, "<a href=\"%R/wiki?name=%T\">", z);
1260 }else if( zTarget>=&zOrig[2] && !fossil_isspace(zTarget[-2]) ){
1261 /* Probably an array subscript in code */
1262 zTerm = "";
1263
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -1252,11 +1252,11 @@
1252 blob_appendf(p->pOut, "%z[",href("%R/info/%s", zTarget));
1253 zTerm = "]</a>";
1254 }
1255 }else if( strlen(zTarget)>=10 && fossil_isdigit(zTarget[0]) && zTarget[4]=='-'
1256 && db_int(0, "SELECT datetime(%Q) NOT NULL", zTarget) ){
1257 blob_appendf(p->pOut, "<a href=\"%R/timeline?n=11&c=%T\">", zTarget);
1258 }else if( (z = validWikiPageName(p, zTarget))!=0 ){
1259 blob_appendf(p->pOut, "<a href=\"%R/wiki?name=%T\">", z);
1260 }else if( zTarget>=&zOrig[2] && !fossil_isspace(zTarget[-2]) ){
1261 /* Probably an array subscript in code */
1262 zTerm = "";
1263

Keyboard Shortcuts

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