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.
Commit
e2e57aa9735cbe6b6181d0e5630fdf23dd54b4e71421ede1e9aa8227923aea3c
Parent
7919a44d5351330…
1 file changed
+21
-9
+21
-9
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -2234,10 +2234,12 @@ | ||
| 2234 | 2234 | int np = 0, nd; |
| 2235 | 2235 | const char *zBackTo = 0; |
| 2236 | 2236 | const char *zFwdTo = 0; |
| 2237 | 2237 | int ridBackTo = 0; |
| 2238 | 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 */ | |
| 2239 | 2241 | |
| 2240 | 2242 | tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS; |
| 2241 | 2243 | if( p_rid && d_rid ){ |
| 2242 | 2244 | if( p_rid!=d_rid ) p_rid = d_rid; |
| 2243 | 2245 | if( !haveParameterN ) nEntry = 10; |
| @@ -2279,10 +2281,14 @@ | ||
| 2279 | 2281 | " ORDER BY 2\n" |
| 2280 | 2282 | ")\n" |
| 2281 | 2283 | "INSERT OR IGNORE INTO ok SELECT rid FROM dx LIMIT %d", |
| 2282 | 2284 | d_rid, rStopTime<8e99 ? 17 : 2, rStopTime, nEntry<=0 ? -1 : nEntry+1 |
| 2283 | 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 | + } | |
| 2284 | 2290 | nd = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2285 | 2291 | if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql)); |
| 2286 | 2292 | if( nd>0 || p_rid==0 ){ |
| 2287 | 2293 | blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s"); |
| 2288 | 2294 | } |
| @@ -2298,46 +2304,52 @@ | ||
| 2298 | 2304 | ridBackTo = name_to_typed_rid(zBackTo,"ci"); |
| 2299 | 2305 | } |
| 2300 | 2306 | if( ridBackTo && !haveParameterN ) nEntry = 0; |
| 2301 | 2307 | } |
| 2302 | 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 | + } | |
| 2303 | 2313 | np = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2304 | 2314 | if( np>0 || nd==0 ){ |
| 2305 | 2315 | if( nd>0 ) blob_appendf(&desc, " and "); |
| 2306 | 2316 | blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s"); |
| 2307 | 2317 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2308 | 2318 | } |
| 2309 | 2319 | if( useDividers && !selectedRid ) selectedRid = p_rid; |
| 2310 | 2320 | } |
| 2311 | - | |
| 2312 | 2321 | blob_appendf(&desc, " of %z%h</a>", |
| 2313 | 2322 | href("%R/info?name=%h", zCiName), zCiName); |
| 2314 | 2323 | if( ridBackTo ){ |
| 2315 | 2324 | if( np==0 ){ |
| 2316 | 2325 | blob_reset(&desc); |
| 2317 | 2326 | 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)", | |
| 2319 | 2328 | href("%R/info?name=%h",zCiName), zCiName, |
| 2320 | 2329 | href("%R/info?name=%h",zBackTo), zBackTo); |
| 2321 | 2330 | }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)" : ""); | |
| 2324 | 2334 | 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)" : ""); | |
| 2327 | 2338 | } |
| 2328 | 2339 | } |
| 2329 | 2340 | }else if( ridFwdTo ){ |
| 2330 | 2341 | if( nd==0 ){ |
| 2331 | 2342 | blob_reset(&desc); |
| 2332 | 2343 | 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)", | |
| 2334 | 2345 | href("%R/info?name=%h",zCiName), zCiName, |
| 2335 | 2346 | href("%R/info?name=%h",zFwdTo), zFwdTo); |
| 2336 | 2347 | }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)":""); | |
| 2339 | 2351 | } |
| 2340 | 2352 | } |
| 2341 | 2353 | if( d_rid ){ |
| 2342 | 2354 | if( p_rid ){ |
| 2343 | 2355 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 2344 | 2356 |
| --- 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 |