Fossil SCM

Honor the chng= query parameter to /timeline on queries that use p=, d=, from=, and similar.

drh 2025-05-18 17:38 trunk
Commit 365a1ecc28b86e07e5a1bd4b7b80bf96735dadda412ad3e9ab14f7a34ca45da1
1 file changed +35 -5
+35 -5
--- src/timeline.c
+++ src/timeline.c
@@ -1273,11 +1273,11 @@
12731273
*/
12741274
static void addFileGlobExclusion(
12751275
const char *zChng, /* The filename GLOB list */
12761276
Blob *pSql /* The SELECT statement under construction */
12771277
){
1278
- if( zChng==0 || zChng[0]==0 ) return;
1278
+ if( zChng==0 ) return;
12791279
blob_append_sql(pSql," AND event.objid IN ("
12801280
"SELECT mlink.mid FROM mlink, filename\n"
12811281
" WHERE mlink.fnid=filename.fnid\n"
12821282
" AND %s)",
12831283
glob_expr("filename.name", mprintf("\"%s\"", zChng)));
@@ -1284,14 +1284,33 @@
12841284
}
12851285
static void addFileGlobDescription(
12861286
const char *zChng, /* The filename GLOB list */
12871287
Blob *pDescription /* Result description */
12881288
){
1289
- if( zChng==0 || zChng[0]==0 ) return;
1289
+ if( zChng==0 ) return;
12901290
blob_appendf(pDescription, " that include changes to files matching '%h'",
12911291
zChng);
12921292
}
1293
+
1294
+/*
1295
+** If zChng is not NULL, then use it as a comma-separated list of
1296
+** glob patterns for filenames, and remove from the "ok" table any
1297
+** check-ins that do not modify one or more of the files identified
1298
+** by zChng.
1299
+*/
1300
+static void removeFileGlobFromOk(
1301
+ const char *zChng /* The filename GLOB list */
1302
+){
1303
+ if( zChng==0 ) return;
1304
+ db_multi_exec(
1305
+ "DELETE FROM ok WHERE rid NOT IN (\n"
1306
+ " SELECT mlink.mid FROM mlink, filename\n"
1307
+ " WHERE mlink.fnid=filename.fnid\n"
1308
+ " AND %z);\n",
1309
+ glob_expr("filename.name", zChng)
1310
+ );
1311
+}
12931312
12941313
/*
12951314
** Similar to fossil_expand_datetime()
12961315
**
12971316
** Add missing "-" characters into a date/time. Examples:
@@ -1777,10 +1796,11 @@
17771796
nEntry = 0;
17781797
useDividers = 0;
17791798
cgi_replace_query_parameter("d",fossil_strdup(z));
17801799
zDPNameD = zDPNameP = z;
17811800
}
1801
+ if( zChng && zChng[0]==0 ) zChng = 0;
17821802
17831803
/* Undocumented query parameter to set JS mode */
17841804
builtin_set_js_delivery_mode(P("jsmode"),1);
17851805
17861806
secondaryRid = name_to_typed_rid(P("sel2"),"ci");
@@ -2175,11 +2195,11 @@
21752195
}
21762196
db_multi_exec("INSERT OR IGNORE INTO pathnode SELECT x FROM related");
21772197
}
21782198
add_extra_rids("pathnode",P("x"));
21792199
blob_append_sql(&sql, " AND event.objid IN pathnode");
2180
- if( zChng && zChng[0] ){
2200
+ if( zChng ){
21812201
db_multi_exec(
21822202
"DELETE FROM pathnode\n"
21832203
" WHERE NOT EXISTS(SELECT 1 FROM mlink, filename\n"
21842204
" WHERE mlink.mid=x\n"
21852205
" AND mlink.fnid=filename.fnid\n"
@@ -2299,14 +2319,16 @@
22992319
db_multi_exec(
23002320
"INSERT INTO ok_d SELECT rid FROM ok;"
23012321
"DELETE FROM ok;"
23022322
);
23032323
}else{
2324
+ removeFileGlobFromOk(zChng);
23042325
nd = db_int(0, "SELECT count(*)-1 FROM ok");
23052326
if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
23062327
if( nd>0 || p_rid==0 ){
2307
- blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
2328
+ blob_appendf(&desc, "%d descendant%s",
2329
+ nd>=0 ? nd : 0,(1==nd)?"":"s");
23082330
}
23092331
if( useDividers && !selectedRid ) selectedRid = d_rid;
23102332
db_multi_exec("DELETE FROM ok");
23112333
}
23122334
}
@@ -2335,21 +2357,25 @@
23352357
db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo);
23362358
bBackAdded = 1;
23372359
}
23382360
if( bSeparateDandP ){
23392361
db_multi_exec("DELETE FROM ok WHERE rid NOT IN ok_d;");
2362
+ removeFileGlobFromOk(zChng);
23402363
db_multi_exec("%s", blob_sql_text(&sql));
23412364
}else{
2365
+ removeFileGlobFromOk(zChng);
23422366
np = db_int(0, "SELECT count(*)-1 FROM ok");
23432367
if( np>0 || nd==0 ){
23442368
if( nd>0 ) blob_appendf(&desc, " and ");
2345
- blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s");
2369
+ blob_appendf(&desc, "%d ancestor%s",
2370
+ np>=0 ? np : 0, (1==np)?"":"s");
23462371
db_multi_exec("%s", blob_sql_text(&sql));
23472372
}
23482373
if( useDividers && !selectedRid ) selectedRid = p_rid;
23492374
}
23502375
}
2376
+
23512377
if( bSeparateDandP ){
23522378
int n = db_int(0, "SELECT count(*) FROM ok");
23532379
blob_reset(&desc);
23542380
blob_appendf(&desc,
23552381
"%d check-ins that are derived from %z%h</a>"
@@ -2392,10 +2418,14 @@
23922418
blob_appendf(&desc, " up to %z%h</a>%s",
23932419
href("%R/info?name=%h",zFwdTo), zFwdTo,
23942420
bFwdAdded ? " (not a direct descendant)":"");
23952421
}
23962422
}
2423
+ if( zChng ){
2424
+ if( strstr(blob_str(&desc)," that ") ) blob_appendf(&desc, " and");
2425
+ blob_appendf(&desc, " that make changes to files matching \"%h\"", zChng);
2426
+ }
23972427
if( advancedMenu ){
23982428
style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0);
23992429
}
24002430
style_submenu_entry("n","Max:",4,0);
24012431
timeline_y_submenu(1);
24022432
--- src/timeline.c
+++ src/timeline.c
@@ -1273,11 +1273,11 @@
1273 */
1274 static void addFileGlobExclusion(
1275 const char *zChng, /* The filename GLOB list */
1276 Blob *pSql /* The SELECT statement under construction */
1277 ){
1278 if( zChng==0 || zChng[0]==0 ) return;
1279 blob_append_sql(pSql," AND event.objid IN ("
1280 "SELECT mlink.mid FROM mlink, filename\n"
1281 " WHERE mlink.fnid=filename.fnid\n"
1282 " AND %s)",
1283 glob_expr("filename.name", mprintf("\"%s\"", zChng)));
@@ -1284,14 +1284,33 @@
1284 }
1285 static void addFileGlobDescription(
1286 const char *zChng, /* The filename GLOB list */
1287 Blob *pDescription /* Result description */
1288 ){
1289 if( zChng==0 || zChng[0]==0 ) return;
1290 blob_appendf(pDescription, " that include changes to files matching '%h'",
1291 zChng);
1292 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1293
1294 /*
1295 ** Similar to fossil_expand_datetime()
1296 **
1297 ** Add missing "-" characters into a date/time. Examples:
@@ -1777,10 +1796,11 @@
1777 nEntry = 0;
1778 useDividers = 0;
1779 cgi_replace_query_parameter("d",fossil_strdup(z));
1780 zDPNameD = zDPNameP = z;
1781 }
 
1782
1783 /* Undocumented query parameter to set JS mode */
1784 builtin_set_js_delivery_mode(P("jsmode"),1);
1785
1786 secondaryRid = name_to_typed_rid(P("sel2"),"ci");
@@ -2175,11 +2195,11 @@
2175 }
2176 db_multi_exec("INSERT OR IGNORE INTO pathnode SELECT x FROM related");
2177 }
2178 add_extra_rids("pathnode",P("x"));
2179 blob_append_sql(&sql, " AND event.objid IN pathnode");
2180 if( zChng && zChng[0] ){
2181 db_multi_exec(
2182 "DELETE FROM pathnode\n"
2183 " WHERE NOT EXISTS(SELECT 1 FROM mlink, filename\n"
2184 " WHERE mlink.mid=x\n"
2185 " AND mlink.fnid=filename.fnid\n"
@@ -2299,14 +2319,16 @@
2299 db_multi_exec(
2300 "INSERT INTO ok_d SELECT rid FROM ok;"
2301 "DELETE FROM ok;"
2302 );
2303 }else{
 
2304 nd = db_int(0, "SELECT count(*)-1 FROM ok");
2305 if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
2306 if( nd>0 || p_rid==0 ){
2307 blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
 
2308 }
2309 if( useDividers && !selectedRid ) selectedRid = d_rid;
2310 db_multi_exec("DELETE FROM ok");
2311 }
2312 }
@@ -2335,21 +2357,25 @@
2335 db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo);
2336 bBackAdded = 1;
2337 }
2338 if( bSeparateDandP ){
2339 db_multi_exec("DELETE FROM ok WHERE rid NOT IN ok_d;");
 
2340 db_multi_exec("%s", blob_sql_text(&sql));
2341 }else{
 
2342 np = db_int(0, "SELECT count(*)-1 FROM ok");
2343 if( np>0 || nd==0 ){
2344 if( nd>0 ) blob_appendf(&desc, " and ");
2345 blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s");
 
2346 db_multi_exec("%s", blob_sql_text(&sql));
2347 }
2348 if( useDividers && !selectedRid ) selectedRid = p_rid;
2349 }
2350 }
 
2351 if( bSeparateDandP ){
2352 int n = db_int(0, "SELECT count(*) FROM ok");
2353 blob_reset(&desc);
2354 blob_appendf(&desc,
2355 "%d check-ins that are derived from %z%h</a>"
@@ -2392,10 +2418,14 @@
2392 blob_appendf(&desc, " up to %z%h</a>%s",
2393 href("%R/info?name=%h",zFwdTo), zFwdTo,
2394 bFwdAdded ? " (not a direct descendant)":"");
2395 }
2396 }
 
 
 
 
2397 if( advancedMenu ){
2398 style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0);
2399 }
2400 style_submenu_entry("n","Max:",4,0);
2401 timeline_y_submenu(1);
2402
--- src/timeline.c
+++ src/timeline.c
@@ -1273,11 +1273,11 @@
1273 */
1274 static void addFileGlobExclusion(
1275 const char *zChng, /* The filename GLOB list */
1276 Blob *pSql /* The SELECT statement under construction */
1277 ){
1278 if( zChng==0 ) return;
1279 blob_append_sql(pSql," AND event.objid IN ("
1280 "SELECT mlink.mid FROM mlink, filename\n"
1281 " WHERE mlink.fnid=filename.fnid\n"
1282 " AND %s)",
1283 glob_expr("filename.name", mprintf("\"%s\"", zChng)));
@@ -1284,14 +1284,33 @@
1284 }
1285 static void addFileGlobDescription(
1286 const char *zChng, /* The filename GLOB list */
1287 Blob *pDescription /* Result description */
1288 ){
1289 if( zChng==0 ) return;
1290 blob_appendf(pDescription, " that include changes to files matching '%h'",
1291 zChng);
1292 }
1293
1294 /*
1295 ** If zChng is not NULL, then use it as a comma-separated list of
1296 ** glob patterns for filenames, and remove from the "ok" table any
1297 ** check-ins that do not modify one or more of the files identified
1298 ** by zChng.
1299 */
1300 static void removeFileGlobFromOk(
1301 const char *zChng /* The filename GLOB list */
1302 ){
1303 if( zChng==0 ) return;
1304 db_multi_exec(
1305 "DELETE FROM ok WHERE rid NOT IN (\n"
1306 " SELECT mlink.mid FROM mlink, filename\n"
1307 " WHERE mlink.fnid=filename.fnid\n"
1308 " AND %z);\n",
1309 glob_expr("filename.name", zChng)
1310 );
1311 }
1312
1313 /*
1314 ** Similar to fossil_expand_datetime()
1315 **
1316 ** Add missing "-" characters into a date/time. Examples:
@@ -1777,10 +1796,11 @@
1796 nEntry = 0;
1797 useDividers = 0;
1798 cgi_replace_query_parameter("d",fossil_strdup(z));
1799 zDPNameD = zDPNameP = z;
1800 }
1801 if( zChng && zChng[0]==0 ) zChng = 0;
1802
1803 /* Undocumented query parameter to set JS mode */
1804 builtin_set_js_delivery_mode(P("jsmode"),1);
1805
1806 secondaryRid = name_to_typed_rid(P("sel2"),"ci");
@@ -2175,11 +2195,11 @@
2195 }
2196 db_multi_exec("INSERT OR IGNORE INTO pathnode SELECT x FROM related");
2197 }
2198 add_extra_rids("pathnode",P("x"));
2199 blob_append_sql(&sql, " AND event.objid IN pathnode");
2200 if( zChng ){
2201 db_multi_exec(
2202 "DELETE FROM pathnode\n"
2203 " WHERE NOT EXISTS(SELECT 1 FROM mlink, filename\n"
2204 " WHERE mlink.mid=x\n"
2205 " AND mlink.fnid=filename.fnid\n"
@@ -2299,14 +2319,16 @@
2319 db_multi_exec(
2320 "INSERT INTO ok_d SELECT rid FROM ok;"
2321 "DELETE FROM ok;"
2322 );
2323 }else{
2324 removeFileGlobFromOk(zChng);
2325 nd = db_int(0, "SELECT count(*)-1 FROM ok");
2326 if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
2327 if( nd>0 || p_rid==0 ){
2328 blob_appendf(&desc, "%d descendant%s",
2329 nd>=0 ? nd : 0,(1==nd)?"":"s");
2330 }
2331 if( useDividers && !selectedRid ) selectedRid = d_rid;
2332 db_multi_exec("DELETE FROM ok");
2333 }
2334 }
@@ -2335,21 +2357,25 @@
2357 db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo);
2358 bBackAdded = 1;
2359 }
2360 if( bSeparateDandP ){
2361 db_multi_exec("DELETE FROM ok WHERE rid NOT IN ok_d;");
2362 removeFileGlobFromOk(zChng);
2363 db_multi_exec("%s", blob_sql_text(&sql));
2364 }else{
2365 removeFileGlobFromOk(zChng);
2366 np = db_int(0, "SELECT count(*)-1 FROM ok");
2367 if( np>0 || nd==0 ){
2368 if( nd>0 ) blob_appendf(&desc, " and ");
2369 blob_appendf(&desc, "%d ancestor%s",
2370 np>=0 ? np : 0, (1==np)?"":"s");
2371 db_multi_exec("%s", blob_sql_text(&sql));
2372 }
2373 if( useDividers && !selectedRid ) selectedRid = p_rid;
2374 }
2375 }
2376
2377 if( bSeparateDandP ){
2378 int n = db_int(0, "SELECT count(*) FROM ok");
2379 blob_reset(&desc);
2380 blob_appendf(&desc,
2381 "%d check-ins that are derived from %z%h</a>"
@@ -2392,10 +2418,14 @@
2418 blob_appendf(&desc, " up to %z%h</a>%s",
2419 href("%R/info?name=%h",zFwdTo), zFwdTo,
2420 bFwdAdded ? " (not a direct descendant)":"");
2421 }
2422 }
2423 if( zChng ){
2424 if( strstr(blob_str(&desc)," that ") ) blob_appendf(&desc, " and");
2425 blob_appendf(&desc, " that make changes to files matching \"%h\"", zChng);
2426 }
2427 if( advancedMenu ){
2428 style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0);
2429 }
2430 style_submenu_entry("n","Max:",4,0);
2431 timeline_y_submenu(1);
2432

Keyboard Shortcuts

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