Fossil SCM
Improved title on /timeline graphs with from, to, and rel query parameters.
Commit
994d7d849d70487c7d8e3bc24fe721ce4e60cfbc1be81ddfa57234ac93cdeda9
Parent
7759a00e3e03e53…
1 file changed
+13
-4
+13
-4
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -1723,10 +1723,11 @@ | ||
| 1723 | 1723 | ** the two */ |
| 1724 | 1724 | PathNode *p = 0; |
| 1725 | 1725 | const char *zFrom = 0; |
| 1726 | 1726 | const char *zTo = 0; |
| 1727 | 1727 | Blob ins; |
| 1728 | + int nNodeOnPath = 0; | |
| 1728 | 1729 | |
| 1729 | 1730 | if( from_rid && to_rid ){ |
| 1730 | 1731 | p = path_shortest(from_rid, to_rid, noMerge, 0); |
| 1731 | 1732 | zFrom = P("from"); |
| 1732 | 1733 | zTo = P("to"); |
| @@ -1743,25 +1744,27 @@ | ||
| 1743 | 1744 | ); |
| 1744 | 1745 | if( p ){ |
| 1745 | 1746 | blob_init(&ins, 0, 0); |
| 1746 | 1747 | blob_append_sql(&ins, "INSERT INTO pathnode(x) VALUES(%d)", p->rid); |
| 1747 | 1748 | p = p->u.pTo; |
| 1749 | + nNodeOnPath = 1; | |
| 1748 | 1750 | while( p ){ |
| 1749 | 1751 | blob_append_sql(&ins, ",(%d)", p->rid); |
| 1750 | 1752 | p = p->u.pTo; |
| 1753 | + nNodeOnPath++; | |
| 1751 | 1754 | } |
| 1752 | 1755 | } |
| 1753 | 1756 | path_reset(); |
| 1754 | 1757 | db_multi_exec("%s", blob_str(&ins)/*safe-for-%s*/); |
| 1755 | 1758 | blob_reset(&ins); |
| 1756 | 1759 | if( related ){ |
| 1757 | 1760 | db_multi_exec( |
| 1758 | 1761 | "CREATE TABLE IF NOT EXISTS temp.related(x INTEGER PRIMARY KEY);" |
| 1759 | 1762 | "INSERT OR IGNORE INTO related(x)" |
| 1760 | - " SELECT cid FROM plink WHERE pid IN pathnode;" | |
| 1763 | + " SELECT cid FROM plink WHERE pid IN pathnode AND NOT isprim;" | |
| 1761 | 1764 | "INSERT OR IGNORE INTO related(x)" |
| 1762 | - " SELECT pid FROM plink WHERE cid IN pathnode;" | |
| 1765 | + " SELECT pid FROM plink WHERE cid IN pathnode AND NOT isprim;" | |
| 1763 | 1766 | ); |
| 1764 | 1767 | if( showCherrypicks ){ |
| 1765 | 1768 | db_multi_exec( |
| 1766 | 1769 | "INSERT OR IGNORE INTO related(x)" |
| 1767 | 1770 | " SELECT childid FROM cherrypick WHERE parentid IN pathnode;" |
| @@ -1776,15 +1779,21 @@ | ||
| 1776 | 1779 | tmFlags |= TIMELINE_DISJOINT; |
| 1777 | 1780 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 1778 | 1781 | if( advancedMenu ){ |
| 1779 | 1782 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 1780 | 1783 | } |
| 1781 | - blob_appendf(&desc, "%d check-ins going from ", | |
| 1782 | - db_int(0, "SELECT count(*) FROM timeline")); | |
| 1784 | + blob_appendf(&desc, "%d check-ins going from ", nNodeOnPath); | |
| 1783 | 1785 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); |
| 1784 | 1786 | blob_append(&desc, " to ", -1); |
| 1785 | 1787 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); |
| 1788 | + if( related ){ | |
| 1789 | + int nRelated = db_int(0, "SELECT count(*) FROM timeline") - nNodeOnPath; | |
| 1790 | + if( nRelated>0 ){ | |
| 1791 | + blob_appendf(&desc, " and %d related check-in%s", nRelated, | |
| 1792 | + nRelated>1 ? "s" : ""); | |
| 1793 | + } | |
| 1794 | + } | |
| 1786 | 1795 | addFileGlobDescription(zChng, &desc); |
| 1787 | 1796 | }else if( (p_rid || d_rid) && g.perm.Read && zTagSql==0 ){ |
| 1788 | 1797 | /* If p= or d= is present, ignore all other parameters other than n= */ |
| 1789 | 1798 | char *zUuid; |
| 1790 | 1799 | int np, nd; |
| 1791 | 1800 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -1723,10 +1723,11 @@ | |
| 1723 | ** the two */ |
| 1724 | PathNode *p = 0; |
| 1725 | const char *zFrom = 0; |
| 1726 | const char *zTo = 0; |
| 1727 | Blob ins; |
| 1728 | |
| 1729 | if( from_rid && to_rid ){ |
| 1730 | p = path_shortest(from_rid, to_rid, noMerge, 0); |
| 1731 | zFrom = P("from"); |
| 1732 | zTo = P("to"); |
| @@ -1743,25 +1744,27 @@ | |
| 1743 | ); |
| 1744 | if( p ){ |
| 1745 | blob_init(&ins, 0, 0); |
| 1746 | blob_append_sql(&ins, "INSERT INTO pathnode(x) VALUES(%d)", p->rid); |
| 1747 | p = p->u.pTo; |
| 1748 | while( p ){ |
| 1749 | blob_append_sql(&ins, ",(%d)", p->rid); |
| 1750 | p = p->u.pTo; |
| 1751 | } |
| 1752 | } |
| 1753 | path_reset(); |
| 1754 | db_multi_exec("%s", blob_str(&ins)/*safe-for-%s*/); |
| 1755 | blob_reset(&ins); |
| 1756 | if( related ){ |
| 1757 | db_multi_exec( |
| 1758 | "CREATE TABLE IF NOT EXISTS temp.related(x INTEGER PRIMARY KEY);" |
| 1759 | "INSERT OR IGNORE INTO related(x)" |
| 1760 | " SELECT cid FROM plink WHERE pid IN pathnode;" |
| 1761 | "INSERT OR IGNORE INTO related(x)" |
| 1762 | " SELECT pid FROM plink WHERE cid IN pathnode;" |
| 1763 | ); |
| 1764 | if( showCherrypicks ){ |
| 1765 | db_multi_exec( |
| 1766 | "INSERT OR IGNORE INTO related(x)" |
| 1767 | " SELECT childid FROM cherrypick WHERE parentid IN pathnode;" |
| @@ -1776,15 +1779,21 @@ | |
| 1776 | tmFlags |= TIMELINE_DISJOINT; |
| 1777 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 1778 | if( advancedMenu ){ |
| 1779 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 1780 | } |
| 1781 | blob_appendf(&desc, "%d check-ins going from ", |
| 1782 | db_int(0, "SELECT count(*) FROM timeline")); |
| 1783 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); |
| 1784 | blob_append(&desc, " to ", -1); |
| 1785 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); |
| 1786 | addFileGlobDescription(zChng, &desc); |
| 1787 | }else if( (p_rid || d_rid) && g.perm.Read && zTagSql==0 ){ |
| 1788 | /* If p= or d= is present, ignore all other parameters other than n= */ |
| 1789 | char *zUuid; |
| 1790 | int np, nd; |
| 1791 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -1723,10 +1723,11 @@ | |
| 1723 | ** the two */ |
| 1724 | PathNode *p = 0; |
| 1725 | const char *zFrom = 0; |
| 1726 | const char *zTo = 0; |
| 1727 | Blob ins; |
| 1728 | int nNodeOnPath = 0; |
| 1729 | |
| 1730 | if( from_rid && to_rid ){ |
| 1731 | p = path_shortest(from_rid, to_rid, noMerge, 0); |
| 1732 | zFrom = P("from"); |
| 1733 | zTo = P("to"); |
| @@ -1743,25 +1744,27 @@ | |
| 1744 | ); |
| 1745 | if( p ){ |
| 1746 | blob_init(&ins, 0, 0); |
| 1747 | blob_append_sql(&ins, "INSERT INTO pathnode(x) VALUES(%d)", p->rid); |
| 1748 | p = p->u.pTo; |
| 1749 | nNodeOnPath = 1; |
| 1750 | while( p ){ |
| 1751 | blob_append_sql(&ins, ",(%d)", p->rid); |
| 1752 | p = p->u.pTo; |
| 1753 | nNodeOnPath++; |
| 1754 | } |
| 1755 | } |
| 1756 | path_reset(); |
| 1757 | db_multi_exec("%s", blob_str(&ins)/*safe-for-%s*/); |
| 1758 | blob_reset(&ins); |
| 1759 | if( related ){ |
| 1760 | db_multi_exec( |
| 1761 | "CREATE TABLE IF NOT EXISTS temp.related(x INTEGER PRIMARY KEY);" |
| 1762 | "INSERT OR IGNORE INTO related(x)" |
| 1763 | " SELECT cid FROM plink WHERE pid IN pathnode AND NOT isprim;" |
| 1764 | "INSERT OR IGNORE INTO related(x)" |
| 1765 | " SELECT pid FROM plink WHERE cid IN pathnode AND NOT isprim;" |
| 1766 | ); |
| 1767 | if( showCherrypicks ){ |
| 1768 | db_multi_exec( |
| 1769 | "INSERT OR IGNORE INTO related(x)" |
| 1770 | " SELECT childid FROM cherrypick WHERE parentid IN pathnode;" |
| @@ -1776,15 +1779,21 @@ | |
| 1779 | tmFlags |= TIMELINE_DISJOINT; |
| 1780 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 1781 | if( advancedMenu ){ |
| 1782 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 1783 | } |
| 1784 | blob_appendf(&desc, "%d check-ins going from ", nNodeOnPath); |
| 1785 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); |
| 1786 | blob_append(&desc, " to ", -1); |
| 1787 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); |
| 1788 | if( related ){ |
| 1789 | int nRelated = db_int(0, "SELECT count(*) FROM timeline") - nNodeOnPath; |
| 1790 | if( nRelated>0 ){ |
| 1791 | blob_appendf(&desc, " and %d related check-in%s", nRelated, |
| 1792 | nRelated>1 ? "s" : ""); |
| 1793 | } |
| 1794 | } |
| 1795 | addFileGlobDescription(zChng, &desc); |
| 1796 | }else if( (p_rid || d_rid) && g.perm.Read && zTagSql==0 ){ |
| 1797 | /* If p= or d= is present, ignore all other parameters other than n= */ |
| 1798 | char *zUuid; |
| 1799 | int np, nd; |
| 1800 |