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".

drh 2012-07-14 04:43 UTC trunk
Commit a4e01221c8c42544b306471933af770a64a51d17
1 file changed +25 -2
+25 -2
--- src/name.c
+++ src/name.c
@@ -141,21 +141,44 @@
141141
&zTag[4], zType);
142142
return rid;
143143
}
144144
145145
/* "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';
147150
rid = db_int(0,
148151
"SELECT event.objid"
149152
" FROM tag, tagxref, event"
150153
" WHERE tag.tagname='sym-%q' "
151154
" AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
152155
" AND event.objid=tagxref.rid "
153156
" AND event.type GLOB '%q'"
154157
" ORDER BY event.mtime DESC /*sort*/",
155
- &zTag[4], zType
158
+ &zTag[4+isRoot], zType
156159
);
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
+ }
157180
return rid;
158181
}
159182
160183
/* symbolic-name ":" date-time */
161184
nTag = strlen(zTag);
162185
--- 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

Keyboard Shortcuts

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