Fossil SCM

Improvements to /timeline generation of cherrypick merges. Cherrypicks are now shown with the f= query parameter. Add the cherrypicks query parameter to /timeline. Add test cases to the graph-test-1.wiki page.

drh 2018-12-28 01:25 trunk
Commit ee64832f7ebf804eccdd0acb77ca362d60332a9781eec8875eb188b90f88cd70
+38 -6
--- src/timeline.c
+++ src/timeline.c
@@ -1447,10 +1447,11 @@
14471447
** days=N Show events over the previous N days
14481448
** datefmt=N Override the date format
14491449
** bisect Show the check-ins that are in the current bisect
14501450
** showid Show RIDs
14511451
** showsql Show the SQL text
1452
+** cherrypicks Show all cherrypicks
14521453
**
14531454
** p= and d= can appear individually or together. If either p= or d=
14541455
** appear, then u=, y=, a=, and b= are ignored.
14551456
**
14561457
** If both a= and b= appear then both upper and lower bounds are honored.
@@ -1491,10 +1492,11 @@
14911492
const char *zChng = P("chng"); /* List of GLOBs for files that changed */
14921493
int useDividers = P("nd")==0; /* Show dividers if "nd" is missing */
14931494
int renameOnly = P("namechng")!=0; /* Show only check-ins that rename files */
14941495
int forkOnly = PB("forks"); /* Show only forks and their children */
14951496
int bisectOnly = PB("bisect"); /* Show the check-ins of the bisect */
1497
+ int cpOnly = PB("cherrypicks"); /* Show all cherrypick checkins */
14961498
int tmFlags = 0; /* Timeline flags */
14971499
const char *zThisTag = 0; /* Suppress links to this tag */
14981500
const char *zThisUser = 0; /* Suppress links to this user */
14991501
HQuery url; /* URL for various branch links */
15001502
int from_rid = name_to_typed_rid(P("from"),"ci"); /* from= for paths */
@@ -1509,10 +1511,11 @@
15091511
char *zNewerButton = 0; /* URL for Newer button at the top */
15101512
int selectedRid = -9999999; /* Show a highlight on this RID */
15111513
int disableY = 0; /* Disable type selector on submenu */
15121514
int advancedMenu = 0; /* Use the advanced menu design */
15131515
char *zPlural; /* Ending for plural forms */
1516
+ int showCherrypicks = 1; /* True to show cherrypick merges */
15141517
15151518
/* Set number of rows to display */
15161519
cookie_read_parameter("n","n");
15171520
z = P("n");
15181521
if( z==0 ) z = db_get("timeline-default-length",0);
@@ -1533,10 +1536,16 @@
15331536
cgi_replace_query_parameter("n",z);
15341537
cookie_write_parameter("n","n",0);
15351538
tmFlags |= timeline_ss_submenu();
15361539
cookie_link_parameter("advm","advm","0");
15371540
advancedMenu = atoi(PD("advm","0"));
1541
+
1542
+ /* Omit all cherry-pick merge lines if the "ncp" query parameter is
1543
+ ** present or if this repository lacks a "cherrypick" table. */
1544
+ if( PB("ncp") || !db_table_exists("repository","cherrypick") ){
1545
+ showCherrypicks = 0;
1546
+ }
15381547
15391548
/* To view the timeline, must have permission to read project data.
15401549
*/
15411550
pd_rid = name_to_typed_rid(P("dp"),"ci");
15421551
if( pd_rid ){
@@ -1796,10 +1805,19 @@
17961805
"INSERT INTO ok VALUES(%d);"
17971806
"INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;"
17981807
"INSERT OR IGNORE INTO ok SELECT cid FROM plink WHERE pid=%d;",
17991808
f_rid, f_rid, f_rid
18001809
);
1810
+ if( showCherrypicks ){
1811
+ db_multi_exec(
1812
+ "INSERT OR IGNORE INTO ok SELECT parentid FROM cherrypick"
1813
+ " WHERE childid=%d;"
1814
+ "INSERT OR IGNORE INTO ok SELECT childid FROM cherrypick"
1815
+ " WHERE parentid=%d;",
1816
+ f_rid, f_rid
1817
+ );
1818
+ }
18011819
blob_append_sql(&sql, " AND event.objid IN ok");
18021820
db_multi_exec("%s", blob_sql_text(&sql));
18031821
if( useDividers ) selectedRid = f_rid;
18041822
blob_appendf(&desc, "Parents and children of check-in ");
18051823
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
@@ -1827,10 +1845,18 @@
18271845
blob_append_sql(&cond, " AND event.objid IN rnfile ");
18281846
}
18291847
if( forkOnly ){
18301848
blob_append_sql(&cond, " AND event.objid IN rnfork ");
18311849
}
1850
+ if( cpOnly && showCherrypicks ){
1851
+ db_multi_exec(
1852
+ "CREATE TABLE IF NOT EXISTS cpnodes(rid INTEGER PRIMARY KEY);"
1853
+ "INSERT OR IGNORE INTO cpnodes SELECT childid FROM cherrypick;"
1854
+ "INSERT OR IGNORE INTO cpnodes SELECT parentid FROM cherrypick;"
1855
+ );
1856
+ blob_append_sql(&cond, " AND event.objid IN cpnodes ");
1857
+ }
18321858
if( bisectOnly ){
18331859
blob_append_sql(&cond, " AND event.objid IN (SELECT rid FROM bilog) ");
18341860
}
18351861
if( zYearMonth ){
18361862
blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
@@ -1907,22 +1933,24 @@
19071933
db_multi_exec(
19081934
"INSERT OR IGNORE INTO related_nodes"
19091935
" SELECT cid FROM selected_nodes CROSS JOIN plink"
19101936
" WHERE selected_nodes.rid=plink.pid;"
19111937
);
1938
+ if( showCherrypicks ){
1939
+ db_multi_exec(
1940
+ "INSERT OR IGNORE INTO related_nodes"
1941
+ " SELECT childid FROM selected_nodes CROSS JOIN cherrypick"
1942
+ " WHERE selected_nodes.rid=cherrypick.parentid;"
1943
+ );
1944
+ }
19121945
}
1913
- if( !PB("ncp") && db_table_exists("repository","cherrypick") ){
1946
+ if( showCherrypicks ){
19141947
db_multi_exec(
19151948
"INSERT OR IGNORE INTO related_nodes"
19161949
" SELECT parentid FROM selected_nodes CROSS JOIN cherrypick"
19171950
" WHERE selected_nodes.rid=cherrypick.childid;"
19181951
);
1919
- db_multi_exec(
1920
- "INSERT OR IGNORE INTO related_nodes"
1921
- " SELECT childid FROM selected_nodes CROSS JOIN cherrypick"
1922
- " WHERE selected_nodes.rid=cherrypick.parentid;"
1923
- );
19241952
}
19251953
if( (tmFlags & TIMELINE_UNHIDE)==0 ){
19261954
db_multi_exec(
19271955
"DELETE FROM related_nodes WHERE rid IN "
19281956
" (SELECT related_nodes.rid FROM related_nodes, tagxref"
@@ -2075,10 +2103,14 @@
20752103
tmFlags |= TIMELINE_DISJOINT;
20762104
}
20772105
if( bisectOnly ){
20782106
blob_appendf(&desc, " in the most recent bisect");
20792107
tmFlags |= TIMELINE_DISJOINT;
2108
+ }
2109
+ if( cpOnly && showCherrypicks ){
2110
+ blob_appendf(&desc, " that participate in a cherrypick merge");
2111
+ tmFlags |= TIMELINE_CHPICK;
20802112
}
20812113
if( zUser ){
20822114
blob_appendf(&desc, " by user %h", zUser);
20832115
tmFlags |= TIMELINE_DISJOINT;
20842116
}
20852117
--- src/timeline.c
+++ src/timeline.c
@@ -1447,10 +1447,11 @@
1447 ** days=N Show events over the previous N days
1448 ** datefmt=N Override the date format
1449 ** bisect Show the check-ins that are in the current bisect
1450 ** showid Show RIDs
1451 ** showsql Show the SQL text
 
1452 **
1453 ** p= and d= can appear individually or together. If either p= or d=
1454 ** appear, then u=, y=, a=, and b= are ignored.
1455 **
1456 ** If both a= and b= appear then both upper and lower bounds are honored.
@@ -1491,10 +1492,11 @@
1491 const char *zChng = P("chng"); /* List of GLOBs for files that changed */
1492 int useDividers = P("nd")==0; /* Show dividers if "nd" is missing */
1493 int renameOnly = P("namechng")!=0; /* Show only check-ins that rename files */
1494 int forkOnly = PB("forks"); /* Show only forks and their children */
1495 int bisectOnly = PB("bisect"); /* Show the check-ins of the bisect */
 
1496 int tmFlags = 0; /* Timeline flags */
1497 const char *zThisTag = 0; /* Suppress links to this tag */
1498 const char *zThisUser = 0; /* Suppress links to this user */
1499 HQuery url; /* URL for various branch links */
1500 int from_rid = name_to_typed_rid(P("from"),"ci"); /* from= for paths */
@@ -1509,10 +1511,11 @@
1509 char *zNewerButton = 0; /* URL for Newer button at the top */
1510 int selectedRid = -9999999; /* Show a highlight on this RID */
1511 int disableY = 0; /* Disable type selector on submenu */
1512 int advancedMenu = 0; /* Use the advanced menu design */
1513 char *zPlural; /* Ending for plural forms */
 
1514
1515 /* Set number of rows to display */
1516 cookie_read_parameter("n","n");
1517 z = P("n");
1518 if( z==0 ) z = db_get("timeline-default-length",0);
@@ -1533,10 +1536,16 @@
1533 cgi_replace_query_parameter("n",z);
1534 cookie_write_parameter("n","n",0);
1535 tmFlags |= timeline_ss_submenu();
1536 cookie_link_parameter("advm","advm","0");
1537 advancedMenu = atoi(PD("advm","0"));
 
 
 
 
 
 
1538
1539 /* To view the timeline, must have permission to read project data.
1540 */
1541 pd_rid = name_to_typed_rid(P("dp"),"ci");
1542 if( pd_rid ){
@@ -1796,10 +1805,19 @@
1796 "INSERT INTO ok VALUES(%d);"
1797 "INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;"
1798 "INSERT OR IGNORE INTO ok SELECT cid FROM plink WHERE pid=%d;",
1799 f_rid, f_rid, f_rid
1800 );
 
 
 
 
 
 
 
 
 
1801 blob_append_sql(&sql, " AND event.objid IN ok");
1802 db_multi_exec("%s", blob_sql_text(&sql));
1803 if( useDividers ) selectedRid = f_rid;
1804 blob_appendf(&desc, "Parents and children of check-in ");
1805 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
@@ -1827,10 +1845,18 @@
1827 blob_append_sql(&cond, " AND event.objid IN rnfile ");
1828 }
1829 if( forkOnly ){
1830 blob_append_sql(&cond, " AND event.objid IN rnfork ");
1831 }
 
 
 
 
 
 
 
 
1832 if( bisectOnly ){
1833 blob_append_sql(&cond, " AND event.objid IN (SELECT rid FROM bilog) ");
1834 }
1835 if( zYearMonth ){
1836 blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
@@ -1907,22 +1933,24 @@
1907 db_multi_exec(
1908 "INSERT OR IGNORE INTO related_nodes"
1909 " SELECT cid FROM selected_nodes CROSS JOIN plink"
1910 " WHERE selected_nodes.rid=plink.pid;"
1911 );
 
 
 
 
 
 
 
1912 }
1913 if( !PB("ncp") && db_table_exists("repository","cherrypick") ){
1914 db_multi_exec(
1915 "INSERT OR IGNORE INTO related_nodes"
1916 " SELECT parentid FROM selected_nodes CROSS JOIN cherrypick"
1917 " WHERE selected_nodes.rid=cherrypick.childid;"
1918 );
1919 db_multi_exec(
1920 "INSERT OR IGNORE INTO related_nodes"
1921 " SELECT childid FROM selected_nodes CROSS JOIN cherrypick"
1922 " WHERE selected_nodes.rid=cherrypick.parentid;"
1923 );
1924 }
1925 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1926 db_multi_exec(
1927 "DELETE FROM related_nodes WHERE rid IN "
1928 " (SELECT related_nodes.rid FROM related_nodes, tagxref"
@@ -2075,10 +2103,14 @@
2075 tmFlags |= TIMELINE_DISJOINT;
2076 }
2077 if( bisectOnly ){
2078 blob_appendf(&desc, " in the most recent bisect");
2079 tmFlags |= TIMELINE_DISJOINT;
 
 
 
 
2080 }
2081 if( zUser ){
2082 blob_appendf(&desc, " by user %h", zUser);
2083 tmFlags |= TIMELINE_DISJOINT;
2084 }
2085
--- src/timeline.c
+++ src/timeline.c
@@ -1447,10 +1447,11 @@
1447 ** days=N Show events over the previous N days
1448 ** datefmt=N Override the date format
1449 ** bisect Show the check-ins that are in the current bisect
1450 ** showid Show RIDs
1451 ** showsql Show the SQL text
1452 ** cherrypicks Show all cherrypicks
1453 **
1454 ** p= and d= can appear individually or together. If either p= or d=
1455 ** appear, then u=, y=, a=, and b= are ignored.
1456 **
1457 ** If both a= and b= appear then both upper and lower bounds are honored.
@@ -1491,10 +1492,11 @@
1492 const char *zChng = P("chng"); /* List of GLOBs for files that changed */
1493 int useDividers = P("nd")==0; /* Show dividers if "nd" is missing */
1494 int renameOnly = P("namechng")!=0; /* Show only check-ins that rename files */
1495 int forkOnly = PB("forks"); /* Show only forks and their children */
1496 int bisectOnly = PB("bisect"); /* Show the check-ins of the bisect */
1497 int cpOnly = PB("cherrypicks"); /* Show all cherrypick checkins */
1498 int tmFlags = 0; /* Timeline flags */
1499 const char *zThisTag = 0; /* Suppress links to this tag */
1500 const char *zThisUser = 0; /* Suppress links to this user */
1501 HQuery url; /* URL for various branch links */
1502 int from_rid = name_to_typed_rid(P("from"),"ci"); /* from= for paths */
@@ -1509,10 +1511,11 @@
1511 char *zNewerButton = 0; /* URL for Newer button at the top */
1512 int selectedRid = -9999999; /* Show a highlight on this RID */
1513 int disableY = 0; /* Disable type selector on submenu */
1514 int advancedMenu = 0; /* Use the advanced menu design */
1515 char *zPlural; /* Ending for plural forms */
1516 int showCherrypicks = 1; /* True to show cherrypick merges */
1517
1518 /* Set number of rows to display */
1519 cookie_read_parameter("n","n");
1520 z = P("n");
1521 if( z==0 ) z = db_get("timeline-default-length",0);
@@ -1533,10 +1536,16 @@
1536 cgi_replace_query_parameter("n",z);
1537 cookie_write_parameter("n","n",0);
1538 tmFlags |= timeline_ss_submenu();
1539 cookie_link_parameter("advm","advm","0");
1540 advancedMenu = atoi(PD("advm","0"));
1541
1542 /* Omit all cherry-pick merge lines if the "ncp" query parameter is
1543 ** present or if this repository lacks a "cherrypick" table. */
1544 if( PB("ncp") || !db_table_exists("repository","cherrypick") ){
1545 showCherrypicks = 0;
1546 }
1547
1548 /* To view the timeline, must have permission to read project data.
1549 */
1550 pd_rid = name_to_typed_rid(P("dp"),"ci");
1551 if( pd_rid ){
@@ -1796,10 +1805,19 @@
1805 "INSERT INTO ok VALUES(%d);"
1806 "INSERT OR IGNORE INTO ok SELECT pid FROM plink WHERE cid=%d;"
1807 "INSERT OR IGNORE INTO ok SELECT cid FROM plink WHERE pid=%d;",
1808 f_rid, f_rid, f_rid
1809 );
1810 if( showCherrypicks ){
1811 db_multi_exec(
1812 "INSERT OR IGNORE INTO ok SELECT parentid FROM cherrypick"
1813 " WHERE childid=%d;"
1814 "INSERT OR IGNORE INTO ok SELECT childid FROM cherrypick"
1815 " WHERE parentid=%d;",
1816 f_rid, f_rid
1817 );
1818 }
1819 blob_append_sql(&sql, " AND event.objid IN ok");
1820 db_multi_exec("%s", blob_sql_text(&sql));
1821 if( useDividers ) selectedRid = f_rid;
1822 blob_appendf(&desc, "Parents and children of check-in ");
1823 zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid);
@@ -1827,10 +1845,18 @@
1845 blob_append_sql(&cond, " AND event.objid IN rnfile ");
1846 }
1847 if( forkOnly ){
1848 blob_append_sql(&cond, " AND event.objid IN rnfork ");
1849 }
1850 if( cpOnly && showCherrypicks ){
1851 db_multi_exec(
1852 "CREATE TABLE IF NOT EXISTS cpnodes(rid INTEGER PRIMARY KEY);"
1853 "INSERT OR IGNORE INTO cpnodes SELECT childid FROM cherrypick;"
1854 "INSERT OR IGNORE INTO cpnodes SELECT parentid FROM cherrypick;"
1855 );
1856 blob_append_sql(&cond, " AND event.objid IN cpnodes ");
1857 }
1858 if( bisectOnly ){
1859 blob_append_sql(&cond, " AND event.objid IN (SELECT rid FROM bilog) ");
1860 }
1861 if( zYearMonth ){
1862 blob_append_sql(&cond, " AND %Q=strftime('%%Y-%%m',event.mtime) ",
@@ -1907,22 +1933,24 @@
1933 db_multi_exec(
1934 "INSERT OR IGNORE INTO related_nodes"
1935 " SELECT cid FROM selected_nodes CROSS JOIN plink"
1936 " WHERE selected_nodes.rid=plink.pid;"
1937 );
1938 if( showCherrypicks ){
1939 db_multi_exec(
1940 "INSERT OR IGNORE INTO related_nodes"
1941 " SELECT childid FROM selected_nodes CROSS JOIN cherrypick"
1942 " WHERE selected_nodes.rid=cherrypick.parentid;"
1943 );
1944 }
1945 }
1946 if( showCherrypicks ){
1947 db_multi_exec(
1948 "INSERT OR IGNORE INTO related_nodes"
1949 " SELECT parentid FROM selected_nodes CROSS JOIN cherrypick"
1950 " WHERE selected_nodes.rid=cherrypick.childid;"
1951 );
 
 
 
 
 
1952 }
1953 if( (tmFlags & TIMELINE_UNHIDE)==0 ){
1954 db_multi_exec(
1955 "DELETE FROM related_nodes WHERE rid IN "
1956 " (SELECT related_nodes.rid FROM related_nodes, tagxref"
@@ -2075,10 +2103,14 @@
2103 tmFlags |= TIMELINE_DISJOINT;
2104 }
2105 if( bisectOnly ){
2106 blob_appendf(&desc, " in the most recent bisect");
2107 tmFlags |= TIMELINE_DISJOINT;
2108 }
2109 if( cpOnly && showCherrypicks ){
2110 blob_appendf(&desc, " that participate in a cherrypick merge");
2111 tmFlags |= TIMELINE_CHPICK;
2112 }
2113 if( zUser ){
2114 blob_appendf(&desc, " by user %h", zUser);
2115 tmFlags |= TIMELINE_DISJOINT;
2116 }
2117
--- test/graph-test-1.wiki
+++ test/graph-test-1.wiki
@@ -78,10 +78,16 @@
7878
screen, not from the andygoth-crlf branch.</a>
7979
* <a href="../../../timeline?a=b8c7af5b&n=12"
8080
target="testwindow">Check-in 2de15c8e has merge arrows from two
8181
different trunk check-ins. One of the merge risers also branches
8282
to check-in ea7f3297</a>
83
+ * <a href="../../../timeline?b=ae8709e2&n=25" target="testwindow">
84
+ Cherrypick merge arrows</a>
85
+ * <a href="../../../timeline?r=branch-1.37" target="testwindow">Branch
86
+ 1.37 with cherry-pick merges from trunk.</a>
87
+ * <a href="../../../timeline?f=68bd2e7bedb8d05a" target="testwindow">
88
+ Single check-in takes both a full merge and a cherrypick merge</a>
8389
8490
External:
8591
8692
* <a href="http://www.sqlite.org/src/timeline?c=2010-09-29&nd"
8793
target="testwindow">Timewarp due to a mis-configured system clock.</a>
8894
--- test/graph-test-1.wiki
+++ test/graph-test-1.wiki
@@ -78,10 +78,16 @@
78 screen, not from the andygoth-crlf branch.</a>
79 * <a href="../../../timeline?a=b8c7af5b&n=12"
80 target="testwindow">Check-in 2de15c8e has merge arrows from two
81 different trunk check-ins. One of the merge risers also branches
82 to check-in ea7f3297</a>
 
 
 
 
 
 
83
84 External:
85
86 * <a href="http://www.sqlite.org/src/timeline?c=2010-09-29&nd"
87 target="testwindow">Timewarp due to a mis-configured system clock.</a>
88
--- test/graph-test-1.wiki
+++ test/graph-test-1.wiki
@@ -78,10 +78,16 @@
78 screen, not from the andygoth-crlf branch.</a>
79 * <a href="../../../timeline?a=b8c7af5b&n=12"
80 target="testwindow">Check-in 2de15c8e has merge arrows from two
81 different trunk check-ins. One of the merge risers also branches
82 to check-in ea7f3297</a>
83 * <a href="../../../timeline?b=ae8709e2&n=25" target="testwindow">
84 Cherrypick merge arrows</a>
85 * <a href="../../../timeline?r=branch-1.37" target="testwindow">Branch
86 1.37 with cherry-pick merges from trunk.</a>
87 * <a href="../../../timeline?f=68bd2e7bedb8d05a" target="testwindow">
88 Single check-in takes both a full merge and a cherrypick merge</a>
89
90 External:
91
92 * <a href="http://www.sqlite.org/src/timeline?c=2010-09-29&nd"
93 target="testwindow">Timewarp due to a mis-configured system clock.</a>
94

Keyboard Shortcuts

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