Hex Artifact Content
Not logged in

Artifact 6980217297d061953cf7917614dc860ea81a5e36:

File src/tag.c part of check-in [b6e22e62cf] - Attempting to rationalize the tagging and branching logic. The "branch" command has been resurrected and appears to work now. The "tag branch" command has been removed. Special tags "newbranch" and "closed" used to manage branches. New changes are not well-tested - use with caution. You must "rebuild" when upgrading through this version. by drh on 2009-01-20 16:51:19.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75   contains code u
0380: 73 65 64 20 74 6f 20 6d 61 6e 61 67 65 20 74 61  sed to manage ta
0390: 67 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  gs.*/.#include "
03a0: 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75  config.h".#inclu
03b0: 64 65 20 22 74 61 67 2e 68 22 0a 23 69 6e 63 6c  de "tag.h".#incl
03c0: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
03d0: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
03e0: 74 68 65 20 74 61 67 20 67 69 76 65 6e 20 62 79  the tag given by
03f0: 20 74 61 67 69 64 20 74 6f 20 74 68 65 20 63 68   tagid to the ch
0400: 69 6c 64 72 65 6e 20 6f 66 20 70 69 64 2e 0a 2a  ildren of pid..*
0410: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0420: 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  e assumes that t
0430: 61 67 69 64 20 69 73 20 61 20 74 61 67 20 74 68  agid is a tag th
0440: 61 74 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  at should be.** 
0450: 70 72 6f 70 61 67 61 74 65 64 20 61 6e 64 20 74  propagated and t
0460: 68 61 74 20 74 68 65 20 74 61 67 20 69 73 20 61  hat the tag is a
0470: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 69  lready present i
0480: 6e 20 70 69 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n pid..**.** If 
0490: 74 61 67 74 79 70 65 20 69 73 20 32 20 74 68 65  tagtype is 2 the
04a0: 6e 20 74 68 65 20 74 61 67 20 69 73 20 62 65 69  n the tag is bei
04b0: 6e 67 20 70 72 6f 70 61 67 61 74 65 64 20 66 72  ng propagated fr
04c0: 6f 6d 20 61 6e 0a 2a 2a 20 61 6e 63 65 73 74 6f  om an.** ancesto
04d0: 72 20 6e 6f 64 65 2e 20 20 49 66 20 74 61 67 74  r node.  If tagt
04e0: 79 70 65 20 69 73 20 30 20 69 74 20 6d 65 61 6e  ype is 0 it mean
04f0: 73 20 61 20 62 72 61 6e 63 68 20 74 61 67 20 69  s a branch tag i
0500: 73 0a 2a 2a 20 62 65 69 6e 67 20 63 61 6e 63 65  s.** being cance
0510: 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 74 61  lled..*/.void ta
0520: 67 5f 70 72 6f 70 61 67 61 74 65 28 0a 20 20 69  g_propagate(.  i
0530: 6e 74 20 70 69 64 2c 20 20 20 20 20 20 20 20 20  nt pid,         
0540: 20 20 20 20 2f 2a 20 50 72 6f 70 61 67 61 74 65      /* Propagate
0550: 20 74 68 65 20 74 61 67 20 74 6f 20 63 68 69 6c   the tag to chil
0560: 64 72 65 6e 20 6f 66 20 74 68 69 73 20 6e 6f 64  dren of this nod
0570: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61 67 69 64  e */.  int tagid
0580: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
0590: 61 67 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20  ag to propagate 
05a0: 2a 2f 0a 20 20 69 6e 74 20 74 61 67 54 79 70 65  */.  int tagType
05b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20 66  ,         /* 2 f
05c0: 6f 72 20 61 20 70 72 6f 70 61 67 61 74 69 6e 67  or a propagating
05d0: 20 74 61 67 2e 20 20 30 20 66 6f 72 20 61 6e 20   tag.  0 for an 
05e0: 61 6e 74 69 74 61 67 20 2a 2f 0a 20 20 63 6f 6e  antitag */.  con
05f0: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 2c  st char *zValue,
0600: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
0610: 65 20 74 61 67 2e 20 20 4d 69 67 68 74 20 62 65  e tag.  Might be
0620: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c   NULL */.  doubl
0630: 65 20 6d 74 69 6d 65 20 20 20 20 20 20 20 20 20  e mtime         
0640: 2f 2a 20 54 69 6d 65 73 74 61 6d 70 20 6f 6e 20  /* Timestamp on 
0650: 74 68 65 20 74 61 67 20 2a 2f 0a 29 7b 0a 20 20  the tag */.){.  
0660: 50 51 75 65 75 65 20 71 75 65 75 65 3b 0a 20 20  PQueue queue;.  
0670: 53 74 6d 74 20 73 2c 20 69 6e 73 2c 20 65 76 65  Stmt s, ins, eve
0680: 6e 74 75 70 64 61 74 65 3b 0a 0a 20 20 61 73 73  ntupdate;..  ass
0690: 65 72 74 28 20 74 61 67 54 79 70 65 3d 3d 30 20  ert( tagType==0 
06a0: 7c 7c 20 74 61 67 54 79 70 65 3d 3d 32 20 29 3b  || tagType==2 );
06b0: 0a 20 20 70 71 75 65 75 65 5f 69 6e 69 74 28 26  .  pqueue_init(&
06c0: 71 75 65 75 65 29 3b 0a 20 20 70 71 75 65 75 65  queue);.  pqueue
06d0: 5f 69 6e 73 65 72 74 28 26 71 75 65 75 65 2c 20  _insert(&queue, 
06e0: 70 69 64 2c 20 30 2e 30 29 3b 0a 20 20 64 62 5f  pid, 0.0);.  db_
06f0: 70 72 65 70 61 72 65 28 26 73 2c 20 0a 20 20 20  prepare(&s, .   
0700: 20 20 22 53 45 4c 45 43 54 20 63 69 64 2c 20 70    "SELECT cid, p
0710: 6c 69 6e 6b 2e 6d 74 69 6d 65 2c 22 0a 20 20 20  link.mtime,".   
0720: 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73    "       coales
0730: 63 65 28 73 72 63 69 64 3d 30 20 41 4e 44 20 74  ce(srcid=0 AND t
0740: 61 67 78 72 65 66 2e 6d 74 69 6d 65 3c 3a 6d 74  agxref.mtime<:mt
0750: 69 6d 65 2c 20 25 64 29 20 41 53 20 64 6f 69 74  ime, %d) AS doit
0760: 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 70  ".     "  FROM p
0770: 6c 69 6e 6b 20 4c 45 46 54 20 4a 4f 49 4e 20 74  link LEFT JOIN t
0780: 61 67 78 72 65 66 20 4f 4e 20 63 69 64 3d 72 69  agxref ON cid=ri
0790: 64 20 41 4e 44 20 74 61 67 69 64 3d 25 64 22 0a  d AND tagid=%d".
07a0: 20 20 20 20 20 22 20 57 48 45 52 45 20 70 69 64       " WHERE pid
07b0: 3d 3a 70 69 64 20 41 4e 44 20 69 73 70 72 69 6d  =:pid AND isprim
07c0: 22 2c 0a 20 20 20 20 20 74 61 67 54 79 70 65 21  ",.     tagType!
07d0: 3d 30 2c 20 74 61 67 69 64 0a 20 20 29 3b 0a 20  =0, tagid.  );. 
07e0: 20 64 62 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28   db_bind_double(
07f0: 26 73 2c 20 22 3a 6d 74 69 6d 65 22 2c 20 6d 74  &s, ":mtime", mt
0800: 69 6d 65 29 3b 0a 20 20 69 66 28 20 74 61 67 54  ime);.  if( tagT
0810: 79 70 65 3d 3d 32 20 29 7b 0a 20 20 20 20 64 62  ype==2 ){.    db
0820: 5f 70 72 65 70 61 72 65 28 26 69 6e 73 2c 0a 20  _prepare(&ins,. 
0830: 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49        "REPLACE I
0840: 4e 54 4f 20 74 61 67 78 72 65 66 28 74 61 67 69  NTO tagxref(tagi
0850: 64 2c 20 74 61 67 74 79 70 65 2c 20 73 72 63 69  d, tagtype, srci
0860: 64 2c 20 76 61 6c 75 65 2c 20 6d 74 69 6d 65 2c  d, value, mtime,
0870: 20 72 69 64 29 22 0a 20 20 20 20 20 20 20 22 56   rid)".       "V
0880: 41 4c 55 45 53 28 25 64 2c 32 2c 30 2c 25 51 2c  ALUES(%d,2,0,%Q,
0890: 3a 6d 74 69 6d 65 2c 3a 72 69 64 29 22 2c 0a 20  :mtime,:rid)",. 
08a0: 20 20 20 20 20 20 74 61 67 69 64 2c 20 7a 56 61        tagid, zVa
08b0: 6c 75 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 64  lue.    );.    d
08c0: 62 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 26 69  b_bind_double(&i
08d0: 6e 73 2c 20 22 3a 6d 74 69 6d 65 22 2c 20 6d 74  ns, ":mtime", mt
08e0: 69 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ime);.  }else{. 
08f0: 20 20 20 7a 56 61 6c 75 65 20 3d 20 30 3b 0a 20     zValue = 0;. 
0900: 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 69     db_prepare(&i
0910: 6e 73 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  ns,.       "DELE
0920: 54 45 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20  TE FROM tagxref 
0930: 57 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41  WHERE tagid=%d A
0940: 4e 44 20 72 69 64 3d 3a 72 69 64 22 2c 20 74 61  ND rid=:rid", ta
0950: 67 69 64 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  gid.    );.  }. 
0960: 20 69 66 28 20 74 61 67 69 64 3d 3d 54 41 47 5f   if( tagid==TAG_
0970: 42 47 43 4f 4c 4f 52 20 29 7b 0a 20 20 20 20 64  BGCOLOR ){.    d
0980: 62 5f 70 72 65 70 61 72 65 28 26 65 76 65 6e 74  b_prepare(&event
0990: 75 70 64 61 74 65 2c 0a 20 20 20 20 20 20 22 55  update,.      "U
09a0: 50 44 41 54 45 20 65 76 65 6e 74 20 53 45 54 20  PDATE event SET 
09b0: 62 72 62 67 63 6f 6c 6f 72 3d 25 51 20 57 48 45  brbgcolor=%Q WHE
09c0: 52 45 20 6f 62 6a 69 64 3d 3a 72 69 64 22 2c 20  RE objid=:rid", 
09d0: 7a 56 61 6c 75 65 0a 20 20 20 20 29 3b 0a 20 20  zValue.    );.  
09e0: 7d 0a 20 20 77 68 69 6c 65 28 20 28 70 69 64 20  }.  while( (pid 
09f0: 3d 20 70 71 75 65 75 65 5f 65 78 74 72 61 63 74  = pqueue_extract
0a00: 28 26 71 75 65 75 65 29 29 21 3d 30 20 29 7b 0a  (&queue))!=0 ){.
0a10: 20 20 20 20 64 62 5f 62 69 6e 64 5f 69 6e 74 28      db_bind_int(
0a20: 26 73 2c 20 22 3a 70 69 64 22 2c 20 70 69 64 29  &s, ":pid", pid)
0a30: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f  ;.    while( db_
0a40: 73 74 65 70 28 26 73 29 3d 3d 53 51 4c 49 54 45  step(&s)==SQLITE
0a50: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e  _ROW ){.      in
0a60: 74 20 64 6f 69 74 20 3d 20 64 62 5f 63 6f 6c 75  t doit = db_colu
0a70: 6d 6e 5f 69 6e 74 28 26 73 2c 20 32 29 3b 0a 20  mn_int(&s, 2);. 
0a80: 20 20 20 20 20 69 66 28 20 64 6f 69 74 20 29 7b       if( doit ){
0a90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 69 64  .        int cid
0aa0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
0ab0: 28 26 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  (&s, 0);.       
0ac0: 20 64 6f 75 62 6c 65 20 6d 74 69 6d 65 20 3d 20   double mtime = 
0ad0: 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  db_column_double
0ae0: 28 26 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  (&s, 1);.       
0af0: 20 70 71 75 65 75 65 5f 69 6e 73 65 72 74 28 26   pqueue_insert(&
0b00: 71 75 65 75 65 2c 20 63 69 64 2c 20 6d 74 69 6d  queue, cid, mtim
0b10: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 62 5f 62  e);.        db_b
0b20: 69 6e 64 5f 69 6e 74 28 26 69 6e 73 2c 20 22 3a  ind_int(&ins, ":
0b30: 72 69 64 22 2c 20 63 69 64 29 3b 0a 20 20 20 20  rid", cid);.    
0b40: 20 20 20 20 64 62 5f 73 74 65 70 28 26 69 6e 73      db_step(&ins
0b50: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 5f 72 65  );.        db_re
0b60: 73 65 74 28 26 69 6e 73 29 3b 0a 20 20 20 20 20  set(&ins);.     
0b70: 20 20 20 69 66 28 20 74 61 67 69 64 3d 3d 54 41     if( tagid==TA
0b80: 47 5f 42 47 43 4f 4c 4f 52 20 29 7b 0a 20 20 20  G_BGCOLOR ){.   
0b90: 20 20 20 20 20 20 20 64 62 5f 62 69 6e 64 5f 69         db_bind_i
0ba0: 6e 74 28 26 65 76 65 6e 74 75 70 64 61 74 65 2c  nt(&eventupdate,
0bb0: 20 22 3a 72 69 64 22 2c 20 63 69 64 29 3b 0a 20   ":rid", cid);. 
0bc0: 20 20 20 20 20 20 20 20 20 64 62 5f 73 74 65 70           db_step
0bd0: 28 26 65 76 65 6e 74 75 70 64 61 74 65 29 3b 0a  (&eventupdate);.
0be0: 20 20 20 20 20 20 20 20 20 20 64 62 5f 72 65 73            db_res
0bf0: 65 74 28 26 65 76 65 6e 74 75 70 64 61 74 65 29  et(&eventupdate)
0c00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0c10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
0c20: 5f 72 65 73 65 74 28 26 73 29 3b 0a 20 20 7d 0a  _reset(&s);.  }.
0c30: 20 20 70 71 75 65 75 65 5f 63 6c 65 61 72 28 26    pqueue_clear(&
0c40: 71 75 65 75 65 29 3b 0a 20 20 64 62 5f 66 69 6e  queue);.  db_fin
0c50: 61 6c 69 7a 65 28 26 69 6e 73 29 3b 0a 20 20 64  alize(&ins);.  d
0c60: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
0c70: 20 20 69 66 28 20 74 61 67 69 64 3d 3d 54 41 47    if( tagid==TAG
0c80: 5f 42 47 43 4f 4c 4f 52 20 29 7b 0a 20 20 20 20  _BGCOLOR ){.    
0c90: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 65 76 65  db_finalize(&eve
0ca0: 6e 74 75 70 64 61 74 65 29 3b 0a 20 20 7d 0a 7d  ntupdate);.  }.}
0cb0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74  ../*.** Propagat
0cc0: 65 20 61 6c 6c 20 70 72 6f 70 61 67 61 74 61 62  e all propagatab
0cd0: 6c 65 20 74 61 67 73 20 69 6e 20 70 69 64 20 74  le tags in pid t
0ce0: 6f 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 0a  o its children..
0cf0: 2a 2f 0a 76 6f 69 64 20 74 61 67 5f 70 72 6f 70  */.void tag_prop
0d00: 61 67 61 74 65 5f 61 6c 6c 28 69 6e 74 20 70 69  agate_all(int pi
0d10: 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20  d){.  Stmt q;.  
0d20: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20  db_prepare(&q,. 
0d30: 20 20 20 20 22 53 45 4c 45 43 54 20 74 61 67 69      "SELECT tagi
0d40: 64 2c 20 74 61 67 74 79 70 65 2c 20 6d 74 69 6d  d, tagtype, mtim
0d50: 65 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 61  e, value FROM ta
0d60: 67 78 72 65 66 22 0a 20 20 20 20 20 22 20 57 48  gxref".     " WH
0d70: 45 52 45 20 72 69 64 3d 25 64 22 0a 20 20 20 20  ERE rid=%d".    
0d80: 20 22 20 20 20 41 4e 44 20 28 74 61 67 74 79 70   "   AND (tagtyp
0d90: 65 3d 30 20 4f 52 20 74 61 67 74 79 70 65 3d 32  e=0 OR tagtype=2
0da0: 29 22 2c 0a 20 20 20 20 20 70 69 64 0a 20 20 29  )",.     pid.  )
0db0: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  ;.  while( db_st
0dc0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
0dd0: 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 61  OW ){.    int ta
0de0: 67 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  gid = db_column_
0df0: 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  int(&q, 0);.    
0e00: 69 6e 74 20 74 61 67 74 79 70 65 20 3d 20 64 62  int tagtype = db
0e10: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
0e20: 31 29 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d  1);.    double m
0e30: 74 69 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  time = db_column
0e40: 5f 64 6f 75 62 6c 65 28 26 71 2c 20 32 29 3b 0a  _double(&q, 2);.
0e50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0e60: 7a 56 61 6c 75 65 20 3d 20 64 62 5f 63 6f 6c 75  zValue = db_colu
0e70: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b 0a  mn_text(&q, 3);.
0e80: 20 20 20 20 74 61 67 5f 70 72 6f 70 61 67 61 74      tag_propagat
0e90: 65 28 70 69 64 2c 20 74 61 67 69 64 2c 20 74 61  e(pid, tagid, ta
0ea0: 67 74 79 70 65 2c 20 7a 56 61 6c 75 65 2c 20 6d  gtype, zValue, m
0eb0: 74 69 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  time);.  }.  db_
0ec0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a  finalize(&q);.}.
0ed0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 74 61 67  ./*.** Get a tag
0ee0: 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
0ef0: 20 54 41 47 2e 20 20 43 72 65 61 74 65 20 61 20   TAG.  Create a 
0f00: 6e 65 77 20 74 61 67 20 69 66 20 6e 65 63 65 73  new tag if neces
0f10: 73 61 72 79 0a 2a 2a 20 69 66 20 63 72 65 61 74  sary.** if creat
0f20: 65 46 6c 61 67 20 69 73 20 31 2e 0a 2a 2f 0a 69  eFlag is 1..*/.i
0f30: 6e 74 20 74 61 67 5f 66 69 6e 64 69 64 28 63 6f  nt tag_findid(co
0f40: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c 20  nst char *zTag, 
0f50: 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 29 7b  int createFlag){
0f60: 0a 20 20 69 6e 74 20 69 64 3b 0a 20 20 69 64 20  .  int id;.  id 
0f70: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  = db_int(0, "SEL
0f80: 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20 74  ECT tagid FROM t
0f90: 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65  ag WHERE tagname
0fa0: 3d 25 51 22 2c 20 7a 54 61 67 29 3b 0a 20 20 69  =%Q", zTag);.  i
0fb0: 66 28 20 69 64 3d 3d 30 20 26 26 20 63 72 65 61  f( id==0 && crea
0fc0: 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 64 62  teFlag ){.    db
0fd0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 49 4e 53  _multi_exec("INS
0fe0: 45 52 54 20 49 4e 54 4f 20 74 61 67 28 74 61 67  ERT INTO tag(tag
0ff0: 6e 61 6d 65 29 20 56 41 4c 55 45 53 28 25 51 29  name) VALUES(%Q)
1000: 22 2c 20 7a 54 61 67 29 3b 0a 20 20 20 20 69 64  ", zTag);.    id
1010: 20 3d 20 64 62 5f 6c 61 73 74 5f 69 6e 73 65 72   = db_last_inser
1020: 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 20  t_rowid();.  }. 
1030: 20 72 65 74 75 72 6e 20 69 64 3b 0a 7d 0a 0a 2f   return id;.}../
1040: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 74 61  *.** Insert a ta
1050: 67 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  g into the datab
1060: 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74 61 67  ase..*/.void tag
1070: 5f 69 6e 73 65 72 74 28 0a 20 20 63 6f 6e 73 74  _insert(.  const
1080: 20 63 68 61 72 20 2a 7a 54 61 67 2c 20 20 20 20   char *zTag,    
1090: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
10a0: 68 65 20 74 61 67 20 28 77 2f 6f 20 74 68 65 20  he tag (w/o the 
10b0: 22 2b 22 20 6f 72 20 22 2d 22 20 70 72 65 66 69  "+" or "-" prefi
10c0: 78 20 2a 2f 0a 20 20 69 6e 74 20 74 61 67 74 79  x */.  int tagty
10d0: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
10e0: 2f 2a 20 30 3a 63 61 6e 63 65 6c 20 20 31 3a 73  /* 0:cancel  1:s
10f0: 69 6e 67 6c 65 74 6f 6e 20 20 32 3a 70 72 6f 70  ingleton  2:prop
1100: 61 67 61 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  agated */.  cons
1110: 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 2c 20  t char *zValue, 
1120: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69 66       /* Value if
1130: 20 74 68 65 20 74 61 67 20 69 73 20 72 65 61 6c   the tag is real
1140: 6c 79 20 61 20 70 72 6f 70 65 72 74 79 20 2a 2f  ly a property */
1150: 0a 20 20 69 6e 74 20 73 72 63 49 64 2c 20 20 20  .  int srcId,   
1160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1170: 72 74 69 66 61 63 74 20 74 68 61 74 20 63 6f 6e  rtifact that con
1180: 74 61 69 6e 73 20 74 68 69 73 20 74 61 67 20 2a  tains this tag *
1190: 2f 0a 20 20 64 6f 75 62 6c 65 20 6d 74 69 6d 65  /.  double mtime
11a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11b0: 54 69 6d 65 73 74 61 6d 70 2e 20 20 55 73 65 20  Timestamp.  Use 
11c0: 64 65 66 61 75 6c 74 20 69 66 20 3c 3d 30 2e 30  default if <=0.0
11d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 69 64 20 20 20   */.  int rid   
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f0: 2a 20 41 72 74 69 66 61 63 74 20 74 6f 20 77 68  * Artifact to wh
1200: 69 63 68 20 74 68 65 20 74 61 67 20 69 73 20 74  ich the tag is t
1210: 6f 20 61 74 74 61 63 68 65 64 20 2a 2f 0a 29 7b  o attached */.){
1220: 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 63 6f 6e  .  Stmt s;.  con
1230: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20  st char *zCol;. 
1240: 20 69 6e 74 20 74 61 67 69 64 20 3d 20 74 61 67   int tagid = tag
1250: 5f 66 69 6e 64 69 64 28 7a 54 61 67 2c 20 31 29  _findid(zTag, 1)
1260: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1270: 66 28 20 6d 74 69 6d 65 3c 3d 30 2e 30 20 29 7b  f( mtime<=0.0 ){
1280: 0a 20 20 20 20 6d 74 69 6d 65 20 3d 20 64 62 5f  .    mtime = db_
1290: 64 6f 75 62 6c 65 28 30 2e 30 2c 20 22 53 45 4c  double(0.0, "SEL
12a0: 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 27 6e  ECT julianday('n
12b0: 6f 77 27 29 22 29 3b 0a 20 20 7d 0a 20 20 64 62  ow')");.  }.  db
12c0: 5f 70 72 65 70 61 72 65 28 26 73 2c 0a 20 20 20  _prepare(&s,.   
12d0: 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20   "SELECT 1 FROM 
12e0: 74 61 67 78 72 65 66 22 0a 20 20 20 20 22 20 57  tagxref".    " W
12f0: 48 45 52 45 20 74 61 67 69 64 3d 25 64 22 0a 20  HERE tagid=%d". 
1300: 20 20 20 22 20 20 20 41 4e 44 20 72 69 64 3d 25     "   AND rid=%
1310: 64 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20 6d  d".    "   AND m
1320: 74 69 6d 65 3e 3d 3a 6d 74 69 6d 65 22 2c 0a 20  time>=:mtime",. 
1330: 20 20 20 74 61 67 69 64 2c 20 72 69 64 0a 20 20     tagid, rid.  
1340: 29 3b 0a 20 20 64 62 5f 62 69 6e 64 5f 64 6f 75  );.  db_bind_dou
1350: 62 6c 65 28 26 73 2c 20 22 3a 6d 74 69 6d 65 22  ble(&s, ":mtime"
1360: 2c 20 6d 74 69 6d 65 29 3b 0a 20 20 72 63 20 3d  , mtime);.  rc =
1370: 20 64 62 5f 73 74 65 70 28 26 73 29 3b 0a 20 20   db_step(&s);.  
1380: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b  db_finalize(&s);
1390: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13a0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20  E_ROW ){.    /* 
13b0: 41 6e 6f 74 68 65 72 20 65 6e 74 72 79 20 74 68  Another entry th
13c0: 69 73 20 69 73 20 6d 6f 72 65 20 72 65 63 65 6e  is is more recen
13d0: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
13e0: 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  .  Do nothing */
13f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1400: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 73  .  db_prepare(&s
1410: 2c 20 0a 20 20 20 20 22 52 45 50 4c 41 43 45 20  , .    "REPLACE 
1420: 49 4e 54 4f 20 74 61 67 78 72 65 66 28 74 61 67  INTO tagxref(tag
1430: 69 64 2c 74 61 67 74 79 70 65 2c 73 72 63 49 64  id,tagtype,srcId
1440: 2c 76 61 6c 75 65 2c 6d 74 69 6d 65 2c 72 69 64  ,value,mtime,rid
1450: 29 22 0a 20 20 20 20 22 20 56 41 4c 55 45 53 28  )".    " VALUES(
1460: 25 64 2c 25 64 2c 25 64 2c 25 51 2c 3a 6d 74 69  %d,%d,%d,%Q,:mti
1470: 6d 65 2c 25 64 29 22 2c 0a 20 20 20 20 74 61 67  me,%d)",.    tag
1480: 69 64 2c 20 74 61 67 74 79 70 65 2c 20 73 72 63  id, tagtype, src
1490: 49 64 2c 20 7a 56 61 6c 75 65 2c 20 72 69 64 0a  Id, zValue, rid.
14a0: 20 20 29 3b 0a 20 20 64 62 5f 62 69 6e 64 5f 64    );.  db_bind_d
14b0: 6f 75 62 6c 65 28 26 73 2c 20 22 3a 6d 74 69 6d  ouble(&s, ":mtim
14c0: 65 22 2c 20 6d 74 69 6d 65 29 3b 0a 20 20 64 62  e", mtime);.  db
14d0: 5f 73 74 65 70 28 26 73 29 3b 0a 20 20 64 62 5f  _step(&s);.  db_
14e0: 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20  finalize(&s);.  
14f0: 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30 20 29  if( tagtype==0 )
1500: 7b 0a 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 30  {.    zValue = 0
1510: 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6c 20 3d 20 30  ;.  }.  zCol = 0
1520: 3b 0a 20 20 73 77 69 74 63 68 28 20 74 61 67 69  ;.  switch( tagi
1530: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 41  d ){.    case TA
1540: 47 5f 42 47 43 4f 4c 4f 52 3a 20 7b 0a 20 20 20  G_BGCOLOR: {.   
1550: 20 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d     if( tagtype==
1560: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  1 ){.        zCo
1570: 6c 20 3d 20 22 62 67 63 6f 6c 6f 72 22 3b 0a 20  l = "bgcolor";. 
1580: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1590: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 62 72 62 67      zCol = "brbg
15a0: 63 6f 6c 6f 72 22 3b 0a 20 20 20 20 20 20 7d 0a  color";.      }.
15b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 41 47 5f   }.    case TAG_
15d0: 43 4f 4d 4d 45 4e 54 3a 20 7b 0a 20 20 20 20 20  COMMENT: {.     
15e0: 20 7a 43 6f 6c 20 3d 20 22 65 63 6f 6d 6d 65 6e   zCol = "ecommen
15f0: 74 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t";.      break;
1600: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1610: 54 41 47 5f 55 53 45 52 3a 20 7b 0a 20 20 20 20  TAG_USER: {.    
1620: 20 20 7a 43 6f 6c 20 3d 20 22 65 75 73 65 72 22    zCol = "euser"
1630: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1640: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
1650: 43 6f 6c 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75  Col ){.    db_mu
1660: 6c 74 69 5f 65 78 65 63 28 22 55 50 44 41 54 45  lti_exec("UPDATE
1670: 20 65 76 65 6e 74 20 53 45 54 20 25 73 3d 25 51   event SET %s=%Q
1680: 20 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22   WHERE objid=%d"
1690: 2c 20 7a 43 6f 6c 2c 20 7a 56 61 6c 75 65 2c 20  , zCol, zValue, 
16a0: 72 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rid);.  }.  if( 
16b0: 74 61 67 74 79 70 65 3d 3d 30 20 7c 7c 20 74 61  tagtype==0 || ta
16c0: 67 74 79 70 65 3d 3d 32 20 29 7b 0a 20 20 20 20  gtype==2 ){.    
16d0: 74 61 67 5f 70 72 6f 70 61 67 61 74 65 28 72 69  tag_propagate(ri
16e0: 64 2c 20 74 61 67 69 64 2c 20 74 61 67 74 79 70  d, tagid, tagtyp
16f0: 65 2c 20 7a 56 61 6c 75 65 2c 20 6d 74 69 6d 65  e, zValue, mtime
1700: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1710: 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 74   COMMAND: test-t
1720: 61 67 0a 2a 2a 20 25 66 6f 73 73 69 6c 20 74 65  ag.** %fossil te
1730: 73 74 2d 74 61 67 20 28 2b 7c 2a 7c 2d 29 54 41  st-tag (+|*|-)TA
1740: 47 4e 41 4d 45 20 41 52 54 49 46 41 43 54 2d 49  GNAME ARTIFACT-I
1750: 44 20 3f 56 41 4c 55 45 3f 0a 2a 2a 0a 2a 2a 20  D ?VALUE?.**.** 
1760: 41 64 64 20 61 20 74 61 67 20 6f 72 20 61 6e 74  Add a tag or ant
1770: 69 2d 74 61 67 20 74 6f 20 74 68 65 20 72 65 62  i-tag to the reb
1780: 75 69 6c 64 61 62 6c 65 20 74 61 62 6c 65 73 20  uildable tables 
1790: 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 72 65 70  of the local rep
17a0: 6f 73 69 74 6f 72 79 2e 0a 2a 2a 20 4e 6f 20 74  ository..** No t
17b0: 61 67 20 61 72 74 69 66 61 63 74 20 69 73 20 63  ag artifact is c
17c0: 72 65 61 74 65 64 20 73 6f 20 74 68 65 20 6e 65  reated so the ne
17d0: 77 20 74 61 67 20 69 73 20 65 72 61 73 65 64 20  w tag is erased 
17e0: 74 68 65 20 6e 65 78 74 0a 2a 2a 20 74 69 6d 65  the next.** time
17f0: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
1800: 69 73 20 72 65 62 75 69 6c 74 2e 20 20 54 68 69  is rebuilt.  Thi
1810: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 6f 72  s routine is for
1820: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 75 73 65 20   testing.** use 
1830: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65  only..*/.void te
1840: 73 74 74 61 67 5f 63 6d 64 28 76 6f 69 64 29 7b  sttag_cmd(void){
1850: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1860: 54 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tag;.  const cha
1870: 72 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 69 6e 74  r *zValue;.  int
1880: 20 72 69 64 3b 0a 20 20 69 6e 74 20 74 61 67 74   rid;.  int tagt
1890: 79 70 65 3b 0a 20 20 64 62 5f 6d 75 73 74 5f 62  ype;.  db_must_b
18a0: 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b  e_within_tree();
18b0: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 34  .  if( g.argc!=4
18c0: 20 26 26 20 67 2e 61 72 67 63 21 3d 35 20 29 7b   && g.argc!=5 ){
18d0: 0a 20 20 20 20 75 73 61 67 65 28 22 54 41 47 4e  .    usage("TAGN
18e0: 41 4d 45 20 41 52 54 49 46 41 43 54 2d 49 44 20  AME ARTIFACT-ID 
18f0: 3f 56 41 4c 55 45 3f 22 29 3b 0a 20 20 7d 0a 20  ?VALUE?");.  }. 
1900: 20 7a 54 61 67 20 3d 20 67 2e 61 72 67 76 5b 32   zTag = g.argv[2
1910: 5d 3b 0a 20 20 73 77 69 74 63 68 28 20 7a 54 61  ];.  switch( zTa
1920: 67 5b 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65  g[0] ){.    case
1930: 20 27 2b 27 3a 20 20 74 61 67 74 79 70 65 20 3d   '+':  tagtype =
1940: 20 31 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20   1;  break;.    
1950: 63 61 73 65 20 27 2a 27 3a 20 20 74 61 67 74 79  case '*':  tagty
1960: 70 65 20 3d 20 32 3b 20 20 62 72 65 61 6b 3b 0a  pe = 2;  break;.
1970: 20 20 20 20 63 61 73 65 20 27 2d 27 3a 20 20 74      case '-':  t
1980: 61 67 74 79 70 65 20 3d 20 30 3b 20 20 62 72 65  agtype = 0;  bre
1990: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
19a0: 20 20 20 0a 20 20 20 20 20 20 66 6f 73 73 69 6c     .      fossil
19b0: 5f 66 61 74 61 6c 28 22 74 61 67 20 73 68 6f 75  _fatal("tag shou
19c0: 6c 64 20 62 65 67 69 6e 20 77 69 74 68 20 27 2b  ld begin with '+
19d0: 27 2c 20 27 2a 27 2c 20 6f 72 20 27 2d 27 22 29  ', '*', or '-'")
19e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
19f0: 20 20 7d 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65    }.  rid = name
1a00: 5f 74 6f 5f 72 69 64 28 67 2e 61 72 67 76 5b 33  _to_rid(g.argv[3
1a10: 5d 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30  ]);.  if( rid==0
1a20: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66   ){.    fossil_f
1a30: 61 74 61 6c 28 22 6e 6f 20 73 75 63 68 20 6f 62  atal("no such ob
1a40: 6a 65 63 74 3a 20 25 73 22 2c 20 67 2e 61 72 67  ject: %s", g.arg
1a50: 76 5b 33 5d 29 3b 0a 20 20 7d 0a 20 20 7a 56 61  v[3]);.  }.  zVa
1a60: 6c 75 65 20 3d 20 67 2e 61 72 67 63 3d 3d 35 20  lue = g.argc==5 
1a70: 3f 20 67 2e 61 72 67 76 5b 34 5d 20 3a 20 30 3b  ? g.argv[4] : 0;
1a80: 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e  .  db_begin_tran
1a90: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 74 61 67  saction();.  tag
1aa0: 5f 69 6e 73 65 72 74 28 7a 54 61 67 2c 20 74 61  _insert(zTag, ta
1ab0: 67 74 79 70 65 2c 20 7a 56 61 6c 75 65 2c 20 2d  gtype, zValue, -
1ac0: 31 2c 20 30 2e 30 2c 20 72 69 64 29 3b 0a 20 20  1, 0.0, rid);.  
1ad0: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
1ae0: 6f 6e 28 30 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  on(0); .}../*.**
1af0: 20 41 64 64 20 61 20 63 6f 6e 74 72 6f 6c 20 72   Add a control r
1b00: 65 63 6f 72 64 20 74 6f 20 74 68 65 20 72 65 70  ecord to the rep
1b10: 6f 73 69 74 6f 72 79 20 74 68 61 74 20 65 69 74  ository that eit
1b20: 68 65 72 20 63 72 65 61 74 65 73 0a 2a 2a 20 6f  her creates.** o
1b30: 72 20 63 61 6e 63 65 6c 73 20 61 20 74 61 67 2e  r cancels a tag.
1b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b50: 74 61 67 5f 61 64 64 5f 61 72 74 69 66 61 63 74  tag_add_artifact
1b60: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1b70: 7a 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20  zPrefix,        
1b80: 2f 2a 20 50 72 65 66 69 78 20 74 6f 20 70 72 65  /* Prefix to pre
1b90: 70 65 6e 64 20 74 6f 20 74 61 67 20 6e 61 6d 65  pend to tag name
1ba0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1bb0: 20 2a 7a 54 61 67 6e 61 6d 65 2c 20 20 20 20 20   *zTagname,     
1bc0: 20 20 2f 2a 20 54 68 65 20 74 61 67 20 74 6f 20    /* The tag to 
1bd0: 61 64 64 20 6f 72 20 63 61 6e 63 65 6c 20 2a 2f  add or cancel */
1be0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bf0: 4f 62 6a 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f  ObjName,       /
1c00: 2a 20 4e 61 6d 65 20 6f 66 20 6f 62 6a 65 63 74  * Name of object
1c10: 20 61 74 74 61 63 68 65 64 20 74 6f 20 2a 2f 0a   attached to */.
1c20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
1c30: 61 6c 75 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  alue,         /*
1c40: 20 56 61 6c 75 65 20 66 6f 72 20 74 68 65 20 74   Value for the t
1c50: 61 67 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  ag.  Might be NU
1c60: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 74 61 67 74  LL */.  int tagt
1c70: 79 70 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ype             
1c80: 20 20 20 20 2f 2a 20 30 3a 63 61 6e 63 65 6c 20      /* 0:cancel 
1c90: 31 3a 73 69 6e 67 6c 65 74 6f 6e 20 32 3a 70 72  1:singleton 2:pr
1ca0: 6f 70 61 67 61 74 65 64 20 2a 2f 0a 29 7b 0a 20  opagated */.){. 
1cb0: 20 69 6e 74 20 72 69 64 3b 0a 20 20 69 6e 74 20   int rid;.  int 
1cc0: 6e 72 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 44  nrid;.  char *zD
1cd0: 61 74 65 3b 0a 20 20 42 6c 6f 62 20 75 75 69 64  ate;.  Blob uuid
1ce0: 3b 0a 20 20 42 6c 6f 62 20 63 74 72 6c 3b 0a 20  ;.  Blob ctrl;. 
1cf0: 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20 73   Blob cksum;.  s
1d00: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1d10: 20 7a 54 61 67 74 79 70 65 5b 5d 20 3d 20 7b 20   zTagtype[] = { 
1d20: 27 2d 27 2c 20 27 2b 27 2c 20 27 2a 27 20 7d 3b  '-', '+', '*' };
1d30: 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 67 74  ..  assert( tagt
1d40: 79 70 65 3e 3d 30 20 26 26 20 74 61 67 74 79 70  ype>=0 && tagtyp
1d50: 65 3c 3d 32 20 29 3b 0a 20 20 75 73 65 72 5f 73  e<=2 );.  user_s
1d60: 65 6c 65 63 74 28 29 3b 0a 20 20 62 6c 6f 62 5f  elect();.  blob_
1d70: 7a 65 72 6f 28 26 75 75 69 64 29 3b 0a 20 20 62  zero(&uuid);.  b
1d80: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 75 75 69 64  lob_append(&uuid
1d90: 2c 20 7a 4f 62 6a 4e 61 6d 65 2c 20 2d 31 29 3b  , zObjName, -1);
1da0: 0a 20 20 69 66 28 20 6e 61 6d 65 5f 74 6f 5f 75  .  if( name_to_u
1db0: 75 69 64 28 26 75 75 69 64 2c 20 39 29 20 29 7b  uid(&uuid, 9) ){
1dc0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1dd0: 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f  .  rid = name_to
1de0: 5f 72 69 64 28 62 6c 6f 62 5f 73 74 72 28 26 75  _rid(blob_str(&u
1df0: 75 69 64 29 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65  uid));.  blob_ze
1e00: 72 6f 28 26 63 74 72 6c 29 3b 0a 0a 23 69 66 20  ro(&ctrl);..#if 
1e10: 30 0a 20 20 69 66 28 20 76 61 6c 69 64 61 74 65  0.  if( validate
1e20: 31 36 28 7a 54 61 67 6e 61 6d 65 2c 20 73 74 72  16(zTagname, str
1e30: 6c 65 6e 28 7a 54 61 67 6e 61 6d 65 29 29 20 29  len(zTagname)) )
1e40: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
1e50: 61 6c 28 0a 20 20 20 20 20 20 20 22 69 6e 76 61  al(.       "inva
1e60: 6c 69 64 20 74 61 67 20 6e 61 6d 65 20 5c 22 25  lid tag name \"%
1e70: 73 5c 22 20 2d 20 6d 69 67 68 74 20 62 65 20 63  s\" - might be c
1e80: 6f 6e 66 75 73 65 64 20 77 69 74 68 22 0a 20 20  onfused with".  
1e90: 20 20 20 20 20 22 20 61 20 68 65 78 61 64 65 63       " a hexadec
1ea0: 69 6d 61 6c 20 61 72 74 69 66 61 63 74 20 49 44  imal artifact ID
1eb0: 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 67 6e 61  ",.       zTagna
1ec0: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65  me.    );.  }.#e
1ed0: 6e 64 69 66 0a 20 20 7a 44 61 74 65 20 3d 20 64  ndif.  zDate = d
1ee0: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
1ef0: 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27  T datetime('now'
1f00: 29 22 29 3b 0a 20 20 7a 44 61 74 65 5b 31 30 5d  )");.  zDate[10]
1f10: 20 3d 20 27 54 27 3b 0a 20 20 62 6c 6f 62 5f 61   = 'T';.  blob_a
1f20: 70 70 65 6e 64 66 28 26 63 74 72 6c 2c 20 22 44  ppendf(&ctrl, "D
1f30: 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a   %s\n", zDate);.
1f40: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
1f50: 63 74 72 6c 2c 20 22 54 20 25 63 25 73 25 46 20  ctrl, "T %c%s%F 
1f60: 25 62 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %b",.           
1f70: 20 20 20 20 7a 54 61 67 74 79 70 65 5b 74 61 67      zTagtype[tag
1f80: 74 79 70 65 5d 2c 20 7a 50 72 65 66 69 78 2c 20  type], zPrefix, 
1f90: 7a 54 61 67 6e 61 6d 65 2c 20 26 75 75 69 64 29  zTagname, &uuid)
1fa0: 3b 0a 20 20 69 66 28 20 74 61 67 74 79 70 65 3e  ;.  if( tagtype>
1fb0: 30 20 26 26 20 7a 56 61 6c 75 65 20 26 26 20 7a  0 && zValue && z
1fc0: 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20  Value[0] ){.    
1fd0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74  blob_appendf(&ct
1fe0: 72 6c 2c 20 22 20 25 46 5c 6e 22 2c 20 7a 56 61  rl, " %F\n", zVa
1ff0: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
2000: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
2010: 26 63 74 72 6c 2c 20 22 5c 6e 22 29 3b 0a 20 20  &ctrl, "\n");.  
2020: 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  }.  blob_appendf
2030: 28 26 63 74 72 6c 2c 20 22 55 20 25 46 5c 6e 22  (&ctrl, "U %F\n"
2040: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 6d  , g.zLogin);.  m
2050: 64 35 73 75 6d 5f 62 6c 6f 62 28 26 63 74 72 6c  d5sum_blob(&ctrl
2060: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 62 6c 6f  , &cksum);.  blo
2070: 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72 6c 2c  b_appendf(&ctrl,
2080: 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63 6b 73 75   "Z %b\n", &cksu
2090: 6d 29 3b 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74  m);.  db_begin_t
20a0: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
20b0: 6e 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70  nrid = content_p
20c0: 75 74 28 26 63 74 72 6c 2c 20 30 2c 20 30 29 3b  ut(&ctrl, 0, 0);
20d0: 0a 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73  .  manifest_cros
20e0: 73 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 63 74 72  slink(nrid, &ctr
20f0: 6c 29 3b 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61  l);.  db_end_tra
2100: 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 0a  nsaction(0);.  .
2110: 20 20 2f 2a 20 44 6f 20 61 6e 20 61 75 74 6f 73    /* Do an autos
2120: 79 6e 63 20 70 75 73 68 20 69 66 20 72 65 71 75  ync push if requ
2130: 65 73 74 65 64 20 2a 2f 0a 20 20 61 75 74 6f 73  ested */.  autos
2140: 79 6e 63 28 41 55 54 4f 53 59 4e 43 5f 50 55 53  ync(AUTOSYNC_PUS
2150: 48 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d  H);.}../*.** COM
2160: 4d 41 4e 44 3a 20 74 61 67 0a 2a 2a 20 55 73 61  MAND: tag.** Usa
2170: 67 65 3a 20 25 66 6f 73 73 69 6c 20 74 61 67 20  ge: %fossil tag 
2180: 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 0a 2a  SUBCOMMAND ....*
2190: 2a 0a 2a 2a 20 52 75 6e 20 76 61 72 69 6f 75 73  *.** Run various
21a0: 20 73 75 62 63 6f 6d 6d 61 6e 64 73 20 74 6f 20   subcommands to 
21b0: 63 6f 6e 74 72 6f 6c 20 74 61 67 73 20 61 6e 64  control tags and
21c0: 20 70 72 6f 70 65 72 74 69 65 73 0a 2a 2a 0a 2a   properties.**.*
21d0: 2a 20 20 20 20 20 25 66 6f 73 73 69 6c 20 74 61  *     %fossil ta
21e0: 67 20 61 64 64 20 3f 2d 2d 72 61 77 3f 20 3f 2d  g add ?--raw? ?-
21f0: 2d 70 72 6f 70 61 67 61 74 65 3f 20 54 41 47 4e  -propagate? TAGN
2200: 41 4d 45 20 43 48 45 43 4b 2d 49 4e 20 3f 56 41  AME CHECK-IN ?VA
2210: 4c 55 45 3f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  LUE?.**.**      
2220: 20 20 20 41 64 64 20 61 20 6e 65 77 20 74 61 67     Add a new tag
2230: 20 6f 72 20 70 72 6f 70 65 72 74 79 20 74 6f 20   or property to 
2240: 43 48 45 43 4b 2d 49 4e 2e 20 54 68 65 20 74 61  CHECK-IN. The ta
2250: 67 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 20 20  g will.**       
2260: 20 20 62 65 20 75 73 61 62 6c 65 20 69 6e 73 74    be usable inst
2270: 65 61 64 20 6f 66 20 61 20 43 48 45 43 4b 2d 49  ead of a CHECK-I
2280: 4e 20 69 6e 20 63 6f 6d 6d 61 6e 64 73 20 73 75  N in commands su
2290: 63 68 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 20  ch as.**        
22a0: 20 75 70 64 61 74 65 20 61 6e 64 20 6d 65 72 67   update and merg
22b0: 65 2e 20 20 49 66 20 74 68 65 20 2d 2d 70 72 6f  e.  If the --pro
22c0: 70 61 67 61 74 65 20 66 6c 61 67 20 69 73 20 70  pagate flag is p
22d0: 72 65 73 65 6e 74 2c 0a 2a 2a 20 20 20 20 20 20  resent,.**      
22e0: 20 20 20 74 68 65 20 74 61 67 20 76 61 6c 75 65     the tag value
22f0: 20 70 72 6f 70 61 67 65 73 20 74 6f 20 61 6c 6c   propages to all
2300: 20 64 65 73 63 65 6e 64 61 6e 74 73 20 6f 66 20   descendants of 
2310: 43 48 45 43 4b 2d 49 4e 0a 2a 2a 0a 2a 2a 20 20  CHECK-IN.**.**  
2320: 20 20 20 25 66 6f 73 73 69 6c 20 74 61 67 20 63     %fossil tag c
2330: 61 6e 63 65 6c 20 3f 2d 2d 72 61 77 3f 20 54 41  ancel ?--raw? TA
2340: 47 4e 41 4d 45 20 43 48 45 43 4b 2d 49 4e 0a 2a  GNAME CHECK-IN.*
2350: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 6d  *.**         Rem
2360: 6f 76 65 20 74 68 65 20 74 61 67 20 54 41 47 4e  ove the tag TAGN
2370: 41 4d 45 20 66 72 6f 6d 20 43 48 45 43 4b 2d 49  AME from CHECK-I
2380: 4e 2c 20 61 6e 64 20 61 6c 73 6f 20 72 65 6d 6f  N, and also remo
2390: 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  ve.**         th
23a0: 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 66  e propagation of
23b0: 20 74 68 65 20 74 61 67 20 74 6f 20 61 6e 79 20   the tag to any 
23c0: 64 65 73 63 65 6e 64 61 6e 74 73 2e 0a 2a 2a 0a  descendants..**.
23d0: 2a 2a 20 20 20 20 20 25 66 6f 73 73 69 6c 20 74  **     %fossil t
23e0: 61 67 20 66 69 6e 64 20 3f 2d 2d 72 61 77 3f 20  ag find ?--raw? 
23f0: 54 41 47 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20  TAGNAME.**.**   
2400: 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 63        List all c
2410: 68 65 63 6b 2d 69 6e 73 20 74 68 61 74 20 75 73  heck-ins that us
2420: 65 20 54 41 47 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  e TAGNAME.**.** 
2430: 20 20 20 20 25 66 6f 73 73 69 6c 20 74 61 67 20      %fossil tag 
2440: 6c 69 73 74 20 3f 2d 2d 72 61 77 3f 20 3f 43 48  list ?--raw? ?CH
2450: 45 43 4b 2d 49 4e 3f 0a 2a 2a 0a 2a 2a 20 20 20  ECK-IN?.**.**   
2460: 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 74        List all t
2470: 61 67 73 2c 20 6f 72 20 69 66 20 43 48 45 43 4b  ags, or if CHECK
2480: 2d 49 4e 20 69 73 20 73 75 70 70 6c 69 65 64 2c  -IN is supplied,
2490: 20 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   list.**        
24a0: 20 61 6c 6c 20 74 61 67 73 20 61 6e 64 20 74 68   all tags and th
24b0: 65 69 72 20 76 61 6c 75 65 73 20 66 6f 72 20 43  eir values for C
24c0: 48 45 43 4b 2d 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54  HECK-IN..**.** T
24d0: 68 65 20 6f 70 74 69 6f 6e 20 2d 2d 72 61 77 20  he option --raw 
24e0: 61 6c 6c 6f 77 73 20 74 68 65 20 6d 61 6e 69 70  allows the manip
24f0: 75 6c 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 74  ulation of all t
2500: 79 70 65 73 20 6f 66 20 74 61 67 73 0a 2a 2a 20  ypes of tags.** 
2510: 75 73 65 64 20 66 6f 72 20 76 61 72 69 6f 75 73  used for various
2520: 20 69 6e 74 65 72 6e 61 6c 20 70 75 72 70 6f 73   internal purpos
2530: 65 73 20 69 6e 20 66 6f 73 73 69 6c 2e 20 49 74  es in fossil. It
2540: 20 61 6c 73 6f 20 73 68 6f 77 73 0a 2a 2a 20 22   also shows.** "
2550: 63 61 6e 63 65 6c 22 20 74 61 67 73 20 66 6f 72  cancel" tags for
2560: 20 74 68 65 20 22 66 69 6e 64 22 20 61 6e 64 20   the "find" and 
2570: 22 6c 69 73 74 22 20 73 75 62 63 6f 6d 6d 61 6e  "list" subcomman
2580: 64 73 2e 20 59 6f 75 20 73 68 6f 75 6c 64 0a 2a  ds. You should.*
2590: 2a 20 6e 6f 74 20 75 73 65 20 74 68 69 73 20 6f  * not use this o
25a0: 70 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20 63 68  ption to make ch
25b0: 61 6e 67 65 73 20 75 6e 6c 65 73 73 20 79 6f 75  anges unless you
25c0: 20 61 72 65 20 73 75 72 65 20 77 68 61 74 0a 2a   are sure what.*
25d0: 2a 20 79 6f 75 20 61 72 65 20 64 6f 69 6e 67 2e  * you are doing.
25e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 6e 65  .**.** If you ne
25f0: 65 64 20 74 6f 20 75 73 65 20 61 20 74 61 67 6e  ed to use a tagn
2600: 61 6d 65 20 74 68 61 74 20 6d 69 67 68 74 20 62  ame that might b
2610: 65 20 63 6f 6e 66 75 73 65 64 20 77 69 74 68 0a  e confused with.
2620: 2a 2a 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c  ** a hexadecimal
2630: 20 62 61 73 65 6c 69 6e 65 20 6f 72 20 61 72 74   baseline or art
2640: 69 66 61 63 74 20 49 44 2c 20 79 6f 75 20 63 61  ifact ID, you ca
2650: 6e 20 65 78 70 6c 69 63 69 74 6c 79 0a 2a 2a 20  n explicitly.** 
2660: 64 69 73 61 6d 62 69 67 75 61 74 65 20 69 74 20  disambiguate it 
2670: 62 79 20 70 72 65 66 69 78 69 6e 67 20 69 74 20  by prefixing it 
2680: 77 69 74 68 20 22 74 61 67 3a 22 2e 20 46 6f 72  with "tag:". For
2690: 20 69 6e 73 74 61 6e 63 65 3a 0a 2a 2a 0a 2a 2a   instance:.**.**
26a0: 20 20 20 66 6f 73 73 69 6c 20 75 70 64 61 74 65     fossil update
26b0: 20 64 65 63 61 66 0a 2a 2a 0a 2a 2a 20 77 69 6c   decaf.**.** wil
26c0: 6c 20 62 65 20 74 61 6b 65 6e 20 61 73 20 61 6e  l be taken as an
26d0: 20 61 72 74 69 66 61 63 74 20 6f 72 20 62 61 73   artifact or bas
26e0: 65 6c 69 6e 65 20 49 44 20 61 6e 64 20 66 6f 73  eline ID and fos
26f0: 73 69 6c 20 77 69 6c 6c 0a 2a 2a 20 70 72 6f 62  sil will.** prob
2700: 61 62 6c 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68  ably complain th
2710: 61 74 20 6e 6f 20 73 75 63 68 20 72 65 76 69 73  at no such revis
2720: 69 6f 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 48  ion was found. H
2730: 6f 77 65 76 65 72 0a 2a 2a 0a 2a 2a 20 20 20 66  owever.**.**   f
2740: 6f 73 73 69 6c 20 75 70 64 61 74 65 20 74 61 67  ossil update tag
2750: 3a 64 65 63 61 66 0a 2a 2a 0a 2a 2a 20 77 69 6c  :decaf.**.** wil
2760: 6c 20 61 73 73 75 6d 65 20 74 68 61 74 20 22 64  l assume that "d
2770: 65 63 61 66 22 20 69 73 20 61 20 74 61 67 2f 62  ecaf" is a tag/b
2780: 72 61 6e 63 68 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  ranch name..**.*
2790: 2f 0a 76 6f 69 64 20 74 61 67 5f 63 6d 64 28 76  /.void tag_cmd(v
27a0: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  oid){.  int n;. 
27b0: 20 69 6e 74 20 66 52 61 77 20 3d 20 66 69 6e 64   int fRaw = find
27c0: 5f 6f 70 74 69 6f 6e 28 22 72 61 77 22 2c 22 22  _option("raw",""
27d0: 2c 30 29 21 3d 30 3b 0a 20 20 69 6e 74 20 66 50  ,0)!=0;.  int fP
27e0: 72 6f 70 61 67 61 74 65 20 3d 20 66 69 6e 64 5f  ropagate = find_
27f0: 6f 70 74 69 6f 6e 28 22 70 72 6f 70 61 67 61 74  option("propagat
2800: 65 22 2c 22 22 2c 30 29 21 3d 30 3b 0a 20 20 63  e","",0)!=0;.  c
2810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66  onst char *zPref
2820: 69 78 20 3d 20 66 52 61 77 20 3f 20 22 22 20 3a  ix = fRaw ? "" :
2830: 20 22 73 79 6d 2d 22 3b 0a 0a 20 20 64 62 5f 66   "sym-";..  db_f
2840: 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70  ind_and_open_rep
2850: 6f 73 69 74 6f 72 79 28 31 29 3b 0a 20 20 69 66  ository(1);.  if
2860: 28 20 67 2e 61 72 67 63 3c 33 20 29 7b 0a 20 20  ( g.argc<3 ){.  
2870: 20 20 67 6f 74 6f 20 74 61 67 5f 63 6d 64 5f 75    goto tag_cmd_u
2880: 73 61 67 65 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  sage;.  }.  n = 
2890: 73 74 72 6c 65 6e 28 67 2e 61 72 67 76 5b 32 5d  strlen(g.argv[2]
28a0: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  );.  if( n==0 ){
28b0: 0a 20 20 20 20 67 6f 74 6f 20 74 61 67 5f 63 6d  .    goto tag_cm
28c0: 64 5f 75 73 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  d_usage;.  }..  
28d0: 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72  if( strncmp(g.ar
28e0: 67 76 5b 32 5d 2c 22 61 64 64 22 2c 6e 29 3d 3d  gv[2],"add",n)==
28f0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
2900: 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 67  Value;.    if( g
2910: 2e 61 72 67 63 21 3d 35 20 26 26 20 67 2e 61 72  .argc!=5 && g.ar
2920: 67 63 21 3d 36 20 29 7b 0a 20 20 20 20 20 20 75  gc!=6 ){.      u
2930: 73 61 67 65 28 22 61 64 64 20 3f 2d 2d 72 61 77  sage("add ?--raw
2940: 3f 20 3f 2d 2d 70 72 6f 70 61 67 61 74 65 3f 20  ? ?--propagate? 
2950: 54 41 47 4e 41 4d 45 20 43 48 45 43 4b 2d 49 4e  TAGNAME CHECK-IN
2960: 20 3f 56 41 4c 55 45 3f 22 29 3b 0a 20 20 20 20   ?VALUE?");.    
2970: 7d 0a 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 67  }.    zValue = g
2980: 2e 61 72 67 63 3d 3d 36 20 3f 20 67 2e 61 72 67  .argc==6 ? g.arg
2990: 76 5b 35 5d 20 3a 20 30 3b 0a 20 20 20 20 74 61  v[5] : 0;.    ta
29a0: 67 5f 61 64 64 5f 61 72 74 69 66 61 63 74 28 7a  g_add_artifact(z
29b0: 50 72 65 66 69 78 2c 20 67 2e 61 72 67 76 5b 33  Prefix, g.argv[3
29c0: 5d 2c 20 67 2e 61 72 67 76 5b 34 5d 2c 20 7a 56  ], g.argv[4], zV
29d0: 61 6c 75 65 2c 20 31 2b 66 50 72 6f 70 61 67 61  alue, 1+fPropaga
29e0: 74 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  te);.  }else..  
29f0: 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72  if( strncmp(g.ar
2a00: 67 76 5b 32 5d 2c 22 62 72 61 6e 63 68 22 2c 6e  gv[2],"branch",n
2a10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73  )==0 ){.    foss
2a20: 69 6c 5f 66 61 74 61 6c 28 22 74 68 65 20 5c 22  il_fatal("the \"
2a30: 66 6f 73 73 69 6c 20 74 61 67 20 62 72 61 6e 63  fossil tag branc
2a40: 68 5c 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  h\" command is d
2a50: 69 73 63 6f 6e 74 69 6e 75 65 64 5c 6e 22 0a 20  iscontinued\n". 
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 22 55 73 65 20 74 68 65 20 5c 22 66 6f 73 73 69  "Use the \"fossi
2a80: 6c 20 62 72 61 6e 63 68 20 6e 65 77 5c 22 20 63  l branch new\" c
2a90: 6f 6d 6d 61 6e 64 20 69 6e 73 74 65 61 64 2e 22  ommand instead."
2aa0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
2ab0: 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76  ( strncmp(g.argv
2ac0: 5b 32 5d 2c 22 63 61 6e 63 65 6c 22 2c 6e 29 3d  [2],"cancel",n)=
2ad0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e  =0 ){.    if( g.
2ae0: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 20  argc!=5 ){.     
2af0: 20 75 73 61 67 65 28 22 63 61 6e 63 65 6c 20 3f   usage("cancel ?
2b00: 2d 2d 72 61 77 3f 20 54 41 47 4e 41 4d 45 20 43  --raw? TAGNAME C
2b10: 48 45 43 4b 2d 49 4e 22 29 3b 0a 20 20 20 20 7d  HECK-IN");.    }
2b20: 0a 20 20 20 20 74 61 67 5f 61 64 64 5f 61 72 74  .    tag_add_art
2b30: 69 66 61 63 74 28 7a 50 72 65 66 69 78 2c 20 67  ifact(zPrefix, g
2b40: 2e 61 72 67 76 5b 33 5d 2c 20 67 2e 61 72 67 76  .argv[3], g.argv
2b50: 5b 34 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  [4], 0, 0);.  }e
2b60: 6c 73 65 0a 0a 20 20 69 66 28 20 73 74 72 6e 63  lse..  if( strnc
2b70: 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 66 69  mp(g.argv[2],"fi
2b80: 6e 64 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  nd",n)==0 ){.   
2b90: 20 53 74 6d 74 20 71 3b 0a 20 20 20 20 69 66 28   Stmt q;.    if(
2ba0: 20 67 2e 61 72 67 63 21 3d 34 20 29 7b 0a 20 20   g.argc!=4 ){.  
2bb0: 20 20 20 20 75 73 61 67 65 28 22 66 69 6e 64 20      usage("find 
2bc0: 3f 2d 2d 72 61 77 3f 20 54 41 47 4e 41 4d 45 22  ?--raw? TAGNAME"
2bd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2be0: 20 66 52 61 77 20 29 7b 0a 20 20 20 20 20 20 64   fRaw ){.      d
2bf0: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20  b_prepare(&q,.  
2c00: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 62 6c        "SELECT bl
2c10: 6f 62 2e 75 75 69 64 20 46 52 4f 4d 20 74 61 67  ob.uuid FROM tag
2c20: 78 72 65 66 2c 20 62 6c 6f 62 22 0a 20 20 20 20  xref, blob".    
2c30: 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67 69      " WHERE tagi
2c40: 64 3d 28 53 45 4c 45 43 54 20 74 61 67 69 64 20  d=(SELECT tagid 
2c50: 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74  FROM tag WHERE t
2c60: 61 67 6e 61 6d 65 3d 25 51 29 22 0a 20 20 20 20  agname=%Q)".    
2c70: 20 20 20 20 22 20 20 20 41 4e 44 20 74 61 67 78      "   AND tagx
2c80: 72 65 66 2e 74 61 67 74 79 70 65 3e 30 22 0a 20  ref.tagtype>0". 
2c90: 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 62         "   AND b
2ca0: 6c 6f 62 2e 72 69 64 3d 74 61 67 78 72 65 66 2e  lob.rid=tagxref.
2cb0: 72 69 64 22 2c 0a 20 20 20 20 20 20 20 20 67 2e  rid",.        g.
2cc0: 61 72 67 76 5b 33 5d 0a 20 20 20 20 20 20 29 3b  argv[3].      );
2cd0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64 62  .      while( db
2ce0: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
2cf0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
2d00: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
2d10: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
2d20: 71 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a  q, 0));.      }.
2d30: 20 20 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a        db_finaliz
2d40: 65 28 26 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e(&q);.    }else
2d50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 67 69  {.      int tagi
2d60: 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53  d = db_int(0, "S
2d70: 45 4c 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d  ELECT tagid FROM
2d80: 20 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61   tag WHERE tagna
2d90: 6d 65 3d 27 73 79 6d 2d 25 71 27 22 2c 0a 20 20  me='sym-%q'",.  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 20 20 67 2e 61 72 67 76 5b 33 5d         g.argv[3]
2dc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 61 67  );.      if( tag
2dd0: 69 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  id>0 ){.        
2de0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20  db_prepare(&q,. 
2df0: 20 20 20 20 20 20 20 20 20 22 25 73 22 0a 20 20           "%s".  
2e00: 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 62          "  AND b
2e10: 6c 6f 62 2e 72 69 64 20 49 4e 20 28 22 0a 20 20  lob.rid IN (".  
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 22 20 53 45 4c 45 43 54 20 72 69 64 20 46    " SELECT rid F
2e40: 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20 20 20  ROM tagxref".   
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 22 20 20 57 48 45 52 45 20 74 61 67 74 79 70   "  WHERE tagtyp
2e70: 65 3e 30 20 41 4e 44 20 74 61 67 69 64 3d 25 64  e>0 AND tagid=%d
2e80: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2e90: 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20 20        ")".      
2ea0: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 65      " ORDER BY e
2eb0: 76 65 6e 74 2e 6d 74 69 6d 65 20 44 45 53 43 22  vent.mtime DESC"
2ec0: 2c 0a 20 20 20 20 20 20 20 20 20 20 74 69 6d 65  ,.          time
2ed0: 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74  line_query_for_t
2ee0: 74 79 28 29 2c 20 74 61 67 69 64 0a 20 20 20 20  ty(), tagid.    
2ef0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
2f00: 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26 71  rint_timeline(&q
2f10: 2c 20 32 30 30 30 29 3b 0a 20 20 20 20 20 20 20  , 2000);.       
2f20: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
2f30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f40: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
2f50: 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 5d  trncmp(g.argv[2]
2f60: 2c 22 6c 69 73 74 22 2c 6e 29 3d 3d 30 20 29 7b  ,"list",n)==0 ){
2f70: 0a 20 20 20 20 53 74 6d 74 20 71 3b 0a 20 20 20  .    Stmt q;.   
2f80: 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 29   if( g.argc==3 )
2f90: 7b 0a 20 20 20 20 20 20 64 62 5f 70 72 65 70 61  {.      db_prepa
2fa0: 72 65 28 26 71 2c 20 0a 20 20 20 20 20 20 20 20  re(&q, .        
2fb0: 22 53 45 4c 45 43 54 20 74 61 67 6e 61 6d 65 20  "SELECT tagname 
2fc0: 46 52 4f 4d 20 74 61 67 22 0a 20 20 20 20 20 20  FROM tag".      
2fd0: 20 20 22 20 57 48 45 52 45 20 45 58 49 53 54 53    " WHERE EXISTS
2fe0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74  (SELECT 1 FROM t
2ff0: 61 67 78 72 65 66 22 0a 20 20 20 20 20 20 20 20  agxref".        
3000: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3010: 57 48 45 52 45 20 74 61 67 69 64 3d 74 61 67 2e  WHERE tagid=tag.
3020: 74 61 67 69 64 22 0a 20 20 20 20 20 20 20 20 22  tagid".        "
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30 29 22   AND tagtype>0)"
3050: 0a 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52  .        " ORDER
3060: 20 42 59 20 74 61 67 6e 61 6d 65 22 0a 20 20 20   BY tagname".   
3070: 20 20 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c     );.      whil
3080: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
3090: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
30a0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
30b0: 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c   *zName = db_col
30c0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b  umn_text(&q, 0);
30d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 52 61  .        if( fRa
30e0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
30f0: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 4e  rintf("%s\n", zN
3100: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
3110: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
3120: 7a 4e 61 6d 65 2c 20 22 73 79 6d 2d 22 2c 20 34  zName, "sym-", 4
3130: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3140: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
3150: 20 26 7a 4e 61 6d 65 5b 34 5d 29 3b 0a 20 20 20   &zName[4]);.   
3160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3170: 20 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65       db_finalize
3180: 28 26 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  (&q);.    }else 
3190: 69 66 28 20 67 2e 61 72 67 63 3d 3d 34 20 29 7b  if( g.argc==4 ){
31a0: 0a 20 20 20 20 20 20 69 6e 74 20 72 69 64 20 3d  .      int rid =
31b0: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 67 2e 61   name_to_rid(g.a
31c0: 72 67 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 64  rgv[3]);.      d
31d0: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20  b_prepare(&q,.  
31e0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 61        "SELECT ta
31f0: 67 6e 61 6d 65 2c 20 76 61 6c 75 65 20 46 52 4f  gname, value FRO
3200: 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a  M tagxref, tag".
3210: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
3220: 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64 20 41  tagxref.rid=%d A
3230: 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67 69 64  ND tagxref.tagid
3240: 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20 20 20  =tag.tagid".    
3250: 20 20 20 20 22 20 20 20 41 4e 44 20 74 61 67 74      "   AND tagt
3260: 79 70 65 3e 25 64 22 0a 20 20 20 20 20 20 20 20  ype>%d".        
3270: 22 20 4f 52 44 45 52 20 42 59 20 74 61 67 6e 61  " ORDER BY tagna
3280: 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 72 69 64  me",.        rid
3290: 2c 0a 20 20 20 20 20 20 20 20 66 52 61 77 20 3f  ,.        fRaw ?
32a0: 20 2d 31 20 3a 20 30 0a 20 20 20 20 20 20 29 3b   -1 : 0.      );
32b0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64 62  .      while( db
32c0: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
32d0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
32e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
32f0: 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  me = db_column_t
3300: 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  ext(&q, 0);.    
3310: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3320: 7a 56 61 6c 75 65 20 3d 20 64 62 5f 63 6f 6c 75  zValue = db_colu
3330: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
3340: 20 20 20 20 20 20 20 20 69 66 28 20 66 52 61 77          if( fRaw
3350: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3360: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
3370: 6d 65 2c 20 22 73 79 6d 2d 22 2c 20 34 29 21 3d  me, "sym-", 4)!=
3380: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
3390: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
33a0: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
33b0: 20 20 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65        if( zValue
33c0: 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b   && zValue[0] ){
33d0: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
33e0: 66 28 22 25 73 3d 25 73 5c 6e 22 2c 20 7a 4e 61  f("%s=%s\n", zNa
33f0: 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20  me, zValue);.   
3400: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3410: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
3420: 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  \n", zName);.   
3430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3440: 20 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65       db_finalize
3450: 28 26 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  (&q);.    }else{
3460: 0a 20 20 20 20 20 20 75 73 61 67 65 28 22 74 61  .      usage("ta
3470: 67 20 6c 69 73 74 20 3f 43 48 45 43 4b 2d 49 4e  g list ?CHECK-IN
3480: 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ?");.    }.  }el
3490: 73 65 0a 20 20 7b 0a 20 20 20 20 67 6f 74 6f 20  se.  {.    goto 
34a0: 74 61 67 5f 63 6d 64 5f 75 73 61 67 65 3b 0a 20  tag_cmd_usage;. 
34b0: 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 75 70   }..  /* Cleanup
34c0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 74   */.  return;..t
34d0: 61 67 5f 63 6d 64 5f 75 73 61 67 65 3a 0a 20 20  ag_cmd_usage:.  
34e0: 75 73 61 67 65 28 22 61 64 64 7c 63 61 6e 63 65  usage("add|cance
34f0: 6c 7c 66 69 6e 64 7c 6c 69 73 74 20 2e 2e 2e 22  l|find|list ..."
3500: 29 3b 0a 7d 0a                                   );.}.