Fossil SCM

In the /timeline with p=/bt= or d=/ft=, show the termination check-in even if it is not a ancestor or descendent of the starting point.

drh 2025-03-10 12:36 trunk
Commit e2e57aa9735cbe6b6181d0e5630fdf23dd54b4e71421ede1e9aa8227923aea3c
1 file changed +21 -9
+21 -9
--- src/timeline.c
+++ src/timeline.c
@@ -2234,10 +2234,12 @@
22342234
int np = 0, nd;
22352235
const char *zBackTo = 0;
22362236
const char *zFwdTo = 0;
22372237
int ridBackTo = 0;
22382238
int ridFwdTo = 0;
2239
+ int bBackAdded = 0; /* True if the zBackTo node was added */
2240
+ int bFwdAdded = 0; /* True if the zBackTo node was added */
22392241
22402242
tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS;
22412243
if( p_rid && d_rid ){
22422244
if( p_rid!=d_rid ) p_rid = d_rid;
22432245
if( !haveParameterN ) nEntry = 10;
@@ -2279,10 +2281,14 @@
22792281
" ORDER BY 2\n"
22802282
")\n"
22812283
"INSERT OR IGNORE INTO ok SELECT rid FROM dx LIMIT %d",
22822284
d_rid, rStopTime<8e99 ? 17 : 2, rStopTime, nEntry<=0 ? -1 : nEntry+1
22832285
);
2286
+ if( ridFwdTo && !db_exists("SELECT 1 FROM ok WHERE rid=%d",ridFwdTo) ){
2287
+ db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridFwdTo);
2288
+ bFwdAdded = 1;
2289
+ }
22842290
nd = db_int(0, "SELECT count(*)-1 FROM ok");
22852291
if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
22862292
if( nd>0 || p_rid==0 ){
22872293
blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
22882294
}
@@ -2298,46 +2304,52 @@
22982304
ridBackTo = name_to_typed_rid(zBackTo,"ci");
22992305
}
23002306
if( ridBackTo && !haveParameterN ) nEntry = 0;
23012307
}
23022308
compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo);
2309
+ if( ridBackTo && !db_exists("SELECT 1 FROM ok WHERE rid=%d",ridBackTo) ){
2310
+ db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo);
2311
+ bBackAdded = 1;
2312
+ }
23032313
np = db_int(0, "SELECT count(*)-1 FROM ok");
23042314
if( np>0 || nd==0 ){
23052315
if( nd>0 ) blob_appendf(&desc, " and ");
23062316
blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s");
23072317
db_multi_exec("%s", blob_sql_text(&sql));
23082318
}
23092319
if( useDividers && !selectedRid ) selectedRid = p_rid;
23102320
}
2311
-
23122321
blob_appendf(&desc, " of %z%h</a>",
23132322
href("%R/info?name=%h", zCiName), zCiName);
23142323
if( ridBackTo ){
23152324
if( np==0 ){
23162325
blob_reset(&desc);
23172326
blob_appendf(&desc,
2318
- "Check-in %z%h</a> only (%z%h</a> is not an ancestor)",
2327
+ "Check-in %z%h</a> only (%z%h</a> does not precede it)",
23192328
href("%R/info?name=%h",zCiName), zCiName,
23202329
href("%R/info?name=%h",zBackTo), zBackTo);
23212330
}else{
2322
- blob_appendf(&desc, " back to %z%h</a>",
2323
- href("%R/info?name=%h",zBackTo), zBackTo);
2331
+ blob_appendf(&desc, " back to %z%h</a>%s",
2332
+ href("%R/info?name=%h",zBackTo), zBackTo,
2333
+ bBackAdded ? " (not a direct anscestor)" : "");
23242334
if( ridFwdTo && zFwdTo ){
2325
- blob_appendf(&desc, " and up to %z%h</a>",
2326
- href("%R/info?name=%h",zFwdTo), zFwdTo);
2335
+ blob_appendf(&desc, " and up to %z%h</a>%s",
2336
+ href("%R/info?name=%h",zFwdTo), zFwdTo,
2337
+ bFwdAdded ? " (not a direct descendent)" : "");
23272338
}
23282339
}
23292340
}else if( ridFwdTo ){
23302341
if( nd==0 ){
23312342
blob_reset(&desc);
23322343
blob_appendf(&desc,
2333
- "Check-in %z%h</a> only (%z%h</a> is not an descendant)",
2344
+ "Check-in %z%h</a> only (%z%h</a> does not follow it)",
23342345
href("%R/info?name=%h",zCiName), zCiName,
23352346
href("%R/info?name=%h",zFwdTo), zFwdTo);
23362347
}else{
2337
- blob_appendf(&desc, " up to %z%h</a>",
2338
- href("%R/info?name=%h",zFwdTo), zFwdTo);
2348
+ blob_appendf(&desc, " up to %z%h</a>%s",
2349
+ href("%R/info?name=%h",zFwdTo), zFwdTo,
2350
+ bFwdAdded ? " (not a direct descendent)":"");
23392351
}
23402352
}
23412353
if( d_rid ){
23422354
if( p_rid ){
23432355
/* If both p= and d= are set, we don't have the uuid of d yet. */
23442356
--- src/timeline.c
+++ src/timeline.c
@@ -2234,10 +2234,12 @@
2234 int np = 0, nd;
2235 const char *zBackTo = 0;
2236 const char *zFwdTo = 0;
2237 int ridBackTo = 0;
2238 int ridFwdTo = 0;
 
 
2239
2240 tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS;
2241 if( p_rid && d_rid ){
2242 if( p_rid!=d_rid ) p_rid = d_rid;
2243 if( !haveParameterN ) nEntry = 10;
@@ -2279,10 +2281,14 @@
2279 " ORDER BY 2\n"
2280 ")\n"
2281 "INSERT OR IGNORE INTO ok SELECT rid FROM dx LIMIT %d",
2282 d_rid, rStopTime<8e99 ? 17 : 2, rStopTime, nEntry<=0 ? -1 : nEntry+1
2283 );
 
 
 
 
2284 nd = db_int(0, "SELECT count(*)-1 FROM ok");
2285 if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
2286 if( nd>0 || p_rid==0 ){
2287 blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
2288 }
@@ -2298,46 +2304,52 @@
2298 ridBackTo = name_to_typed_rid(zBackTo,"ci");
2299 }
2300 if( ridBackTo && !haveParameterN ) nEntry = 0;
2301 }
2302 compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo);
 
 
 
 
2303 np = db_int(0, "SELECT count(*)-1 FROM ok");
2304 if( np>0 || nd==0 ){
2305 if( nd>0 ) blob_appendf(&desc, " and ");
2306 blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s");
2307 db_multi_exec("%s", blob_sql_text(&sql));
2308 }
2309 if( useDividers && !selectedRid ) selectedRid = p_rid;
2310 }
2311
2312 blob_appendf(&desc, " of %z%h</a>",
2313 href("%R/info?name=%h", zCiName), zCiName);
2314 if( ridBackTo ){
2315 if( np==0 ){
2316 blob_reset(&desc);
2317 blob_appendf(&desc,
2318 "Check-in %z%h</a> only (%z%h</a> is not an ancestor)",
2319 href("%R/info?name=%h",zCiName), zCiName,
2320 href("%R/info?name=%h",zBackTo), zBackTo);
2321 }else{
2322 blob_appendf(&desc, " back to %z%h</a>",
2323 href("%R/info?name=%h",zBackTo), zBackTo);
 
2324 if( ridFwdTo && zFwdTo ){
2325 blob_appendf(&desc, " and up to %z%h</a>",
2326 href("%R/info?name=%h",zFwdTo), zFwdTo);
 
2327 }
2328 }
2329 }else if( ridFwdTo ){
2330 if( nd==0 ){
2331 blob_reset(&desc);
2332 blob_appendf(&desc,
2333 "Check-in %z%h</a> only (%z%h</a> is not an descendant)",
2334 href("%R/info?name=%h",zCiName), zCiName,
2335 href("%R/info?name=%h",zFwdTo), zFwdTo);
2336 }else{
2337 blob_appendf(&desc, " up to %z%h</a>",
2338 href("%R/info?name=%h",zFwdTo), zFwdTo);
 
2339 }
2340 }
2341 if( d_rid ){
2342 if( p_rid ){
2343 /* If both p= and d= are set, we don't have the uuid of d yet. */
2344
--- src/timeline.c
+++ src/timeline.c
@@ -2234,10 +2234,12 @@
2234 int np = 0, nd;
2235 const char *zBackTo = 0;
2236 const char *zFwdTo = 0;
2237 int ridBackTo = 0;
2238 int ridFwdTo = 0;
2239 int bBackAdded = 0; /* True if the zBackTo node was added */
2240 int bFwdAdded = 0; /* True if the zBackTo node was added */
2241
2242 tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS;
2243 if( p_rid && d_rid ){
2244 if( p_rid!=d_rid ) p_rid = d_rid;
2245 if( !haveParameterN ) nEntry = 10;
@@ -2279,10 +2281,14 @@
2281 " ORDER BY 2\n"
2282 ")\n"
2283 "INSERT OR IGNORE INTO ok SELECT rid FROM dx LIMIT %d",
2284 d_rid, rStopTime<8e99 ? 17 : 2, rStopTime, nEntry<=0 ? -1 : nEntry+1
2285 );
2286 if( ridFwdTo && !db_exists("SELECT 1 FROM ok WHERE rid=%d",ridFwdTo) ){
2287 db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridFwdTo);
2288 bFwdAdded = 1;
2289 }
2290 nd = db_int(0, "SELECT count(*)-1 FROM ok");
2291 if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql));
2292 if( nd>0 || p_rid==0 ){
2293 blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s");
2294 }
@@ -2298,46 +2304,52 @@
2304 ridBackTo = name_to_typed_rid(zBackTo,"ci");
2305 }
2306 if( ridBackTo && !haveParameterN ) nEntry = 0;
2307 }
2308 compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo);
2309 if( ridBackTo && !db_exists("SELECT 1 FROM ok WHERE rid=%d",ridBackTo) ){
2310 db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo);
2311 bBackAdded = 1;
2312 }
2313 np = db_int(0, "SELECT count(*)-1 FROM ok");
2314 if( np>0 || nd==0 ){
2315 if( nd>0 ) blob_appendf(&desc, " and ");
2316 blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s");
2317 db_multi_exec("%s", blob_sql_text(&sql));
2318 }
2319 if( useDividers && !selectedRid ) selectedRid = p_rid;
2320 }
 
2321 blob_appendf(&desc, " of %z%h</a>",
2322 href("%R/info?name=%h", zCiName), zCiName);
2323 if( ridBackTo ){
2324 if( np==0 ){
2325 blob_reset(&desc);
2326 blob_appendf(&desc,
2327 "Check-in %z%h</a> only (%z%h</a> does not precede it)",
2328 href("%R/info?name=%h",zCiName), zCiName,
2329 href("%R/info?name=%h",zBackTo), zBackTo);
2330 }else{
2331 blob_appendf(&desc, " back to %z%h</a>%s",
2332 href("%R/info?name=%h",zBackTo), zBackTo,
2333 bBackAdded ? " (not a direct anscestor)" : "");
2334 if( ridFwdTo && zFwdTo ){
2335 blob_appendf(&desc, " and up to %z%h</a>%s",
2336 href("%R/info?name=%h",zFwdTo), zFwdTo,
2337 bFwdAdded ? " (not a direct descendent)" : "");
2338 }
2339 }
2340 }else if( ridFwdTo ){
2341 if( nd==0 ){
2342 blob_reset(&desc);
2343 blob_appendf(&desc,
2344 "Check-in %z%h</a> only (%z%h</a> does not follow it)",
2345 href("%R/info?name=%h",zCiName), zCiName,
2346 href("%R/info?name=%h",zFwdTo), zFwdTo);
2347 }else{
2348 blob_appendf(&desc, " up to %z%h</a>%s",
2349 href("%R/info?name=%h",zFwdTo), zFwdTo,
2350 bFwdAdded ? " (not a direct descendent)":"");
2351 }
2352 }
2353 if( d_rid ){
2354 if( p_rid ){
2355 /* If both p= and d= are set, we don't have the uuid of d yet. */
2356

Keyboard Shortcuts

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