Fossil SCM
Allow check-in specifications of the form "root:BRANCH" where BRANCH is a branch name. Such a spec refers to the point on the parent branch from which the branch is derived. Useful for doing a diff of an entire branch, for example, using "fossil diff --from root:xyz --to xyz".
Commit
a4e01221c8c42544b306471933af770a64a51d17
Parent
31545360abfca7a…
1 file changed
+25
-2
+25
-2
| --- src/name.c | ||
| +++ src/name.c | ||
| @@ -141,21 +141,44 @@ | ||
| 141 | 141 | &zTag[4], zType); |
| 142 | 142 | return rid; |
| 143 | 143 | } |
| 144 | 144 | |
| 145 | 145 | /* "tag:" + symbolic-name */ |
| 146 | - if( memcmp(zTag, "tag:", 4)==0 ){ | |
| 146 | + if( memcmp(zTag, "tag:", 4)==0 | |
| 147 | + || memcmp(zTag, "root:", 5)==0 | |
| 148 | + ){ | |
| 149 | + int isRoot = zTag[0]=='r'; | |
| 147 | 150 | rid = db_int(0, |
| 148 | 151 | "SELECT event.objid" |
| 149 | 152 | " FROM tag, tagxref, event" |
| 150 | 153 | " WHERE tag.tagname='sym-%q' " |
| 151 | 154 | " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 " |
| 152 | 155 | " AND event.objid=tagxref.rid " |
| 153 | 156 | " AND event.type GLOB '%q'" |
| 154 | 157 | " ORDER BY event.mtime DESC /*sort*/", |
| 155 | - &zTag[4], zType | |
| 158 | + &zTag[4+isRoot], zType | |
| 156 | 159 | ); |
| 160 | + if( isRoot && rid>0 ){ | |
| 161 | + Stmt q; | |
| 162 | + int rc; | |
| 163 | + db_prepare(&q, | |
| 164 | + "SELECT pid, EXISTS(SELECT 1 FROM tagxref" | |
| 165 | + " WHERE tagid=%d AND tagtype>0" | |
| 166 | + " AND value=%Q AND rid=plink.pid)" | |
| 167 | + " FROM plink" | |
| 168 | + " WHERE cid=:cid AND isprim", | |
| 169 | + TAG_BRANCH, &zTag[5] | |
| 170 | + ); | |
| 171 | + do{ | |
| 172 | + db_reset(&q); | |
| 173 | + db_bind_int(&q, ":cid", rid); | |
| 174 | + rc = db_step(&q); | |
| 175 | + if( rc!=SQLITE_ROW ) break; | |
| 176 | + rid = db_column_int(&q, 0); | |
| 177 | + }while( db_column_int(&q, 1)==1 && rid>0 ); | |
| 178 | + db_finalize(&q); | |
| 179 | + } | |
| 157 | 180 | return rid; |
| 158 | 181 | } |
| 159 | 182 | |
| 160 | 183 | /* symbolic-name ":" date-time */ |
| 161 | 184 | nTag = strlen(zTag); |
| 162 | 185 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -141,21 +141,44 @@ | |
| 141 | &zTag[4], zType); |
| 142 | return rid; |
| 143 | } |
| 144 | |
| 145 | /* "tag:" + symbolic-name */ |
| 146 | if( memcmp(zTag, "tag:", 4)==0 ){ |
| 147 | rid = db_int(0, |
| 148 | "SELECT event.objid" |
| 149 | " FROM tag, tagxref, event" |
| 150 | " WHERE tag.tagname='sym-%q' " |
| 151 | " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 " |
| 152 | " AND event.objid=tagxref.rid " |
| 153 | " AND event.type GLOB '%q'" |
| 154 | " ORDER BY event.mtime DESC /*sort*/", |
| 155 | &zTag[4], zType |
| 156 | ); |
| 157 | return rid; |
| 158 | } |
| 159 | |
| 160 | /* symbolic-name ":" date-time */ |
| 161 | nTag = strlen(zTag); |
| 162 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -141,21 +141,44 @@ | |
| 141 | &zTag[4], zType); |
| 142 | return rid; |
| 143 | } |
| 144 | |
| 145 | /* "tag:" + symbolic-name */ |
| 146 | if( memcmp(zTag, "tag:", 4)==0 |
| 147 | || memcmp(zTag, "root:", 5)==0 |
| 148 | ){ |
| 149 | int isRoot = zTag[0]=='r'; |
| 150 | rid = db_int(0, |
| 151 | "SELECT event.objid" |
| 152 | " FROM tag, tagxref, event" |
| 153 | " WHERE tag.tagname='sym-%q' " |
| 154 | " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 " |
| 155 | " AND event.objid=tagxref.rid " |
| 156 | " AND event.type GLOB '%q'" |
| 157 | " ORDER BY event.mtime DESC /*sort*/", |
| 158 | &zTag[4+isRoot], zType |
| 159 | ); |
| 160 | if( isRoot && rid>0 ){ |
| 161 | Stmt q; |
| 162 | int rc; |
| 163 | db_prepare(&q, |
| 164 | "SELECT pid, EXISTS(SELECT 1 FROM tagxref" |
| 165 | " WHERE tagid=%d AND tagtype>0" |
| 166 | " AND value=%Q AND rid=plink.pid)" |
| 167 | " FROM plink" |
| 168 | " WHERE cid=:cid AND isprim", |
| 169 | TAG_BRANCH, &zTag[5] |
| 170 | ); |
| 171 | do{ |
| 172 | db_reset(&q); |
| 173 | db_bind_int(&q, ":cid", rid); |
| 174 | rc = db_step(&q); |
| 175 | if( rc!=SQLITE_ROW ) break; |
| 176 | rid = db_column_int(&q, 0); |
| 177 | }while( db_column_int(&q, 1)==1 && rid>0 ); |
| 178 | db_finalize(&q); |
| 179 | } |
| 180 | return rid; |
| 181 | } |
| 182 | |
| 183 | /* symbolic-name ":" date-time */ |
| 184 | nTag = strlen(zTag); |
| 185 |