Fossil SCM

* Rename subcommand <tt>tag delete</tt> to <tt>tag cancel</tt>. * New branching behavior. Now if subcommand <tt>tag branch</tt> is used, a new copy of manifest <tt>UUID</tt> with the same parent will be created, thereby forming a fork. A propagating symbolic tag with <tt>TAGNAME</tt> is assigned to the UUID of the new copy. Furthermore all other propagating symbolic tags that the fork did inherited by the original manifest, are cancelled.<br><br>However, if the option <tt>--raw</tt> was given, the old <tt>tag branch</tt> behavior is used. That means, no creation of a fork by copying the manifest <tt>UUID</tt>, no cancelling of inherited propagating symbolic tags. The tag will be applied to the given <UUID> directly.<br><br>For instance <verbatim> fossil tag branch fix-12345 cfcfcfee fossil tag branch --raw bgcolor tag:cfcfcfee yellow </verbatim> will create a fork by copiying manifest <tt>cfcfcfee</tt>, apply a tag <tt>fix-12345</tt> that will propagate to its children and set the propagating property <tt>bgcolor</tt> too.

cle 2008-08-11 04:03 trunk
Commit ac392fbba614c6ce552e3dc15f01b4101f8188e5
1 file changed +94 -22
+94 -22
--- src/tag.c
+++ src/tag.c
@@ -245,20 +245,75 @@
245245
zValue = g.argc==5 ? g.argv[4] : 0;
246246
db_begin_transaction();
247247
tag_insert(zTag, tagtype, zValue, -1, 0.0, rid);
248248
db_end_transaction(0);
249249
}
250
+
251
+/*
252
+** Prepare an artifact that describes a fork from a certain UUID.
253
+** Furthermore a propagating symbolic tag will be inserted and
254
+** all other propagating symbolic tags will be cancelled.
255
+**
256
+** The changes are appended at the Blob pCtrl. However the manifest
257
+** is not complete at that stage.
258
+*/
259
+static void tag_prepare_fork(
260
+ Blob *pCtrl,
261
+ const char *zTagname,
262
+ int rid
263
+){
264
+ Stmt q;
265
+ Manifest origin;
266
+ Blob originContent;
267
+ char *zDate;
268
+ int i;
269
+
270
+ blob_appendf(pCtrl, "C Create\\snamed\\sfork\\s%s\n", zTagname+4);
271
+ content_get(rid, &originContent);
272
+ manifest_parse(&origin, &originContent);
273
+ zDate = db_text(0, "SELECT datetime('now')");
274
+ zDate[10] = 'T';
275
+ blob_appendf(pCtrl, "D %s\n", zDate);
276
+ for(i=0; i<origin.nFile; ++i){
277
+ blob_appendf(pCtrl, "F %s %s %s\n",
278
+ origin.aFile[i].zName,
279
+ origin.aFile[i].zUuid,
280
+ origin.aFile[i].zPerm);
281
+ }
282
+ if( origin.nParent>0 ){
283
+ blob_appendf(pCtrl, "P %s\n", origin.azParent[0]);
284
+ }
285
+ blob_appendf(pCtrl, "R %s\n", origin.zRepoCksum);
286
+ blob_appendf(pCtrl, "T *%F *", zTagname);
287
+
288
+ /* Cancel any sym- tags that propagate */
289
+ db_prepare(&q,
290
+ "SELECT tagname FROM tagxref, tag"
291
+ " WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
292
+ " AND tagtype>0 AND tagname LIKE 'sym-%%'"
293
+ " ORDER BY tagname",
294
+ rid);
295
+ while( db_step(&q)==SQLITE_ROW ){
296
+ const char *zTag = db_column_text(&q, 0);
297
+ blob_appendf(pCtrl, "\nT -%s *", zTag);
298
+ }
299
+ db_finalize(&q);
300
+
301
+ /* Cleanup */
302
+ manifest_clear(&origin);
303
+}
250304
251305
/*
252306
** Add a control record to the repository that either creates
253307
** or cancels a tag.
254308
*/
255309
static void tag_add_artifact(
256310
const char *zTagname, /* The tag to add or cancel */
257311
const char *zObjName, /* Name of object attached to */
258312
const char *zValue, /* Value for the tag. Might be NULL */
259
- int tagtype /* 0:cancel 1:singleton 2:propagated */
313
+ int tagtype, /* 0:cancel 1:singleton 2:propagated */
314
+ int fork /* Should a fork created from zObjName? */
260315
){
261316
int rid;
262317
int nrid;
263318
char *zDate;
264319
Blob uuid;
@@ -278,14 +333,18 @@
278333
279334
if( validate16(zTagname, strlen(zTagname)) ){
280335
fossil_fatal("invalid tag name \"%s\" - might be confused with a UUID",
281336
zTagname);
282337
}
283
- zDate = db_text(0, "SELECT datetime('now')");
284
- zDate[10] = 'T';
285
- blob_appendf(&ctrl, "D %s\n", zDate);
286
- blob_appendf(&ctrl, "T %c%F %b", zTagtype[tagtype], zTagname, &uuid);
338
+ if( fork ){
339
+ tag_prepare_fork(&ctrl, zTagname, rid);
340
+ }else{
341
+ zDate = db_text(0, "SELECT datetime('now')");
342
+ zDate[10] = 'T';
343
+ blob_appendf(&ctrl, "D %s\n", zDate);
344
+ blob_appendf(&ctrl, "T %c%F %b", zTagtype[tagtype], zTagname, &uuid);
345
+ }
287346
if( tagtype && zValue && zValue[0] ){
288347
blob_appendf(&ctrl, " %F\n", zValue);
289348
}else{
290349
blob_appendf(&ctrl, "\n");
291350
}
@@ -309,20 +368,31 @@
309368
**
310369
** %fossil tag add ?--raw? TAGNAME UUID ?VALUE?
311370
**
312371
** Add a new tag or property to UUID. The tag will
313372
** be usable instead of a UUID in commands like
314
-** update and the like.
373
+** update and such.
315374
**
316375
** %fossil tag branch ?--raw? TAGNAME UUID ?VALUE?
317376
**
318
-** Add a new tag or property to UUID and make that
319
-** tag propagate to all direct children.
377
+** A fork of UUID will be created. Then the new tag
378
+** or property will be added to the fork that
379
+** propagate to all direct children.
380
+**
381
+** Additionally all symbolic tags of that fork
382
+** inherited from UUID will be cancelled.
383
+**
384
+** However, if the option '--raw' was given, no
385
+** fork will be created but the tag/property will be
386
+** added to UUID directly and no tag will be
387
+** canceled.
388
+**
389
+** Please see the description of '--raw' below too.
320390
**
321
-** %fossil tag delete ?--raw? TAGNAME UUID
391
+** %fossil tag cancel ?--raw? TAGNAME UUID
322392
**
323
-** Delete the tag TAGNAME from UUID
393
+** Cancel the tag TAGNAME from UUID
324394
**
325395
** %fossil tag find ?--raw? TAGNAME
326396
**
327397
** List all baselines that use TAGNAME
328398
**
@@ -369,39 +439,43 @@
369439
blob_set(&tagname, prefix);
370440
371441
if( strncmp(g.argv[2],"add",n)==0 ){
372442
char *zValue;
373443
if( g.argc!=5 && g.argc!=6 ){
374
- usage("add TAGNAME UUID ?VALUE?");
444
+ usage("add ?--raw? TAGNAME UUID ?VALUE?");
375445
}
376446
blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
377447
zValue = g.argc==6 ? g.argv[5] : 0;
378
- tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 1);
448
+ tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 1, 0);
379449
}else
380450
381451
if( strncmp(g.argv[2],"branch",n)==0 ){
382452
char *zValue;
383453
if( g.argc!=5 && g.argc!=6 ){
384
- usage("branch TAGNAME UUID ?VALUE?");
454
+ usage("branch ?--raw? TAGNAME UUID ?VALUE?");
385455
}
386456
blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
387457
zValue = g.argc==6 ? g.argv[5] : 0;
388
- tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 2);
458
+ tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 2, raw==0);
459
+ if( !raw ){
460
+ const char *zUuid = db_text(0, "SELECT uuid, MAX(rowid) FROM blob");
461
+ printf("New_Fork \"%s\": %s\n", g.argv[3], zUuid);
462
+ }
389463
}else
390464
391
- if( strncmp(g.argv[2],"delete",n)==0 ){
465
+ if( strncmp(g.argv[2],"cancel",n)==0 ){
392466
if( g.argc!=5 ){
393
- usage("delete TAGNAME UUID");
467
+ usage("cancel ?--raw? TAGNAME UUID");
394468
}
395469
blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
396
- tag_add_artifact(blob_str(&tagname), g.argv[4], 0, 0);
470
+ tag_add_artifact(blob_str(&tagname), g.argv[4], 0, 0, 0);
397471
}else
398472
399473
if( strncmp(g.argv[2],"find",n)==0 ){
400474
Stmt q;
401475
if( g.argc!=4 ){
402
- usage("find TAGNAME");
476
+ usage("find ?--raw? TAGNAME");
403477
}
404478
blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
405479
db_prepare(&q,
406480
"SELECT blob.uuid FROM tagxref, blob"
407481
" WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%B)"
@@ -415,12 +489,11 @@
415489
416490
if( strncmp(g.argv[2],"list",n)==0 ){
417491
Stmt q;
418492
if( g.argc==3 ){
419493
db_prepare(&q,
420
- "SELECT tagname"
421
- " FROM tag"
494
+ "SELECT tagname FROM tag"
422495
" WHERE EXISTS(SELECT 1 FROM tagxref"
423496
" WHERE tagid=tag.tagid"
424497
" AND tagtype>0)"
425498
" ORDER BY tagname"
426499
);
@@ -432,12 +505,11 @@
432505
}
433506
db_finalize(&q);
434507
}else if( g.argc==4 ){
435508
int rid = name_to_rid(g.argv[3]);
436509
db_prepare(&q,
437
- "SELECT tagname, value"
438
- " FROM tagxref, tag"
510
+ "SELECT tagname, value FROM tagxref, tag"
439511
" WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
440512
" AND tagtype>0"
441513
" ORDER BY tagname",
442514
rid
443515
);
444516
--- src/tag.c
+++ src/tag.c
@@ -245,20 +245,75 @@
245 zValue = g.argc==5 ? g.argv[4] : 0;
246 db_begin_transaction();
247 tag_insert(zTag, tagtype, zValue, -1, 0.0, rid);
248 db_end_transaction(0);
249 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
251 /*
252 ** Add a control record to the repository that either creates
253 ** or cancels a tag.
254 */
255 static void tag_add_artifact(
256 const char *zTagname, /* The tag to add or cancel */
257 const char *zObjName, /* Name of object attached to */
258 const char *zValue, /* Value for the tag. Might be NULL */
259 int tagtype /* 0:cancel 1:singleton 2:propagated */
 
260 ){
261 int rid;
262 int nrid;
263 char *zDate;
264 Blob uuid;
@@ -278,14 +333,18 @@
278
279 if( validate16(zTagname, strlen(zTagname)) ){
280 fossil_fatal("invalid tag name \"%s\" - might be confused with a UUID",
281 zTagname);
282 }
283 zDate = db_text(0, "SELECT datetime('now')");
284 zDate[10] = 'T';
285 blob_appendf(&ctrl, "D %s\n", zDate);
286 blob_appendf(&ctrl, "T %c%F %b", zTagtype[tagtype], zTagname, &uuid);
 
 
 
 
287 if( tagtype && zValue && zValue[0] ){
288 blob_appendf(&ctrl, " %F\n", zValue);
289 }else{
290 blob_appendf(&ctrl, "\n");
291 }
@@ -309,20 +368,31 @@
309 **
310 ** %fossil tag add ?--raw? TAGNAME UUID ?VALUE?
311 **
312 ** Add a new tag or property to UUID. The tag will
313 ** be usable instead of a UUID in commands like
314 ** update and the like.
315 **
316 ** %fossil tag branch ?--raw? TAGNAME UUID ?VALUE?
317 **
318 ** Add a new tag or property to UUID and make that
319 ** tag propagate to all direct children.
 
 
 
 
 
 
 
 
 
 
 
320 **
321 ** %fossil tag delete ?--raw? TAGNAME UUID
322 **
323 ** Delete the tag TAGNAME from UUID
324 **
325 ** %fossil tag find ?--raw? TAGNAME
326 **
327 ** List all baselines that use TAGNAME
328 **
@@ -369,39 +439,43 @@
369 blob_set(&tagname, prefix);
370
371 if( strncmp(g.argv[2],"add",n)==0 ){
372 char *zValue;
373 if( g.argc!=5 && g.argc!=6 ){
374 usage("add TAGNAME UUID ?VALUE?");
375 }
376 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
377 zValue = g.argc==6 ? g.argv[5] : 0;
378 tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 1);
379 }else
380
381 if( strncmp(g.argv[2],"branch",n)==0 ){
382 char *zValue;
383 if( g.argc!=5 && g.argc!=6 ){
384 usage("branch TAGNAME UUID ?VALUE?");
385 }
386 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
387 zValue = g.argc==6 ? g.argv[5] : 0;
388 tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 2);
 
 
 
 
389 }else
390
391 if( strncmp(g.argv[2],"delete",n)==0 ){
392 if( g.argc!=5 ){
393 usage("delete TAGNAME UUID");
394 }
395 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
396 tag_add_artifact(blob_str(&tagname), g.argv[4], 0, 0);
397 }else
398
399 if( strncmp(g.argv[2],"find",n)==0 ){
400 Stmt q;
401 if( g.argc!=4 ){
402 usage("find TAGNAME");
403 }
404 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
405 db_prepare(&q,
406 "SELECT blob.uuid FROM tagxref, blob"
407 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%B)"
@@ -415,12 +489,11 @@
415
416 if( strncmp(g.argv[2],"list",n)==0 ){
417 Stmt q;
418 if( g.argc==3 ){
419 db_prepare(&q,
420 "SELECT tagname"
421 " FROM tag"
422 " WHERE EXISTS(SELECT 1 FROM tagxref"
423 " WHERE tagid=tag.tagid"
424 " AND tagtype>0)"
425 " ORDER BY tagname"
426 );
@@ -432,12 +505,11 @@
432 }
433 db_finalize(&q);
434 }else if( g.argc==4 ){
435 int rid = name_to_rid(g.argv[3]);
436 db_prepare(&q,
437 "SELECT tagname, value"
438 " FROM tagxref, tag"
439 " WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
440 " AND tagtype>0"
441 " ORDER BY tagname",
442 rid
443 );
444
--- src/tag.c
+++ src/tag.c
@@ -245,20 +245,75 @@
245 zValue = g.argc==5 ? g.argv[4] : 0;
246 db_begin_transaction();
247 tag_insert(zTag, tagtype, zValue, -1, 0.0, rid);
248 db_end_transaction(0);
249 }
250
251 /*
252 ** Prepare an artifact that describes a fork from a certain UUID.
253 ** Furthermore a propagating symbolic tag will be inserted and
254 ** all other propagating symbolic tags will be cancelled.
255 **
256 ** The changes are appended at the Blob pCtrl. However the manifest
257 ** is not complete at that stage.
258 */
259 static void tag_prepare_fork(
260 Blob *pCtrl,
261 const char *zTagname,
262 int rid
263 ){
264 Stmt q;
265 Manifest origin;
266 Blob originContent;
267 char *zDate;
268 int i;
269
270 blob_appendf(pCtrl, "C Create\\snamed\\sfork\\s%s\n", zTagname+4);
271 content_get(rid, &originContent);
272 manifest_parse(&origin, &originContent);
273 zDate = db_text(0, "SELECT datetime('now')");
274 zDate[10] = 'T';
275 blob_appendf(pCtrl, "D %s\n", zDate);
276 for(i=0; i<origin.nFile; ++i){
277 blob_appendf(pCtrl, "F %s %s %s\n",
278 origin.aFile[i].zName,
279 origin.aFile[i].zUuid,
280 origin.aFile[i].zPerm);
281 }
282 if( origin.nParent>0 ){
283 blob_appendf(pCtrl, "P %s\n", origin.azParent[0]);
284 }
285 blob_appendf(pCtrl, "R %s\n", origin.zRepoCksum);
286 blob_appendf(pCtrl, "T *%F *", zTagname);
287
288 /* Cancel any sym- tags that propagate */
289 db_prepare(&q,
290 "SELECT tagname FROM tagxref, tag"
291 " WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
292 " AND tagtype>0 AND tagname LIKE 'sym-%%'"
293 " ORDER BY tagname",
294 rid);
295 while( db_step(&q)==SQLITE_ROW ){
296 const char *zTag = db_column_text(&q, 0);
297 blob_appendf(pCtrl, "\nT -%s *", zTag);
298 }
299 db_finalize(&q);
300
301 /* Cleanup */
302 manifest_clear(&origin);
303 }
304
305 /*
306 ** Add a control record to the repository that either creates
307 ** or cancels a tag.
308 */
309 static void tag_add_artifact(
310 const char *zTagname, /* The tag to add or cancel */
311 const char *zObjName, /* Name of object attached to */
312 const char *zValue, /* Value for the tag. Might be NULL */
313 int tagtype, /* 0:cancel 1:singleton 2:propagated */
314 int fork /* Should a fork created from zObjName? */
315 ){
316 int rid;
317 int nrid;
318 char *zDate;
319 Blob uuid;
@@ -278,14 +333,18 @@
333
334 if( validate16(zTagname, strlen(zTagname)) ){
335 fossil_fatal("invalid tag name \"%s\" - might be confused with a UUID",
336 zTagname);
337 }
338 if( fork ){
339 tag_prepare_fork(&ctrl, zTagname, rid);
340 }else{
341 zDate = db_text(0, "SELECT datetime('now')");
342 zDate[10] = 'T';
343 blob_appendf(&ctrl, "D %s\n", zDate);
344 blob_appendf(&ctrl, "T %c%F %b", zTagtype[tagtype], zTagname, &uuid);
345 }
346 if( tagtype && zValue && zValue[0] ){
347 blob_appendf(&ctrl, " %F\n", zValue);
348 }else{
349 blob_appendf(&ctrl, "\n");
350 }
@@ -309,20 +368,31 @@
368 **
369 ** %fossil tag add ?--raw? TAGNAME UUID ?VALUE?
370 **
371 ** Add a new tag or property to UUID. The tag will
372 ** be usable instead of a UUID in commands like
373 ** update and such.
374 **
375 ** %fossil tag branch ?--raw? TAGNAME UUID ?VALUE?
376 **
377 ** A fork of UUID will be created. Then the new tag
378 ** or property will be added to the fork that
379 ** propagate to all direct children.
380 **
381 ** Additionally all symbolic tags of that fork
382 ** inherited from UUID will be cancelled.
383 **
384 ** However, if the option '--raw' was given, no
385 ** fork will be created but the tag/property will be
386 ** added to UUID directly and no tag will be
387 ** canceled.
388 **
389 ** Please see the description of '--raw' below too.
390 **
391 ** %fossil tag cancel ?--raw? TAGNAME UUID
392 **
393 ** Cancel the tag TAGNAME from UUID
394 **
395 ** %fossil tag find ?--raw? TAGNAME
396 **
397 ** List all baselines that use TAGNAME
398 **
@@ -369,39 +439,43 @@
439 blob_set(&tagname, prefix);
440
441 if( strncmp(g.argv[2],"add",n)==0 ){
442 char *zValue;
443 if( g.argc!=5 && g.argc!=6 ){
444 usage("add ?--raw? TAGNAME UUID ?VALUE?");
445 }
446 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
447 zValue = g.argc==6 ? g.argv[5] : 0;
448 tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 1, 0);
449 }else
450
451 if( strncmp(g.argv[2],"branch",n)==0 ){
452 char *zValue;
453 if( g.argc!=5 && g.argc!=6 ){
454 usage("branch ?--raw? TAGNAME UUID ?VALUE?");
455 }
456 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
457 zValue = g.argc==6 ? g.argv[5] : 0;
458 tag_add_artifact(blob_str(&tagname), g.argv[4], zValue, 2, raw==0);
459 if( !raw ){
460 const char *zUuid = db_text(0, "SELECT uuid, MAX(rowid) FROM blob");
461 printf("New_Fork \"%s\": %s\n", g.argv[3], zUuid);
462 }
463 }else
464
465 if( strncmp(g.argv[2],"cancel",n)==0 ){
466 if( g.argc!=5 ){
467 usage("cancel ?--raw? TAGNAME UUID");
468 }
469 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
470 tag_add_artifact(blob_str(&tagname), g.argv[4], 0, 0, 0);
471 }else
472
473 if( strncmp(g.argv[2],"find",n)==0 ){
474 Stmt q;
475 if( g.argc!=4 ){
476 usage("find ?--raw? TAGNAME");
477 }
478 blob_append(&tagname, g.argv[3], strlen(g.argv[3]));
479 db_prepare(&q,
480 "SELECT blob.uuid FROM tagxref, blob"
481 " WHERE tagid=(SELECT tagid FROM tag WHERE tagname=%B)"
@@ -415,12 +489,11 @@
489
490 if( strncmp(g.argv[2],"list",n)==0 ){
491 Stmt q;
492 if( g.argc==3 ){
493 db_prepare(&q,
494 "SELECT tagname FROM tag"
 
495 " WHERE EXISTS(SELECT 1 FROM tagxref"
496 " WHERE tagid=tag.tagid"
497 " AND tagtype>0)"
498 " ORDER BY tagname"
499 );
@@ -432,12 +505,11 @@
505 }
506 db_finalize(&q);
507 }else if( g.argc==4 ){
508 int rid = name_to_rid(g.argv[3]);
509 db_prepare(&q,
510 "SELECT tagname, value FROM tagxref, tag"
 
511 " WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
512 " AND tagtype>0"
513 " ORDER BY tagname",
514 rid
515 );
516

Keyboard Shortcuts

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