Fossil SCM
More /timeline enhancements. Improved graph drawing for from=,to= especially when using the mionly and rel options. Improved label on p=,bt=.
Commit
21eebbbaba4e84b1a438d03e9dfa4a46f961585ce9dda76ae54b8ca744467b22
Parent
977bb3fdf2c9e6a…
1 file changed
+11
-3
+11
-3
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -2019,19 +2019,20 @@ | ||
| 2019 | 2019 | " AND mlink.fnid=filename.fnid AND %s)", |
| 2020 | 2020 | glob_expr("filename.name", zChng) |
| 2021 | 2021 | ); |
| 2022 | 2022 | } |
| 2023 | 2023 | // tmFlags |= TIMELINE_DISJOINT; |
| 2024 | + tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS; | |
| 2024 | 2025 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2025 | 2026 | if( advancedMenu ){ |
| 2026 | 2027 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 2027 | 2028 | } |
| 2028 | 2029 | nNodeOnPath = db_int(0, "SELECT count(*) FROM temp.pathnode"); |
| 2029 | 2030 | blob_appendf(&desc, "%d check-ins going from ", nNodeOnPath); |
| 2030 | - blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); | |
| 2031 | + blob_appendf(&desc, "%z%h</a>", href("%R/info/%h", zFrom), zFrom); | |
| 2031 | 2032 | blob_append(&desc, " to ", -1); |
| 2032 | - blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); | |
| 2033 | + blob_appendf(&desc, "%z%h</a>", href("%R/info/%h",zTo), zTo); | |
| 2033 | 2034 | if( related ){ |
| 2034 | 2035 | int nRelated = db_int(0, "SELECT count(*) FROM timeline") - nNodeOnPath; |
| 2035 | 2036 | if( nRelated>0 ){ |
| 2036 | 2037 | blob_appendf(&desc, " and %d related check-in%s", nRelated, |
| 2037 | 2038 | nRelated>1 ? "s" : ""); |
| @@ -2041,10 +2042,12 @@ | ||
| 2041 | 2042 | }else if( (p_rid || d_rid) && g.perm.Read && zTagSql==0 ){ |
| 2042 | 2043 | /* If p= or d= is present, ignore all other parameters other than n= */ |
| 2043 | 2044 | char *zUuid; |
| 2044 | 2045 | const char *zCiName; |
| 2045 | 2046 | int np, nd; |
| 2047 | + const char *zBackTo = 0; | |
| 2048 | + int ridBackTo = 0; | |
| 2046 | 2049 | |
| 2047 | 2050 | tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS; |
| 2048 | 2051 | if( p_rid && d_rid ){ |
| 2049 | 2052 | if( p_rid!=d_rid ) p_rid = d_rid; |
| 2050 | 2053 | if( P("n")==0 ) nEntry = 10; |
| @@ -2065,11 +2068,12 @@ | ||
| 2065 | 2068 | if( nd>0 ) blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s"); |
| 2066 | 2069 | if( useDividers ) selectedRid = d_rid; |
| 2067 | 2070 | db_multi_exec("DELETE FROM ok"); |
| 2068 | 2071 | } |
| 2069 | 2072 | if( p_rid ){ |
| 2070 | - int ridBackTo = name_to_typed_rid(P("bt"),"ci"); | |
| 2073 | + zBackTo = P("bt"); | |
| 2074 | + ridBackTo = zBackTo ? name_to_typed_rid(zBackTo,"ci") : 0; | |
| 2071 | 2075 | compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo); |
| 2072 | 2076 | np = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2073 | 2077 | if( np>0 ){ |
| 2074 | 2078 | if( nd>0 ) blob_appendf(&desc, " and "); |
| 2075 | 2079 | blob_appendf(&desc, "%d ancestors", np); |
| @@ -2077,10 +2081,14 @@ | ||
| 2077 | 2081 | } |
| 2078 | 2082 | if( useDividers ) selectedRid = p_rid; |
| 2079 | 2083 | } |
| 2080 | 2084 | blob_appendf(&desc, " of %z%h</a>", |
| 2081 | 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 | + } | |
| 2082 | 2090 | if( d_rid ){ |
| 2083 | 2091 | if( p_rid ){ |
| 2084 | 2092 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 2085 | 2093 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 2086 | 2094 | } |
| 2087 | 2095 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -2019,19 +2019,20 @@ | |
| 2019 | " AND mlink.fnid=filename.fnid AND %s)", |
| 2020 | glob_expr("filename.name", zChng) |
| 2021 | ); |
| 2022 | } |
| 2023 | // tmFlags |= TIMELINE_DISJOINT; |
| 2024 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2025 | if( advancedMenu ){ |
| 2026 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 2027 | } |
| 2028 | nNodeOnPath = db_int(0, "SELECT count(*) FROM temp.pathnode"); |
| 2029 | blob_appendf(&desc, "%d check-ins going from ", nNodeOnPath); |
| 2030 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); |
| 2031 | blob_append(&desc, " to ", -1); |
| 2032 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); |
| 2033 | if( related ){ |
| 2034 | int nRelated = db_int(0, "SELECT count(*) FROM timeline") - nNodeOnPath; |
| 2035 | if( nRelated>0 ){ |
| 2036 | blob_appendf(&desc, " and %d related check-in%s", nRelated, |
| 2037 | nRelated>1 ? "s" : ""); |
| @@ -2041,10 +2042,12 @@ | |
| 2041 | }else if( (p_rid || d_rid) && g.perm.Read && zTagSql==0 ){ |
| 2042 | /* If p= or d= is present, ignore all other parameters other than n= */ |
| 2043 | char *zUuid; |
| 2044 | const char *zCiName; |
| 2045 | int np, nd; |
| 2046 | |
| 2047 | tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS; |
| 2048 | if( p_rid && d_rid ){ |
| 2049 | if( p_rid!=d_rid ) p_rid = d_rid; |
| 2050 | if( P("n")==0 ) nEntry = 10; |
| @@ -2065,11 +2068,12 @@ | |
| 2065 | if( nd>0 ) blob_appendf(&desc, "%d descendant%s", nd,(1==nd)?"":"s"); |
| 2066 | if( useDividers ) selectedRid = d_rid; |
| 2067 | db_multi_exec("DELETE FROM ok"); |
| 2068 | } |
| 2069 | if( p_rid ){ |
| 2070 | int ridBackTo = name_to_typed_rid(P("bt"),"ci"); |
| 2071 | compute_ancestors(p_rid, nEntry==0 ? 0 : nEntry+1, 0, ridBackTo); |
| 2072 | np = db_int(0, "SELECT count(*)-1 FROM ok"); |
| 2073 | if( np>0 ){ |
| 2074 | if( nd>0 ) blob_appendf(&desc, " and "); |
| 2075 | blob_appendf(&desc, "%d ancestors", np); |
| @@ -2077,10 +2081,14 @@ | |
| 2077 | } |
| 2078 | if( useDividers ) selectedRid = p_rid; |
| 2079 | } |
| 2080 | blob_appendf(&desc, " of %z%h</a>", |
| 2081 | href("%R/info?name=%h", zCiName), zCiName); |
| 2082 | if( d_rid ){ |
| 2083 | if( p_rid ){ |
| 2084 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 2085 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 2086 | } |
| 2087 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -2019,19 +2019,20 @@ | |
| 2019 | " AND mlink.fnid=filename.fnid AND %s)", |
| 2020 | glob_expr("filename.name", zChng) |
| 2021 | ); |
| 2022 | } |
| 2023 | // tmFlags |= TIMELINE_DISJOINT; |
| 2024 | tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS; |
| 2025 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 2026 | if( advancedMenu ){ |
| 2027 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 2028 | } |
| 2029 | nNodeOnPath = db_int(0, "SELECT count(*) FROM temp.pathnode"); |
| 2030 | blob_appendf(&desc, "%d check-ins going from ", nNodeOnPath); |
| 2031 | blob_appendf(&desc, "%z%h</a>", href("%R/info/%h", zFrom), zFrom); |
| 2032 | blob_append(&desc, " to ", -1); |
| 2033 | blob_appendf(&desc, "%z%h</a>", href("%R/info/%h",zTo), zTo); |
| 2034 | if( related ){ |
| 2035 | int nRelated = db_int(0, "SELECT count(*) FROM timeline") - nNodeOnPath; |
| 2036 | if( nRelated>0 ){ |
| 2037 | blob_appendf(&desc, " and %d related check-in%s", nRelated, |
| 2038 | nRelated>1 ? "s" : ""); |
| @@ -2041,10 +2042,12 @@ | |
| 2042 | }else if( (p_rid || d_rid) && g.perm.Read && zTagSql==0 ){ |
| 2043 | /* If p= or d= is present, ignore all other parameters other than n= */ |
| 2044 | char *zUuid; |
| 2045 | const char *zCiName; |
| 2046 | int np, nd; |
| 2047 | const char *zBackTo = 0; |
| 2048 | int ridBackTo = 0; |
| 2049 | |
| 2050 | tmFlags |= TIMELINE_XMERGE | TIMELINE_FILLGAPS; |
| 2051 | if( p_rid && d_rid ){ |
| 2052 | if( p_rid!=d_rid ) p_rid = d_rid; |
| 2053 | if( P("n")==0 ) nEntry = 10; |
| @@ -2065,11 +2068,12 @@ | |
| 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); |
| @@ -2077,10 +2081,14 @@ | |
| 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 | } |
| 2095 |