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 ;.}.