Hex Artifact Content
Not logged in

Artifact 1d87ff81d3c06eb9397bd7e443c59895dff2ab26:

File src/manifest.c part of check-in [09c4adeb6f] - Rework the tag system so that propagation to children is a property of each tag and does not depend on the tag name beginning with "br". Older tag artifacts might not work. The database will need to be rebuilt after upgrading to this version. by drh on 2007-09-22 23:41:29.

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 63 72 6f 73 73 20 6c 69 6e  sed to cross lin
0390: 6b 20 63 6f 6e 74 72 6f 6c 20 66 69 6c 65 73 20  k control files 
03a0: 61 6e 64 0a 2a 2a 20 6d 61 6e 69 66 65 73 74 73  and.** manifests
03b0: 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
03c0: 61 6d 65 64 20 22 6d 61 6e 69 66 65 73 74 2e 63  amed "manifest.c
03d0: 22 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  " because it was
03e0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 6f 6e 6c  .** original onl
03f0: 79 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  y used to parse 
0400: 6d 61 6e 69 66 65 73 74 73 2e 20 20 54 68 65 6e  manifests.  Then
0410: 20 6c 61 74 65 72 20 63 6c 75 73 74 65 72 73 0a   later clusters.
0420: 2a 2a 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66  ** and control f
0430: 69 6c 65 73 20 77 65 72 65 20 61 64 64 65 64 2e  iles were added.
0440: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  .*/.#include "co
0450: 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65  nfig.h".#include
0460: 20 22 6d 61 6e 69 66 65 73 74 2e 68 22 0a 23 69   "manifest.h".#i
0470: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0480: 3e 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45  >..#if INTERFACE
0490: 0a 2f 2a 0a 2a 2a 20 54 79 70 65 73 20 6f 66 20  ./*.** Types of 
04a0: 63 6f 6e 74 72 6f 6c 20 66 69 6c 65 73 0a 2a 2f  control files.*/
04b0: 0a 23 64 65 66 69 6e 65 20 43 46 54 59 50 45 5f  .#define CFTYPE_
04c0: 4d 41 4e 49 46 45 53 54 20 20 20 31 0a 23 64 65  MANIFEST   1.#de
04d0: 66 69 6e 65 20 43 46 54 59 50 45 5f 43 4c 55 53  fine CFTYPE_CLUS
04e0: 54 45 52 20 20 20 20 32 0a 23 64 65 66 69 6e 65  TER    2.#define
04f0: 20 43 46 54 59 50 45 5f 43 4f 4e 54 52 4f 4c 20   CFTYPE_CONTROL 
0500: 20 20 20 33 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 61     3../*.** A pa
0510: 72 73 65 64 20 6d 61 6e 69 66 65 73 74 20 6f 72  rsed manifest or
0520: 20 63 6c 75 73 74 65 72 2e 0a 2a 2f 0a 73 74 72   cluster..*/.str
0530: 75 63 74 20 4d 61 6e 69 66 65 73 74 20 7b 0a 20  uct Manifest {. 
0540: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 20 20   Blob content;  
0550: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
0560: 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 62  iginal content b
0570: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70  lob */.  int typ
0580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
0590: 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 2a  * Type of file *
05a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65  /.  char *zComme
05b0: 6e 74 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 63  nt;       /* Dec
05c0: 6f 64 65 64 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a  oded comment */.
05d0: 20 20 63 68 61 72 20 7a 55 75 69 64 5b 55 55 49    char zUuid[UUI
05e0: 44 5f 53 49 5a 45 2b 31 5d 3b 20 20 2f 2a 20 53  D_SIZE+1];  /* S
05f0: 65 6c 66 20 55 55 49 44 20 2a 2f 0a 20 20 64 6f  elf UUID */.  do
0600: 75 62 6c 65 20 72 44 61 74 65 3b 20 20 20 20 20  uble rDate;     
0610: 20 20 20 20 2f 2a 20 54 69 6d 65 20 69 6e 20 74      /* Time in t
0620: 68 65 20 22 44 22 20 6c 69 6e 65 20 2a 2f 0a 20  he "D" line */. 
0630: 20 63 68 61 72 20 2a 7a 55 73 65 72 3b 20 20 20   char *zUser;   
0640: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0650: 66 20 74 68 65 20 75 73 65 72 20 2a 2f 0a 20 20  f the user */.  
0660: 63 68 61 72 20 2a 7a 52 65 70 6f 43 6b 73 75 6d  char *zRepoCksum
0670: 3b 20 20 20 20 20 2f 2a 20 4d 44 35 20 63 68 65  ;     /* MD5 che
0680: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 62 61 73  cksum of the bas
0690: 65 6c 69 6e 65 20 63 6f 6e 74 65 6e 74 20 2a 2f  eline content */
06a0: 0a 20 20 69 6e 74 20 6e 46 69 6c 65 3b 20 20 20  .  int nFile;   
06b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
06c0: 65 72 20 6f 66 20 46 20 6c 69 6e 65 73 20 2a 2f  er of F lines */
06d0: 0a 20 20 69 6e 74 20 6e 46 69 6c 65 41 6c 6c 6f  .  int nFileAllo
06e0: 63 3b 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74  c;       /* Slot
06f0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
0700: 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  File[] */.  stru
0710: 63 74 20 7b 20 0a 20 20 20 20 63 68 61 72 20 2a  ct { .    char *
0720: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
0730: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 66 69   /* Name of a fi
0740: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
0750: 7a 55 75 69 64 3b 20 20 20 20 20 20 20 20 20 20  zUuid;          
0760: 20 2f 2a 20 55 55 49 44 20 6f 66 20 74 68 65 20   /* UUID of the 
0770: 66 69 6c 65 20 2a 2f 0a 20 20 7d 20 2a 61 46 69  file */.  } *aFi
0780: 6c 65 3b 0a 20 20 69 6e 74 20 6e 50 61 72 65 6e  le;.  int nParen
0790: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  t;          /* N
07a0: 75 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74 73  umber of parents
07b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 65 6e   */.  int nParen
07c0: 74 41 6c 6c 6f 63 3b 20 20 20 20 20 2f 2a 20 53  tAlloc;     /* S
07d0: 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  lots allocated i
07e0: 6e 20 61 7a 50 61 72 65 6e 74 5b 5d 20 2a 2f 0a  n azParent[] */.
07f0: 20 20 63 68 61 72 20 2a 2a 61 7a 50 61 72 65 6e    char **azParen
0800: 74 3b 20 20 20 20 20 20 2f 2a 20 55 55 49 44 73  t;      /* UUIDs
0810: 20 6f 66 20 70 61 72 65 6e 74 73 20 2a 2f 0a 20   of parents */. 
0820: 20 69 6e 74 20 6e 43 43 68 69 6c 64 3b 20 20 20   int nCChild;   
0830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0840: 20 6f 66 20 63 6c 75 73 74 65 72 20 63 68 69 6c   of cluster chil
0850: 64 72 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  dren */.  int nC
0860: 43 68 69 6c 64 41 6c 6c 6f 63 3b 20 20 20 20 20  ChildAlloc;     
0870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6c 6f  /* Number of clo
0880: 73 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  sts allocated in
0890: 20 61 7a 43 43 68 69 6c 64 5b 5d 20 2a 2f 0a 20   azCChild[] */. 
08a0: 20 63 68 61 72 20 2a 2a 61 7a 43 43 68 69 6c 64   char **azCChild
08b0: 3b 20 20 20 20 20 20 2f 2a 20 55 55 49 44 73 20  ;      /* UUIDs 
08c0: 6f 66 20 72 65 66 65 72 65 6e 63 65 64 20 6f 62  of referenced ob
08d0: 6a 65 63 74 73 20 69 6e 20 61 20 63 6c 75 73 74  jects in a clust
08e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 67  er */.  int nTag
08f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0900: 20 4e 75 6d 62 65 72 20 6f 66 20 54 20 6c 69 6e   Number of T lin
0910: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 67  es */.  int nTag
0920: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 2f 2a  Alloc;        /*
0930: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
0940: 20 69 6e 20 61 54 61 67 5b 5d 20 2a 2f 0a 20 20   in aTag[] */.  
0950: 73 74 72 75 63 74 20 7b 20 0a 20 20 20 20 63 68  struct { .    ch
0960: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
0970: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0980: 74 68 65 20 74 61 67 20 2a 2f 0a 20 20 20 20 63  the tag */.    c
0990: 68 61 72 20 2a 7a 55 75 69 64 3b 20 20 20 20 20  har *zUuid;     
09a0: 20 20 20 20 20 20 2f 2a 20 55 55 49 44 20 74 68        /* UUID th
09b0: 61 74 20 74 68 65 20 74 61 67 20 69 73 20 61 70  at the tag is ap
09c0: 70 6c 69 65 64 20 74 6f 20 2a 2f 0a 20 20 20 20  plied to */.    
09d0: 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b 20 20 20  char *zValue;   
09e0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
09f0: 69 66 20 74 68 65 20 74 61 67 20 69 73 20 72 65  if the tag is re
0a00: 61 6c 6c 79 20 61 20 70 72 6f 70 65 72 74 79 20  ally a property 
0a10: 2a 2f 0a 20 20 7d 20 2a 61 54 61 67 3b 0a 7d 3b  */.  } *aTag;.};
0a20: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
0a30: 43 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79  Clear the memory
0a40: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 20   allocated in a 
0a50: 6d 61 6e 69 66 65 73 74 20 6f 62 6a 65 63 74 0a  manifest object.
0a60: 2a 2f 0a 76 6f 69 64 20 6d 61 6e 69 66 65 73 74  */.void manifest
0a70: 5f 63 6c 65 61 72 28 4d 61 6e 69 66 65 73 74 20  _clear(Manifest 
0a80: 2a 70 29 7b 0a 20 20 62 6c 6f 62 5f 72 65 73 65  *p){.  blob_rese
0a90: 74 28 26 70 2d 3e 63 6f 6e 74 65 6e 74 29 3b 0a  t(&p->content);.
0aa0: 20 20 66 72 65 65 28 70 2d 3e 61 46 69 6c 65 29    free(p->aFile)
0ab0: 3b 0a 20 20 66 72 65 65 28 70 2d 3e 61 7a 50 61  ;.  free(p->azPa
0ac0: 72 65 6e 74 29 3b 0a 20 20 66 72 65 65 28 70 2d  rent);.  free(p-
0ad0: 3e 61 7a 43 43 68 69 6c 64 29 3b 0a 20 20 6d 65  >azCChild);.  me
0ae0: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
0af0: 66 28 2a 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(*p));.}../*.**
0b00: 20 50 61 72 73 65 20 61 20 6d 61 6e 69 66 65 73   Parse a manifes
0b10: 74 20 62 6c 6f 62 20 69 6e 74 6f 20 61 20 4d 61  t blob into a Ma
0b20: 6e 69 66 65 73 74 20 6f 62 6a 65 63 74 2e 20 20  nifest object.  
0b30: 54 68 65 20 4d 61 6e 69 66 65 73 74 0a 2a 2a 20  The Manifest.** 
0b40: 6f 62 6a 65 63 74 20 74 61 6b 65 73 20 6f 76 65  object takes ove
0b50: 72 20 74 68 65 20 69 6e 70 75 74 20 62 6c 6f 62  r the input blob
0b60: 20 61 6e 64 20 77 69 6c 6c 20 66 72 65 65 20 69   and will free i
0b70: 74 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 4d 61  t when the.** Ma
0b80: 6e 69 66 65 73 74 20 6f 62 6a 65 63 74 20 69 73  nifest object is
0b90: 20 66 72 65 65 64 2e 20 20 5a 65 72 6f 73 20 61   freed.  Zeros a
0ba0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  re inserted into
0bb0: 20 74 68 65 20 62 6c 6f 62 0a 2a 2a 20 61 73 20   the blob.** as 
0bc0: 73 74 72 69 6e 67 20 74 65 72 6d 69 6e 61 74 6f  string terminato
0bd0: 72 73 20 73 6f 20 74 68 61 74 20 62 6c 6f 62 20  rs so that blob 
0be0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73  should not be us
0bf0: 65 64 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ed again..**.** 
0c00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
0c10: 68 65 20 63 6f 6e 74 65 6e 74 20 72 65 61 6c 6c  he content reall
0c20: 79 20 69 73 20 61 20 6d 61 6e 69 66 65 73 74 2e  y is a manifest.
0c30: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
0c40: 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 73  * if there are s
0c50: 79 6e 74 61 78 20 65 72 72 6f 72 73 2e 0a 2a 2a  yntax errors..**
0c60: 0a 2a 2a 20 54 68 65 20 70 43 6f 6e 74 65 6e 74  .** The pContent
0c70: 20 69 73 20 72 65 73 65 74 2e 20 20 49 66 20 54   is reset.  If T
0c80: 52 55 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c  RUE is returned,
0c90: 20 74 68 65 6e 20 70 43 6f 6e 74 65 6e 74 20 77   then pContent w
0ca0: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 73 65 74 20  ill.** be reset 
0cb0: 77 68 65 6e 20 74 68 65 20 4d 61 6e 69 66 65 73  when the Manifes
0cc0: 74 20 6f 62 6a 65 63 74 20 69 73 20 63 6c 65 61  t object is clea
0cd0: 72 65 64 2e 20 20 49 66 20 46 41 4c 53 45 20 69  red.  If FALSE i
0ce0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 68  s.** returned th
0cf0: 65 6e 20 74 68 65 20 4d 61 6e 69 66 65 73 74 20  en the Manifest 
0d00: 6f 62 6a 65 63 74 20 69 73 20 63 6c 65 61 72 65  object is cleare
0d10: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  d automatically.
0d20: 2a 2a 20 61 6e 64 20 70 43 6f 6e 74 65 6e 74 20  ** and pContent 
0d30: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
0d40: 74 68 65 20 72 65 74 75 72 6e 2e 0a 2a 2f 0a 69  the return..*/.i
0d50: 6e 74 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73  nt manifest_pars
0d60: 65 28 4d 61 6e 69 66 65 73 74 20 2a 70 2c 20 42  e(Manifest *p, B
0d70: 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 29 7b 0a  lob *pContent){.
0d80: 20 20 69 6e 74 20 73 65 65 6e 48 65 61 64 65 72    int seenHeader
0d90: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
0da0: 20 42 6c 6f 62 20 6c 69 6e 65 2c 20 74 6f 6b 65   Blob line, toke
0db0: 6e 2c 20 61 31 2c 20 61 32 2c 20 61 33 3b 0a 20  n, a1, a2, a3;. 
0dc0: 20 42 6c 6f 62 20 73 65 6c 66 75 75 69 64 3b 0a   Blob selfuuid;.
0dd0: 20 20 63 68 61 72 20 7a 50 72 65 76 4c 69 6e 65    char zPrevLine
0de0: 5b 31 30 5d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  [10];..  memset(
0df0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
0e00: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e  );.  memcpy(&p->
0e10: 63 6f 6e 74 65 6e 74 2c 20 70 43 6f 6e 74 65 6e  content, pConten
0e20: 74 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6e  t, sizeof(p->con
0e30: 74 65 6e 74 29 29 3b 0a 20 20 73 68 61 31 73 75  tent));.  sha1su
0e40: 6d 5f 62 6c 6f 62 28 26 70 2d 3e 63 6f 6e 74 65  m_blob(&p->conte
0e50: 6e 74 2c 20 26 73 65 6c 66 75 75 69 64 29 3b 0a  nt, &selfuuid);.
0e60: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 55 75 69    memcpy(p->zUui
0e70: 64 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26  d, blob_buffer(&
0e80: 73 65 6c 66 75 75 69 64 29 2c 20 55 55 49 44 5f  selfuuid), UUID_
0e90: 53 49 5a 45 29 3b 0a 20 20 70 2d 3e 7a 55 75 69  SIZE);.  p->zUui
0ea0: 64 5b 55 55 49 44 5f 53 49 5a 45 5d 20 3d 20 30  d[UUID_SIZE] = 0
0eb0: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 43  ;.  blob_zero(pC
0ec0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 43 6f 6e 74  ontent);.  pCont
0ed0: 65 6e 74 20 3d 20 26 70 2d 3e 63 6f 6e 74 65 6e  ent = &p->conten
0ee0: 74 3b 0a 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  t;..  blob_zero(
0ef0: 26 61 31 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72  &a1);.  blob_zer
0f00: 6f 28 26 61 32 29 3b 0a 20 20 6d 64 35 73 75 6d  o(&a2);.  md5sum
0f10: 5f 69 6e 69 74 28 29 3b 0a 20 20 7a 50 72 65 76  _init();.  zPrev
0f20: 4c 69 6e 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 77  Line[0] = 0;.  w
0f30: 68 69 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e 65 28  hile( blob_line(
0f40: 70 43 6f 6e 74 65 6e 74 2c 20 26 6c 69 6e 65 29  pContent, &line)
0f50: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
0f60: 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c  = blob_buffer(&l
0f70: 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b  ine);.    if( z[
0f80: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
0f90: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20   if( strncmp(z, 
0fa0: 22 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 47 50 20  "-----BEGIN PGP 
0fb0: 22 2c 20 31 35 29 21 3d 30 20 29 7b 0a 20 20 20  ", 15)!=0 ){.   
0fc0: 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65       goto manife
0fd0: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
0fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
0ff0: 66 28 20 73 65 65 6e 48 65 61 64 65 72 20 29 7b  f( seenHeader ){
1000: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
1020: 69 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e 65 28 70  ile( blob_line(p
1030: 43 6f 6e 74 65 6e 74 2c 20 26 6c 69 6e 65 29 3e  Content, &line)>
1040: 32 20 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  2 ){}.      if( 
1050: 62 6c 6f 62 5f 6c 69 6e 65 28 70 43 6f 6e 74 65  blob_line(pConte
1060: 6e 74 2c 20 26 6c 69 6e 65 29 3d 3d 30 20 29 20  nt, &line)==0 ) 
1070: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a 20 3d  break;.      z =
1080: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69   blob_buffer(&li
1090: 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ne);.    }.    i
10a0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 7a 50 72  f( strcmp(z, zPr
10b0: 65 76 4c 69 6e 65 29 3c 30 20 29 7b 0a 20 20 20  evLine)<0 ){.   
10c0: 20 20 20 2f 2a 20 4c 69 6e 65 73 20 6f 66 20 61     /* Lines of a
10d0: 20 6d 61 6e 69 66 65 73 74 20 6d 75 73 74 20 6f   manifest must o
10e0: 63 63 75 72 20 69 6e 20 6c 65 78 69 63 6f 67 72  ccur in lexicogr
10f0: 61 70 68 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f  aphical order */
1100: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69  .      goto mani
1110: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
1120: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  r;.    }.    sql
1130: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1140: 7a 65 6f 66 28 7a 50 72 65 76 4c 69 6e 65 29 2c  zeof(zPrevLine),
1150: 20 7a 50 72 65 76 4c 69 6e 65 2c 20 22 25 73 22   zPrevLine, "%s"
1160: 2c 20 7a 29 3b 0a 20 20 20 20 73 65 65 6e 48 65  , z);.    seenHe
1170: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 69 66  ader = 1;.    if
1180: 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69  ( blob_token(&li
1190: 6e 65 2c 20 26 74 6f 6b 65 6e 29 21 3d 31 20 29  ne, &token)!=1 )
11a0: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
11b0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
11c0: 20 73 77 69 74 63 68 28 20 7a 5b 30 5d 20 29 7b   switch( z[0] ){
11d0: 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20  .      /*.      
11e0: 2a 2a 20 20 20 20 20 43 20 3c 63 6f 6d 6d 65 6e  **     C <commen
11f0: 74 3e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t>.      **.    
1200: 20 20 2a 2a 20 43 6f 6d 6d 65 6e 74 20 74 65 78    ** Comment tex
1210: 74 20 69 73 20 66 6f 73 73 69 6c 2d 65 6e 63 6f  t is fossil-enco
1220: 64 65 64 2e 20 20 54 68 65 72 65 20 6d 61 79 20  ded.  There may 
1230: 62 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 0a  be no more than.
1240: 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 43 20 6c        ** one C l
1250: 69 6e 65 2e 20 20 43 20 6c 69 6e 65 73 20 61 72  ine.  C lines ar
1260: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 6d  e required for m
1270: 61 6e 69 66 65 73 74 73 20 61 6e 64 20 61 72 65  anifests and are
1280: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 6c 6c  .      ** disall
1290: 6f 77 65 64 20 6f 6e 20 61 6c 6c 20 6f 74 68 65  owed on all othe
12a0: 72 20 63 6f 6e 74 72 6f 6c 20 66 69 6c 65 73 2e  r control files.
12b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12c0: 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20 20 20  case 'C': {.    
12d0: 20 20 20 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f      md5sum_step_
12e0: 74 65 78 74 28 62 6c 6f 62 5f 62 75 66 66 65 72  text(blob_buffer
12f0: 28 26 6c 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 69  (&line), blob_si
1300: 7a 65 28 26 6c 69 6e 65 29 29 3b 0a 20 20 20 20  ze(&line));.    
1310: 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6d 6d      if( p->zComm
1320: 65 6e 74 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61  ent!=0 ) goto ma
1330: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
1340: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ror;.        if(
1350: 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e   blob_token(&lin
1360: 65 2c 20 26 61 31 29 3d 3d 30 20 29 20 67 6f 74  e, &a1)==0 ) got
1370: 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61  o manifest_synta
1380: 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  x_error;.       
1390: 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28   if( blob_token(
13a0: 26 6c 69 6e 65 2c 20 26 61 32 29 21 3d 30 20 29  &line, &a2)!=0 )
13b0: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
13c0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
13d0: 20 20 20 20 20 70 2d 3e 7a 43 6f 6d 6d 65 6e 74       p->zComment
13e0: 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74   = blob_terminat
13f0: 65 28 26 61 31 29 3b 0a 20 20 20 20 20 20 20 20  e(&a1);.        
1400: 64 65 66 6f 73 73 69 6c 69 7a 65 28 70 2d 3e 7a  defossilize(p->z
1410: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
1420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1430: 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  ..      /*.     
1440: 20 2a 2a 20 20 20 20 20 44 20 3c 74 69 6d 65 73   **     D <times
1450: 74 61 6d 70 3e 0a 20 20 20 20 20 20 2a 2a 0a 20  tamp>.      **. 
1460: 20 20 20 20 20 2a 2a 20 54 68 65 20 74 69 6d 65       ** The time
1470: 73 74 61 6d 70 20 73 68 6f 75 6c 64 20 62 65 20  stamp should be 
1480: 49 53 4f 20 38 36 30 31 2e 20 20 20 59 59 59 59  ISO 8601.   YYYY
1490: 2d 4d 4d 2d 44 44 74 48 48 3a 4d 4d 3a 53 53 0a  -MM-DDtHH:MM:SS.
14a0: 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 63        ** There c
14b0: 61 6e 20 62 65 20 6e 6f 20 6d 6f 72 65 20 74 68  an be no more th
14c0: 61 6e 20 31 20 44 20 6c 69 6e 65 2e 20 20 44 20  an 1 D line.  D 
14d0: 6c 69 6e 65 73 20 61 72 65 20 72 65 71 75 69 72  lines are requir
14e0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ed.      ** for 
14f0: 61 6c 6c 20 63 6f 6e 74 72 6f 6c 20 66 69 6c 65  all control file
1500: 73 20 65 78 63 65 70 74 20 66 6f 72 20 63 6c 75  s except for clu
1510: 73 74 65 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  sters..      */.
1520: 20 20 20 20 20 20 63 61 73 65 20 27 44 27 3a 20        case 'D': 
1530: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1540: 7a 44 61 74 65 3b 0a 20 20 20 20 20 20 20 20 6d  zDate;.        m
1550: 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28  d5sum_step_text(
1560: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 6e  blob_buffer(&lin
1570: 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 6c  e), blob_size(&l
1580: 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ine));.        i
1590: 66 28 20 70 2d 3e 72 44 61 74 65 21 3d 30 2e 30  f( p->rDate!=0.0
15a0: 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74   ) goto manifest
15b0: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
15c0: 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f         if( blob_
15d0: 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 31  token(&line, &a1
15e0: 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  )==0 ) goto mani
15f0: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
1600: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  r;.        if( b
1610: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c  lob_token(&line,
1620: 20 26 61 32 29 21 3d 30 20 29 20 67 6f 74 6f 20   &a2)!=0 ) goto 
1630: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
1640: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a  error;.        z
1650: 44 61 74 65 20 3d 20 62 6c 6f 62 5f 74 65 72 6d  Date = blob_term
1660: 69 6e 61 74 65 28 26 61 31 29 3b 0a 20 20 20 20  inate(&a1);.    
1670: 20 20 20 20 70 2d 3e 72 44 61 74 65 20 3d 20 64      p->rDate = d
1680: 62 5f 64 6f 75 62 6c 65 28 30 2e 30 2c 20 22 53  b_double(0.0, "S
1690: 45 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28  ELECT julianday(
16a0: 25 51 29 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20  %Q)", zDate);.  
16b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20     }..      /*. 
16d0: 20 20 20 20 20 2a 2a 20 20 20 20 20 46 20 3c 66       **     F <f
16e0: 69 6c 65 6e 61 6d 65 3e 20 3c 75 75 69 64 3e 0a  ilename> <uuid>.
16f0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1700: 2a 20 49 64 65 6e 74 69 66 69 65 73 20 61 20 66  * Identifies a f
1710: 69 6c 65 20 69 6e 20 61 20 6d 61 6e 69 66 65 73  ile in a manifes
1720: 74 2e 20 20 4d 75 6c 74 69 70 6c 65 20 46 20 6c  t.  Multiple F l
1730: 69 6e 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ines are.      *
1740: 2a 20 61 6c 6c 6f 77 65 64 20 69 6e 20 61 20 6d  * allowed in a m
1750: 61 6e 69 66 65 73 74 2e 20 20 46 20 6c 69 6e 65  anifest.  F line
1760: 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
1770: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 20 20 2a  d in any.      *
1780: 2a 20 6f 74 68 65 72 20 63 6f 6e 74 72 6f 6c 20  * other control 
1790: 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65 6e  file.  The filen
17a0: 61 6d 65 20 69 73 20 66 6f 73 73 69 6c 2d 65 6e  ame is fossil-en
17b0: 63 6f 64 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  coded..      */.
17c0: 20 20 20 20 20 20 63 61 73 65 20 27 46 27 3a 20        case 'F': 
17d0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
17e0: 7a 4e 61 6d 65 2c 20 2a 7a 55 75 69 64 3b 0a 20  zName, *zUuid;. 
17f0: 20 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 73 74         md5sum_st
1800: 65 70 5f 74 65 78 74 28 62 6c 6f 62 5f 62 75 66  ep_text(blob_buf
1810: 66 65 72 28 26 6c 69 6e 65 29 2c 20 62 6c 6f 62  fer(&line), blob
1820: 5f 73 69 7a 65 28 26 6c 69 6e 65 29 29 3b 0a 20  _size(&line));. 
1830: 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f         if( blob_
1840: 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 31  token(&line, &a1
1850: 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  )==0 ) goto mani
1860: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
1870: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  r;.        if( b
1880: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c  lob_token(&line,
1890: 20 26 61 32 29 3d 3d 30 20 29 20 67 6f 74 6f 20   &a2)==0 ) goto 
18a0: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
18b0: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  error;.        i
18c0: 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c  f( blob_token(&l
18d0: 69 6e 65 2c 20 26 61 33 29 21 3d 30 20 29 20 67  ine, &a3)!=0 ) g
18e0: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
18f0: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
1900: 20 20 20 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f     zName = blob_
1910: 74 65 72 6d 69 6e 61 74 65 28 26 61 31 29 3b 0a  terminate(&a1);.
1920: 20 20 20 20 20 20 20 20 7a 55 75 69 64 20 3d 20          zUuid = 
1930: 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26  blob_terminate(&
1940: 61 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  a2);.        if(
1950: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 61 32 29 21   blob_size(&a2)!
1960: 3d 55 55 49 44 5f 53 49 5a 45 20 29 20 67 6f 74  =UUID_SIZE ) got
1970: 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61  o manifest_synta
1980: 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  x_error;.       
1990: 20 69 66 28 20 21 76 61 6c 69 64 61 74 65 31 36   if( !validate16
19a0: 28 7a 55 75 69 64 2c 20 55 55 49 44 5f 53 49 5a  (zUuid, UUID_SIZ
19b0: 45 29 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  E) ) goto manife
19c0: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
19d0: 0a 20 20 20 20 20 20 20 20 64 65 66 6f 73 73 69  .        defossi
19e0: 6c 69 7a 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  lize(zName);.   
19f0: 20 20 20 20 20 69 66 28 20 21 66 69 6c 65 5f 69       if( !file_i
1a00: 73 5f 73 69 6d 70 6c 65 5f 70 61 74 68 6e 61 6d  s_simple_pathnam
1a10: 65 28 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  e(zName) ){.    
1a20: 20 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66        goto manif
1a30: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
1a40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a50: 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 69 6c 65      if( p->nFile
1a60: 3e 3d 70 2d 3e 6e 46 69 6c 65 41 6c 6c 6f 63 20  >=p->nFileAlloc 
1a70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1a80: 6e 46 69 6c 65 41 6c 6c 6f 63 20 3d 20 70 2d 3e  nFileAlloc = p->
1a90: 6e 46 69 6c 65 41 6c 6c 6f 63 2a 32 20 2b 20 31  nFileAlloc*2 + 1
1aa0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
1ab0: 61 46 69 6c 65 20 3d 20 72 65 61 6c 6c 6f 63 28  aFile = realloc(
1ac0: 70 2d 3e 61 46 69 6c 65 2c 20 70 2d 3e 6e 46 69  p->aFile, p->nFi
1ad0: 6c 65 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  leAlloc*sizeof(p
1ae0: 2d 3e 61 46 69 6c 65 5b 30 5d 29 20 29 3b 0a 20  ->aFile[0]) );. 
1af0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
1b00: 61 46 69 6c 65 3d 3d 30 20 29 20 66 6f 73 73 69  aFile==0 ) fossi
1b10: 6c 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66 20  l_panic("out of 
1b20: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
1b30: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20    }.        i = 
1b40: 70 2d 3e 6e 46 69 6c 65 2b 2b 3b 0a 20 20 20 20  p->nFile++;.    
1b50: 20 20 20 20 70 2d 3e 61 46 69 6c 65 5b 69 5d 2e      p->aFile[i].
1b60: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
1b70: 20 20 20 20 20 20 20 70 2d 3e 61 46 69 6c 65 5b         p->aFile[
1b80: 69 5d 2e 7a 55 75 69 64 20 3d 20 7a 55 75 69 64  i].zUuid = zUuid
1b90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  ;.        if( i>
1ba0: 30 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 61  0 && strcmp(p->a
1bb0: 46 69 6c 65 5b 69 2d 31 5d 2e 7a 4e 61 6d 65 2c  File[i-1].zName,
1bc0: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
1bd0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e          goto man
1be0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
1bf0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  or;.        }.  
1c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c10: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20     }..      /*. 
1c20: 20 20 20 20 20 2a 2a 20 20 20 20 4d 20 3c 75 75       **    M <uu
1c30: 69 64 3e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  id>.      **.   
1c40: 20 20 20 2a 2a 20 41 6e 20 4d 2d 6c 69 6e 65 20     ** An M-line 
1c50: 69 64 65 6e 74 69 66 69 65 73 20 61 6e 6f 74 68  identifies anoth
1c60: 65 72 20 61 72 74 69 66 61 63 74 20 62 79 20 69  er artifact by i
1c70: 74 73 20 55 55 49 44 2e 20 20 4d 2d 6c 69 6e 65  ts UUID.  M-line
1c80: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72  s.      ** occur
1c90: 20 69 6e 20 63 6c 75 73 74 65 72 73 20 6f 6e 6c   in clusters onl
1ca0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
1cb0: 20 20 63 61 73 65 20 27 4d 27 3a 20 7b 0a 20 20    case 'M': {.  
1cc0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69        char *zUui
1cd0: 64 3b 0a 20 20 20 20 20 20 20 20 6d 64 35 73 75  d;.        md5su
1ce0: 6d 5f 73 74 65 70 5f 74 65 78 74 28 62 6c 6f 62  m_step_text(blob
1cf0: 5f 62 75 66 66 65 72 28 26 6c 69 6e 65 29 2c 20  _buffer(&line), 
1d00: 62 6c 6f 62 5f 73 69 7a 65 28 26 6c 69 6e 65 29  blob_size(&line)
1d10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  );.        if( b
1d20: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c  lob_token(&line,
1d30: 20 26 61 31 29 3d 3d 30 20 29 20 67 6f 74 6f 20   &a1)==0 ) goto 
1d40: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
1d50: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a  error;.        z
1d60: 55 75 69 64 20 3d 20 62 6c 6f 62 5f 74 65 72 6d  Uuid = blob_term
1d70: 69 6e 61 74 65 28 26 61 31 29 3b 0a 20 20 20 20  inate(&a1);.    
1d80: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a      if( blob_siz
1d90: 65 28 26 61 31 29 21 3d 55 55 49 44 5f 53 49 5a  e(&a1)!=UUID_SIZ
1da0: 45 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  E ) goto manifes
1db0: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
1dc0: 20 20 20 20 20 20 20 20 69 66 28 20 21 76 61 6c          if( !val
1dd0: 69 64 61 74 65 31 36 28 7a 55 75 69 64 2c 20 55  idate16(zUuid, U
1de0: 55 49 44 5f 53 49 5a 45 29 20 29 20 67 6f 74 6f  UID_SIZE) ) goto
1df0: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
1e00: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1e10: 69 66 28 20 70 2d 3e 6e 43 43 68 69 6c 64 3e 3d  if( p->nCChild>=
1e20: 70 2d 3e 6e 43 43 68 69 6c 64 41 6c 6c 6f 63 20  p->nCChildAlloc 
1e30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1e40: 6e 43 43 68 69 6c 64 41 6c 6c 6f 63 20 3d 20 70  nCChildAlloc = p
1e50: 2d 3e 6e 43 43 68 69 6c 64 41 6c 6c 6f 63 2a 32  ->nCChildAlloc*2
1e60: 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   + 10;.         
1e70: 20 70 2d 3e 61 7a 43 43 68 69 6c 64 20 3d 20 0a   p->azCChild = .
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
1e90: 6c 6c 6f 63 28 70 2d 3e 61 7a 43 43 68 69 6c 64  lloc(p->azCChild
1ea0: 2c 20 70 2d 3e 6e 43 43 68 69 6c 64 41 6c 6c 6f  , p->nCChildAllo
1eb0: 63 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 43 43  c*sizeof(p->azCC
1ec0: 68 69 6c 64 5b 30 5d 29 20 29 3b 0a 20 20 20 20  hild[0]) );.    
1ed0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 7a 43        if( p->azC
1ee0: 43 68 69 6c 64 3d 3d 30 20 29 20 66 6f 73 73 69  Child==0 ) fossi
1ef0: 6c 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66 20  l_panic("out of 
1f00: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
1f10: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20    }.        i = 
1f20: 70 2d 3e 6e 43 43 68 69 6c 64 2b 2b 3b 0a 20 20  p->nCChild++;.  
1f30: 20 20 20 20 20 20 70 2d 3e 61 7a 43 43 68 69 6c        p->azCChil
1f40: 64 5b 69 5d 20 3d 20 7a 55 75 69 64 3b 0a 20 20  d[i] = zUuid;.  
1f50: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1f60: 20 73 74 72 63 6d 70 28 70 2d 3e 61 7a 43 43 68   strcmp(p->azCCh
1f70: 69 6c 64 5b 69 2d 31 5d 2c 20 7a 55 75 69 64 29  ild[i-1], zUuid)
1f80: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1f90: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
1fa0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
1fb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
1fc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1fd0: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
1fe0: 20 20 20 20 54 20 28 2b 7c 2a 7c 2d 29 3c 74 61      T (+|*|-)<ta
1ff0: 67 6e 61 6d 65 3e 20 3c 75 75 69 64 3e 20 3f 3c  gname> <uuid> ?<
2000: 76 61 6c 75 65 3e 3f 0a 20 20 20 20 20 20 2a 2a  value>?.      **
2010: 0a 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65  .      ** Create
2020: 20 6f 72 20 63 61 6e 63 65 6c 20 61 20 74 61 67   or cancel a tag
2030: 20 6f 72 20 70 72 6f 70 65 72 74 79 2e 20 20 54   or property.  T
2040: 68 65 20 74 61 67 6e 61 6d 65 20 69 73 20 66 6f  he tagname is fo
2050: 73 73 69 6c 2d 65 6e 63 6f 64 65 64 2e 0a 20 20  ssil-encoded..  
2060: 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
2070: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
2080: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 65  e name must be e
2090: 69 74 68 65 72 20 22 2b 22 20 74 6f 20 63 72 65  ither "+" to cre
20a0: 61 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ate a.      ** s
20b0: 69 6e 67 6c 65 74 6f 6e 20 74 61 67 2c 20 22 2a  ingleton tag, "*
20c0: 22 20 74 6f 20 63 72 65 61 74 65 20 61 20 70 72  " to create a pr
20d0: 6f 70 61 67 61 74 69 6e 67 20 74 61 67 2c 20 6f  opagating tag, o
20e0: 72 20 22 2d 22 20 74 6f 20 63 72 65 61 74 65 0a  r "-" to create.
20f0: 20 20 20 20 20 20 2a 2a 20 61 6e 74 69 2d 74 61        ** anti-ta
2100: 67 20 74 68 61 74 20 75 6e 64 6f 65 73 20 61 20  g that undoes a 
2110: 70 72 69 6f 72 20 22 2b 22 20 6f 72 20 62 6c 6f  prior "+" or blo
2120: 63 6b 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  cks propagation 
2130: 6f 66 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  of of.      ** a
2140: 20 22 2a 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   "*"..      **. 
2150: 20 20 20 20 20 2a 2a 20 54 68 65 20 74 61 67 20       ** The tag 
2160: 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20 3c 75  is applied to <u
2170: 75 69 64 3e 2e 20 20 49 66 20 3c 75 75 69 64 3e  uid>.  If <uuid>
2180: 20 69 73 20 22 2a 22 20 74 68 65 6e 20 74 68 65   is "*" then the
2190: 20 74 61 67 20 69 73 0a 20 20 20 20 20 20 2a 2a   tag is.      **
21a0: 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
21b0: 63 75 72 72 65 6e 74 20 6d 61 6e 69 66 65 73 74  current manifest
21c0: 2e 20 20 49 66 20 3c 76 61 6c 75 65 3e 20 69 73  .  If <value> is
21d0: 20 70 72 6f 76 69 64 65 64 20 74 68 65 6e 20 0a   provided then .
21e0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 67        ** the tag
21f0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 72 6f   is really a pro
2200: 70 65 72 74 79 20 77 69 74 68 20 74 68 65 20 67  perty with the g
2210: 69 76 65 6e 20 76 61 6c 75 65 2e 0a 20 20 20 20  iven value..    
2220: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 61    **.      ** Ta
2230: 67 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  gs are not allow
2240: 65 64 20 69 6e 20 63 6c 75 73 74 65 72 73 2e 20  ed in clusters. 
2250: 20 4d 75 6c 74 69 70 6c 65 20 54 20 6c 69 6e 65   Multiple T line
2260: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 20  s are allowed.. 
2270: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61       */.      ca
2280: 73 65 20 27 54 27 3a 20 7b 0a 20 20 20 20 20 20  se 'T': {.      
2290: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a    char *zName, *
22a0: 7a 55 75 69 64 2c 20 2a 7a 56 61 6c 75 65 3b 0a  zUuid, *zValue;.
22b0: 20 20 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 73          md5sum_s
22c0: 74 65 70 5f 74 65 78 74 28 62 6c 6f 62 5f 62 75  tep_text(blob_bu
22d0: 66 66 65 72 28 26 6c 69 6e 65 29 2c 20 62 6c 6f  ffer(&line), blo
22e0: 62 5f 73 69 7a 65 28 26 6c 69 6e 65 29 29 3b 0a  b_size(&line));.
22f0: 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62          if( blob
2300: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61  _token(&line, &a
2310: 31 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e  1)==0 ) goto man
2320: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
2330: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
2340: 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65  blob_token(&line
2350: 2c 20 26 61 32 29 3d 3d 30 20 29 20 67 6f 74 6f  , &a2)==0 ) goto
2360: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
2370: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
2380: 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 74 65 72  zName = blob_ter
2390: 6d 69 6e 61 74 65 28 26 61 31 29 3b 0a 20 20 20  minate(&a1);.   
23a0: 20 20 20 20 20 7a 55 75 69 64 20 3d 20 62 6c 6f       zUuid = blo
23b0: 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 32 29  b_terminate(&a2)
23c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c  ;.        if( bl
23d0: 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20  ob_token(&line, 
23e0: 26 61 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  &a3)==0 ){.     
23f0: 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 30 3b       zValue = 0;
2400: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2410: 20 20 20 20 20 20 20 20 20 20 7a 56 61 6c 75 65            zValue
2420: 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74   = blob_terminat
2430: 65 28 26 61 33 29 3b 0a 20 20 20 20 20 20 20 20  e(&a3);.        
2440: 20 20 64 65 66 6f 73 73 69 6c 69 7a 65 28 7a 56    defossilize(zV
2450: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  alue);.        }
2460: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f  .        if( blo
2470: 62 5f 73 69 7a 65 28 26 61 32 29 3d 3d 55 55 49  b_size(&a2)==UUI
2480: 44 5f 53 49 5a 45 20 26 26 20 76 61 6c 69 64 61  D_SIZE && valida
2490: 74 65 31 36 28 7a 55 75 69 64 2c 20 55 55 49 44  te16(zUuid, UUID
24a0: 5f 53 49 5a 45 29 20 29 7b 0a 20 20 20 20 20 20  _SIZE) ){.      
24b0: 20 20 20 20 2f 2a 20 41 20 76 61 6c 69 64 20 75      /* A valid u
24c0: 75 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  uid */.        }
24d0: 65 6c 73 65 20 69 66 28 20 62 6c 6f 62 5f 73 69  else if( blob_si
24e0: 7a 65 28 26 61 32 29 3d 3d 31 20 26 26 20 7a 55  ze(&a2)==1 && zU
24f0: 75 69 64 5b 30 5d 3d 3d 27 2a 27 20 29 7b 0a 20  uid[0]=='*' ){. 
2500: 20 20 20 20 20 20 20 20 20 7a 55 75 69 64 20 3d           zUuid =
2510: 20 70 2d 3e 7a 55 75 69 64 3b 0a 20 20 20 20 20   p->zUuid;.     
2520: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2530: 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73      goto manifes
2540: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
2550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2560: 20 20 64 65 66 6f 73 73 69 6c 69 7a 65 28 7a 4e    defossilize(zN
2570: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
2580: 28 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 2d 27 20  ( zName[0]!='-' 
2590: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 2b 27  && zName[0]!='+'
25a0: 20 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 2a   && zName[0]!='*
25b0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ' ){.          g
25c0: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
25d0: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
25e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
25f0: 20 76 61 6c 69 64 61 74 65 31 36 28 26 7a 4e 61   validate16(&zNa
2600: 6d 65 5b 31 5d 2c 20 73 74 72 6c 65 6e 28 26 7a  me[1], strlen(&z
2610: 4e 61 6d 65 5b 31 5d 29 29 20 29 7b 0a 20 20 20  Name[1])) ){.   
2620: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2630: 20 61 6c 6c 6f 77 20 74 61 67 73 20 77 68 6f 73   allow tags whos
2640: 65 20 6e 61 6d 65 73 20 6c 6f 6f 6b 20 6c 69 6b  e names look lik
2650: 65 20 55 55 49 44 73 20 2a 2f 0a 20 20 20 20 20  e UUIDs */.     
2660: 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65       goto manife
2670: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
2680: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2690: 20 20 20 69 66 28 20 70 2d 3e 6e 54 61 67 3e 3d     if( p->nTag>=
26a0: 70 2d 3e 6e 54 61 67 41 6c 6c 6f 63 20 29 7b 0a  p->nTagAlloc ){.
26b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 54 61            p->nTa
26c0: 67 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 54 61 67  gAlloc = p->nTag
26d0: 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20  Alloc*2 + 10;.  
26e0: 20 20 20 20 20 20 20 20 70 2d 3e 61 54 61 67 20          p->aTag 
26f0: 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 54 61  = realloc(p->aTa
2700: 67 2c 20 70 2d 3e 6e 54 61 67 41 6c 6c 6f 63 2a  g, p->nTagAlloc*
2710: 73 69 7a 65 6f 66 28 70 2d 3e 61 54 61 67 5b 30  sizeof(p->aTag[0
2720: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
2730: 69 66 28 20 70 2d 3e 61 54 61 67 3d 3d 30 20 29  if( p->aTag==0 )
2740: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6f   fossil_panic("o
2750: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
2760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2770: 20 20 69 20 3d 20 70 2d 3e 6e 54 61 67 2b 2b 3b    i = p->nTag++;
2780: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 54 61 67  .        p->aTag
2790: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
27a0: 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 54  e;.        p->aT
27b0: 61 67 5b 69 5d 2e 7a 55 75 69 64 20 3d 20 7a 55  ag[i].zUuid = zU
27c0: 75 69 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  uid;.        p->
27d0: 61 54 61 67 5b 69 5d 2e 7a 56 61 6c 75 65 20 3d  aTag[i].zValue =
27e0: 20 7a 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20   zValue;.       
27f0: 20 69 66 28 20 69 3e 30 20 26 26 20 73 74 72 63   if( i>0 && strc
2800: 6d 70 28 70 2d 3e 61 54 61 67 5b 69 2d 31 5d 2e  mp(p->aTag[i-1].
2810: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3e 3d 30  zName, zName)>=0
2820: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2830: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
2840: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2850: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
2860: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
2870: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    /*.      **   
2880: 20 20 55 20 3c 6c 6f 67 69 6e 3e 0a 20 20 20 20    U <login>.    
2890: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 64    **.      ** Id
28a0: 65 6e 74 69 66 79 20 74 68 65 20 75 73 65 72 20  entify the user 
28b0: 77 68 6f 20 63 72 65 61 74 65 64 20 74 68 69 73  who created this
28c0: 20 63 6f 6e 74 72 6f 6c 20 66 69 6c 65 20 62 79   control file by
28d0: 20 74 68 65 69 72 0a 20 20 20 20 20 20 2a 2a 20   their.      ** 
28e0: 6c 6f 67 69 6e 2e 20 20 4f 6e 6c 79 20 6f 6e 65  login.  Only one
28f0: 20 55 20 6c 69 6e 65 20 69 73 20 61 6c 6c 6f 77   U line is allow
2900: 65 64 2e 20 20 50 72 6f 68 69 62 69 74 65 64 20  ed.  Prohibited 
2910: 69 6e 20 63 6c 75 73 74 65 72 73 2e 0a 20 20 20  in clusters..   
2920: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
2930: 20 27 55 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'U': {.        
2940: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74  md5sum_step_text
2950: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69  (blob_buffer(&li
2960: 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26  ne), blob_size(&
2970: 6c 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20  line));.        
2980: 69 66 28 20 70 2d 3e 7a 55 73 65 72 21 3d 30 20  if( p->zUser!=0 
2990: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
29a0: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
29b0: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74        if( blob_t
29c0: 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 31 29  oken(&line, &a1)
29d0: 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  ==0 ) goto manif
29e0: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
29f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c  ;.        if( bl
2a00: 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20  ob_token(&line, 
2a10: 26 61 32 29 21 3d 30 20 29 20 67 6f 74 6f 20 6d  &a2)!=0 ) goto m
2a20: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
2a30: 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  rror;.        p-
2a40: 3e 7a 55 73 65 72 20 3d 20 62 6c 6f 62 5f 74 65  >zUser = blob_te
2a50: 72 6d 69 6e 61 74 65 28 26 61 31 29 3b 0a 20 20  rminate(&a1);.  
2a60: 20 20 20 20 20 20 64 65 66 6f 73 73 69 6c 69 7a        defossiliz
2a70: 65 28 70 2d 3e 7a 55 73 65 72 29 3b 0a 20 20 20  e(p->zUser);.   
2a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a90: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20    }..      /*.  
2aa0: 20 20 20 20 2a 2a 20 20 20 20 20 52 20 3c 6d 64      **     R <md
2ab0: 35 73 75 6d 3e 0a 20 20 20 20 20 20 2a 2a 0a 20  5sum>.      **. 
2ac0: 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66 79 20       ** Specify 
2ad0: 74 68 65 20 4d 44 35 20 63 68 65 63 6b 73 75 6d  the MD5 checksum
2ae0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 62   of the entire b
2af0: 61 73 65 6c 69 6e 65 20 69 6e 20 61 0a 20 20 20  aseline in a.   
2b00: 20 20 20 2a 2a 20 6d 61 6e 69 66 65 73 74 2e 0a     ** manifest..
2b10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
2b20: 61 73 65 20 27 52 27 3a 20 7b 0a 20 20 20 20 20  ase 'R': {.     
2b30: 20 20 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74     md5sum_step_t
2b40: 65 78 74 28 62 6c 6f 62 5f 62 75 66 66 65 72 28  ext(blob_buffer(
2b50: 26 6c 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a  &line), blob_siz
2b60: 65 28 26 6c 69 6e 65 29 29 3b 0a 20 20 20 20 20  e(&line));.     
2b70: 20 20 20 69 66 28 20 70 2d 3e 7a 52 65 70 6f 43     if( p->zRepoC
2b80: 6b 73 75 6d 21 3d 30 20 29 20 67 6f 74 6f 20 6d  ksum!=0 ) goto m
2b90: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
2ba0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rror;.        if
2bb0: 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69  ( blob_token(&li
2bc0: 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 20 67 6f  ne, &a1)==0 ) go
2bd0: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
2be0: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2bf0: 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e    if( blob_token
2c00: 28 26 6c 69 6e 65 2c 20 26 61 32 29 21 3d 30 20  (&line, &a2)!=0 
2c10: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
2c20: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
2c30: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 73        if( blob_s
2c40: 69 7a 65 28 26 61 31 29 21 3d 33 32 20 29 20 67  ize(&a1)!=32 ) g
2c50: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
2c60: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
2c70: 20 20 20 70 2d 3e 7a 52 65 70 6f 43 6b 73 75 6d     p->zRepoCksum
2c80: 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74   = blob_terminat
2c90: 65 28 26 61 31 29 3b 0a 20 20 20 20 20 20 20 20  e(&a1);.        
2ca0: 69 66 28 20 21 76 61 6c 69 64 61 74 65 31 36 28  if( !validate16(
2cb0: 70 2d 3e 7a 52 65 70 6f 43 6b 73 75 6d 2c 20 33  p->zRepoCksum, 3
2cc0: 32 29 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  2) ) goto manife
2cd0: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
2ce0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2cf0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2d00: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 50  *.      **     P
2d10: 20 3c 75 75 69 64 3e 20 2e 2e 2e 0a 20 20 20 20   <uuid> ....    
2d20: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 70    **.      ** Sp
2d30: 65 63 69 66 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ecify one or mor
2d40: 65 20 6f 74 68 65 72 20 61 72 74 69 66 61 63 74  e other artifact
2d50: 73 20 77 68 65 72 65 20 61 72 65 20 74 68 65 20  s where are the 
2d60: 70 61 72 65 6e 74 73 20 6f 66 0a 20 20 20 20 20  parents of.     
2d70: 20 2a 2a 20 74 68 69 73 20 61 72 74 69 66 61 63   ** this artifac
2d80: 74 2e 20 20 54 68 65 20 66 69 72 73 74 20 70 61  t.  The first pa
2d90: 72 65 6e 74 20 69 73 20 74 68 65 20 70 72 69 6d  rent is the prim
2da0: 61 72 79 20 70 61 72 65 6e 74 2e 20 20 41 6c 6c  ary parent.  All
2db0: 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 73  .      ** others
2dc0: 20 61 72 65 20 70 61 72 65 6e 74 73 20 62 79 20   are parents by 
2dd0: 6d 65 72 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  merge..      */.
2de0: 20 20 20 20 20 20 63 61 73 65 20 27 50 27 3a 20        case 'P': 
2df0: 7b 0a 20 20 20 20 20 20 20 20 6d 64 35 73 75 6d  {.        md5sum
2e00: 5f 73 74 65 70 5f 74 65 78 74 28 62 6c 6f 62 5f  _step_text(blob_
2e10: 62 75 66 66 65 72 28 26 6c 69 6e 65 29 2c 20 62  buffer(&line), b
2e20: 6c 6f 62 5f 73 69 7a 65 28 26 6c 69 6e 65 29 29  lob_size(&line))
2e30: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
2e40: 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e   blob_token(&lin
2e50: 65 2c 20 26 61 31 29 20 29 7b 0a 20 20 20 20 20  e, &a1) ){.     
2e60: 20 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64       char *zUuid
2e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e80: 62 6c 6f 62 5f 73 69 7a 65 28 26 61 31 29 21 3d  blob_size(&a1)!=
2e90: 55 55 49 44 5f 53 49 5a 45 20 29 20 67 6f 74 6f  UUID_SIZE ) goto
2ea0: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
2eb0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
2ec0: 20 20 7a 55 75 69 64 20 3d 20 62 6c 6f 62 5f 74    zUuid = blob_t
2ed0: 65 72 6d 69 6e 61 74 65 28 26 61 31 29 3b 0a 20  erminate(&a1);. 
2ee0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 76 61           if( !va
2ef0: 6c 69 64 61 74 65 31 36 28 7a 55 75 69 64 2c 20  lidate16(zUuid, 
2f00: 55 55 49 44 5f 53 49 5a 45 29 20 29 20 67 6f 74  UUID_SIZE) ) got
2f10: 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61  o manifest_synta
2f20: 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  x_error;.       
2f30: 20 20 20 69 66 28 20 70 2d 3e 6e 50 61 72 65 6e     if( p->nParen
2f40: 74 3e 3d 70 2d 3e 6e 50 61 72 65 6e 74 41 6c 6c  t>=p->nParentAll
2f50: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  oc ){.          
2f60: 20 20 70 2d 3e 6e 50 61 72 65 6e 74 41 6c 6c 6f    p->nParentAllo
2f70: 63 20 3d 20 70 2d 3e 6e 50 61 72 65 6e 74 41 6c  c = p->nParentAl
2f80: 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 20  loc*2 + 5;.     
2f90: 20 20 20 20 20 20 20 70 2d 3e 61 7a 50 61 72 65         p->azPare
2fa0: 6e 74 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e  nt = realloc(p->
2fb0: 61 7a 50 61 72 65 6e 74 2c 20 70 2d 3e 6e 50 61  azParent, p->nPa
2fc0: 72 65 6e 74 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  rentAlloc*sizeof
2fd0: 28 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20  (char*));.      
2fe0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 7a 50        if( p->azP
2ff0: 61 72 65 6e 74 3d 3d 30 20 29 20 66 6f 73 73 69  arent==0 ) fossi
3000: 6c 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66 20  l_panic("out of 
3010: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
3020: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3030: 69 20 3d 20 70 2d 3e 6e 50 61 72 65 6e 74 2b 2b  i = p->nParent++
3040: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
3050: 7a 50 61 72 65 6e 74 5b 69 5d 20 3d 20 7a 55 75  zParent[i] = zUu
3060: 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
3070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3080: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20     }..      /*. 
3090: 20 20 20 20 20 2a 2a 20 20 20 20 20 5a 20 3c 6d       **     Z <m
30a0: 64 35 73 75 6d 3e 0a 20 20 20 20 20 20 2a 2a 0a  d5sum>.      **.
30b0: 20 20 20 20 20 20 2a 2a 20 4d 44 35 20 63 68 65        ** MD5 che
30c0: 63 6b 73 75 6d 20 6f 6e 20 74 68 69 73 20 63 6f  cksum on this co
30d0: 6e 74 72 6f 6c 20 66 69 6c 65 2e 20 20 54 68 65  ntrol file.  The
30e0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 6f 76 65   checksum is ove
30f0: 72 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6c  r all.      ** l
3100: 69 6e 65 73 20 28 6f 74 68 65 72 20 74 68 61 6e  ines (other than
3110: 20 50 47 50 2d 73 69 67 6e 61 74 75 72 65 20 6c   PGP-signature l
3120: 69 6e 65 73 29 20 70 72 69 6f 72 20 74 6f 20 74  ines) prior to t
3130: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
3140: 20 2a 2a 20 6c 69 6e 65 2e 20 20 54 68 69 73 20   ** line.  This 
3150: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
3160: 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a   record..      *
3170: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 27 5a 27  /.      case 'Z'
3180: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
3190: 72 63 3b 0a 20 20 20 20 20 20 20 20 42 6c 6f 62  rc;.        Blob
31a0: 20 68 61 73 68 3b 0a 20 20 20 20 20 20 20 20 69   hash;.        i
31b0: 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c  f( blob_token(&l
31c0: 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 20 67  ine, &a1)==0 ) g
31d0: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
31e0: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
31f0: 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65     if( blob_toke
3200: 6e 28 26 6c 69 6e 65 2c 20 26 61 32 29 21 3d 30  n(&line, &a2)!=0
3210: 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74   ) goto manifest
3220: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
3230: 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f         if( blob_
3240: 73 69 7a 65 28 26 61 31 29 21 3d 33 32 20 29 20  size(&a1)!=32 ) 
3250: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
3260: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
3270: 20 20 20 20 69 66 28 20 21 76 61 6c 69 64 61 74      if( !validat
3280: 65 31 36 28 62 6c 6f 62 5f 62 75 66 66 65 72 28  e16(blob_buffer(
3290: 26 61 31 29 2c 20 33 32 29 20 29 20 67 6f 74 6f  &a1), 32) ) goto
32a0: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
32b0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
32c0: 6d 64 35 73 75 6d 5f 66 69 6e 69 73 68 28 26 68  md5sum_finish(&h
32d0: 61 73 68 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ash);.        rc
32e0: 20 3d 20 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28   = blob_compare(
32f0: 26 68 61 73 68 2c 20 26 61 31 29 3b 0a 20 20 20  &hash, &a1);.   
3300: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
3310: 26 68 61 73 68 29 3b 0a 20 20 20 20 20 20 20 20  &hash);.        
3320: 69 66 28 20 72 63 21 3d 30 20 29 20 67 6f 74 6f  if( rc!=0 ) goto
3330: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
3340: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
3350: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3360: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
3370: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e          goto man
3380: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
3390: 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
33a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 65 65  }.  }.  if( !see
33b0: 6e 48 65 61 64 65 72 20 29 20 67 6f 74 6f 20 6d  nHeader ) goto m
33c0: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
33d0: 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  rror;..  if( p->
33e0: 6e 46 69 6c 65 3e 30 20 29 7b 0a 20 20 20 20 69  nFile>0 ){.    i
33f0: 66 28 20 70 2d 3e 6e 43 43 68 69 6c 64 3e 30 20  f( p->nCChild>0 
3400: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
3410: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
3420: 20 20 69 66 28 20 70 2d 3e 72 44 61 74 65 3d 3d    if( p->rDate==
3430: 30 2e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  0.0 ) goto manif
3440: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
3450: 3b 0a 20 20 20 20 70 2d 3e 74 79 70 65 20 3d 20  ;.    p->type = 
3460: 43 46 54 59 50 45 5f 4d 41 4e 49 46 45 53 54 3b  CFTYPE_MANIFEST;
3470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3480: 6e 43 43 68 69 6c 64 3e 30 20 29 7b 0a 20 20 20  nCChild>0 ){.   
3490: 20 69 66 28 20 70 2d 3e 72 44 61 74 65 3e 30 2e   if( p->rDate>0.
34a0: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
34b0: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
34c0: 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6d 6d      if( p->zComm
34d0: 65 6e 74 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61  ent!=0 ) goto ma
34e0: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
34f0: 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ror;.    if( p->
3500: 7a 55 73 65 72 21 3d 30 20 29 20 67 6f 74 6f 20  zUser!=0 ) goto 
3510: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
3520: 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  error;.    if( p
3530: 2d 3e 6e 54 61 67 3e 30 20 29 20 67 6f 74 6f 20  ->nTag>0 ) goto 
3540: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
3550: 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  error;.    if( p
3560: 2d 3e 6e 50 61 72 65 6e 74 3e 30 20 29 20 67 6f  ->nParent>0 ) go
3570: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
3580: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  ax_error;.    if
3590: 28 20 70 2d 3e 7a 52 65 70 6f 43 6b 73 75 6d 21  ( p->zRepoCksum!
35a0: 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  =0 ) goto manife
35b0: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
35c0: 0a 20 20 20 20 70 2d 3e 74 79 70 65 20 3d 20 43  .    p->type = C
35d0: 46 54 59 50 45 5f 43 4c 55 53 54 45 52 3b 0a 20  FTYPE_CLUSTER;. 
35e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 54   }else if( p->nT
35f0: 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ag>0 ){.    if( 
3600: 70 2d 3e 72 44 61 74 65 3c 3d 30 2e 30 20 29 20  p->rDate<=0.0 ) 
3610: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
3620: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
3630: 69 66 28 20 70 2d 3e 7a 52 65 70 6f 43 6b 73 75  if( p->zRepoCksu
3640: 6d 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  m!=0 ) goto mani
3650: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
3660: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  r;.    if( p->nP
3670: 61 72 65 6e 74 3e 30 20 29 20 67 6f 74 6f 20 6d  arent>0 ) goto m
3680: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
3690: 72 72 6f 72 3b 0a 20 20 20 20 70 2d 3e 74 79 70  rror;.    p->typ
36a0: 65 20 3d 20 43 46 54 59 50 45 5f 43 4f 4e 54 52  e = CFTYPE_CONTR
36b0: 4f 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OL;.  }else{.   
36c0: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
36d0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 7d  yntax_error;.  }
36e0: 0a 20 20 20 20 0a 20 20 6d 64 35 73 75 6d 5f 69  .    .  md5sum_i
36f0: 6e 69 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  nit();.  return 
3700: 31 3b 0a 0a 6d 61 6e 69 66 65 73 74 5f 73 79 6e  1;..manifest_syn
3710: 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20 6d 64 35  tax_error:.  md5
3720: 73 75 6d 5f 69 6e 69 74 28 29 3b 0a 20 20 6d 61  sum_init();.  ma
3730: 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 70 29 3b  nifest_clear(p);
3740: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3750: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
3760: 6c 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  le entry to the 
3770: 6d 6c 69 6e 6b 20 74 61 62 6c 65 2e 20 20 41 6c  mlink table.  Al
3780: 73 6f 20 61 64 64 20 74 68 65 20 66 69 6c 65 6e  so add the filen
3790: 61 6d 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 69  ame to.** the fi
37a0: 6c 65 6e 61 6d 65 20 74 61 62 6c 65 20 69 66 20  lename table if 
37b0: 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
37c0: 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
37d0: 69 63 20 76 6f 69 64 20 61 64 64 5f 6f 6e 65 5f  ic void add_one_
37e0: 6d 6c 69 6e 6b 28 0a 20 20 69 6e 74 20 6d 69 64  mlink(.  int mid
37f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3800: 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
3810: 20 49 44 20 6f 66 20 74 68 65 20 6d 61 6e 69 66   ID of the manif
3820: 65 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  est */.  const c
3830: 68 61 72 20 2a 7a 46 72 6f 6d 55 75 69 64 2c 20  har *zFromUuid, 
3840: 20 20 20 2f 2a 20 55 55 49 44 20 66 6f 72 20 74     /* UUID for t
3850: 68 65 20 6d 6c 69 6e 6b 2e 70 69 64 20 66 69 65  he mlink.pid fie
3860: 6c 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ld */.  const ch
3870: 61 72 20 2a 7a 54 6f 55 75 69 64 2c 20 20 20 20  ar *zToUuid,    
3880: 20 20 2f 2a 20 55 55 49 44 20 66 6f 72 20 74 68    /* UUID for th
3890: 65 20 6d 6c 69 6e 6b 2e 66 69 64 20 66 69 65 6c  e mlink.fid fiel
38a0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
38b0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 20 20  r *zFilename    
38c0: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a   /* Filename */.
38d0: 29 7b 0a 20 20 69 6e 74 20 66 6e 69 64 2c 20 70  ){.  int fnid, p
38e0: 69 64 2c 20 66 69 64 3b 0a 0a 20 20 66 6e 69 64  id, fid;..  fnid
38f0: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45   = db_int(0, "SE
3900: 4c 45 43 54 20 66 6e 69 64 20 46 52 4f 4d 20 66  LECT fnid FROM f
3910: 69 6c 65 6e 61 6d 65 20 57 48 45 52 45 20 6e 61  ilename WHERE na
3920: 6d 65 3d 25 51 22 2c 20 7a 46 69 6c 65 6e 61 6d  me=%Q", zFilenam
3930: 65 29 3b 0a 20 20 69 66 28 20 66 6e 69 64 3d 3d  e);.  if( fnid==
3940: 30 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74  0 ){.    db_mult
3950: 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 49  i_exec("INSERT I
3960: 4e 54 4f 20 66 69 6c 65 6e 61 6d 65 28 6e 61 6d  NTO filename(nam
3970: 65 29 20 56 41 4c 55 45 53 28 25 51 29 22 2c 20  e) VALUES(%Q)", 
3980: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
3990: 66 6e 69 64 20 3d 20 64 62 5f 6c 61 73 74 5f 69  fnid = db_last_i
39a0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20  nsert_rowid();. 
39b0: 20 7d 0a 20 20 69 66 28 20 7a 46 72 6f 6d 55 75   }.  if( zFromUu
39c0: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 69 64  id==0 ){.    pid
39d0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
39e0: 20 20 20 70 69 64 20 3d 20 75 75 69 64 5f 74 6f     pid = uuid_to
39f0: 5f 72 69 64 28 7a 46 72 6f 6d 55 75 69 64 2c 20  _rid(zFromUuid, 
3a00: 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  1);.  }.  if( zT
3a10: 6f 55 75 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  oUuid==0 ){.    
3a20: 66 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  fid = 0;.  }else
3a30: 7b 0a 20 20 20 20 66 69 64 20 3d 20 75 75 69 64  {.    fid = uuid
3a40: 5f 74 6f 5f 72 69 64 28 7a 54 6f 55 75 69 64 2c  _to_rid(zToUuid,
3a50: 20 31 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6d 75   1);.  }.  db_mu
3a60: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 22 49  lti_exec(.    "I
3a70: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 6c 69 6e 6b  NSERT INTO mlink
3a80: 28 6d 69 64 2c 70 69 64 2c 66 69 64 2c 66 6e 69  (mid,pid,fid,fni
3a90: 64 29 22 0a 20 20 20 20 22 56 41 4c 55 45 53 28  d)".    "VALUES(
3aa0: 25 64 2c 25 64 2c 25 64 2c 25 64 29 22 2c 20 6d  %d,%d,%d,%d)", m
3ab0: 69 64 2c 20 70 69 64 2c 20 66 69 64 2c 20 66 6e  id, pid, fid, fn
3ac0: 69 64 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 69  id.  );.  if( pi
3ad0: 64 20 26 26 20 66 69 64 20 29 7b 0a 20 20 20 20  d && fid ){.    
3ae0: 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 79 28  content_deltify(
3af0: 70 69 64 2c 20 66 69 64 2c 20 30 29 3b 0a 20 20  pid, fid, 0);.  
3b00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6d  }.}../*.** Add m
3b10: 6c 69 6e 6b 20 74 61 62 6c 65 20 65 6e 74 72 69  link table entri
3b20: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3b30: 74 68 20 6d 61 6e 69 66 65 73 74 20 63 69 64 2e  th manifest cid.
3b40: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20  .** There is an 
3b50: 6d 6c 69 6e 6b 20 65 6e 74 72 79 20 66 6f 72 20  mlink entry for 
3b60: 65 76 65 72 79 20 66 69 6c 65 20 74 68 61 74 20  every file that 
3b70: 63 68 61 6e 67 65 64 20 67 6f 69 6e 67 0a 2a 2a  changed going.**
3b80: 20 66 72 6f 6d 20 70 69 64 20 74 6f 20 63 69 64   from pid to cid
3b90: 2e 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 64 20  ..**.** Deleted 
3ba0: 66 69 6c 65 73 20 68 61 76 65 20 6d 6c 69 6e 6b  files have mlink
3bb0: 2e 66 69 64 3d 30 2e 0a 2a 2a 20 41 64 64 65 64  .fid=0..** Added
3bc0: 20 66 69 6c 65 73 20 68 61 76 65 20 6d 6c 69 6e   files have mlin
3bd0: 6b 2e 70 69 64 3d 30 2e 0a 2a 2a 20 45 64 69 74  k.pid=0..** Edit
3be0: 65 64 20 66 69 6c 65 73 20 68 61 76 65 20 62 6f  ed files have bo
3bf0: 74 68 20 6d 6c 69 6e 6b 2e 70 69 64 21 3d 30 20  th mlink.pid!=0 
3c00: 61 6e 64 20 6d 6c 69 6e 6b 2e 66 69 64 21 3d 30  and mlink.fid!=0
3c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3c20: 61 64 64 5f 6d 6c 69 6e 6b 28 69 6e 74 20 70 69  add_mlink(int pi
3c30: 64 2c 20 4d 61 6e 69 66 65 73 74 20 2a 70 50 61  d, Manifest *pPa
3c40: 72 65 6e 74 2c 20 69 6e 74 20 63 69 64 2c 20 4d  rent, int cid, M
3c50: 61 6e 69 66 65 73 74 20 2a 70 43 68 69 6c 64 29  anifest *pChild)
3c60: 7b 0a 20 20 4d 61 6e 69 66 65 73 74 20 6f 74 68  {.  Manifest oth
3c70: 65 72 3b 0a 20 20 42 6c 6f 62 20 6f 74 68 65 72  er;.  Blob other
3c80: 43 6f 6e 74 65 6e 74 3b 0a 20 20 69 6e 74 20 69  Content;.  int i
3c90: 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 64 62 5f 65  , j;..  if( db_e
3ca0: 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20  xists("SELECT 1 
3cb0: 46 52 4f 4d 20 6d 6c 69 6e 6b 20 57 48 45 52 45  FROM mlink WHERE
3cc0: 20 6d 69 64 3d 25 64 22 2c 20 63 69 64 29 20 29   mid=%d", cid) )
3cd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
3ce0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  }.  assert( pPar
3cf0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 43 68 69 6c 64  ent==0 || pChild
3d00: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ==0 );.  if( pPa
3d10: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rent==0 ){.    p
3d20: 50 61 72 65 6e 74 20 3d 20 26 6f 74 68 65 72 3b  Parent = &other;
3d30: 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74  .    content_get
3d40: 28 70 69 64 2c 20 26 6f 74 68 65 72 43 6f 6e 74  (pid, &otherCont
3d50: 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
3d60: 20 20 20 70 43 68 69 6c 64 20 3d 20 26 6f 74 68     pChild = &oth
3d70: 65 72 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f  er;.    content_
3d80: 67 65 74 28 63 69 64 2c 20 26 6f 74 68 65 72 43  get(cid, &otherC
3d90: 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  ontent);.  }.  i
3da0: 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26 6f 74  f( blob_size(&ot
3db0: 68 65 72 43 6f 6e 74 65 6e 74 29 3d 3d 30 20 29  herContent)==0 )
3dc0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
3dd0: 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6f  anifest_parse(&o
3de0: 74 68 65 72 2c 20 26 6f 74 68 65 72 43 6f 6e 74  ther, &otherCont
3df0: 65 6e 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ent)==0 ) return
3e00: 3b 0a 20 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74  ;.  content_delt
3e10: 69 66 79 28 70 69 64 2c 20 63 69 64 2c 20 30 29  ify(pid, cid, 0)
3e20: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
3e30: 3c 70 50 61 72 65 6e 74 2d 3e 6e 46 69 6c 65 20  <pParent->nFile 
3e40: 26 26 20 6a 3c 70 43 68 69 6c 64 2d 3e 6e 46 69  && j<pChild->nFi
3e50: 6c 65 3b 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  le; ){.    int c
3e60: 20 3d 20 73 74 72 63 6d 70 28 70 50 61 72 65 6e   = strcmp(pParen
3e70: 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a 4e 61 6d  t->aFile[i].zNam
3e80: 65 2c 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c 65  e, pChild->aFile
3e90: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
3ea0: 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
3eb0: 20 61 64 64 5f 6f 6e 65 5f 6d 6c 69 6e 6b 28 63   add_one_mlink(c
3ec0: 69 64 2c 20 70 50 61 72 65 6e 74 2d 3e 61 46 69  id, pParent->aFi
3ed0: 6c 65 5b 69 5d 2e 7a 55 75 69 64 2c 20 30 2c 20  le[i].zUuid, 0, 
3ee0: 70 50 61 72 65 6e 74 2d 3e 61 46 69 6c 65 5b 69  pParent->aFile[i
3ef0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
3f00: 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i++;.    }else i
3f10: 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
3f20: 61 64 64 5f 6f 6e 65 5f 6d 6c 69 6e 6b 28 63 69  add_one_mlink(ci
3f30: 64 2c 20 30 2c 20 70 43 68 69 6c 64 2d 3e 61 46  d, 0, pChild->aF
3f40: 69 6c 65 5b 6a 5d 2e 7a 55 75 69 64 2c 20 70 43  ile[j].zUuid, pC
3f50: 68 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a  hild->aFile[j].z
3f60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6a 2b 2b  Name);.      j++
3f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3f80: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 50     if( strcmp(pP
3f90: 61 72 65 6e 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e  arent->aFile[i].
3fa0: 7a 55 75 69 64 2c 20 70 43 68 69 6c 64 2d 3e 61  zUuid, pChild->a
3fb0: 46 69 6c 65 5b 6a 5d 2e 7a 55 75 69 64 29 21 3d  File[j].zUuid)!=
3fc0: 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 5f 6f  0 ){.      add_o
3fd0: 6e 65 5f 6d 6c 69 6e 6b 28 63 69 64 2c 20 70 50  ne_mlink(cid, pP
3fe0: 61 72 65 6e 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e  arent->aFile[i].
3ff0: 7a 55 75 69 64 2c 20 70 43 68 69 6c 64 2d 3e 61  zUuid, pChild->a
4000: 46 69 6c 65 5b 6a 5d 2e 7a 55 75 69 64 2c 20 0a  File[j].zUuid, .
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c      pChild->aFil
4030: 65 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  e[j].zName);.   
4040: 20 20 20 7d 0a 20 20 20 20 20 20 69 2b 2b 3b 0a     }.      i++;.
4050: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
4060: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3c  .  }.  while( i<
4070: 70 50 61 72 65 6e 74 2d 3e 6e 46 69 6c 65 20 29  pParent->nFile )
4080: 7b 0a 20 20 20 20 61 64 64 5f 6f 6e 65 5f 6d 6c  {.    add_one_ml
4090: 69 6e 6b 28 63 69 64 2c 20 70 50 61 72 65 6e 74  ink(cid, pParent
40a0: 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a 55 75 69 64  ->aFile[i].zUuid
40b0: 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 61 46  , 0, pParent->aF
40c0: 69 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ile[i].zName);. 
40d0: 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68     i++;.  }.  wh
40e0: 69 6c 65 28 20 6a 3c 70 43 68 69 6c 64 2d 3e 6e  ile( j<pChild->n
40f0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 61 64 64 5f  File ){.    add_
4100: 6f 6e 65 5f 6d 6c 69 6e 6b 28 63 69 64 2c 20 30  one_mlink(cid, 0
4110: 2c 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c 65 5b  , pChild->aFile[
4120: 6a 5d 2e 7a 55 75 69 64 2c 20 70 43 68 69 6c 64  j].zUuid, pChild
4130: 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a 4e 61 6d 65  ->aFile[j].zName
4140: 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
4150: 20 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61 72    manifest_clear
4160: 28 26 6f 74 68 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (&other);.}../*.
4170: 2a 2a 20 53 63 61 6e 20 72 65 63 6f 72 64 20 72  ** Scan record r
4180: 69 64 2f 70 43 6f 6e 74 65 6e 74 20 74 6f 20 73  id/pContent to s
4190: 65 65 20 69 66 20 69 74 20 69 73 20 61 20 6d 61  ee if it is a ma
41a0: 6e 69 66 65 73 74 2e 20 20 49 66 0a 2a 2a 20 69  nifest.  If.** i
41b0: 74 20 69 73 20 61 20 6d 61 6e 69 66 65 73 74 2c  t is a manifest,
41c0: 20 74 68 65 6e 20 70 6f 70 75 6c 61 74 65 20 74   then populate t
41d0: 68 65 20 6d 6c 69 6e 6b 2c 20 70 6c 69 6e 6b 2c  he mlink, plink,
41e0: 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 61 6e  .** filename, an
41f0: 64 20 65 76 65 6e 74 20 74 61 62 6c 65 73 20 77  d event tables w
4200: 69 74 68 20 63 72 6f 73 73 2d 72 65 66 65 72 65  ith cross-refere
4210: 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nce information.
4220: 0a 2a 2a 0a 2a 2a 20 28 4c 61 74 65 72 3a 29 20  .**.** (Later:) 
4230: 41 6c 73 6f 20 63 68 65 63 6b 20 74 6f 20 73 65  Also check to se
4240: 65 20 69 66 20 70 43 6f 6e 74 65 6e 74 20 69 73  e if pContent is
4250: 20 61 20 63 6c 75 73 74 65 72 2e 20 20 49 66 20   a cluster.  If 
4260: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6c 75 73 74  it.** is a clust
4270: 65 72 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 61  er then remove a
4280: 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 65 6c  ll referenced el
4290: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 0a  ements from the.
42a0: 2a 2a 20 75 6e 63 6c 75 73 74 65 72 65 64 20 74  ** unclustered t
42b0: 61 62 6c 65 20 61 6e 64 20 63 72 65 61 74 65 20  able and create 
42c0: 70 68 61 6e 74 6f 6d 73 20 66 6f 72 20 61 6e 79  phantoms for any
42d0: 20 75 6e 6b 6e 6f 77 6e 20 65 6c 65 6d 65 6e 74   unknown element
42e0: 73 2e 0a 2a 2f 0a 69 6e 74 20 6d 61 6e 69 66 65  s..*/.int manife
42f0: 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 69 6e 74  st_crosslink(int
4300: 20 72 69 64 2c 20 42 6c 6f 62 20 2a 70 43 6f 6e   rid, Blob *pCon
4310: 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  tent){.  int i;.
4320: 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20 20    Manifest m;.  
4330: 53 74 6d 74 20 71 3b 0a 0a 20 20 69 66 28 20 6d  Stmt q;..  if( m
4340: 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d  anifest_parse(&m
4350: 2c 20 70 43 6f 6e 74 65 6e 74 29 3d 3d 30 20 29  , pContent)==0 )
4360: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4370: 20 20 7d 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74    }.  db_begin_t
4380: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
4390: 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 54 59  if( m.type==CFTY
43a0: 50 45 5f 4d 41 4e 49 46 45 53 54 20 29 7b 0a 20  PE_MANIFEST ){. 
43b0: 20 20 20 69 66 28 20 21 64 62 5f 65 78 69 73 74     if( !db_exist
43c0: 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
43d0: 20 6d 6c 69 6e 6b 20 57 48 45 52 45 20 6d 69 64   mlink WHERE mid
43e0: 3d 25 64 22 2c 20 72 69 64 29 20 29 7b 0a 20 20  =%d", rid) ){.  
43f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d      for(i=0; i<m
4400: 2e 6e 50 61 72 65 6e 74 3b 20 69 2b 2b 29 7b 0a  .nParent; i++){.
4410: 20 20 20 20 20 20 20 20 69 6e 74 20 70 69 64 20          int pid 
4420: 3d 20 75 75 69 64 5f 74 6f 5f 72 69 64 28 6d 2e  = uuid_to_rid(m.
4430: 61 7a 50 61 72 65 6e 74 5b 69 5d 2c 20 31 29 3b  azParent[i], 1);
4440: 0a 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74  .        db_mult
4450: 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f  i_exec("INSERT O
4460: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 70 6c  R IGNORE INTO pl
4470: 69 6e 6b 28 70 69 64 2c 20 63 69 64 2c 20 69 73  ink(pid, cid, is
4480: 70 72 69 6d 2c 20 6d 74 69 6d 65 29 22 0a 20 20  prim, mtime)".  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 20 22 56 41 4c 55 45 53 28 25 64 2c 20      "VALUES(%d, 
44b0: 25 64 2c 20 25 64 2c 20 25 2e 31 37 67 29 22 2c  %d, %d, %.17g)",
44c0: 20 70 69 64 2c 20 72 69 64 2c 20 69 3d 3d 30 2c   pid, rid, i==0,
44d0: 20 6d 2e 72 44 61 74 65 29 3b 0a 20 20 20 20 20   m.rDate);.     
44e0: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
44f0: 20 20 20 20 20 20 20 20 20 61 64 64 5f 6d 6c 69           add_mli
4500: 6e 6b 28 70 69 64 2c 20 30 2c 20 72 69 64 2c 20  nk(pid, 0, rid, 
4510: 26 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  &m);.        }. 
4520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f       }.      db_
4530: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
4540: 45 43 54 20 63 69 64 20 46 52 4f 4d 20 70 6c 69  ECT cid FROM pli
4550: 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 25 64 20  nk WHERE pid=%d 
4560: 41 4e 44 20 69 73 70 72 69 6d 22 2c 20 72 69 64  AND isprim", rid
4570: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
4580: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
4590: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
45a0: 20 20 20 69 6e 74 20 63 69 64 20 3d 20 64 62 5f     int cid = db_
45b0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30  column_int(&q, 0
45c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 5f 6d  );.        add_m
45d0: 6c 69 6e 6b 28 72 69 64 2c 20 26 6d 2c 20 63 69  link(rid, &m, ci
45e0: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, 0);.      }. 
45f0: 20 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65       db_finalize
4600: 28 26 71 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d  (&q);.      db_m
4610: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
4620: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
4630: 65 76 65 6e 74 28 74 79 70 65 2c 6d 74 69 6d 65  event(type,mtime
4640: 2c 6f 62 6a 69 64 2c 75 73 65 72 2c 63 6f 6d 6d  ,objid,user,comm
4650: 65 6e 74 29 22 0a 20 20 20 20 20 20 20 20 22 56  ent)".        "V
4660: 41 4c 55 45 53 28 27 63 69 27 2c 25 2e 31 37 67  ALUES('ci',%.17g
4670: 2c 25 64 2c 25 51 2c 25 51 29 22 2c 0a 20 20 20  ,%d,%Q,%Q)",.   
4680: 20 20 20 20 20 6d 2e 72 44 61 74 65 2c 20 72 69       m.rDate, ri
4690: 64 2c 20 6d 2e 7a 55 73 65 72 2c 20 6d 2e 7a 43  d, m.zUser, m.zC
46a0: 6f 6d 6d 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a  omment.      );.
46b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
46c0: 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 43  m.type==CFTYPE_C
46d0: 4c 55 53 54 45 52 20 29 7b 0a 20 20 20 20 66 6f  LUSTER ){.    fo
46e0: 72 28 69 3d 30 3b 20 69 3c 6d 2e 6e 43 43 68 69  r(i=0; i<m.nCChi
46f0: 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
4700: 69 6e 74 20 6d 69 64 3b 0a 20 20 20 20 20 20 6d  int mid;.      m
4710: 69 64 20 3d 20 75 75 69 64 5f 74 6f 5f 72 69 64  id = uuid_to_rid
4720: 28 6d 2e 61 7a 43 43 68 69 6c 64 5b 69 5d 2c 20  (m.azCChild[i], 
4730: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 69  1);.      if( mi
4740: 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  d>0 ){.        d
4750: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45  b_multi_exec("DE
4760: 4c 45 54 45 20 46 52 4f 4d 20 75 6e 63 6c 75 73  LETE FROM unclus
4770: 74 65 72 65 64 20 57 48 45 52 45 20 72 69 64 3d  tered WHERE rid=
4780: 25 64 22 2c 20 6d 69 64 29 3b 0a 20 20 20 20 20  %d", mid);.     
4790: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
47a0: 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50  f( m.type==CFTYP
47b0: 45 5f 43 4f 4e 54 52 4f 4c 20 7c 7c 20 6d 2e 74  E_CONTROL || m.t
47c0: 79 70 65 3d 3d 43 46 54 59 50 45 5f 4d 41 4e 49  ype==CFTYPE_MANI
47d0: 46 45 53 54 20 29 7b 0a 20 20 20 20 66 6f 72 28  FEST ){.    for(
47e0: 69 3d 30 3b 20 69 3c 6d 2e 6e 54 61 67 3b 20 69  i=0; i<m.nTag; i
47f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ++){.      int t
4800: 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 79  id;.      int ty
4810: 70 65 3b 0a 20 20 20 20 20 20 74 69 64 20 3d 20  pe;.      tid = 
4820: 75 75 69 64 5f 74 6f 5f 72 69 64 28 6d 2e 61 54  uuid_to_rid(m.aT
4830: 61 67 5b 69 5d 2e 7a 55 75 69 64 2c 20 31 29 3b  ag[i].zUuid, 1);
4840: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 6d  .      switch( m
4850: 2e 61 54 61 67 5b 69 5d 2e 7a 4e 61 6d 65 5b 30  .aTag[i].zName[0
4860: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ] ){.        cas
4870: 65 20 27 2b 27 3a 20 20 74 79 70 65 20 3d 20 31  e '+':  type = 1
4880: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
4890: 20 63 61 73 65 20 27 2a 27 3a 20 20 74 79 70 65   case '*':  type
48a0: 20 3d 20 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20   = 2; break;.   
48b0: 20 20 20 20 20 63 61 73 65 20 27 2d 27 3a 20 20       case '-':  
48c0: 74 79 70 65 20 3d 20 30 3b 20 62 72 65 61 6b 3b  type = 0; break;
48d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
48e0: 61 67 5f 69 6e 73 65 72 74 28 26 6d 2e 61 54 61  ag_insert(&m.aTa
48f0: 67 5b 69 5d 2e 7a 4e 61 6d 65 5b 31 5d 2c 20 74  g[i].zName[1], t
4900: 79 70 65 2c 20 6d 2e 61 54 61 67 5b 69 5d 2e 7a  ype, m.aTag[i].z
4910: 56 61 6c 75 65 2c 20 0a 20 20 20 20 20 20 20 20  Value, .        
4920: 20 20 20 20 20 20 20 20 20 72 69 64 2c 20 6d 2e           rid, m.
4930: 72 44 61 74 65 2c 20 74 69 64 29 3b 0a 20 20 20  rDate, tid);.   
4940: 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f   }.  }.  db_end_
4950: 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a  transaction(0);.
4960: 20 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61 72    manifest_clear
4970: 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  (&m);.  return 1
4980: 3b 0a 7d 0a                                      ;.}.