Fossil SCM

New ml=TAGLIST query parameter to /timeline works like "tl=TAGLIST with "mionly".

drh 2024-12-24 03:24 rl-determines-graph-order
Commit 7f06e5ca6e5e94f145c091a5623f1308aaad95478d600cf7012b67179e007576
1 file changed +17 -8
+17 -8
--- src/timeline.c
+++ src/timeline.c
@@ -1552,10 +1552,11 @@
15521552
** from=CX ... shortest path from CX up to CHECKIN
15531553
** t=TAG Show only check-ins with the given TAG
15541554
** r=TAG Show check-ins related to TAG, equivalent to t=TAG&rel
15551555
** tl=TAGLIST Same as 't=TAGLIST&ms=brlist'
15561556
** rl=TAGLIST Same as 'r=TAGLIST&ms=brlist'
1557
+** ml=TAGLIST Same as 't=TAGLIST&ms=brlist&mionly'
15571558
** bo=TAGLIST Show branches of the graph in the order defined TAGLIST
15581559
** rel Show related check-ins as well as those matching t=TAG
15591560
** mionly Limit rel to show ancestors but not descendants
15601561
** nowiki Do not show wiki associated with branch or tag
15611562
** ms=MATCHSTYLE Set tag match style to EXACT, GLOB, LIKE, REGEXP
@@ -1691,10 +1692,13 @@
16911692
login_check_credentials();
16921693
url_initialize(&url, "timeline");
16931694
cgi_query_parameters_to_url(&url);
16941695
blob_init(&allSql, 0, 0);
16951696
1697
+ /* The "mionly" query parameter is like "rel", but shows merge-ins only */
1698
+ if( P("mionly")!=0 ) related = 2;
1699
+
16961700
(void)P_NoBot("ss")
16971701
/* "ss" is processed via the udc but at least one spider likes to
16981702
** try to SQL inject via this argument, so let's catch that. */;
16991703
17001704
/* Set number of rows to display */
@@ -1811,14 +1815,19 @@
18111815
if( zBrName==0 && zTagName==0 ){
18121816
const char *z;
18131817
if( (z = P("tl"))!=0 ){
18141818
zTagName = z;
18151819
zMatchStyle = "brlist";
1816
- }
1820
+ }else
18171821
if( (z = P("rl"))!=0 ){
18181822
zBrName = z;
1819
- related = 1;
1823
+ if( related==0 ) related = 1;
1824
+ zMatchStyle = "brlist";
1825
+ }else
1826
+ if( (z = P("ml"))!=0 ){
1827
+ zBrName = z;
1828
+ if( related==0 ) related = 2;
18201829
zMatchStyle = "brlist";
18211830
}
18221831
}
18231832
18241833
/* Convert r=TAG to t=TAG&rel in order to populate the UI style widgets. */
@@ -1825,11 +1834,11 @@
18251834
if( zBrName ){
18261835
cgi_delete_query_parameter("r");
18271836
cgi_set_query_parameter("t", zBrName); (void)P("t");
18281837
cgi_set_query_parameter("rel", "1");
18291838
zTagName = zBrName;
1830
- related = 1;
1839
+ if( related==0 ) related = 1;
18311840
zType = "ci";
18321841
}
18331842
18341843
/* Ignore empty tag query strings. */
18351844
if( zTagName && !*zTagName ){
@@ -2089,17 +2098,17 @@
20892098
}
20902099
}
20912100
path_reset();
20922101
db_multi_exec("%s", blob_str(&ins)/*safe-for-%s*/);
20932102
blob_reset(&ins);
2094
- if( related || P("mionly") ){
2103
+ if( related ){
20952104
db_multi_exec(
20962105
"CREATE TEMP TABLE IF NOT EXISTS related(x INTEGER PRIMARY KEY);"
20972106
"INSERT OR IGNORE INTO related(x)"
20982107
" SELECT pid FROM plink WHERE cid IN pathnode AND NOT isprim;"
20992108
);
2100
- if( P("mionly")==0 ){
2109
+ if( related==1 ){
21012110
db_multi_exec(
21022111
"INSERT OR IGNORE INTO related(x)"
21032112
" SELECT cid FROM plink WHERE pid IN pathnode;"
21042113
);
21052114
}
@@ -2106,11 +2115,11 @@
21062115
if( showCherrypicks ){
21072116
db_multi_exec(
21082117
"INSERT OR IGNORE INTO related(x)"
21092118
" SELECT parentid FROM cherrypick WHERE childid IN pathnode;"
21102119
);
2111
- if( P("mionly")==0 ){
2120
+ if( related==1 ){
21122121
db_multi_exec(
21132122
"INSERT OR IGNORE INTO related(x)"
21142123
" SELECT childid FROM cherrypick WHERE parentid IN pathnode;"
21152124
);
21162125
}
@@ -2536,11 +2545,11 @@
25362545
int ridMark = name_to_rid(zMark);
25372546
db_multi_exec(
25382547
"INSERT OR IGNORE INTO selected_nodes(rid) VALUES(%d)", ridMark);
25392548
}
25402549
add_extra_rids("selected_nodes",P("x"));
2541
- if( !related && !PB("mionly") ){
2550
+ if( related==0 ){
25422551
blob_append_sql(&cond, " AND blob.rid IN selected_nodes");
25432552
}else{
25442553
db_multi_exec(
25452554
"CREATE TEMP TABLE related_nodes(rid INTEGER PRIMARY KEY);"
25462555
"INSERT INTO related_nodes SELECT rid FROM selected_nodes;"
@@ -2555,11 +2564,11 @@
25552564
db_multi_exec(
25562565
"INSERT OR IGNORE INTO related_nodes\n"
25572566
" SELECT pid FROM selected_nodes CROSS JOIN plink\n"
25582567
" WHERE selected_nodes.rid=plink.cid;"
25592568
);
2560
- if( P("mionly")==0 ){
2569
+ if( related==1 ){
25612570
db_multi_exec(
25622571
"INSERT OR IGNORE INTO related_nodes\n"
25632572
" SELECT cid FROM selected_nodes CROSS JOIN plink\n"
25642573
" WHERE selected_nodes.rid=plink.pid;"
25652574
);
25662575
--- src/timeline.c
+++ src/timeline.c
@@ -1552,10 +1552,11 @@
1552 ** from=CX ... shortest path from CX up to CHECKIN
1553 ** t=TAG Show only check-ins with the given TAG
1554 ** r=TAG Show check-ins related to TAG, equivalent to t=TAG&rel
1555 ** tl=TAGLIST Same as 't=TAGLIST&ms=brlist'
1556 ** rl=TAGLIST Same as 'r=TAGLIST&ms=brlist'
 
1557 ** bo=TAGLIST Show branches of the graph in the order defined TAGLIST
1558 ** rel Show related check-ins as well as those matching t=TAG
1559 ** mionly Limit rel to show ancestors but not descendants
1560 ** nowiki Do not show wiki associated with branch or tag
1561 ** ms=MATCHSTYLE Set tag match style to EXACT, GLOB, LIKE, REGEXP
@@ -1691,10 +1692,13 @@
1691 login_check_credentials();
1692 url_initialize(&url, "timeline");
1693 cgi_query_parameters_to_url(&url);
1694 blob_init(&allSql, 0, 0);
1695
 
 
 
1696 (void)P_NoBot("ss")
1697 /* "ss" is processed via the udc but at least one spider likes to
1698 ** try to SQL inject via this argument, so let's catch that. */;
1699
1700 /* Set number of rows to display */
@@ -1811,14 +1815,19 @@
1811 if( zBrName==0 && zTagName==0 ){
1812 const char *z;
1813 if( (z = P("tl"))!=0 ){
1814 zTagName = z;
1815 zMatchStyle = "brlist";
1816 }
1817 if( (z = P("rl"))!=0 ){
1818 zBrName = z;
1819 related = 1;
 
 
 
 
 
1820 zMatchStyle = "brlist";
1821 }
1822 }
1823
1824 /* Convert r=TAG to t=TAG&rel in order to populate the UI style widgets. */
@@ -1825,11 +1834,11 @@
1825 if( zBrName ){
1826 cgi_delete_query_parameter("r");
1827 cgi_set_query_parameter("t", zBrName); (void)P("t");
1828 cgi_set_query_parameter("rel", "1");
1829 zTagName = zBrName;
1830 related = 1;
1831 zType = "ci";
1832 }
1833
1834 /* Ignore empty tag query strings. */
1835 if( zTagName && !*zTagName ){
@@ -2089,17 +2098,17 @@
2089 }
2090 }
2091 path_reset();
2092 db_multi_exec("%s", blob_str(&ins)/*safe-for-%s*/);
2093 blob_reset(&ins);
2094 if( related || P("mionly") ){
2095 db_multi_exec(
2096 "CREATE TEMP TABLE IF NOT EXISTS related(x INTEGER PRIMARY KEY);"
2097 "INSERT OR IGNORE INTO related(x)"
2098 " SELECT pid FROM plink WHERE cid IN pathnode AND NOT isprim;"
2099 );
2100 if( P("mionly")==0 ){
2101 db_multi_exec(
2102 "INSERT OR IGNORE INTO related(x)"
2103 " SELECT cid FROM plink WHERE pid IN pathnode;"
2104 );
2105 }
@@ -2106,11 +2115,11 @@
2106 if( showCherrypicks ){
2107 db_multi_exec(
2108 "INSERT OR IGNORE INTO related(x)"
2109 " SELECT parentid FROM cherrypick WHERE childid IN pathnode;"
2110 );
2111 if( P("mionly")==0 ){
2112 db_multi_exec(
2113 "INSERT OR IGNORE INTO related(x)"
2114 " SELECT childid FROM cherrypick WHERE parentid IN pathnode;"
2115 );
2116 }
@@ -2536,11 +2545,11 @@
2536 int ridMark = name_to_rid(zMark);
2537 db_multi_exec(
2538 "INSERT OR IGNORE INTO selected_nodes(rid) VALUES(%d)", ridMark);
2539 }
2540 add_extra_rids("selected_nodes",P("x"));
2541 if( !related && !PB("mionly") ){
2542 blob_append_sql(&cond, " AND blob.rid IN selected_nodes");
2543 }else{
2544 db_multi_exec(
2545 "CREATE TEMP TABLE related_nodes(rid INTEGER PRIMARY KEY);"
2546 "INSERT INTO related_nodes SELECT rid FROM selected_nodes;"
@@ -2555,11 +2564,11 @@
2555 db_multi_exec(
2556 "INSERT OR IGNORE INTO related_nodes\n"
2557 " SELECT pid FROM selected_nodes CROSS JOIN plink\n"
2558 " WHERE selected_nodes.rid=plink.cid;"
2559 );
2560 if( P("mionly")==0 ){
2561 db_multi_exec(
2562 "INSERT OR IGNORE INTO related_nodes\n"
2563 " SELECT cid FROM selected_nodes CROSS JOIN plink\n"
2564 " WHERE selected_nodes.rid=plink.pid;"
2565 );
2566
--- src/timeline.c
+++ src/timeline.c
@@ -1552,10 +1552,11 @@
1552 ** from=CX ... shortest path from CX up to CHECKIN
1553 ** t=TAG Show only check-ins with the given TAG
1554 ** r=TAG Show check-ins related to TAG, equivalent to t=TAG&rel
1555 ** tl=TAGLIST Same as 't=TAGLIST&ms=brlist'
1556 ** rl=TAGLIST Same as 'r=TAGLIST&ms=brlist'
1557 ** ml=TAGLIST Same as 't=TAGLIST&ms=brlist&mionly'
1558 ** bo=TAGLIST Show branches of the graph in the order defined TAGLIST
1559 ** rel Show related check-ins as well as those matching t=TAG
1560 ** mionly Limit rel to show ancestors but not descendants
1561 ** nowiki Do not show wiki associated with branch or tag
1562 ** ms=MATCHSTYLE Set tag match style to EXACT, GLOB, LIKE, REGEXP
@@ -1691,10 +1692,13 @@
1692 login_check_credentials();
1693 url_initialize(&url, "timeline");
1694 cgi_query_parameters_to_url(&url);
1695 blob_init(&allSql, 0, 0);
1696
1697 /* The "mionly" query parameter is like "rel", but shows merge-ins only */
1698 if( P("mionly")!=0 ) related = 2;
1699
1700 (void)P_NoBot("ss")
1701 /* "ss" is processed via the udc but at least one spider likes to
1702 ** try to SQL inject via this argument, so let's catch that. */;
1703
1704 /* Set number of rows to display */
@@ -1811,14 +1815,19 @@
1815 if( zBrName==0 && zTagName==0 ){
1816 const char *z;
1817 if( (z = P("tl"))!=0 ){
1818 zTagName = z;
1819 zMatchStyle = "brlist";
1820 }else
1821 if( (z = P("rl"))!=0 ){
1822 zBrName = z;
1823 if( related==0 ) related = 1;
1824 zMatchStyle = "brlist";
1825 }else
1826 if( (z = P("ml"))!=0 ){
1827 zBrName = z;
1828 if( related==0 ) related = 2;
1829 zMatchStyle = "brlist";
1830 }
1831 }
1832
1833 /* Convert r=TAG to t=TAG&rel in order to populate the UI style widgets. */
@@ -1825,11 +1834,11 @@
1834 if( zBrName ){
1835 cgi_delete_query_parameter("r");
1836 cgi_set_query_parameter("t", zBrName); (void)P("t");
1837 cgi_set_query_parameter("rel", "1");
1838 zTagName = zBrName;
1839 if( related==0 ) related = 1;
1840 zType = "ci";
1841 }
1842
1843 /* Ignore empty tag query strings. */
1844 if( zTagName && !*zTagName ){
@@ -2089,17 +2098,17 @@
2098 }
2099 }
2100 path_reset();
2101 db_multi_exec("%s", blob_str(&ins)/*safe-for-%s*/);
2102 blob_reset(&ins);
2103 if( related ){
2104 db_multi_exec(
2105 "CREATE TEMP TABLE IF NOT EXISTS related(x INTEGER PRIMARY KEY);"
2106 "INSERT OR IGNORE INTO related(x)"
2107 " SELECT pid FROM plink WHERE cid IN pathnode AND NOT isprim;"
2108 );
2109 if( related==1 ){
2110 db_multi_exec(
2111 "INSERT OR IGNORE INTO related(x)"
2112 " SELECT cid FROM plink WHERE pid IN pathnode;"
2113 );
2114 }
@@ -2106,11 +2115,11 @@
2115 if( showCherrypicks ){
2116 db_multi_exec(
2117 "INSERT OR IGNORE INTO related(x)"
2118 " SELECT parentid FROM cherrypick WHERE childid IN pathnode;"
2119 );
2120 if( related==1 ){
2121 db_multi_exec(
2122 "INSERT OR IGNORE INTO related(x)"
2123 " SELECT childid FROM cherrypick WHERE parentid IN pathnode;"
2124 );
2125 }
@@ -2536,11 +2545,11 @@
2545 int ridMark = name_to_rid(zMark);
2546 db_multi_exec(
2547 "INSERT OR IGNORE INTO selected_nodes(rid) VALUES(%d)", ridMark);
2548 }
2549 add_extra_rids("selected_nodes",P("x"));
2550 if( related==0 ){
2551 blob_append_sql(&cond, " AND blob.rid IN selected_nodes");
2552 }else{
2553 db_multi_exec(
2554 "CREATE TEMP TABLE related_nodes(rid INTEGER PRIMARY KEY);"
2555 "INSERT INTO related_nodes SELECT rid FROM selected_nodes;"
@@ -2555,11 +2564,11 @@
2564 db_multi_exec(
2565 "INSERT OR IGNORE INTO related_nodes\n"
2566 " SELECT pid FROM selected_nodes CROSS JOIN plink\n"
2567 " WHERE selected_nodes.rid=plink.cid;"
2568 );
2569 if( related==1 ){
2570 db_multi_exec(
2571 "INSERT OR IGNORE INTO related_nodes\n"
2572 " SELECT cid FROM selected_nodes CROSS JOIN plink\n"
2573 " WHERE selected_nodes.rid=plink.pid;"
2574 );
2575

Keyboard Shortcuts

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