Fossil SCM
Honor the chng= query parameter to /timeline on queries that use p=, d=, from=, and similar.
Commit
365a1ecc28b86e07e5a1bd4b7b80bf96735dadda412ad3e9ab14f7a34ca45da1
Parent
8a28e91555a85b8…
1 file changed
+35
-5
+35
-5
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -1273,11 +1273,11 @@ | ||
| 1273 | 1273 | */ |
| 1274 | 1274 | static void addFileGlobExclusion( |
| 1275 | 1275 | const char *zChng, /* The filename GLOB list */ |
| 1276 | 1276 | Blob *pSql /* The SELECT statement under construction */ |
| 1277 | 1277 | ){ |
| 1278 | - if( zChng==0 || zChng[0]==0 ) return; | |
| 1278 | + if( zChng==0 ) return; | |
| 1279 | 1279 | blob_append_sql(pSql," AND event.objid IN (" |
| 1280 | 1280 | "SELECT mlink.mid FROM mlink, filename\n" |
| 1281 | 1281 | " WHERE mlink.fnid=filename.fnid\n" |
| 1282 | 1282 | " AND %s)", |
| 1283 | 1283 | glob_expr("filename.name", mprintf("\"%s\"", zChng))); |
| @@ -1284,14 +1284,33 @@ | ||
| 1284 | 1284 | } |
| 1285 | 1285 | static void addFileGlobDescription( |
| 1286 | 1286 | const char *zChng, /* The filename GLOB list */ |
| 1287 | 1287 | Blob *pDescription /* Result description */ |
| 1288 | 1288 | ){ |
| 1289 | - if( zChng==0 || zChng[0]==0 ) return; | |
| 1289 | + if( zChng==0 ) return; | |
| 1290 | 1290 | blob_appendf(pDescription, " that include changes to files matching '%h'", |
| 1291 | 1291 | zChng); |
| 1292 | 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 | +} | |
| 1293 | 1312 | |
| 1294 | 1313 | /* |
| 1295 | 1314 | ** Similar to fossil_expand_datetime() |
| 1296 | 1315 | ** |
| 1297 | 1316 | ** Add missing "-" characters into a date/time. Examples: |
| @@ -1777,10 +1796,11 @@ | ||
| 1777 | 1796 | nEntry = 0; |
| 1778 | 1797 | useDividers = 0; |
| 1779 | 1798 | cgi_replace_query_parameter("d",fossil_strdup(z)); |
| 1780 | 1799 | zDPNameD = zDPNameP = z; |
| 1781 | 1800 | } |
| 1801 | + if( zChng && zChng[0]==0 ) zChng = 0; | |
| 1782 | 1802 | |
| 1783 | 1803 | /* Undocumented query parameter to set JS mode */ |
| 1784 | 1804 | builtin_set_js_delivery_mode(P("jsmode"),1); |
| 1785 | 1805 | |
| 1786 | 1806 | secondaryRid = name_to_typed_rid(P("sel2"),"ci"); |
| @@ -2175,11 +2195,11 @@ | ||
| 2175 | 2195 | } |
| 2176 | 2196 | db_multi_exec("INSERT OR IGNORE INTO pathnode SELECT x FROM related"); |
| 2177 | 2197 | } |
| 2178 | 2198 | add_extra_rids("pathnode",P("x")); |
| 2179 | 2199 | blob_append_sql(&sql, " AND event.objid IN pathnode"); |
| 2180 | - if( zChng && zChng[0] ){ | |
| 2200 | + if( zChng ){ | |
| 2181 | 2201 | db_multi_exec( |
| 2182 | 2202 | "DELETE FROM pathnode\n" |
| 2183 | 2203 | " WHERE NOT EXISTS(SELECT 1 FROM mlink, filename\n" |
| 2184 | 2204 | " WHERE mlink.mid=x\n" |
| 2185 | 2205 | " AND mlink.fnid=filename.fnid\n" |
| @@ -2299,14 +2319,16 @@ | ||
| 2299 | 2319 | db_multi_exec( |
| 2300 | 2320 | "INSERT INTO ok_d SELECT rid FROM ok;" |
| 2301 | 2321 | "DELETE FROM ok;" |
| 2302 | 2322 | ); |
| 2303 | 2323 | }else{ |
| 2324 | + removeFileGlobFromOk(zChng); | |
| 2304 | 2325 | nd = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2305 | 2326 | if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql)); |
| 2306 | 2327 | 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"); | |
| 2308 | 2330 | } |
| 2309 | 2331 | if( useDividers && !selectedRid ) selectedRid = d_rid; |
| 2310 | 2332 | db_multi_exec("DELETE FROM ok"); |
| 2311 | 2333 | } |
| 2312 | 2334 | } |
| @@ -2335,21 +2357,25 @@ | ||
| 2335 | 2357 | db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo); |
| 2336 | 2358 | bBackAdded = 1; |
| 2337 | 2359 | } |
| 2338 | 2360 | if( bSeparateDandP ){ |
| 2339 | 2361 | db_multi_exec("DELETE FROM ok WHERE rid NOT IN ok_d;"); |
| 2362 | + removeFileGlobFromOk(zChng); | |
| 2340 | 2363 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2341 | 2364 | }else{ |
| 2365 | + removeFileGlobFromOk(zChng); | |
| 2342 | 2366 | np = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2343 | 2367 | if( np>0 || nd==0 ){ |
| 2344 | 2368 | 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"); | |
| 2346 | 2371 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2347 | 2372 | } |
| 2348 | 2373 | if( useDividers && !selectedRid ) selectedRid = p_rid; |
| 2349 | 2374 | } |
| 2350 | 2375 | } |
| 2376 | + | |
| 2351 | 2377 | if( bSeparateDandP ){ |
| 2352 | 2378 | int n = db_int(0, "SELECT count(*) FROM ok"); |
| 2353 | 2379 | blob_reset(&desc); |
| 2354 | 2380 | blob_appendf(&desc, |
| 2355 | 2381 | "%d check-ins that are derived from %z%h</a>" |
| @@ -2392,10 +2418,14 @@ | ||
| 2392 | 2418 | blob_appendf(&desc, " up to %z%h</a>%s", |
| 2393 | 2419 | href("%R/info?name=%h",zFwdTo), zFwdTo, |
| 2394 | 2420 | bFwdAdded ? " (not a direct descendant)":""); |
| 2395 | 2421 | } |
| 2396 | 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 | + } | |
| 2397 | 2427 | if( advancedMenu ){ |
| 2398 | 2428 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 2399 | 2429 | } |
| 2400 | 2430 | style_submenu_entry("n","Max:",4,0); |
| 2401 | 2431 | timeline_y_submenu(1); |
| 2402 | 2432 |
| --- 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 |