Fossil SCM
More improvements to the /timeline display with p= and bt=.
Commit
048a74b6b78cff7781a70ff3b32d9a5660469372ebdbcd4e251117fd865edf16
Parent
21eebbbaba4e84b…
2 files changed
+8
-7
+16
-5
+8
-7
| --- src/descendants.c | ||
| +++ src/descendants.c | ||
| @@ -198,14 +198,12 @@ | ||
| 198 | 198 | ** (4) All ancestores of 1 and 2 but not of 3. |
| 199 | 199 | */ |
| 200 | 200 | double rLimitMtime = 0.0; |
| 201 | 201 | if( ridBackTo ){ |
| 202 | 202 | rLimitMtime = db_double(0.0, |
| 203 | - "SELECT mtime FROM event" | |
| 204 | - " WHERE objid=%d" | |
| 205 | - " AND mtime<(SELECT mtime FROM event WHERE objid=%d)", | |
| 206 | - ridBackTo, rid); | |
| 203 | + "SELECT mtime FROM event WHERE objid=%d", | |
| 204 | + ridBackTo); | |
| 207 | 205 | } |
| 208 | 206 | db_multi_exec( |
| 209 | 207 | "WITH RECURSIVE " |
| 210 | 208 | " parent(pid,cid,isCP) AS (" |
| 211 | 209 | " SELECT plink.pid, plink.cid, 0 AS xisCP FROM plink" |
| @@ -218,17 +216,20 @@ | ||
| 218 | 216 | " SELECT parent.pid, event.mtime, parent.isCP" |
| 219 | 217 | " FROM ancestor, parent, event" |
| 220 | 218 | " WHERE parent.cid=ancestor.rid" |
| 221 | 219 | " AND event.objid=parent.pid" |
| 222 | 220 | " AND NOT ancestor.isCP" |
| 223 | - " AND event.mtime>=%.17g" | |
| 221 | + " AND (event.mtime>=%.17g OR parent.pid=%d)" | |
| 224 | 222 | " ORDER BY mtime DESC LIMIT %d" |
| 225 | 223 | " )" |
| 226 | - "INSERT INTO ok" | |
| 224 | + "INSERT OR IGNORE INTO ok" | |
| 227 | 225 | " SELECT rid FROM ancestor;", |
| 228 | - rid, rid, rLimitMtime, N | |
| 226 | + rid, rid, rLimitMtime, ridBackTo, N | |
| 229 | 227 | ); |
| 228 | + if( ridBackTo && db_changes()>1 ){ | |
| 229 | + db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo); | |
| 230 | + } | |
| 230 | 231 | } |
| 231 | 232 | } |
| 232 | 233 | |
| 233 | 234 | /* |
| 234 | 235 | ** Compute the youngest ancestor of record ID rid that is a member of |
| 235 | 236 |
| --- src/descendants.c | |
| +++ src/descendants.c | |
| @@ -198,14 +198,12 @@ | |
| 198 | ** (4) All ancestores of 1 and 2 but not of 3. |
| 199 | */ |
| 200 | double rLimitMtime = 0.0; |
| 201 | if( ridBackTo ){ |
| 202 | rLimitMtime = db_double(0.0, |
| 203 | "SELECT mtime FROM event" |
| 204 | " WHERE objid=%d" |
| 205 | " AND mtime<(SELECT mtime FROM event WHERE objid=%d)", |
| 206 | ridBackTo, rid); |
| 207 | } |
| 208 | db_multi_exec( |
| 209 | "WITH RECURSIVE " |
| 210 | " parent(pid,cid,isCP) AS (" |
| 211 | " SELECT plink.pid, plink.cid, 0 AS xisCP FROM plink" |
| @@ -218,17 +216,20 @@ | |
| 218 | " SELECT parent.pid, event.mtime, parent.isCP" |
| 219 | " FROM ancestor, parent, event" |
| 220 | " WHERE parent.cid=ancestor.rid" |
| 221 | " AND event.objid=parent.pid" |
| 222 | " AND NOT ancestor.isCP" |
| 223 | " AND event.mtime>=%.17g" |
| 224 | " ORDER BY mtime DESC LIMIT %d" |
| 225 | " )" |
| 226 | "INSERT INTO ok" |
| 227 | " SELECT rid FROM ancestor;", |
| 228 | rid, rid, rLimitMtime, N |
| 229 | ); |
| 230 | } |
| 231 | } |
| 232 | |
| 233 | /* |
| 234 | ** Compute the youngest ancestor of record ID rid that is a member of |
| 235 |
| --- src/descendants.c | |
| +++ src/descendants.c | |
| @@ -198,14 +198,12 @@ | |
| 198 | ** (4) All ancestores of 1 and 2 but not of 3. |
| 199 | */ |
| 200 | double rLimitMtime = 0.0; |
| 201 | if( ridBackTo ){ |
| 202 | rLimitMtime = db_double(0.0, |
| 203 | "SELECT mtime FROM event WHERE objid=%d", |
| 204 | ridBackTo); |
| 205 | } |
| 206 | db_multi_exec( |
| 207 | "WITH RECURSIVE " |
| 208 | " parent(pid,cid,isCP) AS (" |
| 209 | " SELECT plink.pid, plink.cid, 0 AS xisCP FROM plink" |
| @@ -218,17 +216,20 @@ | |
| 216 | " SELECT parent.pid, event.mtime, parent.isCP" |
| 217 | " FROM ancestor, parent, event" |
| 218 | " WHERE parent.cid=ancestor.rid" |
| 219 | " AND event.objid=parent.pid" |
| 220 | " AND NOT ancestor.isCP" |
| 221 | " AND (event.mtime>=%.17g OR parent.pid=%d)" |
| 222 | " ORDER BY mtime DESC LIMIT %d" |
| 223 | " )" |
| 224 | "INSERT OR IGNORE INTO ok" |
| 225 | " SELECT rid FROM ancestor;", |
| 226 | rid, rid, rLimitMtime, ridBackTo, N |
| 227 | ); |
| 228 | if( ridBackTo && db_changes()>1 ){ |
| 229 | db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", ridBackTo); |
| 230 | } |
| 231 | } |
| 232 | } |
| 233 | |
| 234 | /* |
| 235 | ** Compute the youngest ancestor of record ID rid that is a member of |
| 236 |
+16
-5
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -2063,31 +2063,42 @@ | ||
| 2063 | 2063 | nd = 0; |
| 2064 | 2064 | if( d_rid ){ |
| 2065 | 2065 | compute_descendants(d_rid, nEntry==0 ? 0 : nEntry+1); |
| 2066 | 2066 | nd = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2067 | 2067 | if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql)); |
| 2068 | - if( nd>0 ) blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s"); | |
| 2068 | + if( nd>0 || p_rid==0 ){ | |
| 2069 | + blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s"); | |
| 2070 | + } | |
| 2069 | 2071 | if( useDividers ) selectedRid = d_rid; |
| 2070 | 2072 | db_multi_exec("DELETE FROM ok"); |
| 2071 | 2073 | } |
| 2072 | 2074 | if( p_rid ){ |
| 2073 | 2075 | zBackTo = P("bt"); |
| 2074 | 2076 | ridBackTo = zBackTo ? name_to_typed_rid(zBackTo,"ci") : 0; |
| 2075 | 2077 | compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo); |
| 2076 | 2078 | np = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2077 | - if( np>0 ){ | |
| 2079 | + if( np>0 || nd==0 ){ | |
| 2078 | 2080 | if( nd>0 ) blob_appendf(&desc, " and "); |
| 2079 | - blob_appendf(&desc, "%d ancestors", np); | |
| 2081 | + blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s"); | |
| 2080 | 2082 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2081 | 2083 | } |
| 2082 | 2084 | if( useDividers ) selectedRid = p_rid; |
| 2083 | 2085 | } |
| 2086 | + | |
| 2084 | 2087 | blob_appendf(&desc, " of %z%h</a>", |
| 2085 | 2088 | href("%R/info?name=%h", zCiName), zCiName); |
| 2086 | 2089 | if( ridBackTo ){ |
| 2087 | - blob_appendf(&desc, " back to %z%h</a>", | |
| 2088 | - href("%R/info?name=%h",zBackTo), zBackTo); | |
| 2090 | + if( np==0 ){ | |
| 2091 | + blob_reset(&desc); | |
| 2092 | + blob_appendf(&desc, | |
| 2093 | + "Check-in %z%h</a> only (%z%h</a> is not an ancestor)", | |
| 2094 | + href("%R/info?name=%h",zCiName), zCiName, | |
| 2095 | + href("%R/info?name=%h",zBackTo), zBackTo); | |
| 2096 | + }else{ | |
| 2097 | + blob_appendf(&desc, " back to %z%h</a>", | |
| 2098 | + href("%R/info?name=%h",zBackTo), zBackTo); | |
| 2099 | + } | |
| 2089 | 2100 | } |
| 2090 | 2101 | if( d_rid ){ |
| 2091 | 2102 | if( p_rid ){ |
| 2092 | 2103 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 2093 | 2104 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 2094 | 2105 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -2063,31 +2063,42 @@ | |
| 2063 | nd = 0; |
| 2064 | if( d_rid ){ |
| 2065 | compute_descendants(d_rid, nEntry==0 ? 0 : nEntry+1); |
| 2066 | nd = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2067 | if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql)); |
| 2068 | if( nd>0 ) blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s"); |
| 2069 | if( useDividers ) selectedRid = d_rid; |
| 2070 | db_multi_exec("DELETE FROM ok"); |
| 2071 | } |
| 2072 | if( p_rid ){ |
| 2073 | zBackTo = P("bt"); |
| 2074 | ridBackTo = zBackTo ? name_to_typed_rid(zBackTo,"ci") : 0; |
| 2075 | compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo); |
| 2076 | np = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2077 | if( np>0 ){ |
| 2078 | if( nd>0 ) blob_appendf(&desc, " and "); |
| 2079 | blob_appendf(&desc, "%d ancestors", np); |
| 2080 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2081 | } |
| 2082 | if( useDividers ) selectedRid = p_rid; |
| 2083 | } |
| 2084 | blob_appendf(&desc, " of %z%h</a>", |
| 2085 | href("%R/info?name=%h", zCiName), zCiName); |
| 2086 | if( ridBackTo ){ |
| 2087 | blob_appendf(&desc, " back to %z%h</a>", |
| 2088 | href("%R/info?name=%h",zBackTo), zBackTo); |
| 2089 | } |
| 2090 | if( d_rid ){ |
| 2091 | if( p_rid ){ |
| 2092 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 2093 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 2094 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -2063,31 +2063,42 @@ | |
| 2063 | nd = 0; |
| 2064 | if( d_rid ){ |
| 2065 | compute_descendants(d_rid, nEntry==0 ? 0 : nEntry+1); |
| 2066 | nd = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2067 | if( nd>=0 ) db_multi_exec("%s", blob_sql_text(&sql)); |
| 2068 | if( nd>0 || p_rid==0 ){ |
| 2069 | blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s"); |
| 2070 | } |
| 2071 | if( useDividers ) selectedRid = d_rid; |
| 2072 | db_multi_exec("DELETE FROM ok"); |
| 2073 | } |
| 2074 | if( p_rid ){ |
| 2075 | zBackTo = P("bt"); |
| 2076 | ridBackTo = zBackTo ? name_to_typed_rid(zBackTo,"ci") : 0; |
| 2077 | compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo); |
| 2078 | np = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2079 | if( np>0 || nd==0 ){ |
| 2080 | if( nd>0 ) blob_appendf(&desc, " and "); |
| 2081 | blob_appendf(&desc, "%d ancestor%s", np, (1==np)?"":"s"); |
| 2082 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2083 | } |
| 2084 | if( useDividers ) selectedRid = p_rid; |
| 2085 | } |
| 2086 | |
| 2087 | blob_appendf(&desc, " of %z%h</a>", |
| 2088 | href("%R/info?name=%h", zCiName), zCiName); |
| 2089 | if( ridBackTo ){ |
| 2090 | if( np==0 ){ |
| 2091 | blob_reset(&desc); |
| 2092 | blob_appendf(&desc, |
| 2093 | "Check-in %z%h</a> only (%z%h</a> is not an ancestor)", |
| 2094 | href("%R/info?name=%h",zCiName), zCiName, |
| 2095 | href("%R/info?name=%h",zBackTo), zBackTo); |
| 2096 | }else{ |
| 2097 | blob_appendf(&desc, " back to %z%h</a>", |
| 2098 | href("%R/info?name=%h",zBackTo), zBackTo); |
| 2099 | } |
| 2100 | } |
| 2101 | if( d_rid ){ |
| 2102 | if( p_rid ){ |
| 2103 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 2104 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 2105 |