@@ -370,10 +370,15 @@
370 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If zTag is NULL or valid for use as a tag for the `tag add` and
371 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** `tag cancel` commands, returns without side effects, else emits a
372 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fatal error message. We reject certain prefixes to avoid that
373 373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** clients cause undue grief by improperly tagging artifacts as being,
374 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** e.g., wiki pages or tickets.
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Note that we intentionally allow the "sym-" prefix, partly for
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** historical compatibility and partly because it can be applied
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** properly, whereas the other reserved name types have special
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** meanings for fossil and cannot be sensibly manually manipulated.
375 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
376 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void tag_cmd_tagname_check(const char *zTag){
377 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(zTag && *zTag &&
378 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(strncmp(zTag,"wiki-",5)==0
379 384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| strncmp(zTag,"tkt-",4)==0
@@ -393,11 +398,11 @@
393 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
394 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Add a new tag or property to an artifact referenced by
395 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ARTIFACT-ID. For checkins, the tag will be usable instead
396 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of a CHECK-IN in commands such as update and merge. If the
397 402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** --propagate flag is present and ARTIFACT-ID refers to a
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** wiki page, forum post, tech-note, or check-in, the tag
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** wiki page, forum post, technote, or check-in, the tag
399 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** propagates to all descendants of that artifact.
400 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
401 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Options:
402 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** --raw Raw tag name. Ignored for
403 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** non-CHECK-IN artifacts.
@@ -440,20 +445,31 @@
440 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Options:
441 446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** --raw Raw tag name.
442 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** -t|--type TYPE One of "ci", or "e".
443 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** -n|--limit N Limit to N results.
444 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** > fossil tag list|ls ?OPTIONS? ?CHECK-IN?
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** > fossil tag list|ls ?OPTIONS? ?ARTIFACT-ID?
446 451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** List all tags, or if CHECK-IN is supplied, list
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** all tags and their values for CHECK-IN. The tagtype option
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** takes one of: propagated, singleton, cancel.
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** List all tags or, if ARTIFACT-ID is supplied, all tags and
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** their values for that artifact. The tagtype option accepts
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** one of: propagated, singleton, cancel. For historical
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** scripting compatibility, the internal tag types "wiki-",
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "tkt-", and "event-" (technote) are elided by default
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** unless the --raw or --prefix options are used.
450 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
451 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Options:
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** --raw List tags raw names of tags
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** --tagtype TYPE List only tags of type TYPE
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --raw List raw names of tags
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --tagtype TYPE List only tags of type TYPE, which must
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be one of: cancel, singleton, propagated
454 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** -v|--inverse Inverse the meaning of --tagtype TYPE.
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --prefix List only tags with the given prefix.
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fossil-internal prefixes include "sym-"
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (branch name), "wiki-", "event-"
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (technote), and "tkt-" (ticket). The
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** prefix is stripped from the resulting
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** list unless --raw is provided. Ignored if
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ARTIFACT-ID is provided.
455 471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
456 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The option --raw allows the manipulation of all types of tags
457 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** used for various internal purposes in fossil. It also shows
458 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** "cancel" tags for the "find" and "list" subcommands. You should
459 475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** not use this option to make changes unless you are sure what
@@ -610,11 +626,13 @@
610 626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(( strncmp(g.argv[2],"list",n)==0 )||( strncmp(g.argv[2],"ls",n)==0 )){
611 627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
612 628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int fRaw = find_option("raw","",0)!=0;
613 629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTagType = find_option("tagtype","t",1);
614 630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int fInverse = find_option("inverse","v",0)!=0;
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTagPrefix = find_option("prefix","",1);
615 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTagType = fRaw ? -1 : 0;
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
616 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zTagType!=0 ){
617 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int l = strlen(zTagType);
618 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zTagType,"cancel",l)==0 ){
619 637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nTagType = 0;
620 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( strncmp(zTagType,"singleton",l)==0 ){
@@ -624,30 +642,55 @@
624 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
625 643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("unrecognized tag type");
626 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
627 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
628 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc==3 ){
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int nTagPrefix = zTagPrefix ? (int)strlen(zTagPrefix) : 0;
629 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
630 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT tagname FROM tag"
631 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE EXISTS(SELECT 1 FROM tagxref"
632 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE tagid=tag.tagid"
633 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND tagtype%s%d)"
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " ORDER BY tagname",
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " AND CASE WHEN %Q IS NULL THEN 1 ELSE tagname GLOB %Q||'*' "
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " END ORDER BY tagname",
635 655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zTagType!=0 ? (fInverse!=0?"<>":"=") : ">"/*safe-for-%s*/,
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nTagType
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nTagType, zTagPrefix, zTagPrefix
637 657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
638 658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
639 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName = db_column_text(&q, 0);
640 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fRaw ){
641 661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%s\n", zName);
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( nTagPrefix>0 ){
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert(db_column_bytes(&q,0)>=nTagPrefix);
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%s\n", &zName[nTagPrefix]);
642 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( strncmp(zName, "sym-", 4)==0 ){
643 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%s\n", &zName[4]);
644 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
645 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
646 669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
647 670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.argc==4 ){
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rid = name_to_rid(g.argv[3]);
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const *zObjId = g.argv[3];
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int rid = name_to_rid(zObjId);
673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int objType = whatis_rid_type(rid);
674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTagOffset = 0;
675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTagPrefix = 0;
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(objType<=0){
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Cannot resolve artifact ID: %s", zObjId);
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(fRaw==0){
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Figure out the tag prefix to strip */
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch(objType){
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_MANIFEST: zTagPrefix = "sym-"; break;
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_WIKI: zTagPrefix = "wiki-"; break;
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_TICKET: zTagPrefix = "tkt-"; break;
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case CFTYPE_EVENT: zTagPrefix = "event-"; break;
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default: break;
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(zTagPrefix!=0){
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nTagOffset = (int)strlen(zTagPrefix);
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
649 692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
650 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT tagname, value FROM tagxref, tag"
651 694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE tagxref.rid=%d AND tagxref.tagid=tag.tagid"
652 695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" AND tagtype%s%d"
653 696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" ORDER BY tagname",
@@ -656,13 +699,12 @@
656 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nTagType
657 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
658 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( db_step(&q)==SQLITE_ROW ){
659 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName = db_column_text(&q, 0);
660 703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zValue = db_column_text(&q, 1);
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fRaw==0 ){
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncmp(zName, "sym-", 4)!=0 ) continue;
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zName += 4;
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTagPrefix && strncmp(zName, zTagPrefix, nTagOffset)==0 ){
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zName += nTagOffset;
664 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
665 707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zValue && zValue[0] ){
666 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%s=%s\n", zName, zValue);
667 709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
668 710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%s\n", zName);
669 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!