Fossil SCM

Add support for multiple branch names in the doc-branch setting, as discussed in [forum:520d420d04e482b2 | forum post 520d420d04].

stephan 2024-10-23 18:21 trunk merge
Commit 40d0b360d2cf9d72b4430836a6ddef5a4e75a6859cfb339528250bf257be35e5
2 files changed +80 -63 +4 -3
+80 -63
--- src/search.c
+++ src/search.c
@@ -794,30 +794,38 @@
794794
SRCHFLG_STATIC|SRCHFLG_HTML);
795795
if( (srchFlags & SRCH_DOC)!=0 ){
796796
char *zDocGlob = db_get("doc-glob","");
797797
char *zDocBr = db_get("doc-branch","trunk");
798798
if( zDocGlob && zDocGlob[0] && zDocBr && zDocBr[0] ){
799
+ Glob * pGlob = glob_create(zDocBr)
800
+ /* We're misusing a Glob as a list of comma-/space-delimited
801
+ ** tokens. We're not actually doing glob matches here. */;
802
+ int i;
799803
db_multi_exec(
800804
"CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
801805
);
802
- db_multi_exec(
803
- "INSERT INTO x(label,url,score,id,date,snip)"
804
- " SELECT printf('Document: %%s',title('d',blob.rid,foci.filename)),"
805
- " printf('/doc/%T/%%s',foci.filename),"
806
- " search_score(),"
807
- " 'd'||blob.rid,"
808
- " (SELECT datetime(event.mtime) FROM event"
809
- " WHERE objid=symbolic_name_to_rid(%Q)),"
810
- " search_snippet()"
811
- " FROM foci CROSS JOIN blob"
812
- " WHERE checkinID=symbolic_name_to_rid(%Q)"
813
- " AND blob.uuid=foci.uuid"
814
- " AND search_match(title('d',blob.rid,foci.filename),"
815
- " body('d',blob.rid,foci.filename))"
816
- " AND %z",
817
- zDocBr, zDocBr, zDocBr, glob_expr("foci.filename", zDocGlob)
818
- );
806
+ for( i = 0; i < pGlob->nPattern; ++i ){
807
+ const char * zBranch = pGlob->azPattern[i];
808
+ db_multi_exec(
809
+ "INSERT INTO x(label,url,score,id,date,snip)"
810
+ " SELECT printf('Document: %%s',title('d',blob.rid,foci.filename)),"
811
+ " printf('/doc/%T/%%s',foci.filename),"
812
+ " search_score(),"
813
+ " 'd'||blob.rid,"
814
+ " (SELECT datetime(event.mtime) FROM event"
815
+ " WHERE objid=symbolic_name_to_rid(%Q)),"
816
+ " search_snippet()"
817
+ " FROM foci CROSS JOIN blob"
818
+ " WHERE checkinID=symbolic_name_to_rid(%Q)"
819
+ " AND blob.uuid=foci.uuid"
820
+ " AND search_match(title('d',blob.rid,foci.filename),"
821
+ " body('d',blob.rid,foci.filename))"
822
+ " AND %z",
823
+ zBranch, zBranch, zBranch, glob_expr("foci.filename", zDocGlob)
824
+ );
825
+ }
826
+ glob_free(pGlob);
819827
}
820828
fossil_free(zDocGlob);
821829
fossil_free(zDocBr);
822830
}
823831
if( (srchFlags & SRCH_WIKI)!=0 ){
@@ -1880,59 +1888,68 @@
18801888
** and if the latest check-in on doc-br is in the unindexed set of
18811889
** check-ins, then update all 'd' entries in FTSDOCS that have
18821890
** changed.
18831891
*/
18841892
static void search_update_doc_index(void){
1885
- const char *zDocBr = db_get("doc-branch","trunk");
1886
- int ckid = zDocBr ? symbolic_name_to_rid(zDocBr,"ci") : 0;
1887
- double rTime;
1888
- if( ckid==0 ) return;
1889
- if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1890
- " AND NOT idxed", ckid) ) return;
1891
-
1892
- /* If we get this far, it means that changes to 'd' entries are
1893
- ** required. */
1894
- rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1893
+ const char *zDocBranches = db_get("doc-branch","trunk");
1894
+ int i;
1895
+ Glob * pGlob = glob_create(zDocBranches)
1896
+ /* We're misusing a Glob as a list of comma-/space-delimited
1897
+ ** tokens. We're not actually doing glob matches here. */;
1898
+ if( !pGlob ) return;
18951899
db_multi_exec(
18961900
"CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);"
18971901
"CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
1898
- "INSERT OR IGNORE INTO current_docs(rid, name)"
1899
- " SELECT blob.rid, foci.filename FROM foci, blob"
1900
- " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1901
- " AND %z",
1902
- ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1903
- );
1904
- db_multi_exec(
1905
- "DELETE FROM ftsidx WHERE rowid IN"
1906
- " (SELECT rowid FROM ftsdocs WHERE type='d'"
1907
- " AND rid NOT IN (SELECT rid FROM current_docs))"
1908
- );
1909
- db_multi_exec(
1910
- "DELETE FROM ftsdocs WHERE type='d'"
1911
- " AND rid NOT IN (SELECT rid FROM current_docs)"
1912
- );
1913
- db_multi_exec(
1914
- "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1915
- " SELECT 'd', rid, name, 0,"
1916
- " title('d',rid,name),"
1917
- " body('d',rid,name),"
1918
- " printf('/doc/%T/%%s',urlencode(name)),"
1919
- " %.17g"
1920
- " FROM current_docs",
1921
- zDocBr, rTime
1922
- );
1923
- db_multi_exec(
1924
- "INSERT INTO ftsidx(rowid,title,body)"
1925
- " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1926
- );
1927
- db_multi_exec(
1928
- "UPDATE ftsdocs SET"
1929
- " idxed=1,"
1930
- " bx=NULL,"
1931
- " label='Document: '||label"
1932
- " WHERE type='d' AND NOT idxed"
1933
- );
1902
+ );
1903
+ for( i = 0; i < pGlob->nPattern; ++i ){
1904
+ const char *zDocBr = pGlob->azPattern[i];
1905
+ int ckid = symbolic_name_to_rid(zDocBr,"ci");
1906
+ double rTime;
1907
+ if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1908
+ " AND NOT idxed", ckid) ) continue;
1909
+ /* If we get this far, it means that changes to 'd' entries are
1910
+ ** required. */
1911
+ rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1912
+ db_multi_exec(
1913
+ "INSERT OR IGNORE INTO current_docs(rid, name)"
1914
+ " SELECT blob.rid, foci.filename FROM foci, blob"
1915
+ " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1916
+ " AND %z",
1917
+ ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1918
+ );
1919
+ db_multi_exec(
1920
+ "DELETE FROM ftsidx WHERE rowid IN"
1921
+ " (SELECT rowid FROM ftsdocs WHERE type='d'"
1922
+ " AND rid NOT IN (SELECT rid FROM current_docs))"
1923
+ );
1924
+ db_multi_exec(
1925
+ "DELETE FROM ftsdocs WHERE type='d'"
1926
+ " AND rid NOT IN (SELECT rid FROM current_docs)"
1927
+ );
1928
+ db_multi_exec(
1929
+ "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1930
+ " SELECT 'd', rid, name, 0,"
1931
+ " title('d',rid,name),"
1932
+ " body('d',rid,name),"
1933
+ " printf('/doc/%T/%%s',urlencode(name)),"
1934
+ " %.17g"
1935
+ " FROM current_docs",
1936
+ zDocBr, rTime
1937
+ );
1938
+ db_multi_exec(
1939
+ "INSERT INTO ftsidx(rowid,title,body)"
1940
+ " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1941
+ );
1942
+ db_multi_exec(
1943
+ "UPDATE ftsdocs SET"
1944
+ " idxed=1,"
1945
+ " bx=NULL,"
1946
+ " label='Document: '||label"
1947
+ " WHERE type='d' AND NOT idxed"
1948
+ );
1949
+ }
1950
+ glob_free(pGlob);
19341951
}
19351952
19361953
/*
19371954
** Deal with all of the unindexed 'c' terms in FTSDOCS
19381955
*/
19391956
--- src/search.c
+++ src/search.c
@@ -794,30 +794,38 @@
794 SRCHFLG_STATIC|SRCHFLG_HTML);
795 if( (srchFlags & SRCH_DOC)!=0 ){
796 char *zDocGlob = db_get("doc-glob","");
797 char *zDocBr = db_get("doc-branch","trunk");
798 if( zDocGlob && zDocGlob[0] && zDocBr && zDocBr[0] ){
 
 
 
 
799 db_multi_exec(
800 "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
801 );
802 db_multi_exec(
803 "INSERT INTO x(label,url,score,id,date,snip)"
804 " SELECT printf('Document: %%s',title('d',blob.rid,foci.filename)),"
805 " printf('/doc/%T/%%s',foci.filename),"
806 " search_score(),"
807 " 'd'||blob.rid,"
808 " (SELECT datetime(event.mtime) FROM event"
809 " WHERE objid=symbolic_name_to_rid(%Q)),"
810 " search_snippet()"
811 " FROM foci CROSS JOIN blob"
812 " WHERE checkinID=symbolic_name_to_rid(%Q)"
813 " AND blob.uuid=foci.uuid"
814 " AND search_match(title('d',blob.rid,foci.filename),"
815 " body('d',blob.rid,foci.filename))"
816 " AND %z",
817 zDocBr, zDocBr, zDocBr, glob_expr("foci.filename", zDocGlob)
818 );
 
 
 
 
819 }
820 fossil_free(zDocGlob);
821 fossil_free(zDocBr);
822 }
823 if( (srchFlags & SRCH_WIKI)!=0 ){
@@ -1880,59 +1888,68 @@
1880 ** and if the latest check-in on doc-br is in the unindexed set of
1881 ** check-ins, then update all 'd' entries in FTSDOCS that have
1882 ** changed.
1883 */
1884 static void search_update_doc_index(void){
1885 const char *zDocBr = db_get("doc-branch","trunk");
1886 int ckid = zDocBr ? symbolic_name_to_rid(zDocBr,"ci") : 0;
1887 double rTime;
1888 if( ckid==0 ) return;
1889 if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1890 " AND NOT idxed", ckid) ) return;
1891
1892 /* If we get this far, it means that changes to 'd' entries are
1893 ** required. */
1894 rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1895 db_multi_exec(
1896 "CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);"
1897 "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
1898 "INSERT OR IGNORE INTO current_docs(rid, name)"
1899 " SELECT blob.rid, foci.filename FROM foci, blob"
1900 " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1901 " AND %z",
1902 ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1903 );
1904 db_multi_exec(
1905 "DELETE FROM ftsidx WHERE rowid IN"
1906 " (SELECT rowid FROM ftsdocs WHERE type='d'"
1907 " AND rid NOT IN (SELECT rid FROM current_docs))"
1908 );
1909 db_multi_exec(
1910 "DELETE FROM ftsdocs WHERE type='d'"
1911 " AND rid NOT IN (SELECT rid FROM current_docs)"
1912 );
1913 db_multi_exec(
1914 "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1915 " SELECT 'd', rid, name, 0,"
1916 " title('d',rid,name),"
1917 " body('d',rid,name),"
1918 " printf('/doc/%T/%%s',urlencode(name)),"
1919 " %.17g"
1920 " FROM current_docs",
1921 zDocBr, rTime
1922 );
1923 db_multi_exec(
1924 "INSERT INTO ftsidx(rowid,title,body)"
1925 " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1926 );
1927 db_multi_exec(
1928 "UPDATE ftsdocs SET"
1929 " idxed=1,"
1930 " bx=NULL,"
1931 " label='Document: '||label"
1932 " WHERE type='d' AND NOT idxed"
1933 );
 
 
 
 
 
 
 
 
 
 
 
 
 
1934 }
1935
1936 /*
1937 ** Deal with all of the unindexed 'c' terms in FTSDOCS
1938 */
1939
--- src/search.c
+++ src/search.c
@@ -794,30 +794,38 @@
794 SRCHFLG_STATIC|SRCHFLG_HTML);
795 if( (srchFlags & SRCH_DOC)!=0 ){
796 char *zDocGlob = db_get("doc-glob","");
797 char *zDocBr = db_get("doc-branch","trunk");
798 if( zDocGlob && zDocGlob[0] && zDocBr && zDocBr[0] ){
799 Glob * pGlob = glob_create(zDocBr)
800 /* We're misusing a Glob as a list of comma-/space-delimited
801 ** tokens. We're not actually doing glob matches here. */;
802 int i;
803 db_multi_exec(
804 "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
805 );
806 for( i = 0; i < pGlob->nPattern; ++i ){
807 const char * zBranch = pGlob->azPattern[i];
808 db_multi_exec(
809 "INSERT INTO x(label,url,score,id,date,snip)"
810 " SELECT printf('Document: %%s',title('d',blob.rid,foci.filename)),"
811 " printf('/doc/%T/%%s',foci.filename),"
812 " search_score(),"
813 " 'd'||blob.rid,"
814 " (SELECT datetime(event.mtime) FROM event"
815 " WHERE objid=symbolic_name_to_rid(%Q)),"
816 " search_snippet()"
817 " FROM foci CROSS JOIN blob"
818 " WHERE checkinID=symbolic_name_to_rid(%Q)"
819 " AND blob.uuid=foci.uuid"
820 " AND search_match(title('d',blob.rid,foci.filename),"
821 " body('d',blob.rid,foci.filename))"
822 " AND %z",
823 zBranch, zBranch, zBranch, glob_expr("foci.filename", zDocGlob)
824 );
825 }
826 glob_free(pGlob);
827 }
828 fossil_free(zDocGlob);
829 fossil_free(zDocBr);
830 }
831 if( (srchFlags & SRCH_WIKI)!=0 ){
@@ -1880,59 +1888,68 @@
1888 ** and if the latest check-in on doc-br is in the unindexed set of
1889 ** check-ins, then update all 'd' entries in FTSDOCS that have
1890 ** changed.
1891 */
1892 static void search_update_doc_index(void){
1893 const char *zDocBranches = db_get("doc-branch","trunk");
1894 int i;
1895 Glob * pGlob = glob_create(zDocBranches)
1896 /* We're misusing a Glob as a list of comma-/space-delimited
1897 ** tokens. We're not actually doing glob matches here. */;
1898 if( !pGlob ) return;
 
 
 
 
1899 db_multi_exec(
1900 "CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);"
1901 "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
1902 );
1903 for( i = 0; i < pGlob->nPattern; ++i ){
1904 const char *zDocBr = pGlob->azPattern[i];
1905 int ckid = symbolic_name_to_rid(zDocBr,"ci");
1906 double rTime;
1907 if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1908 " AND NOT idxed", ckid) ) continue;
1909 /* If we get this far, it means that changes to 'd' entries are
1910 ** required. */
1911 rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1912 db_multi_exec(
1913 "INSERT OR IGNORE INTO current_docs(rid, name)"
1914 " SELECT blob.rid, foci.filename FROM foci, blob"
1915 " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1916 " AND %z",
1917 ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1918 );
1919 db_multi_exec(
1920 "DELETE FROM ftsidx WHERE rowid IN"
1921 " (SELECT rowid FROM ftsdocs WHERE type='d'"
1922 " AND rid NOT IN (SELECT rid FROM current_docs))"
1923 );
1924 db_multi_exec(
1925 "DELETE FROM ftsdocs WHERE type='d'"
1926 " AND rid NOT IN (SELECT rid FROM current_docs)"
1927 );
1928 db_multi_exec(
1929 "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1930 " SELECT 'd', rid, name, 0,"
1931 " title('d',rid,name),"
1932 " body('d',rid,name),"
1933 " printf('/doc/%T/%%s',urlencode(name)),"
1934 " %.17g"
1935 " FROM current_docs",
1936 zDocBr, rTime
1937 );
1938 db_multi_exec(
1939 "INSERT INTO ftsidx(rowid,title,body)"
1940 " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1941 );
1942 db_multi_exec(
1943 "UPDATE ftsdocs SET"
1944 " idxed=1,"
1945 " bx=NULL,"
1946 " label='Document: '||label"
1947 " WHERE type='d' AND NOT idxed"
1948 );
1949 }
1950 glob_free(pGlob);
1951 }
1952
1953 /*
1954 ** Deal with all of the unindexed 'c' terms in FTSDOCS
1955 */
1956
+4 -3
--- src/setup.c
+++ src/setup.c
@@ -2187,14 +2187,15 @@
21872187
@ <tr><td>*<td><td>Search all checked-in files</tr>
21882188
@ <tr><td><i>(blank)</i><td>
21892189
@ <td>Search nothing. (Disables document search).</tr>
21902190
@ </table>
21912191
@ <hr>
2192
- entry_attribute("Document Branch", 20, "doc-branch", "db", "trunk", 0);
2192
+ entry_attribute("Document Branches", 20, "doc-branch", "db", "trunk", 0);
21932193
@ <p>When searching documents, use the versions of the files found at the
2194
- @ type of the "Document Branch" branch. Recommended value: "trunk".
2195
- @ Document search is disabled if blank.
2194
+ @ type of the "Document Branches" branch. Recommended value: "trunk".
2195
+ @ Document search is disabled if blank. It may be a list of branch names
2196
+ @ separated by spaces and/or commas.
21962197
@ <hr>
21972198
onoff_attribute("Search Check-in Comments", "search-ci", "sc", 0, 0);
21982199
@ <br>
21992200
onoff_attribute("Search Documents", "search-doc", "sd", 0, 0);
22002201
@ <br>
22012202
--- src/setup.c
+++ src/setup.c
@@ -2187,14 +2187,15 @@
2187 @ <tr><td>*<td><td>Search all checked-in files</tr>
2188 @ <tr><td><i>(blank)</i><td>
2189 @ <td>Search nothing. (Disables document search).</tr>
2190 @ </table>
2191 @ <hr>
2192 entry_attribute("Document Branch", 20, "doc-branch", "db", "trunk", 0);
2193 @ <p>When searching documents, use the versions of the files found at the
2194 @ type of the "Document Branch" branch. Recommended value: "trunk".
2195 @ Document search is disabled if blank.
 
2196 @ <hr>
2197 onoff_attribute("Search Check-in Comments", "search-ci", "sc", 0, 0);
2198 @ <br>
2199 onoff_attribute("Search Documents", "search-doc", "sd", 0, 0);
2200 @ <br>
2201
--- src/setup.c
+++ src/setup.c
@@ -2187,14 +2187,15 @@
2187 @ <tr><td>*<td><td>Search all checked-in files</tr>
2188 @ <tr><td><i>(blank)</i><td>
2189 @ <td>Search nothing. (Disables document search).</tr>
2190 @ </table>
2191 @ <hr>
2192 entry_attribute("Document Branches", 20, "doc-branch", "db", "trunk", 0);
2193 @ <p>When searching documents, use the versions of the files found at the
2194 @ type of the "Document Branches" branch. Recommended value: "trunk".
2195 @ Document search is disabled if blank. It may be a list of branch names
2196 @ separated by spaces and/or commas.
2197 @ <hr>
2198 onoff_attribute("Search Check-in Comments", "search-ci", "sc", 0, 0);
2199 @ <br>
2200 onoff_attribute("Search Documents", "search-doc", "sd", 0, 0);
2201 @ <br>
2202

Keyboard Shortcuts

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