Hex Artifact Content
Not logged in

Artifact 053fee443ee2842dfb75b9f89ff3f8fa23fb6c3b:

File src/manifest.c part of check-in [ac3f1f2ba7] - Improvements to how ticket changes are displayed in the UI. The hyperlink is show with strick-through if the ticket is closed. The title is shown after the ticket hyperlink. SQL to determine the closed condition and the title can be set in the ticket setup screens. by drh on 2008-10-18 02:27:13.

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 61 6e 64 20 77 69 6b 69 20 70 61  iles and wiki pa
0440: 67 65 73 20 61 6e 64 20 74 69 63 6b 65 74 73 20  ges and tickets 
0450: 77 65 72 65 20 61 64 64 65 64 2e 0a 2a 2f 0a 23  were added..*/.#
0460: 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e  include "config.
0470: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 61 6e  h".#include "man
0480: 69 66 65 73 74 2e 68 22 0a 23 69 6e 63 6c 75 64  ifest.h".#includ
0490: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69  e <assert.h>..#i
04a0: 66 20 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a  f INTERFACE./*.*
04b0: 2a 20 54 79 70 65 73 20 6f 66 20 63 6f 6e 74 72  * Types of contr
04c0: 6f 6c 20 66 69 6c 65 73 0a 2a 2f 0a 23 64 65 66  ol files.*/.#def
04d0: 69 6e 65 20 43 46 54 59 50 45 5f 4d 41 4e 49 46  ine CFTYPE_MANIF
04e0: 45 53 54 20 20 20 31 0a 23 64 65 66 69 6e 65 20  EST   1.#define 
04f0: 43 46 54 59 50 45 5f 43 4c 55 53 54 45 52 20 20  CFTYPE_CLUSTER  
0500: 20 20 32 0a 23 64 65 66 69 6e 65 20 43 46 54 59    2.#define CFTY
0510: 50 45 5f 43 4f 4e 54 52 4f 4c 20 20 20 20 33 0a  PE_CONTROL    3.
0520: 23 64 65 66 69 6e 65 20 43 46 54 59 50 45 5f 57  #define CFTYPE_W
0530: 49 4b 49 20 20 20 20 20 20 20 34 0a 23 64 65 66  IKI       4.#def
0540: 69 6e 65 20 43 46 54 59 50 45 5f 54 49 43 4b 45  ine CFTYPE_TICKE
0550: 54 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4d  T     5../*.** M
0560: 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 76 61  ode parameter va
0570: 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lues.*/.#define 
0580: 43 46 4d 4f 44 45 5f 52 45 41 44 20 20 20 20 20  CFMODE_READ     
0590: 20 20 31 0a 23 64 65 66 69 6e 65 20 43 46 4d 4f    1.#define CFMO
05a0: 44 45 5f 41 50 50 45 4e 44 20 20 20 20 20 32 0a  DE_APPEND     2.
05b0: 23 64 65 66 69 6e 65 20 43 46 4d 4f 44 45 5f 57  #define CFMODE_W
05c0: 52 49 54 45 20 20 20 20 20 20 33 0a 0a 2f 2a 0a  RITE      3../*.
05d0: 2a 2a 20 41 20 70 61 72 73 65 64 20 6d 61 6e 69  ** A parsed mani
05e0: 66 65 73 74 20 6f 72 20 63 6c 75 73 74 65 72 2e  fest or cluster.
05f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 61 6e 69 66  .*/.struct Manif
0600: 65 73 74 20 7b 0a 20 20 42 6c 6f 62 20 63 6f 6e  est {.  Blob con
0610: 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  tent;         /*
0620: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   The original co
0630: 6e 74 65 6e 74 20 62 6c 6f 62 20 2a 2f 0a 20 20  ntent blob */.  
0640: 69 6e 74 20 74 79 70 65 3b 20 20 20 20 20 20 20  int type;       
0650: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
0660: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d   file */.  int m
0670: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
0680: 20 2f 2a 20 41 63 63 65 73 73 20 6d 6f 64 65 20   /* Access mode 
0690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  */.  char *zComm
06a0: 65 6e 74 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  ent;       /* De
06b0: 63 6f 64 65 64 20 63 6f 6d 6d 65 6e 74 20 2a 2f  coded comment */
06c0: 0a 20 20 64 6f 75 62 6c 65 20 72 44 61 74 65 3b  .  double rDate;
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69 6d 65           /* Time
06e0: 20 69 6e 20 74 68 65 20 22 44 22 20 6c 69 6e 65   in the "D" line
06f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 55 73 65   */.  char *zUse
0700: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  r;          /* N
0710: 61 6d 65 20 6f 66 20 74 68 65 20 75 73 65 72 20  ame of the user 
0720: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 70 6f  */.  char *zRepo
0730: 43 6b 73 75 6d 3b 20 20 20 20 20 2f 2a 20 4d 44  Cksum;     /* MD
0740: 35 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  5 checksum of th
0750: 65 20 62 61 73 65 6c 69 6e 65 20 63 6f 6e 74 65  e baseline conte
0760: 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57  nt */.  char *zW
0770: 69 6b 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  iki;          /*
0780: 20 54 65 78 74 20 6f 66 20 74 68 65 20 77 69 6b   Text of the wik
0790: 69 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72  i page */.  char
07a0: 20 2a 7a 57 69 6b 69 54 69 74 6c 65 3b 20 20 20   *zWikiTitle;   
07b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
07c0: 20 77 69 6b 69 20 70 61 67 65 20 2a 2f 0a 20 20   wiki page */.  
07d0: 63 68 61 72 20 2a 7a 54 69 63 6b 65 74 55 75 69  char *zTicketUui
07e0: 64 3b 20 20 20 20 2f 2a 20 55 55 49 44 20 66 6f  d;    /* UUID fo
07f0: 72 20 61 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20  r a ticket */.  
0800: 69 6e 74 20 6e 46 69 6c 65 3b 20 20 20 20 20 20  int nFile;      
0810: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0820: 6f 66 20 46 20 6c 69 6e 65 73 20 2a 2f 0a 20 20  of F lines */.  
0830: 69 6e 74 20 6e 46 69 6c 65 41 6c 6c 6f 63 3b 20  int nFileAlloc; 
0840: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
0850: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 46 69 6c  llocated in aFil
0860: 65 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  e[] */.  struct 
0870: 7b 20 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  { .    char *zNa
0880: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
0890: 20 4e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20   Name of a file 
08a0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 75  */.    char *zUu
08b0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id;           /*
08c0: 20 55 55 49 44 20 6f 66 20 74 68 65 20 66 69 6c   UUID of the fil
08d0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
08e0: 50 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Perm;           
08f0: 2f 2a 20 46 69 6c 65 20 70 65 72 6d 69 73 73 69  /* File permissi
0900: 6f 6e 73 20 2a 2f 0a 20 20 7d 20 2a 61 46 69 6c  ons */.  } *aFil
0910: 65 3b 0a 20 20 69 6e 74 20 6e 50 61 72 65 6e 74  e;.  int nParent
0920: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
0930: 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74 73 20  mber of parents 
0940: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 65 6e 74  */.  int nParent
0950: 41 6c 6c 6f 63 3b 20 20 20 20 20 2f 2a 20 53 6c  Alloc;     /* Sl
0960: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  ots allocated in
0970: 20 61 7a 50 61 72 65 6e 74 5b 5d 20 2a 2f 0a 20   azParent[] */. 
0980: 20 63 68 61 72 20 2a 2a 61 7a 50 61 72 65 6e 74   char **azParent
0990: 3b 20 20 20 20 20 20 2f 2a 20 55 55 49 44 73 20  ;      /* UUIDs 
09a0: 6f 66 20 70 61 72 65 6e 74 73 20 2a 2f 0a 20 20  of parents */.  
09b0: 69 6e 74 20 6e 43 43 68 69 6c 64 3b 20 20 20 20  int nCChild;    
09c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
09d0: 6f 66 20 63 6c 75 73 74 65 72 20 63 68 69 6c 64  of cluster child
09e0: 72 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 43  ren */.  int nCC
09f0: 68 69 6c 64 41 6c 6c 6f 63 3b 20 20 20 20 20 2f  hildAlloc;     /
0a00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6c 6f 73  * Number of clos
0a10: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  ts allocated in 
0a20: 61 7a 43 43 68 69 6c 64 5b 5d 20 2a 2f 0a 20 20  azCChild[] */.  
0a30: 63 68 61 72 20 2a 2a 61 7a 43 43 68 69 6c 64 3b  char **azCChild;
0a40: 20 20 20 20 20 20 2f 2a 20 55 55 49 44 73 20 6f        /* UUIDs o
0a50: 66 20 72 65 66 65 72 65 6e 63 65 64 20 6f 62 6a  f referenced obj
0a60: 65 63 74 73 20 69 6e 20 61 20 63 6c 75 73 74 65  ects in a cluste
0a70: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 67 3b  r */.  int nTag;
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a90: 4e 75 6d 62 65 72 20 6f 66 20 54 20 6c 69 6e 65  Number of T line
0aa0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 67 41  s */.  int nTagA
0ab0: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  lloc;        /* 
0ac0: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
0ad0: 69 6e 20 61 54 61 67 5b 5d 20 2a 2f 0a 20 20 73  in aTag[] */.  s
0ae0: 74 72 75 63 74 20 7b 20 0a 20 20 20 20 63 68 61  truct { .    cha
0af0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
0b00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
0b10: 68 65 20 74 61 67 20 2a 2f 0a 20 20 20 20 63 68  he tag */.    ch
0b20: 61 72 20 2a 7a 55 75 69 64 3b 20 20 20 20 20 20  ar *zUuid;      
0b30: 20 20 20 20 20 2f 2a 20 55 55 49 44 20 74 68 61       /* UUID tha
0b40: 74 20 74 68 65 20 74 61 67 20 69 73 20 61 70 70  t the tag is app
0b50: 6c 69 65 64 20 74 6f 20 2a 2f 0a 20 20 20 20 63  lied to */.    c
0b60: 68 61 72 20 2a 7a 56 61 6c 75 65 3b 20 20 20 20  har *zValue;    
0b70: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69        /* Value i
0b80: 66 20 74 68 65 20 74 61 67 20 69 73 20 72 65 61  f the tag is rea
0b90: 6c 6c 79 20 61 20 70 72 6f 70 65 72 74 79 20 2a  lly a property *
0ba0: 2f 0a 20 20 7d 20 2a 61 54 61 67 3b 0a 20 20 69  /.  } *aTag;.  i
0bb0: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
0bc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0bd0: 66 20 4a 20 6c 69 6e 65 73 20 2a 2f 0a 20 20 69  f J lines */.  i
0be0: 6e 74 20 6e 46 69 65 6c 64 41 6c 6c 6f 63 3b 20  nt nFieldAlloc; 
0bf0: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
0c00: 6c 6f 63 61 74 65 64 20 69 6e 20 61 46 69 65 6c  located in aFiel
0c10: 64 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  d[] */.  struct 
0c20: 7b 20 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  { .    char *zNa
0c30: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
0c40: 20 4b 65 79 20 6f 72 20 66 69 65 6c 64 20 6e 61   Key or field na
0c50: 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  me */.    char *
0c60: 7a 56 61 6c 75 65 3b 20 20 20 20 20 20 20 20 20  zValue;         
0c70: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
0c80: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 7d 20 2a 61   field */.  } *a
0c90: 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 6e 41 74  Field;.  int nAt
0ca0: 74 61 63 68 3b 20 20 20 20 20 20 20 20 20 20 2f  tach;          /
0cb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 41 20 6c 69  * Number of A li
0cc0: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 74  nes */.  int nAt
0cd0: 74 61 63 68 41 6c 6c 6f 63 3b 20 20 20 20 20 2f  tachAlloc;     /
0ce0: 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65  * Slots allocate
0cf0: 64 20 69 6e 20 61 41 74 74 61 63 68 5b 5d 20 2a  d in aAttach[] *
0d00: 2f 0a 20 20 73 74 72 75 63 74 20 7b 20 0a 20 20  /.  struct { .  
0d10: 20 20 63 68 61 72 20 2a 7a 55 75 69 64 3b 20 20    char *zUuid;  
0d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 55 49 44           /* UUID
0d30: 20 6f 66 20 74 68 65 20 61 74 74 61 63 68 6d 65   of the attachme
0d40: 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
0d50: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
0d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
0d70: 61 74 74 61 63 68 6d 65 6e 74 20 2a 2f 0a 20 20  attachment */.  
0d80: 20 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 20 20    char *zDesc;  
0d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
0da0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  ription of the a
0db0: 74 74 61 63 68 6d 65 6e 74 20 2a 2f 0a 20 20 7d  ttachment */.  }
0dc0: 20 2a 61 41 74 74 61 63 68 3b 0a 7d 3b 0a 23 65   *aAttach;.};.#e
0dd0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  ndif.../*.** Cle
0de0: 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ar the memory al
0df0: 6c 6f 63 61 74 65 64 20 69 6e 20 61 20 6d 61 6e  located in a man
0e00: 69 66 65 73 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  ifest object.*/.
0e10: 76 6f 69 64 20 6d 61 6e 69 66 65 73 74 5f 63 6c  void manifest_cl
0e20: 65 61 72 28 4d 61 6e 69 66 65 73 74 20 2a 70 29  ear(Manifest *p)
0e30: 7b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  {.  blob_reset(&
0e40: 70 2d 3e 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 66  p->content);.  f
0e50: 72 65 65 28 70 2d 3e 61 46 69 6c 65 29 3b 0a 20  ree(p->aFile);. 
0e60: 20 66 72 65 65 28 70 2d 3e 61 7a 50 61 72 65 6e   free(p->azParen
0e70: 74 29 3b 0a 20 20 66 72 65 65 28 70 2d 3e 61 7a  t);.  free(p->az
0e80: 43 43 68 69 6c 64 29 3b 0a 20 20 66 72 65 65 28  CChild);.  free(
0e90: 70 2d 3e 61 54 61 67 29 3b 0a 20 20 66 72 65 65  p->aTag);.  free
0ea0: 28 70 2d 3e 61 46 69 65 6c 64 29 3b 0a 20 20 66  (p->aField);.  f
0eb0: 72 65 65 28 70 2d 3e 61 41 74 74 61 63 68 29 3b  ree(p->aAttach);
0ec0: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
0ed0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 0a  sizeof(*p));.}..
0ee0: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 62 6c  /*.** Parse a bl
0ef0: 6f 62 20 69 6e 74 6f 20 61 20 4d 61 6e 69 66 65  ob into a Manife
0f00: 73 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  st object.  The 
0f10: 4d 61 6e 69 66 65 73 74 20 6f 62 6a 65 63 74 0a  Manifest object.
0f20: 2a 2a 20 74 61 6b 65 73 20 6f 76 65 72 20 74 68  ** takes over th
0f30: 65 20 69 6e 70 75 74 20 62 6c 6f 62 20 61 6e 64  e input blob and
0f40: 20 77 69 6c 6c 20 66 72 65 65 20 69 74 20 77 68   will free it wh
0f50: 65 6e 20 74 68 65 0a 2a 2a 20 4d 61 6e 69 66 65  en the.** Manife
0f60: 73 74 20 6f 62 6a 65 63 74 20 69 73 20 66 72 65  st object is fre
0f70: 65 64 2e 20 20 5a 65 72 6f 73 20 61 72 65 20 69  ed.  Zeros are i
0f80: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
0f90: 20 62 6c 6f 62 0a 2a 2a 20 61 73 20 73 74 72 69   blob.** as stri
0fa0: 6e 67 20 74 65 72 6d 69 6e 61 74 6f 72 73 20 73  ng terminators s
0fb0: 6f 20 74 68 61 74 20 62 6c 6f 62 20 73 68 6f 75  o that blob shou
0fc0: 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 20 61  ld not be used a
0fd0: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  gain..**.** Retu
0fe0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
0ff0: 6f 6e 74 65 6e 74 20 72 65 61 6c 6c 79 20 69 73  ontent really is
1000: 20 61 20 63 6f 6e 74 72 6f 6c 20 66 69 6c 65 20   a control file 
1010: 6f 66 20 73 6f 6d 65 0a 2a 2a 20 6b 69 6e 64 2e  of some.** kind.
1020: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
1030: 66 20 74 68 65 72 65 20 61 72 65 20 73 79 6e 74  f there are synt
1040: 61 78 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ax errors..**.**
1050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1060: 20 73 74 72 69 63 74 20 61 62 6f 75 74 20 74 68   strict about th
1070: 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 63 6f  e format of a co
1080: 6e 74 72 6f 6c 20 66 69 6c 65 2e 0a 2a 2a 20 54  ntrol file..** T
1090: 68 65 20 66 6f 72 6d 61 74 20 6d 75 73 74 20 6d  he format must m
10a0: 61 74 63 68 20 65 78 61 63 74 6c 79 20 6f 72 20  atch exactly or 
10b0: 65 6c 73 65 20 69 74 20 69 73 20 72 65 6a 65 63  else it is rejec
10c0: 74 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 75  ted.  This.** ru
10d0: 6c 65 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68 65  le minimizes the
10e0: 20 72 69 73 6b 20 74 68 61 74 20 61 20 63 6f 6e   risk that a con
10f0: 74 65 6e 74 20 66 69 6c 65 20 77 69 6c 6c 20 62  tent file will b
1100: 65 20 6d 69 73 74 61 6b 65 6e 0a 2a 2a 20 66 6f  e mistaken.** fo
1110: 72 20 61 20 63 6f 6e 74 72 6f 6c 20 66 69 6c 65  r a control file
1120: 20 73 69 6d 70 6c 79 20 62 65 63 61 75 73 65 20   simply because 
1130: 74 68 65 79 20 6c 6f 6f 6b 20 74 68 65 20 73 61  they look the sa
1140: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 43  me..**.** The pC
1150: 6f 6e 74 65 6e 74 20 69 73 20 72 65 73 65 74 2e  ontent is reset.
1160: 20 20 49 66 20 54 52 55 45 20 69 73 20 72 65 74    If TRUE is ret
1170: 75 72 6e 65 64 2c 20 74 68 65 6e 20 70 43 6f 6e  urned, then pCon
1180: 74 65 6e 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  tent will.** be 
1190: 72 65 73 65 74 20 77 68 65 6e 20 74 68 65 20 4d  reset when the M
11a0: 61 6e 69 66 65 73 74 20 6f 62 6a 65 63 74 20 69  anifest object i
11b0: 73 20 63 6c 65 61 72 65 64 2e 20 20 49 66 20 46  s cleared.  If F
11c0: 41 4c 53 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  ALSE is.** retur
11d0: 6e 65 64 20 74 68 65 6e 20 74 68 65 20 4d 61 6e  ned then the Man
11e0: 69 66 65 73 74 20 6f 62 6a 65 63 74 20 69 73 20  ifest object is 
11f0: 63 6c 65 61 72 65 64 20 61 75 74 6f 6d 61 74 69  cleared automati
1200: 63 61 6c 6c 79 0a 2a 2a 20 61 6e 64 20 70 43 6f  cally.** and pCo
1210: 6e 74 65 6e 74 20 69 73 20 72 65 73 65 74 20 62  ntent is reset b
1220: 65 66 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e  efore the return
1230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e 74 69  ..**.** The enti
1240: 72 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 50  re file can be P
1250: 47 50 20 63 6c 65 61 72 2d 73 69 67 6e 65 64 2e  GP clear-signed.
1260: 20 20 54 68 65 20 73 69 67 6e 61 74 75 72 65 20    The signature 
1270: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54  is ignored..** T
1280: 68 65 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  he file consists
1290: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
12a0: 20 63 61 72 64 73 2c 20 6f 6e 65 20 63 61 72 64   cards, one card
12b0: 20 70 65 72 20 6c 69 6e 65 2e 0a 2a 2a 20 28 45   per line..** (E
12c0: 78 63 65 70 74 3a 20 74 68 65 20 63 6f 6e 74 65  xcept: the conte
12d0: 6e 74 20 6f 66 20 74 68 65 20 57 20 63 61 72 64  nt of the W card
12e0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 20 6d   can extend of m
12f0: 75 6c 74 69 70 6c 65 20 6c 69 6e 65 73 2e 29 0a  ultiple lines.).
1300: 2a 2a 20 45 61 63 68 20 63 61 72 64 20 69 73 20  ** Each card is 
1310: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74 6f 6b  divided into tok
1320: 65 6e 73 20 62 79 20 61 20 73 69 6e 67 6c 65 20  ens by a single 
1330: 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 2e  space character.
1340: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 6f  .** The first to
1350: 6b 65 6e 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ken is a single 
1360: 75 70 70 65 72 2d 63 61 73 65 20 6c 65 74 74 65  upper-case lette
1370: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 63  r which is the c
1380: 61 72 64 20 74 79 70 65 2e 0a 2a 2a 20 54 68 65  ard type..** The
1390: 20 63 61 72 64 20 74 79 70 65 20 64 65 74 65 72   card type deter
13a0: 6d 69 6e 65 73 20 74 68 65 20 6f 74 68 65 72 20  mines the other 
13b0: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
13c0: 65 20 63 61 72 64 2e 0a 2a 2a 20 43 61 72 64 73  e card..** Cards
13d0: 20 6d 75 73 74 20 6f 63 63 75 72 20 69 6e 20 6c   must occur in l
13e0: 65 78 69 63 6f 67 72 61 70 68 69 63 61 6c 20 6f  exicographical o
13f0: 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 6d 61 6e  rder..*/.int man
1400: 69 66 65 73 74 5f 70 61 72 73 65 28 4d 61 6e 69  ifest_parse(Mani
1410: 66 65 73 74 20 2a 70 2c 20 42 6c 6f 62 20 2a 70  fest *p, Blob *p
1420: 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20  Content){.  int 
1430: 73 65 65 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  seenHeader = 0;.
1440: 20 20 69 6e 74 20 73 65 65 6e 5a 20 3d 20 30 3b    int seenZ = 0;
1450: 0a 20 20 69 6e 74 20 69 2c 20 6c 69 6e 65 4e 6f  .  int i, lineNo
1460: 3d 30 3b 0a 20 20 42 6c 6f 62 20 6c 69 6e 65 2c  =0;.  Blob line,
1470: 20 74 6f 6b 65 6e 2c 20 61 31 2c 20 61 32 2c 20   token, a1, a2, 
1480: 61 33 3b 0a 20 20 63 68 61 72 20 63 50 72 65 76  a3;.  char cPrev
1490: 54 79 70 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d  Type = 0;..  mem
14a0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
14b0: 28 2a 70 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28  (*p));.  memcpy(
14c0: 26 70 2d 3e 63 6f 6e 74 65 6e 74 2c 20 70 43 6f  &p->content, pCo
14d0: 6e 74 65 6e 74 2c 20 73 69 7a 65 6f 66 28 70 2d  ntent, sizeof(p-
14e0: 3e 63 6f 6e 74 65 6e 74 29 29 3b 0a 20 20 62 6c  >content));.  bl
14f0: 6f 62 5f 7a 65 72 6f 28 70 43 6f 6e 74 65 6e 74  ob_zero(pContent
1500: 29 3b 0a 20 20 70 43 6f 6e 74 65 6e 74 20 3d 20  );.  pContent = 
1510: 26 70 2d 3e 63 6f 6e 74 65 6e 74 3b 0a 0a 20 20  &p->content;..  
1520: 62 6c 6f 62 5f 7a 65 72 6f 28 26 61 31 29 3b 0a  blob_zero(&a1);.
1530: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 61 32 29    blob_zero(&a2)
1540: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 61  ;.  blob_zero(&a
1550: 33 29 3b 0a 20 20 6d 64 35 73 75 6d 5f 69 6e 69  3);.  md5sum_ini
1560: 74 28 29 3b 0a 20 20 77 68 69 6c 65 28 20 62 6c  t();.  while( bl
1570: 6f 62 5f 6c 69 6e 65 28 70 43 6f 6e 74 65 6e 74  ob_line(pContent
1580: 2c 20 26 6c 69 6e 65 29 20 29 7b 0a 20 20 20 20  , &line) ){.    
1590: 63 68 61 72 20 2a 7a 20 3d 20 62 6c 6f 62 5f 62  char *z = blob_b
15a0: 75 66 66 65 72 28 26 6c 69 6e 65 29 3b 0a 20 20  uffer(&line);.  
15b0: 20 20 6c 69 6e 65 4e 6f 2b 2b 3b 0a 20 20 20 20    lineNo++;.    
15c0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
15d0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
15e0: 6d 70 28 7a 2c 20 22 2d 2d 2d 2d 2d 42 45 47 49  mp(z, "-----BEGI
15f0: 4e 20 50 47 50 20 22 2c 20 31 35 29 21 3d 30 20  N PGP ", 15)!=0 
1600: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1610: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
1620: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
1630: 20 20 20 20 20 69 66 28 20 73 65 65 6e 48 65 61       if( seenHea
1640: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  der ){.        b
1650: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1660: 20 20 20 20 77 68 69 6c 65 28 20 62 6c 6f 62 5f      while( blob_
1670: 6c 69 6e 65 28 70 43 6f 6e 74 65 6e 74 2c 20 26  line(pContent, &
1680: 6c 69 6e 65 29 3e 32 20 29 7b 7d 0a 20 20 20 20  line)>2 ){}.    
1690: 20 20 69 66 28 20 62 6c 6f 62 5f 6c 69 6e 65 28    if( blob_line(
16a0: 70 43 6f 6e 74 65 6e 74 2c 20 26 6c 69 6e 65 29  pContent, &line)
16b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
16c0: 20 20 20 7a 20 3d 20 62 6c 6f 62 5f 62 75 66 66     z = blob_buff
16d0: 65 72 28 26 6c 69 6e 65 29 3b 0a 20 20 20 20 7d  er(&line);.    }
16e0: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3c 63 50  .    if( z[0]<cP
16f0: 72 65 76 54 79 70 65 20 29 7b 0a 20 20 20 20 20  revType ){.     
1700: 20 2f 2a 20 4c 69 6e 65 73 20 6f 66 20 61 20 6d   /* Lines of a m
1710: 61 6e 69 66 65 73 74 20 6d 75 73 74 20 6f 63 63  anifest must occ
1720: 75 72 20 69 6e 20 6c 65 78 69 63 6f 67 72 61 70  ur in lexicograp
1730: 68 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f 0a 20  hical order */. 
1740: 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65       goto manife
1750: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
1760: 0a 20 20 20 20 7d 0a 20 20 20 20 63 50 72 65 76  .    }.    cPrev
1770: 54 79 70 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 20  Type = z[0];.   
1780: 20 73 65 65 6e 48 65 61 64 65 72 20 3d 20 31 3b   seenHeader = 1;
1790: 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f  .    if( blob_to
17a0: 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 74 6f 6b 65  ken(&line, &toke
17b0: 6e 29 21 3d 31 20 29 20 67 6f 74 6f 20 6d 61 6e  n)!=1 ) goto man
17c0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
17d0: 6f 72 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  or;.    switch( 
17e0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
17f0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 41 20  .      **     A 
1800: 3c 75 75 69 64 3e 20 3c 66 69 6c 65 6e 61 6d 65  <uuid> <filename
1810: 3e 20 3c 64 65 73 63 72 69 70 74 69 6f 6e 3e 0a  > <description>.
1820: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1830: 2a 20 49 64 65 6e 74 69 66 69 65 73 20 61 6e 20  * Identifies an 
1840: 61 74 74 61 63 68 6d 65 6e 74 20 74 6f 20 65 69  attachment to ei
1850: 74 68 65 72 20 61 20 77 69 6b 69 20 70 61 67 65  ther a wiki page
1860: 20 6f 72 20 61 20 74 69 63 6b 65 74 2e 0a 20 20   or a ticket..  
1870: 20 20 20 20 2a 2a 20 3c 75 75 69 64 3e 20 69 73      ** <uuid> is
1880: 20 74 68 65 20 61 72 74 69 66 61 63 74 20 74 68   the artifact th
1890: 61 74 20 69 73 20 74 68 65 20 61 74 74 61 63 68  at is the attach
18a0: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
18b0: 20 20 20 20 20 63 61 73 65 20 27 41 27 3a 20 7b       case 'A': {
18c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
18d0: 4e 61 6d 65 2c 20 2a 7a 55 75 69 64 2c 20 2a 7a  Name, *zUuid, *z
18e0: 44 65 73 63 3b 0a 20 20 20 20 20 20 20 20 6d 64  Desc;.        md
18f0: 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 62  5sum_step_text(b
1900: 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 6e 65  lob_buffer(&line
1910: 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 6c 69  ), blob_size(&li
1920: 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ne));.        if
1930: 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69  ( blob_token(&li
1940: 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 20 67 6f  ne, &a1)==0 ) go
1950: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
1960: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
1970: 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e    if( blob_token
1980: 28 26 6c 69 6e 65 2c 20 26 61 32 29 3d 3d 30 20  (&line, &a2)==0 
1990: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
19a0: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
19b0: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74        if( blob_t
19c0: 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 33 29  oken(&line, &a3)
19d0: 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  ==0 ) goto manif
19e0: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
19f0: 3b 0a 20 20 20 20 20 20 20 20 7a 55 75 69 64 20  ;.        zUuid 
1a00: 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65  = blob_terminate
1a10: 28 26 61 31 29 3b 0a 20 20 20 20 20 20 20 20 7a  (&a1);.        z
1a20: 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 74 65 72 6d  Name = blob_term
1a30: 69 6e 61 74 65 28 26 61 32 29 3b 0a 20 20 20 20  inate(&a2);.    
1a40: 20 20 20 20 7a 44 65 73 63 20 3d 20 62 6c 6f 62      zDesc = blob
1a50: 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 33 29 3b  _terminate(&a3);
1a60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f  .        if( blo
1a70: 62 5f 73 69 7a 65 28 26 61 31 29 21 3d 55 55 49  b_size(&a1)!=UUI
1a80: 44 5f 53 49 5a 45 20 29 20 67 6f 74 6f 20 6d 61  D_SIZE ) goto ma
1a90: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
1aa0: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ror;.        if(
1ab0: 20 21 76 61 6c 69 64 61 74 65 31 36 28 7a 55 75   !validate16(zUu
1ac0: 69 64 2c 20 55 55 49 44 5f 53 49 5a 45 29 20 29  id, UUID_SIZE) )
1ad0: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
1ae0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
1af0: 20 20 20 20 20 64 65 66 6f 73 73 69 6c 69 7a 65       defossilize
1b00: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
1b10: 20 69 66 28 20 21 66 69 6c 65 5f 69 73 5f 73 69   if( !file_is_si
1b20: 6d 70 6c 65 5f 70 61 74 68 6e 61 6d 65 28 7a 4e  mple_pathname(zN
1b30: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1b40: 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f    goto manifest_
1b50: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
1b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b70: 64 65 66 6f 73 73 69 6c 69 7a 65 28 7a 44 65 73  defossilize(zDes
1b80: 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
1b90: 70 2d 3e 6e 41 74 74 61 63 68 3e 3d 70 2d 3e 6e  p->nAttach>=p->n
1ba0: 41 74 74 61 63 68 41 6c 6c 6f 63 20 29 7b 0a 20  AttachAlloc ){. 
1bb0: 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 41 74 74           p->nAtt
1bc0: 61 63 68 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  achAlloc = p->nA
1bd0: 74 74 61 63 68 41 6c 6c 6f 63 2a 32 20 2b 20 31  ttachAlloc*2 + 1
1be0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
1bf0: 61 41 74 74 61 63 68 20 3d 20 72 65 61 6c 6c 6f  aAttach = reallo
1c00: 63 28 70 2d 3e 61 41 74 74 61 63 68 2c 0a 20 20  c(p->aAttach,.  
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1c30: 6e 41 74 74 61 63 68 41 6c 6c 6f 63 2a 73 69 7a  nAttachAlloc*siz
1c40: 65 6f 66 28 70 2d 3e 61 41 74 74 61 63 68 5b 30  eof(p->aAttach[0
1c50: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
1c60: 69 66 28 20 70 2d 3e 61 41 74 74 61 63 68 3d 3d  if( p->aAttach==
1c70: 30 20 29 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63  0 ) fossil_panic
1c80: 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22  ("out of memory"
1c90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ca0: 20 20 20 20 20 69 20 3d 20 70 2d 3e 6e 41 74 74       i = p->nAtt
1cb0: 61 63 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  ach++;.        p
1cc0: 2d 3e 61 41 74 74 61 63 68 5b 69 5d 2e 7a 55 75  ->aAttach[i].zUu
1cd0: 69 64 20 3d 20 7a 55 75 69 64 3b 0a 20 20 20 20  id = zUuid;.    
1ce0: 20 20 20 20 70 2d 3e 61 41 74 74 61 63 68 5b 69      p->aAttach[i
1cf0: 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
1d00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 41 74 74  .        p->aAtt
1d10: 61 63 68 5b 69 5d 2e 7a 44 65 73 63 20 3d 20 7a  ach[i].zDesc = z
1d20: 44 65 73 63 3b 0a 20 20 20 20 20 20 20 20 69 66  Desc;.        if
1d30: 28 20 69 3e 30 20 26 26 20 73 74 72 63 6d 70 28  ( i>0 && strcmp(
1d40: 70 2d 3e 61 41 74 74 61 63 68 5b 69 2d 31 5d 2e  p->aAttach[i-1].
1d50: 7a 55 75 69 64 2c 20 7a 55 75 69 64 29 3e 3d 30  zUuid, zUuid)>=0
1d60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1d70: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
1d80: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
1d90: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1da0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1db0: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    /*.      **   
1dc0: 20 20 43 20 3c 63 6f 6d 6d 65 6e 74 3e 0a 20 20    C <comment>.  
1dd0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1de0: 43 6f 6d 6d 65 6e 74 20 74 65 78 74 20 69 73 20  Comment text is 
1df0: 66 6f 73 73 69 6c 2d 65 6e 63 6f 64 65 64 2e 20  fossil-encoded. 
1e00: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 6e 6f   There may be no
1e10: 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
1e20: 20 2a 2a 20 6f 6e 65 20 43 20 6c 69 6e 65 2e 20   ** one C line. 
1e30: 20 43 20 6c 69 6e 65 73 20 61 72 65 20 72 65 71   C lines are req
1e40: 75 69 72 65 64 20 66 6f 72 20 6d 61 6e 69 66 65  uired for manife
1e50: 73 74 73 20 61 6e 64 20 61 72 65 0a 20 20 20 20  sts and are.    
1e60: 20 20 2a 2a 20 64 69 73 61 6c 6c 6f 77 65 64 20    ** disallowed 
1e70: 6f 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6e  on all other con
1e80: 74 72 6f 6c 20 66 69 6c 65 73 2e 0a 20 20 20 20  trol files..    
1e90: 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20    */.      case 
1ea0: 27 43 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 6d  'C': {.        m
1eb0: 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28  d5sum_step_text(
1ec0: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 6e  blob_buffer(&lin
1ed0: 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 6c  e), blob_size(&l
1ee0: 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ine));.        i
1ef0: 66 28 20 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 21 3d  f( p->zComment!=
1f00: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
1f10: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
1f20: 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62          if( blob
1f30: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61  _token(&line, &a
1f40: 31 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e  1)==0 ) goto man
1f50: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
1f60: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
1f70: 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65  blob_token(&line
1f80: 2c 20 26 61 32 29 21 3d 30 20 29 20 67 6f 74 6f  , &a2)!=0 ) goto
1f90: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
1fa0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1fb0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 62 6c  p->zComment = bl
1fc0: 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 31  ob_terminate(&a1
1fd0: 29 3b 0a 20 20 20 20 20 20 20 20 64 65 66 6f 73  );.        defos
1fe0: 73 69 6c 69 7a 65 28 70 2d 3e 7a 43 6f 6d 6d 65  silize(p->zComme
1ff0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nt);.        bre
2000: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
2010: 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20     /*.      **  
2020: 20 20 20 44 20 3c 74 69 6d 65 73 74 61 6d 70 3e     D <timestamp>
2030: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2040: 2a 2a 20 54 68 65 20 74 69 6d 65 73 74 61 6d 70  ** The timestamp
2050: 20 73 68 6f 75 6c 64 20 62 65 20 49 53 4f 20 38   should be ISO 8
2060: 36 30 31 2e 20 20 20 59 59 59 59 2d 4d 4d 2d 44  601.   YYYY-MM-D
2070: 44 74 48 48 3a 4d 4d 3a 53 53 0a 20 20 20 20 20  DtHH:MM:SS.     
2080: 20 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 62 65   ** There can be
2090: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 31 20   no more than 1 
20a0: 44 20 6c 69 6e 65 2e 20 20 44 20 6c 69 6e 65 73  D line.  D lines
20b0: 20 61 72 65 20 72 65 71 75 69 72 65 64 0a 20 20   are required.  
20c0: 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 63      ** for all c
20d0: 6f 6e 74 72 6f 6c 20 66 69 6c 65 73 20 65 78 63  ontrol files exc
20e0: 65 70 74 20 66 6f 72 20 63 6c 75 73 74 65 72 73  ept for clusters
20f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2100: 20 63 61 73 65 20 27 44 27 3a 20 7b 0a 20 20 20   case 'D': {.   
2110: 20 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65       char *zDate
2120: 3b 0a 20 20 20 20 20 20 20 20 6d 64 35 73 75 6d  ;.        md5sum
2130: 5f 73 74 65 70 5f 74 65 78 74 28 62 6c 6f 62 5f  _step_text(blob_
2140: 62 75 66 66 65 72 28 26 6c 69 6e 65 29 2c 20 62  buffer(&line), b
2150: 6c 6f 62 5f 73 69 7a 65 28 26 6c 69 6e 65 29 29  lob_size(&line))
2160: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
2170: 3e 72 44 61 74 65 21 3d 30 2e 30 20 29 20 67 6f  >rDate!=0.0 ) go
2180: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
2190: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
21a0: 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e    if( blob_token
21b0: 28 26 6c 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20  (&line, &a1)==0 
21c0: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
21d0: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
21e0: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74        if( blob_t
21f0: 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 32 29  oken(&line, &a2)
2200: 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  !=0 ) goto manif
2210: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
2220: 3b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 20  ;.        zDate 
2230: 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65  = blob_terminate
2240: 28 26 61 31 29 3b 0a 20 20 20 20 20 20 20 20 70  (&a1);.        p
2250: 2d 3e 72 44 61 74 65 20 3d 20 64 62 5f 64 6f 75  ->rDate = db_dou
2260: 62 6c 65 28 30 2e 30 2c 20 22 53 45 4c 45 43 54  ble(0.0, "SELECT
2270: 20 6a 75 6c 69 61 6e 64 61 79 28 25 51 29 22 2c   julianday(%Q)",
2280: 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20 20   zDate);.       
2290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
22a0: 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20  .      /*.      
22b0: 2a 2a 20 20 20 20 20 45 20 3c 6d 6f 64 65 3e 0a  **     E <mode>.
22c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22d0: 2a 20 41 63 63 65 73 73 20 6d 6f 64 65 2e 20 20  * Access mode.  
22e0: 3c 6d 6f 64 65 3e 20 63 61 6e 20 62 65 20 6f 6e  <mode> can be on
22f0: 65 20 6f 66 20 22 72 65 61 64 22 2c 20 22 61 70  e of "read", "ap
2300: 70 65 6e 64 22 2c 0a 20 20 20 20 20 20 2a 2a 20  pend",.      ** 
2310: 6f 72 20 22 77 72 69 74 65 22 2e 0a 20 20 20 20  or "write"..    
2320: 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20    */.      case 
2330: 27 45 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 6d  'E': {.        m
2340: 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28  d5sum_step_text(
2350: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 6e  blob_buffer(&lin
2360: 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 6c  e), blob_size(&l
2370: 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ine));.        i
2380: 66 28 20 70 2d 3e 6d 6f 64 65 21 3d 30 20 29 20  f( p->mode!=0 ) 
2390: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
23a0: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
23b0: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b      if( blob_tok
23c0: 65 6e 28 26 6c 69 6e 65 2c 20 26 61 31 29 3d 3d  en(&line, &a1)==
23d0: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
23e0: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
23f0: 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62          if( blob
2400: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61  _token(&line, &a
2410: 32 29 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e  2)!=0 ) goto man
2420: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
2430: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
2440: 62 6c 6f 62 5f 65 71 28 26 61 31 2c 20 22 77 72  blob_eq(&a1, "wr
2450: 69 74 65 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ite") ){.       
2460: 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 43 46 4d     p->mode = CFM
2470: 4f 44 45 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ODE_WRITE;.     
2480: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 6c 6f     }else if( blo
2490: 62 5f 65 71 28 26 61 31 2c 20 22 61 70 70 65 6e  b_eq(&a1, "appen
24a0: 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d") ){.         
24b0: 20 70 2d 3e 6d 6f 64 65 20 3d 20 43 46 4d 4f 44   p->mode = CFMOD
24c0: 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20 20  E_APPEND;.      
24d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 6c 6f 62    }else if( blob
24e0: 5f 65 71 28 26 61 31 2c 20 22 72 65 61 64 22 29  _eq(&a1, "read")
24f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
2500: 3e 6d 6f 64 65 20 3d 20 43 46 4d 4f 44 45 5f 52  >mode = CFMODE_R
2510: 45 41 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  EAD;.        }el
2520: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
2530: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
2540: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2550: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
2560: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
2570: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    /*.      **   
2580: 20 20 46 20 3c 66 69 6c 65 6e 61 6d 65 3e 20 3c    F <filename> <
2590: 75 75 69 64 3e 20 3f 3c 70 65 72 6d 69 73 73 69  uuid> ?<permissi
25a0: 6f 6e 73 3e 3f 0a 20 20 20 20 20 20 2a 2a 0a 20  ons>?.      **. 
25b0: 20 20 20 20 20 2a 2a 20 49 64 65 6e 74 69 66 69       ** Identifi
25c0: 65 73 20 61 20 66 69 6c 65 20 69 6e 20 61 20 6d  es a file in a m
25d0: 61 6e 69 66 65 73 74 2e 20 20 4d 75 6c 74 69 70  anifest.  Multip
25e0: 6c 65 20 46 20 6c 69 6e 65 73 20 61 72 65 0a 20  le F lines are. 
25f0: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 20       ** allowed 
2600: 69 6e 20 61 20 6d 61 6e 69 66 65 73 74 2e 20 20  in a manifest.  
2610: 46 20 6c 69 6e 65 73 20 61 72 65 20 6e 6f 74 20  F lines are not 
2620: 61 6c 6c 6f 77 65 64 20 69 6e 20 61 6e 79 0a 20  allowed in any. 
2630: 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
2640: 6e 74 72 6f 6c 20 66 69 6c 65 2e 20 20 54 68 65  ntrol file.  The
2650: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 66 6f 73   filename is fos
2660: 73 69 6c 2d 65 6e 63 6f 64 65 64 2e 0a 20 20 20  sil-encoded..   
2670: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
2680: 20 27 46 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'F': {.        
2690: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 55  char *zName, *zU
26a0: 75 69 64 2c 20 2a 7a 50 65 72 6d 3b 0a 20 20 20  uid, *zPerm;.   
26b0: 20 20 20 20 20 6d 64 35 73 75 6d 5f 73 74 65 70       md5sum_step
26c0: 5f 74 65 78 74 28 62 6c 6f 62 5f 62 75 66 66 65  _text(blob_buffe
26d0: 72 28 26 6c 69 6e 65 29 2c 20 62 6c 6f 62 5f 73  r(&line), blob_s
26e0: 69 7a 65 28 26 6c 69 6e 65 29 29 3b 0a 20 20 20  ize(&line));.   
26f0: 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f       if( blob_to
2700: 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 31 29 3d  ken(&line, &a1)=
2710: 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  =0 ) goto manife
2720: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
2730: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f  .        if( blo
2740: 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26  b_token(&line, &
2750: 61 32 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61  a2)==0 ) goto ma
2760: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
2770: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ror;.        zNa
2780: 6d 65 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e  me = blob_termin
2790: 61 74 65 28 26 61 31 29 3b 0a 20 20 20 20 20 20  ate(&a1);.      
27a0: 20 20 7a 55 75 69 64 20 3d 20 62 6c 6f 62 5f 74    zUuid = blob_t
27b0: 65 72 6d 69 6e 61 74 65 28 26 61 32 29 3b 0a 20  erminate(&a2);. 
27c0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 74 6f 6b 65         blob_toke
27d0: 6e 28 26 6c 69 6e 65 2c 20 26 61 33 29 3b 0a 20  n(&line, &a3);. 
27e0: 20 20 20 20 20 20 20 7a 50 65 72 6d 20 3d 20 62         zPerm = b
27f0: 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 61  lob_terminate(&a
2800: 33 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  3);.        if( 
2810: 62 6c 6f 62 5f 73 69 7a 65 28 26 61 32 29 21 3d  blob_size(&a2)!=
2820: 55 55 49 44 5f 53 49 5a 45 20 29 20 67 6f 74 6f  UUID_SIZE ) goto
2830: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
2840: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
2850: 69 66 28 20 21 76 61 6c 69 64 61 74 65 31 36 28  if( !validate16(
2860: 7a 55 75 69 64 2c 20 55 55 49 44 5f 53 49 5a 45  zUuid, UUID_SIZE
2870: 29 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  ) ) goto manifes
2880: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
2890: 20 20 20 20 20 20 20 20 64 65 66 6f 73 73 69 6c          defossil
28a0: 69 7a 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ize(zName);.    
28b0: 20 20 20 20 69 66 28 20 21 66 69 6c 65 5f 69 73      if( !file_is
28c0: 5f 73 69 6d 70 6c 65 5f 70 61 74 68 6e 61 6d 65  _simple_pathname
28d0: 28 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  (zName) ){.     
28e0: 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65       goto manife
28f0: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
2900: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2910: 20 20 20 69 66 28 20 70 2d 3e 6e 46 69 6c 65 3e     if( p->nFile>
2920: 3d 70 2d 3e 6e 46 69 6c 65 41 6c 6c 6f 63 20 29  =p->nFileAlloc )
2930: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
2940: 46 69 6c 65 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  FileAlloc = p->n
2950: 46 69 6c 65 41 6c 6c 6f 63 2a 32 20 2b 20 31 30  FileAlloc*2 + 10
2960: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ;.          p->a
2970: 46 69 6c 65 20 3d 20 72 65 61 6c 6c 6f 63 28 70  File = realloc(p
2980: 2d 3e 61 46 69 6c 65 2c 20 70 2d 3e 6e 46 69 6c  ->aFile, p->nFil
2990: 65 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d  eAlloc*sizeof(p-
29a0: 3e 61 46 69 6c 65 5b 30 5d 29 20 29 3b 0a 20 20  >aFile[0]) );.  
29b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
29c0: 46 69 6c 65 3d 3d 30 20 29 20 66 6f 73 73 69 6c  File==0 ) fossil
29d0: 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66 20 6d  _panic("out of m
29e0: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20  emory");.       
29f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20 70   }.        i = p
2a00: 2d 3e 6e 46 69 6c 65 2b 2b 3b 0a 20 20 20 20 20  ->nFile++;.     
2a10: 20 20 20 70 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a     p->aFile[i].z
2a20: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
2a30: 20 20 20 20 20 20 70 2d 3e 61 46 69 6c 65 5b 69        p->aFile[i
2a40: 5d 2e 7a 55 75 69 64 20 3d 20 7a 55 75 69 64 3b  ].zUuid = zUuid;
2a50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 46 69 6c  .        p->aFil
2a60: 65 5b 69 5d 2e 7a 50 65 72 6d 20 3d 20 7a 50 65  e[i].zPerm = zPe
2a70: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2a80: 69 3e 30 20 26 26 20 73 74 72 63 6d 70 28 70 2d  i>0 && strcmp(p-
2a90: 3e 61 46 69 6c 65 5b 69 2d 31 5d 2e 7a 4e 61 6d  >aFile[i-1].zNam
2aa0: 65 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  e, zName)>=0 ){.
2ab0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2ac0: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
2ad0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rror;.        }.
2ae0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2af0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2b00: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 4a 20  .      **     J 
2b10: 27 2b 27 3f 3c 6e 61 6d 65 3e 20 3c 76 61 6c 75  '+'?<name> <valu
2b20: 65 3e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e>.      **.    
2b30: 20 20 2a 2a 20 53 70 65 63 69 66 69 65 73 20 61    ** Specifies a
2b40: 20 6e 61 6d 65 20 76 61 6c 75 65 20 70 61 69 72   name value pair
2b50: 20 66 6f 72 20 74 69 63 6b 65 74 2e 20 20 49 66   for ticket.  If
2b60: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
2b70: 63 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  cter.      ** of
2b80: 20 3c 6e 61 6d 65 3e 20 69 73 20 22 2b 22 20 74   <name> is "+" t
2b90: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73  hen the value is
2ba0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 6e 79   appended to any
2bb0: 20 70 72 65 65 78 69 73 74 69 6e 67 0a 20 20 20   preexisting.   
2bc0: 20 20 20 2a 2a 20 76 61 6c 75 65 2e 0a 20 20 20     ** value..   
2bd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
2be0: 20 27 4a 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'J': {.        
2bf0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 56  char *zName, *zV
2c00: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 6d 64  alue;.        md
2c10: 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 62  5sum_step_text(b
2c20: 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 6e 65  lob_buffer(&line
2c30: 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 6c 69  ), blob_size(&li
2c40: 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ne));.        if
2c50: 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69  ( blob_token(&li
2c60: 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 20 67 6f  ne, &a1)==0 ) go
2c70: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
2c80: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2c90: 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e    if( blob_token
2ca0: 28 26 6c 69 6e 65 2c 20 26 61 32 29 3d 3d 30 20  (&line, &a2)==0 
2cb0: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
2cc0: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
2cd0: 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74        if( blob_t
2ce0: 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 33 29  oken(&line, &a3)
2cf0: 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  !=0 ) goto manif
2d00: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
2d10: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
2d20: 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65  = blob_terminate
2d30: 28 26 61 31 29 3b 0a 20 20 20 20 20 20 20 20 7a  (&a1);.        z
2d40: 56 61 6c 75 65 20 3d 20 62 6c 6f 62 5f 74 65 72  Value = blob_ter
2d50: 6d 69 6e 61 74 65 28 26 61 32 29 3b 0a 20 20 20  minate(&a2);.   
2d60: 20 20 20 20 20 64 65 66 6f 73 73 69 6c 69 7a 65       defossilize
2d70: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
2d80: 20 20 69 66 28 20 70 2d 3e 6e 46 69 65 6c 64 3e    if( p->nField>
2d90: 3d 70 2d 3e 6e 46 69 65 6c 64 41 6c 6c 6f 63 20  =p->nFieldAlloc 
2da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
2db0: 6e 46 69 65 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d  nFieldAlloc = p-
2dc0: 3e 6e 46 69 65 6c 64 41 6c 6c 6f 63 2a 32 20 2b  >nFieldAlloc*2 +
2dd0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70   10;.          p
2de0: 2d 3e 61 46 69 65 6c 64 20 3d 20 72 65 61 6c 6c  ->aField = reall
2df0: 6f 63 28 70 2d 3e 61 46 69 65 6c 64 2c 0a 20 20  oc(p->aField,.  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2e20: 6e 46 69 65 6c 64 41 6c 6c 6f 63 2a 73 69 7a 65  nFieldAlloc*size
2e30: 6f 66 28 70 2d 3e 61 46 69 65 6c 64 5b 30 5d 29  of(p->aField[0])
2e40: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2e50: 28 20 70 2d 3e 61 46 69 65 6c 64 3d 3d 30 20 29  ( p->aField==0 )
2e60: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6f   fossil_panic("o
2e70: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
2e80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e90: 20 20 69 20 3d 20 70 2d 3e 6e 46 69 65 6c 64 2b    i = p->nField+
2ea0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 46  +;.        p->aF
2eb0: 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  ield[i].zName = 
2ec0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70  zName;.        p
2ed0: 2d 3e 61 46 69 65 6c 64 5b 69 5d 2e 7a 56 61 6c  ->aField[i].zVal
2ee0: 75 65 20 3d 20 7a 56 61 6c 75 65 3b 0a 20 20 20  ue = zValue;.   
2ef0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
2f00: 73 74 72 63 6d 70 28 70 2d 3e 61 46 69 65 6c 64  strcmp(p->aField
2f10: 5b 69 2d 31 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  [i-1].zName, zNa
2f20: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
2f30: 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73      goto manifes
2f40: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
2f50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2f70: 0a 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  ...      /*.    
2f80: 20 20 2a 2a 20 20 20 20 4b 20 3c 75 75 69 64 3e    **    K <uuid>
2f90: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2fa0: 2a 2a 20 41 20 4b 2d 6c 69 6e 65 20 67 69 76 65  ** A K-line give
2fb0: 73 20 74 68 65 20 55 55 49 44 20 66 6f 72 20 74  s the UUID for t
2fc0: 68 65 20 74 69 63 6b 65 74 20 77 68 69 63 68 20  he ticket which 
2fd0: 74 68 69 73 20 63 6f 6e 74 72 6f 6c 20 66 69 6c  this control fil
2fe0: 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6d  e.      ** is am
2ff0: 65 6e 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  ending..      */
3000: 0a 20 20 20 20 20 20 63 61 73 65 20 27 4b 27 3a  .      case 'K':
3010: 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20   {.        char 
3020: 2a 7a 55 75 69 64 3b 0a 20 20 20 20 20 20 20 20  *zUuid;.        
3030: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74  md5sum_step_text
3040: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69  (blob_buffer(&li
3050: 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26  ne), blob_size(&
3060: 6c 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20  line));.        
3070: 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26  if( blob_token(&
3080: 6c 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 20  line, &a1)==0 ) 
3090: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
30a0: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
30b0: 20 20 20 20 7a 55 75 69 64 20 3d 20 62 6c 6f 62      zUuid = blob
30c0: 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 31 29 3b  _terminate(&a1);
30d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f  .        if( blo
30e0: 62 5f 73 69 7a 65 28 26 61 31 29 21 3d 55 55 49  b_size(&a1)!=UUI
30f0: 44 5f 53 49 5a 45 20 29 20 67 6f 74 6f 20 6d 61  D_SIZE ) goto ma
3100: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
3110: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ror;.        if(
3120: 20 21 76 61 6c 69 64 61 74 65 31 36 28 7a 55 75   !validate16(zUu
3130: 69 64 2c 20 55 55 49 44 5f 53 49 5a 45 29 20 29  id, UUID_SIZE) )
3140: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
3150: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
3160: 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 54 69 63       if( p->zTic
3170: 6b 65 74 55 75 69 64 21 3d 30 20 29 20 67 6f 74  ketUuid!=0 ) got
3180: 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61  o manifest_synta
3190: 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  x_error;.       
31a0: 20 70 2d 3e 7a 54 69 63 6b 65 74 55 75 69 64 20   p->zTicketUuid 
31b0: 3d 20 7a 55 75 69 64 3b 0a 20 20 20 20 20 20 20  = zUuid;.       
31c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
31d0: 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20  .      /*.      
31e0: 2a 2a 20 20 20 20 20 4c 20 3c 77 69 6b 69 74 69  **     L <wikiti
31f0: 74 6c 65 3e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  tle>.      **.  
3200: 20 20 20 20 2a 2a 20 54 68 65 20 77 69 6b 69 20      ** The wiki 
3210: 70 61 67 65 20 74 69 74 6c 65 20 69 73 20 66 6f  page title is fo
3220: 73 73 69 6c 2d 65 6e 63 6f 64 65 64 2e 20 20 54  ssil-encoded.  T
3230: 68 65 72 65 20 6d 61 79 20 62 65 20 6e 6f 20 6d  here may be no m
3240: 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
3250: 2a 20 6f 6e 65 20 4c 20 6c 69 6e 65 2e 0a 20 20  * one L line..  
3260: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73      */.      cas
3270: 65 20 27 4c 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'L': {.       
3280: 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78   md5sum_step_tex
3290: 74 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c  t(blob_buffer(&l
32a0: 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  ine), blob_size(
32b0: 26 6c 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20  &line));.       
32c0: 20 69 66 28 20 70 2d 3e 7a 57 69 6b 69 54 69 74   if( p->zWikiTit
32d0: 6c 65 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e  le!=0 ) goto man
32e0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
32f0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
3300: 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65  blob_token(&line
3310: 2c 20 26 61 31 29 3d 3d 30 20 29 20 67 6f 74 6f  , &a1)==0 ) goto
3320: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
3330: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
3340: 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26  if( blob_token(&
3350: 6c 69 6e 65 2c 20 26 61 32 29 21 3d 30 20 29 20  line, &a2)!=0 ) 
3360: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
3370: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
3380: 20 20 20 20 70 2d 3e 7a 57 69 6b 69 54 69 74 6c      p->zWikiTitl
3390: 65 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61  e = blob_termina
33a0: 74 65 28 26 61 31 29 3b 0a 20 20 20 20 20 20 20  te(&a1);.       
33b0: 20 64 65 66 6f 73 73 69 6c 69 7a 65 28 70 2d 3e   defossilize(p->
33c0: 7a 57 69 6b 69 54 69 74 6c 65 29 3b 0a 20 20 20  zWikiTitle);.   
33d0: 20 20 20 20 20 69 66 28 20 21 77 69 6b 69 5f 6e       if( !wiki_n
33e0: 61 6d 65 5f 69 73 5f 77 65 6c 6c 66 6f 72 6d 65  ame_is_wellforme
33f0: 64 28 70 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 29  d(p->zWikiTitle)
3400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
3410: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
3420: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
3430: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
3440: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
3450: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    /*.      **   
3460: 20 4d 20 3c 75 75 69 64 3e 0a 20 20 20 20 20 20   M <uuid>.      
3470: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6e 20 4d  **.      ** An M
3480: 2d 6c 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  -line identifies
3490: 20 61 6e 6f 74 68 65 72 20 61 72 74 69 66 61 63   another artifac
34a0: 74 20 62 79 20 69 74 73 20 55 55 49 44 2e 20 20  t by its UUID.  
34b0: 4d 2d 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  M-lines.      **
34c0: 20 6f 63 63 75 72 20 69 6e 20 63 6c 75 73 74 65   occur in cluste
34d0: 72 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  rs only..      *
34e0: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 27 4d 27  /.      case 'M'
34f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  : {.        char
3500: 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 20 20 20   *zUuid;.       
3510: 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78   md5sum_step_tex
3520: 74 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c  t(blob_buffer(&l
3530: 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  ine), blob_size(
3540: 26 6c 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20  &line));.       
3550: 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28   if( blob_token(
3560: 26 6c 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29  &line, &a1)==0 )
3570: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
3580: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
3590: 20 20 20 20 20 7a 55 75 69 64 20 3d 20 62 6c 6f       zUuid = blo
35a0: 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 31 29  b_terminate(&a1)
35b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c  ;.        if( bl
35c0: 6f 62 5f 73 69 7a 65 28 26 61 31 29 21 3d 55 55  ob_size(&a1)!=UU
35d0: 49 44 5f 53 49 5a 45 20 29 20 67 6f 74 6f 20 6d  ID_SIZE ) goto m
35e0: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
35f0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rror;.        if
3600: 28 20 21 76 61 6c 69 64 61 74 65 31 36 28 7a 55  ( !validate16(zU
3610: 75 69 64 2c 20 55 55 49 44 5f 53 49 5a 45 29 20  uid, UUID_SIZE) 
3620: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
3630: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
3640: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 43 43        if( p->nCC
3650: 68 69 6c 64 3e 3d 70 2d 3e 6e 43 43 68 69 6c 64  hild>=p->nCChild
3660: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
3670: 20 20 20 70 2d 3e 6e 43 43 68 69 6c 64 41 6c 6c     p->nCChildAll
3680: 6f 63 20 3d 20 70 2d 3e 6e 43 43 68 69 6c 64 41  oc = p->nCChildA
3690: 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20  lloc*2 + 10;.   
36a0: 20 20 20 20 20 20 20 70 2d 3e 61 7a 43 43 68 69         p->azCChi
36b0: 6c 64 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  ld = .          
36c0: 20 20 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 7a     realloc(p->az
36d0: 43 43 68 69 6c 64 2c 20 70 2d 3e 6e 43 43 68 69  CChild, p->nCChi
36e0: 6c 64 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  ldAlloc*sizeof(p
36f0: 2d 3e 61 7a 43 43 68 69 6c 64 5b 30 5d 29 20 29  ->azCChild[0]) )
3700: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3710: 70 2d 3e 61 7a 43 43 68 69 6c 64 3d 3d 30 20 29  p->azCChild==0 )
3720: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6f   fossil_panic("o
3730: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
3740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3750: 20 20 69 20 3d 20 70 2d 3e 6e 43 43 68 69 6c 64    i = p->nCChild
3760: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ++;.        p->a
3770: 7a 43 43 68 69 6c 64 5b 69 5d 20 3d 20 7a 55 75  zCChild[i] = zUu
3780: 69 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  id;.        if( 
3790: 69 3e 30 20 26 26 20 73 74 72 63 6d 70 28 70 2d  i>0 && strcmp(p-
37a0: 3e 61 7a 43 43 68 69 6c 64 5b 69 2d 31 5d 2c 20  >azCChild[i-1], 
37b0: 7a 55 75 69 64 29 3e 3d 30 20 29 7b 0a 20 20 20  zUuid)>=0 ){.   
37c0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69         goto mani
37d0: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
37e0: 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
37f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3800: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20    }..      /*.  
3810: 20 20 20 20 2a 2a 20 20 20 20 20 50 20 3c 75 75      **     P <uu
3820: 69 64 3e 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  id> ....      **
3830: 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66  .      ** Specif
3840: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 74  y one or more ot
3850: 68 65 72 20 61 72 74 69 66 61 63 74 73 20 77 68  her artifacts wh
3860: 65 72 65 20 61 72 65 20 74 68 65 20 70 61 72 65  ere are the pare
3870: 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  nts of.      ** 
3880: 74 68 69 73 20 61 72 74 69 66 61 63 74 2e 20 20  this artifact.  
3890: 54 68 65 20 66 69 72 73 74 20 70 61 72 65 6e 74  The first parent
38a0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
38b0: 70 61 72 65 6e 74 2e 20 20 41 6c 6c 0a 20 20 20  parent.  All.   
38c0: 20 20 20 2a 2a 20 6f 74 68 65 72 73 20 61 72 65     ** others are
38d0: 20 70 61 72 65 6e 74 73 20 62 79 20 6d 65 72 67   parents by merg
38e0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
38f0: 20 20 63 61 73 65 20 27 50 27 3a 20 7b 0a 20 20    case 'P': {.  
3900: 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 73 74 65        md5sum_ste
3910: 70 5f 74 65 78 74 28 62 6c 6f 62 5f 62 75 66 66  p_text(blob_buff
3920: 65 72 28 26 6c 69 6e 65 29 2c 20 62 6c 6f 62 5f  er(&line), blob_
3930: 73 69 7a 65 28 26 6c 69 6e 65 29 29 3b 0a 20 20  size(&line));.  
3940: 20 20 20 20 20 20 77 68 69 6c 65 28 20 62 6c 6f        while( blo
3950: 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26  b_token(&line, &
3960: 61 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  a1) ){.         
3970: 20 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20   char *zUuid;.  
3980: 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62          if( blob
3990: 5f 73 69 7a 65 28 26 61 31 29 21 3d 55 55 49 44  _size(&a1)!=UUID
39a0: 5f 53 49 5a 45 20 29 20 67 6f 74 6f 20 6d 61 6e  _SIZE ) goto man
39b0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
39c0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 55  or;.          zU
39d0: 75 69 64 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69  uid = blob_termi
39e0: 6e 61 74 65 28 26 61 31 29 3b 0a 20 20 20 20 20  nate(&a1);.     
39f0: 20 20 20 20 20 69 66 28 20 21 76 61 6c 69 64 61       if( !valida
3a00: 74 65 31 36 28 7a 55 75 69 64 2c 20 55 55 49 44  te16(zUuid, UUID
3a10: 5f 53 49 5a 45 29 20 29 20 67 6f 74 6f 20 6d 61  _SIZE) ) goto ma
3a20: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
3a30: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ror;.          i
3a40: 66 28 20 70 2d 3e 6e 50 61 72 65 6e 74 3e 3d 70  f( p->nParent>=p
3a50: 2d 3e 6e 50 61 72 65 6e 74 41 6c 6c 6f 63 20 29  ->nParentAlloc )
3a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
3a70: 3e 6e 50 61 72 65 6e 74 41 6c 6c 6f 63 20 3d 20  >nParentAlloc = 
3a80: 70 2d 3e 6e 50 61 72 65 6e 74 41 6c 6c 6f 63 2a  p->nParentAlloc*
3a90: 32 20 2b 20 35 3b 0a 20 20 20 20 20 20 20 20 20  2 + 5;.         
3aa0: 20 20 20 70 2d 3e 61 7a 50 61 72 65 6e 74 20 3d     p->azParent =
3ab0: 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 7a 50 61   realloc(p->azPa
3ac0: 72 65 6e 74 2c 20 70 2d 3e 6e 50 61 72 65 6e 74  rent, p->nParent
3ad0: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 63 68 61  Alloc*sizeof(cha
3ae0: 72 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r*));.          
3af0: 20 20 69 66 28 20 70 2d 3e 61 7a 50 61 72 65 6e    if( p->azParen
3b00: 74 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 70 61  t==0 ) fossil_pa
3b10: 6e 69 63 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  nic("out of memo
3b20: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
3b30: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  }.          i = 
3b40: 70 2d 3e 6e 50 61 72 65 6e 74 2b 2b 3b 0a 20 20  p->nParent++;.  
3b50: 20 20 20 20 20 20 20 20 70 2d 3e 61 7a 50 61 72          p->azPar
3b60: 65 6e 74 5b 69 5d 20 3d 20 7a 55 75 69 64 3b 0a  ent[i] = zUuid;.
3b70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3b90: 0a 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  ..      /*.     
3ba0: 20 2a 2a 20 20 20 20 20 52 20 3c 6d 64 35 73 75   **     R <md5su
3bb0: 6d 3e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  m>.      **.    
3bc0: 20 20 2a 2a 20 53 70 65 63 69 66 79 20 74 68 65    ** Specify the
3bd0: 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 20 6f 66   MD5 checksum of
3be0: 20 74 68 65 20 65 6e 74 69 72 65 20 62 61 73 65   the entire base
3bf0: 6c 69 6e 65 20 69 6e 20 61 0a 20 20 20 20 20 20  line in a.      
3c00: 2a 2a 20 6d 61 6e 69 66 65 73 74 2e 0a 20 20 20  ** manifest..   
3c10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65     */.      case
3c20: 20 27 52 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'R': {.        
3c30: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74  md5sum_step_text
3c40: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69  (blob_buffer(&li
3c50: 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26  ne), blob_size(&
3c60: 6c 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20  line));.        
3c70: 69 66 28 20 70 2d 3e 7a 52 65 70 6f 43 6b 73 75  if( p->zRepoCksu
3c80: 6d 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  m!=0 ) goto mani
3c90: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
3ca0: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  r;.        if( b
3cb0: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c  lob_token(&line,
3cc0: 20 26 61 31 29 3d 3d 30 20 29 20 67 6f 74 6f 20   &a1)==0 ) goto 
3cd0: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
3ce0: 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  error;.        i
3cf0: 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c  f( blob_token(&l
3d00: 69 6e 65 2c 20 26 61 32 29 21 3d 30 20 29 20 67  ine, &a2)!=0 ) g
3d10: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
3d20: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
3d30: 20 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65     if( blob_size
3d40: 28 26 61 31 29 21 3d 33 32 20 29 20 67 6f 74 6f  (&a1)!=32 ) goto
3d50: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
3d60: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
3d70: 70 2d 3e 7a 52 65 70 6f 43 6b 73 75 6d 20 3d 20  p->zRepoCksum = 
3d80: 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26  blob_terminate(&
3d90: 61 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  a1);.        if(
3da0: 20 21 76 61 6c 69 64 61 74 65 31 36 28 70 2d 3e   !validate16(p->
3db0: 7a 52 65 70 6f 43 6b 73 75 6d 2c 20 33 32 29 20  zRepoCksum, 32) 
3dc0: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
3dd0: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
3de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3df0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20     }..      /*. 
3e00: 20 20 20 20 20 2a 2a 20 20 20 20 54 20 28 2b 7c       **    T (+|
3e10: 2a 7c 2d 29 3c 74 61 67 6e 61 6d 65 3e 20 3c 75  *|-)<tagname> <u
3e20: 75 69 64 3e 20 3f 3c 76 61 6c 75 65 3e 3f 0a 20  uid> ?<value>?. 
3e30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
3e40: 20 43 72 65 61 74 65 20 6f 72 20 63 61 6e 63 65   Create or cance
3e50: 6c 20 61 20 74 61 67 20 6f 72 20 70 72 6f 70 65  l a tag or prope
3e60: 72 74 79 2e 20 20 54 68 65 20 74 61 67 6e 61 6d  rty.  The tagnam
3e70: 65 20 69 73 20 66 6f 73 73 69 6c 2d 65 6e 63 6f  e is fossil-enco
3e80: 64 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ded..      ** Th
3e90: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
3ea0: 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6d 75  r of the name mu
3eb0: 73 74 20 62 65 20 65 69 74 68 65 72 20 22 2b 22  st be either "+"
3ec0: 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 20   to create a.   
3ed0: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 74 6f 6e 20     ** singleton 
3ee0: 74 61 67 2c 20 22 2a 22 20 74 6f 20 63 72 65 61  tag, "*" to crea
3ef0: 74 65 20 61 20 70 72 6f 70 61 67 61 74 69 6e 67  te a propagating
3f00: 20 74 61 67 2c 20 6f 72 20 22 2d 22 20 74 6f 20   tag, or "-" to 
3f10: 63 72 65 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  create.      ** 
3f20: 61 6e 74 69 2d 74 61 67 20 74 68 61 74 20 75 6e  anti-tag that un
3f30: 64 6f 65 73 20 61 20 70 72 69 6f 72 20 22 2b 22  does a prior "+"
3f40: 20 6f 72 20 62 6c 6f 63 6b 73 20 70 72 6f 70 61   or blocks propa
3f50: 67 61 74 69 6f 6e 20 6f 66 20 6f 66 0a 20 20 20  gation of of.   
3f60: 20 20 20 2a 2a 20 61 20 22 2a 22 2e 0a 20 20 20     ** a "*"..   
3f70: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
3f80: 68 65 20 74 61 67 20 69 73 20 61 70 70 6c 69 65  he tag is applie
3f90: 64 20 74 6f 20 3c 75 75 69 64 3e 2e 20 20 49 66  d to <uuid>.  If
3fa0: 20 3c 75 75 69 64 3e 20 69 73 20 22 2a 22 20 74   <uuid> is "*" t
3fb0: 68 65 6e 20 74 68 65 20 74 61 67 20 69 73 0a 20  hen the tag is. 
3fc0: 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
3fd0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  to the current m
3fe0: 61 6e 69 66 65 73 74 2e 20 20 49 66 20 3c 76 61  anifest.  If <va
3ff0: 6c 75 65 3e 20 69 73 20 70 72 6f 76 69 64 65 64  lue> is provided
4000: 20 74 68 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   then .      ** 
4010: 74 68 65 20 74 61 67 20 69 73 20 72 65 61 6c 6c  the tag is reall
4020: 79 20 61 20 70 72 6f 70 65 72 74 79 20 77 69 74  y a property wit
4030: 68 20 74 68 65 20 67 69 76 65 6e 20 76 61 6c 75  h the given valu
4040: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
4050: 20 20 2a 2a 20 54 61 67 73 20 61 72 65 20 6e 6f    ** Tags are no
4060: 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 63 6c 75  t allowed in clu
4070: 73 74 65 72 73 2e 20 20 4d 75 6c 74 69 70 6c 65  sters.  Multiple
4080: 20 54 20 6c 69 6e 65 73 20 61 72 65 20 61 6c 6c   T lines are all
4090: 6f 77 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  owed..      */. 
40a0: 20 20 20 20 20 63 61 73 65 20 27 54 27 3a 20 7b       case 'T': {
40b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
40c0: 4e 61 6d 65 2c 20 2a 7a 55 75 69 64 2c 20 2a 7a  Name, *zUuid, *z
40d0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 6d  Value;.        m
40e0: 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28  d5sum_step_text(
40f0: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69 6e  blob_buffer(&lin
4100: 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 6c  e), blob_size(&l
4110: 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ine));.        i
4120: 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c  f( blob_token(&l
4130: 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 7b 0a  ine, &a1)==0 ){.
4140: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
4150: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
4160: 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rror;.        }.
4170: 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62          if( blob
4180: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61  _token(&line, &a
4190: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
41a0: 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74     goto manifest
41b0: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
41c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
41d0: 20 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 74 65   zName = blob_te
41e0: 72 6d 69 6e 61 74 65 28 26 61 31 29 3b 0a 20 20  rminate(&a1);.  
41f0: 20 20 20 20 20 20 7a 55 75 69 64 20 3d 20 62 6c        zUuid = bl
4200: 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 61 32  ob_terminate(&a2
4210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  );.        if( b
4220: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c  lob_token(&line,
4230: 20 26 61 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20   &a3)==0 ){.    
4240: 20 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 30        zValue = 0
4250: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
4260: 0a 20 20 20 20 20 20 20 20 20 20 7a 56 61 6c 75  .          zValu
4270: 65 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61  e = blob_termina
4280: 74 65 28 26 61 33 29 3b 0a 20 20 20 20 20 20 20  te(&a3);.       
4290: 20 20 20 64 65 66 6f 73 73 69 6c 69 7a 65 28 7a     defossilize(z
42a0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
42b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 6c  }.        if( bl
42c0: 6f 62 5f 73 69 7a 65 28 26 61 32 29 3d 3d 55 55  ob_size(&a2)==UU
42d0: 49 44 5f 53 49 5a 45 20 26 26 20 76 61 6c 69 64  ID_SIZE && valid
42e0: 61 74 65 31 36 28 7a 55 75 69 64 2c 20 55 55 49  ate16(zUuid, UUI
42f0: 44 5f 53 49 5a 45 29 20 29 7b 0a 20 20 20 20 20  D_SIZE) ){.     
4300: 20 20 20 20 20 2f 2a 20 41 20 76 61 6c 69 64 20       /* A valid 
4310: 75 75 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  uuid */.        
4320: 7d 65 6c 73 65 20 69 66 28 20 62 6c 6f 62 5f 73  }else if( blob_s
4330: 69 7a 65 28 26 61 32 29 3d 3d 31 20 26 26 20 7a  ize(&a2)==1 && z
4340: 55 75 69 64 5b 30 5d 3d 3d 27 2a 27 20 29 7b 0a  Uuid[0]=='*' ){.
4350: 20 20 20 20 20 20 20 20 20 20 7a 55 75 69 64 20            zUuid 
4360: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
4370: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
4380: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
4390: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
43a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 6f    }.        defo
43b0: 73 73 69 6c 69 7a 65 28 7a 4e 61 6d 65 29 3b 0a  ssilize(zName);.
43c0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
43d0: 65 5b 30 5d 21 3d 27 2d 27 20 26 26 20 7a 4e 61  e[0]!='-' && zNa
43e0: 6d 65 5b 30 5d 21 3d 27 2b 27 20 26 26 20 7a 4e  me[0]!='+' && zN
43f0: 61 6d 65 5b 30 5d 21 3d 27 2a 27 20 29 7b 0a 20  ame[0]!='*' ){. 
4400: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 61           goto ma
4410: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
4420: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ror;.        }. 
4430: 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 69 64         if( valid
4440: 61 74 65 31 36 28 26 7a 4e 61 6d 65 5b 31 5d 2c  ate16(&zName[1],
4450: 20 73 74 72 6c 65 6e 28 26 7a 4e 61 6d 65 5b 31   strlen(&zName[1
4460: 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ])) ){.         
4470: 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
4480: 20 74 61 67 73 20 77 68 6f 73 65 20 6e 61 6d 65   tags whose name
4490: 73 20 6c 6f 6f 6b 20 6c 69 6b 65 20 55 55 49 44  s look like UUID
44a0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  s */.          g
44b0: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
44c0: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
44d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
44e0: 20 70 2d 3e 6e 54 61 67 3e 3d 70 2d 3e 6e 54 61   p->nTag>=p->nTa
44f0: 67 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  gAlloc ){.      
4500: 20 20 20 20 70 2d 3e 6e 54 61 67 41 6c 6c 6f 63      p->nTagAlloc
4510: 20 3d 20 70 2d 3e 6e 54 61 67 41 6c 6c 6f 63 2a   = p->nTagAlloc*
4520: 32 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  2 + 10;.        
4530: 20 20 70 2d 3e 61 54 61 67 20 3d 20 72 65 61 6c    p->aTag = real
4540: 6c 6f 63 28 70 2d 3e 61 54 61 67 2c 20 70 2d 3e  loc(p->aTag, p->
4550: 6e 54 61 67 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  nTagAlloc*sizeof
4560: 28 70 2d 3e 61 54 61 67 5b 30 5d 29 20 29 3b 0a  (p->aTag[0]) );.
4570: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
4580: 3e 61 54 61 67 3d 3d 30 20 29 20 66 6f 73 73 69  >aTag==0 ) fossi
4590: 6c 5f 70 61 6e 69 63 28 22 6f 75 74 20 6f 66 20  l_panic("out of 
45a0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
45b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20    }.        i = 
45c0: 70 2d 3e 6e 54 61 67 2b 2b 3b 0a 20 20 20 20 20  p->nTag++;.     
45d0: 20 20 20 70 2d 3e 61 54 61 67 5b 69 5d 2e 7a 4e     p->aTag[i].zN
45e0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
45f0: 20 20 20 20 20 70 2d 3e 61 54 61 67 5b 69 5d 2e       p->aTag[i].
4600: 7a 55 75 69 64 20 3d 20 7a 55 75 69 64 3b 0a 20  zUuid = zUuid;. 
4610: 20 20 20 20 20 20 20 70 2d 3e 61 54 61 67 5b 69         p->aTag[i
4620: 5d 2e 7a 56 61 6c 75 65 20 3d 20 7a 56 61 6c 75  ].zValue = zValu
4630: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  e;.        if( i
4640: 3e 30 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e  >0 && strcmp(p->
4650: 61 54 61 67 5b 69 2d 31 5d 2e 7a 4e 61 6d 65 2c  aTag[i-1].zName,
4660: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
4670: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 61 6e          goto man
4680: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
4690: 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  or;.        }.  
46a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
46b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 0a 20     }..      /*. 
46c0: 20 20 20 20 20 2a 2a 20 20 20 20 20 55 20 3c 6c       **     U <l
46d0: 6f 67 69 6e 3e 0a 20 20 20 20 20 20 2a 2a 0a 20  ogin>.      **. 
46e0: 20 20 20 20 20 2a 2a 20 49 64 65 6e 74 69 66 79       ** Identify
46f0: 20 74 68 65 20 75 73 65 72 20 77 68 6f 20 63 72   the user who cr
4700: 65 61 74 65 64 20 74 68 69 73 20 63 6f 6e 74 72  eated this contr
4710: 6f 6c 20 66 69 6c 65 20 62 79 20 74 68 65 69 72  ol file by their
4720: 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 67 69 6e 2e  .      ** login.
4730: 20 20 4f 6e 6c 79 20 6f 6e 65 20 55 20 6c 69 6e    Only one U lin
4740: 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 50  e is allowed.  P
4750: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 63 6c 75  rohibited in clu
4760: 73 74 65 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  sters..      */.
4770: 20 20 20 20 20 20 63 61 73 65 20 27 55 27 3a 20        case 'U': 
4780: 7b 0a 20 20 20 20 20 20 20 20 6d 64 35 73 75 6d  {.        md5sum
4790: 5f 73 74 65 70 5f 74 65 78 74 28 62 6c 6f 62 5f  _step_text(blob_
47a0: 62 75 66 66 65 72 28 26 6c 69 6e 65 29 2c 20 62  buffer(&line), b
47b0: 6c 6f 62 5f 73 69 7a 65 28 26 6c 69 6e 65 29 29  lob_size(&line))
47c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
47d0: 3e 7a 55 73 65 72 21 3d 30 20 29 20 67 6f 74 6f  >zUser!=0 ) goto
47e0: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
47f0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
4800: 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26  if( blob_token(&
4810: 6c 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29 20  line, &a1)==0 ) 
4820: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
4830: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
4840: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b      if( blob_tok
4850: 65 6e 28 26 6c 69 6e 65 2c 20 26 61 32 29 21 3d  en(&line, &a2)!=
4860: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
4870: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
4880: 20 20 20 20 20 20 20 20 70 2d 3e 7a 55 73 65 72          p->zUser
4890: 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74   = blob_terminat
48a0: 65 28 26 61 31 29 3b 0a 20 20 20 20 20 20 20 20  e(&a1);.        
48b0: 64 65 66 6f 73 73 69 6c 69 7a 65 28 70 2d 3e 7a  defossilize(p->z
48c0: 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 62  User);.        b
48d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
48e0: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
48f0: 20 20 20 20 20 57 20 3c 73 69 7a 65 3e 0a 20 20       W <size>.  
4900: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
4910: 54 68 65 20 6e 65 78 74 20 3c 73 69 7a 65 3e 20  The next <size> 
4920: 62 79 74 65 73 20 6f 66 20 74 68 65 20 66 69 6c  bytes of the fil
4930: 65 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65  e contain the te
4940: 78 74 20 6f 66 20 74 68 65 20 77 69 6b 69 0a 20  xt of the wiki. 
4950: 20 20 20 20 20 2a 2a 20 70 61 67 65 2e 20 20 54       ** page.  T
4960: 68 65 72 65 20 69 73 20 61 6c 77 61 79 73 20 61  here is always a
4970: 6e 20 65 78 74 72 61 20 5c 6e 20 62 65 66 6f 72  n extra \n befor
4980: 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  e the start of t
4990: 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a  he next.      **
49a0: 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a   record..      *
49b0: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 27 57 27  /.      case 'W'
49c0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
49d0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 42 6c  size;.        Bl
49e0: 6f 62 20 77 69 6b 69 3b 0a 20 20 20 20 20 20 20  ob wiki;.       
49f0: 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78   md5sum_step_tex
4a00: 74 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c  t(blob_buffer(&l
4a10: 69 6e 65 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  ine), blob_size(
4a20: 26 6c 69 6e 65 29 29 3b 0a 20 20 20 20 20 20 20  &line));.       
4a30: 20 69 66 28 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28   if( blob_token(
4a40: 26 6c 69 6e 65 2c 20 26 61 31 29 3d 3d 30 20 29  &line, &a1)==0 )
4a50: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
4a60: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
4a70: 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 74 6f       if( blob_to
4a80: 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61 32 29 21  ken(&line, &a2)!
4a90: 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  =0 ) goto manife
4aa0: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
4ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 6c  .        if( !bl
4ac0: 6f 62 5f 69 73 5f 69 6e 74 28 26 61 31 2c 20 26  ob_is_int(&a1, &
4ad0: 73 69 7a 65 29 20 29 20 67 6f 74 6f 20 6d 61 6e  size) ) goto man
4ae0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
4af0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
4b00: 73 69 7a 65 3c 30 20 29 20 67 6f 74 6f 20 6d 61  size<0 ) goto ma
4b10: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
4b20: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ror;.        if(
4b30: 20 70 2d 3e 7a 57 69 6b 69 21 3d 30 20 29 20 67   p->zWiki!=0 ) g
4b40: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
4b50: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
4b60: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 77 69     blob_zero(&wi
4b70: 6b 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ki);.        if(
4b80: 20 62 6c 6f 62 5f 65 78 74 72 61 63 74 28 70 43   blob_extract(pC
4b90: 6f 6e 74 65 6e 74 2c 20 73 69 7a 65 2b 31 2c 20  ontent, size+1, 
4ba0: 26 77 69 6b 69 29 21 3d 73 69 7a 65 2b 31 20 29  &wiki)!=size+1 )
4bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
4bc0: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
4bd0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
4be0: 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 57 69  }.        p->zWi
4bf0: 6b 69 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72  ki = blob_buffer
4c00: 28 26 77 69 6b 69 29 3b 0a 20 20 20 20 20 20 20  (&wiki);.       
4c10: 20 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78   md5sum_step_tex
4c20: 74 28 70 2d 3e 7a 57 69 6b 69 2c 20 73 69 7a 65  t(p->zWiki, size
4c30: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
4c40: 20 70 2d 3e 7a 57 69 6b 69 5b 73 69 7a 65 5d 21   p->zWiki[size]!
4c50: 3d 27 5c 6e 27 20 29 20 67 6f 74 6f 20 6d 61 6e  ='\n' ) goto man
4c60: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
4c70: 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  or;.        p->z
4c80: 57 69 6b 69 5b 73 69 7a 65 5d 20 3d 20 30 3b 0a  Wiki[size] = 0;.
4c90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4ca0: 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f       }...      /
4cb0: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 5a  *.      **     Z
4cc0: 20 3c 6d 64 35 73 75 6d 3e 0a 20 20 20 20 20 20   <md5sum>.      
4cd0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 44 35 20  **.      ** MD5 
4ce0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 74 68 69 73  checksum on this
4cf0: 20 63 6f 6e 74 72 6f 6c 20 66 69 6c 65 2e 20 20   control file.  
4d00: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  The checksum is 
4d10: 6f 76 65 72 20 61 6c 6c 0a 20 20 20 20 20 20 2a  over all.      *
4d20: 2a 20 6c 69 6e 65 73 20 28 6f 74 68 65 72 20 74  * lines (other t
4d30: 68 61 6e 20 50 47 50 2d 73 69 67 6e 61 74 75 72  han PGP-signatur
4d40: 65 20 6c 69 6e 65 73 29 20 70 72 69 6f 72 20 74  e lines) prior t
4d50: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  o the current.  
4d60: 20 20 20 20 2a 2a 20 6c 69 6e 65 2e 20 20 54 68      ** line.  Th
4d70: 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  is must be the l
4d80: 61 73 74 20 72 65 63 6f 72 64 2e 0a 20 20 20 20  ast record..    
4d90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
4da0: 69 73 20 63 61 72 64 20 69 73 20 72 65 71 75 69  is card is requi
4db0: 72 65 64 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 74  red for all cont
4dc0: 72 6f 6c 20 66 69 6c 65 20 74 79 70 65 73 20 65  rol file types e
4dd0: 78 63 65 70 74 20 66 6f 72 0a 20 20 20 20 20 20  xcept for.      
4de0: 2a 2a 20 4d 61 6e 69 66 65 73 74 2e 20 20 49 74  ** Manifest.  It
4df0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
4e00: 20 66 6f 72 20 6d 61 6e 69 66 65 73 74 20 6f 6e   for manifest on
4e10: 6c 79 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  ly for historica
4e20: 6c 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  l.      ** compa
4e30: 74 69 62 69 6c 69 74 79 20 72 65 61 73 6f 6e 73  tibility reasons
4e40: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
4e50: 20 63 61 73 65 20 27 5a 27 3a 20 7b 0a 20 20 20   case 'Z': {.   
4e60: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
4e70: 20 20 20 20 20 42 6c 6f 62 20 68 61 73 68 3b 0a       Blob hash;.
4e80: 20 20 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62          if( blob
4e90: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 61  _token(&line, &a
4ea0: 31 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e  1)==0 ) goto man
4eb0: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
4ec0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
4ed0: 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65  blob_token(&line
4ee0: 2c 20 26 61 32 29 21 3d 30 20 29 20 67 6f 74 6f  , &a2)!=0 ) goto
4ef0: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
4f00: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
4f10: 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26 61  if( blob_size(&a
4f20: 31 29 21 3d 33 32 20 29 20 67 6f 74 6f 20 6d 61  1)!=32 ) goto ma
4f30: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
4f40: 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ror;.        if(
4f50: 20 21 76 61 6c 69 64 61 74 65 31 36 28 62 6c 6f   !validate16(blo
4f60: 62 5f 62 75 66 66 65 72 28 26 61 31 29 2c 20 33  b_buffer(&a1), 3
4f70: 32 29 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  2) ) goto manife
4f80: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
4f90: 0a 20 20 20 20 20 20 20 20 6d 64 35 73 75 6d 5f  .        md5sum_
4fa0: 66 69 6e 69 73 68 28 26 68 61 73 68 29 3b 0a 20  finish(&hash);. 
4fb0: 20 20 20 20 20 20 20 72 63 20 3d 20 62 6c 6f 62         rc = blob
4fc0: 5f 63 6f 6d 70 61 72 65 28 26 68 61 73 68 2c 20  _compare(&hash, 
4fd0: 26 61 31 29 3b 0a 20 20 20 20 20 20 20 20 62 6c  &a1);.        bl
4fe0: 6f 62 5f 72 65 73 65 74 28 26 68 61 73 68 29 3b  ob_reset(&hash);
4ff0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
5000: 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  =0 ) goto manife
5010: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
5020: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 20 3d  .        seenZ =
5030: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
5040: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5050: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5060: 20 20 20 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73      goto manifes
5070: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
5080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5090: 7d 0a 20 20 69 66 28 20 21 73 65 65 6e 48 65 61  }.  if( !seenHea
50a0: 64 65 72 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  der ) goto manif
50b0: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
50c0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 69 6c  ;..  if( p->nFil
50d0: 65 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  e>0 ){.    if( p
50e0: 2d 3e 6e 43 43 68 69 6c 64 3e 30 20 29 20 67 6f  ->nCChild>0 ) go
50f0: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
5100: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  ax_error;.    if
5110: 28 20 70 2d 3e 72 44 61 74 65 3d 3d 30 2e 30 20  ( p->rDate==0.0 
5120: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
5130: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
5140: 20 20 69 66 28 20 70 2d 3e 6e 46 69 65 6c 64 3e    if( p->nField>
5150: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
5160: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
5170: 20 20 20 20 69 66 28 20 70 2d 3e 7a 54 69 63 6b      if( p->zTick
5180: 65 74 55 75 69 64 20 29 20 67 6f 74 6f 20 6d 61  etUuid ) goto ma
5190: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
51a0: 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ror;.    if( p->
51b0: 6e 41 74 74 61 63 68 3e 30 20 29 20 67 6f 74 6f  nAttach>0 ) goto
51c0: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
51d0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
51e0: 70 2d 3e 7a 57 69 6b 69 20 29 20 67 6f 74 6f 20  p->zWiki ) goto 
51f0: 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f  manifest_syntax_
5200: 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  error;.    if( p
5210: 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 20 29 20 67  ->zWikiTitle ) g
5220: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
5230: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69  tax_error;.    i
5240: 66 28 20 70 2d 3e 7a 54 69 63 6b 65 74 55 75 69  f( p->zTicketUui
5250: 64 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  d ) goto manifes
5260: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
5270: 20 20 20 20 70 2d 3e 74 79 70 65 20 3d 20 43 46      p->type = CF
5280: 54 59 50 45 5f 4d 41 4e 49 46 45 53 54 3b 0a 20  TYPE_MANIFEST;. 
5290: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 43   }else if( p->nC
52a0: 43 68 69 6c 64 3e 30 20 29 7b 0a 20 20 20 20 69  Child>0 ){.    i
52b0: 66 28 20 70 2d 3e 72 44 61 74 65 3e 30 2e 30 20  f( p->rDate>0.0 
52c0: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
52d0: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
52e0: 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6d 6d 65 6e    if( p->zCommen
52f0: 74 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  t!=0 ) goto mani
5300: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
5310: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 55  r;.    if( p->zU
5320: 73 65 72 21 3d 30 20 29 20 67 6f 74 6f 20 6d 61  ser!=0 ) goto ma
5330: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
5340: 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ror;.    if( p->
5350: 6e 54 61 67 3e 30 20 29 20 67 6f 74 6f 20 6d 61  nTag>0 ) goto ma
5360: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
5370: 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ror;.    if( p->
5380: 6e 50 61 72 65 6e 74 3e 30 20 29 20 67 6f 74 6f  nParent>0 ) goto
5390: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
53a0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
53b0: 70 2d 3e 7a 52 65 70 6f 43 6b 73 75 6d 21 3d 30  p->zRepoCksum!=0
53c0: 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74   ) goto manifest
53d0: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
53e0: 20 20 20 69 66 28 20 70 2d 3e 6e 46 69 65 6c 64     if( p->nField
53f0: 3e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  >0 ) goto manife
5400: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
5410: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 54 69 63  .    if( p->zTic
5420: 6b 65 74 55 75 69 64 20 29 20 67 6f 74 6f 20 6d  ketUuid ) goto m
5430: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
5440: 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rror;.    if( p-
5450: 3e 6e 41 74 74 61 63 68 3e 30 20 29 20 67 6f 74  >nAttach>0 ) got
5460: 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61  o manifest_synta
5470: 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  x_error;.    if(
5480: 20 70 2d 3e 7a 57 69 6b 69 20 29 20 67 6f 74 6f   p->zWiki ) goto
5490: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
54a0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
54b0: 70 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 20 29 20  p->zWikiTitle ) 
54c0: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
54d0: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
54e0: 69 66 28 20 21 73 65 65 6e 5a 20 29 20 67 6f 74  if( !seenZ ) got
54f0: 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61  o manifest_synta
5500: 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 70 2d 3e  x_error;.    p->
5510: 74 79 70 65 20 3d 20 43 46 54 59 50 45 5f 43 4c  type = CFTYPE_CL
5520: 55 53 54 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  USTER;.  }else i
5530: 66 28 20 70 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  f( p->nField>0 )
5540: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 44 61  {.    if( p->rDa
5550: 74 65 3d 3d 30 2e 30 20 29 20 67 6f 74 6f 20 6d  te==0.0 ) goto m
5560: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
5570: 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rror;.    if( p-
5580: 3e 7a 52 65 70 6f 43 6b 73 75 6d 21 3d 30 20 29  >zRepoCksum!=0 )
5590: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
55a0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
55b0: 20 69 66 28 20 70 2d 3e 7a 57 69 6b 69 20 29 20   if( p->zWiki ) 
55c0: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
55d0: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
55e0: 69 66 28 20 70 2d 3e 7a 57 69 6b 69 54 69 74 6c  if( p->zWikiTitl
55f0: 65 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  e ) goto manifes
5600: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
5610: 20 20 20 20 69 66 28 20 70 2d 3e 6e 43 43 68 69      if( p->nCChi
5620: 6c 64 3e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  ld>0 ) goto mani
5630: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
5640: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54  r;.    if( p->nT
5650: 61 67 3e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  ag>0 ) goto mani
5660: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
5670: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 54  r;.    if( p->zT
5680: 69 63 6b 65 74 55 75 69 64 3d 3d 30 20 29 20 67  icketUuid==0 ) g
5690: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
56a0: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69  tax_error;.    i
56b0: 66 28 20 70 2d 3e 7a 55 73 65 72 3d 3d 30 20 29  f( p->zUser==0 )
56c0: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
56d0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
56e0: 20 69 66 28 20 21 73 65 65 6e 5a 20 29 20 67 6f   if( !seenZ ) go
56f0: 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74  to manifest_synt
5700: 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 70 2d  ax_error;.    p-
5710: 3e 74 79 70 65 20 3d 20 43 46 54 59 50 45 5f 54  >type = CFTYPE_T
5720: 49 43 4b 45 54 3b 0a 20 20 7d 65 6c 73 65 20 69  ICKET;.  }else i
5730: 66 28 20 70 2d 3e 7a 57 69 6b 69 21 3d 30 20 29  f( p->zWiki!=0 )
5740: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 44 61  {.    if( p->rDa
5750: 74 65 3d 3d 30 2e 30 20 29 20 67 6f 74 6f 20 6d  te==0.0 ) goto m
5760: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
5770: 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rror;.    if( p-
5780: 3e 7a 52 65 70 6f 43 6b 73 75 6d 21 3d 30 20 29  >zRepoCksum!=0 )
5790: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
57a0: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
57b0: 20 69 66 28 20 70 2d 3e 6e 43 43 68 69 6c 64 3e   if( p->nCChild>
57c0: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
57d0: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
57e0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 61 67 3e      if( p->nTag>
57f0: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
5800: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
5810: 20 20 20 20 69 66 28 20 70 2d 3e 7a 54 69 63 6b      if( p->zTick
5820: 65 74 55 75 69 64 21 3d 30 20 29 20 67 6f 74 6f  etUuid!=0 ) goto
5830: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
5840: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
5850: 70 2d 3e 7a 57 69 6b 69 54 69 74 6c 65 3d 3d 30  p->zWikiTitle==0
5860: 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74   ) goto manifest
5870: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
5880: 20 20 20 69 66 28 20 21 73 65 65 6e 5a 20 29 20     if( !seenZ ) 
5890: 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79  goto manifest_sy
58a0: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
58b0: 70 2d 3e 74 79 70 65 20 3d 20 43 46 54 59 50 45  p->type = CFTYPE
58c0: 5f 57 49 4b 49 3b 0a 20 20 7d 65 6c 73 65 20 69  _WIKI;.  }else i
58d0: 66 28 20 70 2d 3e 6e 54 61 67 3e 30 20 29 7b 0a  f( p->nTag>0 ){.
58e0: 20 20 20 20 69 66 28 20 70 2d 3e 72 44 61 74 65      if( p->rDate
58f0: 3c 3d 30 2e 30 20 29 20 67 6f 74 6f 20 6d 61 6e  <=0.0 ) goto man
5900: 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72  ifest_syntax_err
5910: 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  or;.    if( p->z
5920: 52 65 70 6f 43 6b 73 75 6d 21 3d 30 20 29 20 67  RepoCksum!=0 ) g
5930: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
5940: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69  tax_error;.    i
5950: 66 28 20 70 2d 3e 6e 50 61 72 65 6e 74 3e 30 20  f( p->nParent>0 
5960: 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f  ) goto manifest_
5970: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
5980: 20 20 69 66 28 20 70 2d 3e 6e 41 74 74 61 63 68    if( p->nAttach
5990: 3e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65  >0 ) goto manife
59a0: 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  st_syntax_error;
59b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 69 65  .    if( p->nFie
59c0: 6c 64 3e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69  ld>0 ) goto mani
59d0: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
59e0: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 57  r;.    if( p->zW
59f0: 69 6b 69 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  iki ) goto manif
5a00: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
5a10: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 57 69  ;.    if( p->zWi
5a20: 6b 69 54 69 74 6c 65 20 29 20 67 6f 74 6f 20 6d  kiTitle ) goto m
5a30: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
5a40: 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rror;.    if( p-
5a50: 3e 7a 54 69 63 6b 65 74 55 75 69 64 20 29 20 67  >zTicketUuid ) g
5a60: 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e  oto manifest_syn
5a70: 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69  tax_error;.    i
5a80: 66 28 20 21 73 65 65 6e 5a 20 29 20 67 6f 74 6f  f( !seenZ ) goto
5a90: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
5aa0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 70 2d 3e 74  _error;.    p->t
5ab0: 79 70 65 20 3d 20 43 46 54 59 50 45 5f 43 4f 4e  ype = CFTYPE_CON
5ac0: 54 52 4f 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROL;.  }else{. 
5ad0: 20 20 20 69 66 28 20 70 2d 3e 6e 43 43 68 69 6c     if( p->nCChil
5ae0: 64 3e 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66  d>0 ) goto manif
5af0: 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  est_syntax_error
5b00: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 44 61  ;.    if( p->rDa
5b10: 74 65 3d 3d 30 2e 30 20 29 20 67 6f 74 6f 20 6d  te==0.0 ) goto m
5b20: 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65  anifest_syntax_e
5b30: 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rror;.    if( p-
5b40: 3e 6e 46 69 65 6c 64 3e 30 20 29 20 67 6f 74 6f  >nField>0 ) goto
5b50: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
5b60: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
5b70: 70 2d 3e 7a 54 69 63 6b 65 74 55 75 69 64 20 29  p->zTicketUuid )
5b80: 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74 5f 73   goto manifest_s
5b90: 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
5ba0: 20 69 66 28 20 70 2d 3e 6e 41 74 74 61 63 68 3e   if( p->nAttach>
5bb0: 30 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73  0 ) goto manifes
5bc0: 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  t_syntax_error;.
5bd0: 20 20 20 20 69 66 28 20 70 2d 3e 7a 57 69 6b 69      if( p->zWiki
5be0: 20 29 20 67 6f 74 6f 20 6d 61 6e 69 66 65 73 74   ) goto manifest
5bf0: 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
5c00: 20 20 20 69 66 28 20 70 2d 3e 7a 57 69 6b 69 54     if( p->zWikiT
5c10: 69 74 6c 65 20 29 20 67 6f 74 6f 20 6d 61 6e 69  itle ) goto mani
5c20: 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72 72 6f  fest_syntax_erro
5c30: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 54  r;.    if( p->zT
5c40: 69 63 6b 65 74 55 75 69 64 20 29 20 67 6f 74 6f  icketUuid ) goto
5c50: 20 6d 61 6e 69 66 65 73 74 5f 73 79 6e 74 61 78   manifest_syntax
5c60: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 70 2d 3e 74  _error;.    p->t
5c70: 79 70 65 20 3d 20 43 46 54 59 50 45 5f 4d 41 4e  ype = CFTYPE_MAN
5c80: 49 46 45 53 54 3b 0a 20 20 7d 0a 20 20 20 20 0a  IFEST;.  }.    .
5c90: 20 20 6d 64 35 73 75 6d 5f 69 6e 69 74 28 29 3b    md5sum_init();
5ca0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 0a 6d 61  .  return 1;..ma
5cb0: 6e 69 66 65 73 74 5f 73 79 6e 74 61 78 5f 65 72  nifest_syntax_er
5cc0: 72 6f 72 3a 0a 20 20 2f 2a 66 70 72 69 6e 74 66  ror:.  /*fprintf
5cd0: 28 73 74 64 65 72 72 2c 20 22 4d 61 6e 69 66 65  (stderr, "Manife
5ce0: 73 74 20 65 72 72 6f 72 20 6f 6e 20 6c 69 6e 65  st error on line
5cf0: 20 25 69 5c 6e 22 2c 20 6c 69 6e 65 4e 6f 29 3b   %i\n", lineNo);
5d00: 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 2a  fflush(stderr);*
5d10: 2f 0a 20 20 6d 64 35 73 75 6d 5f 69 6e 69 74 28  /.  md5sum_init(
5d20: 29 3b 0a 20 20 6d 61 6e 69 66 65 73 74 5f 63 6c  );.  manifest_cl
5d30: 65 61 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ear(p);.  return
5d40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
5d50: 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   a single entry 
5d60: 74 6f 20 74 68 65 20 6d 6c 69 6e 6b 20 74 61 62  to the mlink tab
5d70: 6c 65 2e 20 20 41 6c 73 6f 20 61 64 64 20 74 68  le.  Also add th
5d80: 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 0a 2a 2a  e filename to.**
5d90: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 61   the filename ta
5da0: 62 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ble if it is not
5db0: 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
5dc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
5dd0: 64 64 5f 6f 6e 65 5f 6d 6c 69 6e 6b 28 0a 20 20  dd_one_mlink(.  
5de0: 69 6e 74 20 6d 69 64 2c 20 20 20 20 20 20 20 20  int mid,        
5df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e00: 20 72 65 63 6f 72 64 20 49 44 20 6f 66 20 74 68   record ID of th
5e10: 65 20 6d 61 6e 69 66 65 73 74 20 2a 2f 0a 20 20  e manifest */.  
5e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f  const char *zFro
5e30: 6d 55 75 69 64 2c 20 20 20 20 2f 2a 20 55 55 49  mUuid,    /* UUI
5e40: 44 20 66 6f 72 20 74 68 65 20 6d 6c 69 6e 6b 2e  D for the mlink.
5e50: 70 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20 63  pid field */.  c
5e60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 55 75  onst char *zToUu
5e70: 69 64 2c 20 20 20 20 20 20 2f 2a 20 55 55 49 44  id,      /* UUID
5e80: 20 66 6f 72 20 74 68 65 20 6d 6c 69 6e 6b 2e 66   for the mlink.f
5e90: 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20 63 6f  id field */.  co
5ea0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
5eb0: 61 6d 65 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame     /* Filen
5ec0: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
5ed0: 66 6e 69 64 2c 20 70 69 64 2c 20 66 69 64 3b 0a  fnid, pid, fid;.
5ee0: 0a 20 20 66 6e 69 64 20 3d 20 64 62 5f 69 6e 74  .  fnid = db_int
5ef0: 28 30 2c 20 22 53 45 4c 45 43 54 20 66 6e 69 64  (0, "SELECT fnid
5f00: 20 46 52 4f 4d 20 66 69 6c 65 6e 61 6d 65 20 57   FROM filename W
5f10: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
5f20: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
5f30: 20 66 6e 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20   fnid==0 ){.    
5f40: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 49  db_multi_exec("I
5f50: 4e 53 45 52 54 20 49 4e 54 4f 20 66 69 6c 65 6e  NSERT INTO filen
5f60: 61 6d 65 28 6e 61 6d 65 29 20 56 41 4c 55 45 53  ame(name) VALUES
5f70: 28 25 51 29 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  (%Q)", zFilename
5f80: 29 3b 0a 20 20 20 20 66 6e 69 64 20 3d 20 64 62  );.    fnid = db
5f90: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5fa0: 69 64 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  id();.  }.  if( 
5fb0: 7a 46 72 6f 6d 55 75 69 64 3d 3d 30 20 29 7b 0a  zFromUuid==0 ){.
5fc0: 20 20 20 20 70 69 64 20 3d 20 30 3b 0a 20 20 7d      pid = 0;.  }
5fd0: 65 6c 73 65 7b 0a 20 20 20 20 70 69 64 20 3d 20  else{.    pid = 
5fe0: 75 75 69 64 5f 74 6f 5f 72 69 64 28 7a 46 72 6f  uuid_to_rid(zFro
5ff0: 6d 55 75 69 64 2c 20 31 29 3b 0a 20 20 7d 0a 20  mUuid, 1);.  }. 
6000: 20 69 66 28 20 7a 54 6f 55 75 69 64 3d 3d 30 20   if( zToUuid==0 
6010: 29 7b 0a 20 20 20 20 66 69 64 20 3d 20 30 3b 0a  ){.    fid = 0;.
6020: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 69 64    }else{.    fid
6030: 20 3d 20 75 75 69 64 5f 74 6f 5f 72 69 64 28 7a   = uuid_to_rid(z
6040: 54 6f 55 75 69 64 2c 20 31 29 3b 0a 20 20 7d 0a  ToUuid, 1);.  }.
6050: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
6060: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
6070: 4f 20 6d 6c 69 6e 6b 28 6d 69 64 2c 70 69 64 2c  O mlink(mid,pid,
6080: 66 69 64 2c 66 6e 69 64 29 22 0a 20 20 20 20 22  fid,fnid)".    "
6090: 56 41 4c 55 45 53 28 25 64 2c 25 64 2c 25 64 2c  VALUES(%d,%d,%d,
60a0: 25 64 29 22 2c 20 6d 69 64 2c 20 70 69 64 2c 20  %d)", mid, pid, 
60b0: 66 69 64 2c 20 66 6e 69 64 0a 20 20 29 3b 0a 20  fid, fnid.  );. 
60c0: 20 69 66 28 20 70 69 64 20 26 26 20 66 69 64 20   if( pid && fid 
60d0: 29 7b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f 64  ){.    content_d
60e0: 65 6c 74 69 66 79 28 70 69 64 2c 20 66 69 64 2c  eltify(pid, fid,
60f0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
6100: 2a 20 41 64 64 20 6d 6c 69 6e 6b 20 74 61 62 6c  * Add mlink tabl
6110: 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
6120: 61 74 65 64 20 77 69 74 68 20 6d 61 6e 69 66 65  ated with manife
6130: 73 74 20 63 69 64 2e 0a 2a 2a 20 54 68 65 72 65  st cid..** There
6140: 20 69 73 20 61 6e 20 6d 6c 69 6e 6b 20 65 6e 74   is an mlink ent
6150: 72 79 20 66 6f 72 20 65 76 65 72 79 20 66 69 6c  ry for every fil
6160: 65 20 74 68 61 74 20 63 68 61 6e 67 65 64 20 67  e that changed g
6170: 6f 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 70 69 64  oing.** from pid
6180: 20 74 6f 20 63 69 64 2e 0a 2a 2a 0a 2a 2a 20 44   to cid..**.** D
6190: 65 6c 65 74 65 64 20 66 69 6c 65 73 20 68 61 76  eleted files hav
61a0: 65 20 6d 6c 69 6e 6b 2e 66 69 64 3d 30 2e 0a 2a  e mlink.fid=0..*
61b0: 2a 20 41 64 64 65 64 20 66 69 6c 65 73 20 68 61  * Added files ha
61c0: 76 65 20 6d 6c 69 6e 6b 2e 70 69 64 3d 30 2e 0a  ve mlink.pid=0..
61d0: 2a 2a 20 45 64 69 74 65 64 20 66 69 6c 65 73 20  ** Edited files 
61e0: 68 61 76 65 20 62 6f 74 68 20 6d 6c 69 6e 6b 2e  have both mlink.
61f0: 70 69 64 21 3d 30 20 61 6e 64 20 6d 6c 69 6e 6b  pid!=0 and mlink
6200: 2e 66 69 64 21 3d 30 0a 2a 2f 0a 73 74 61 74 69  .fid!=0.*/.stati
6210: 63 20 76 6f 69 64 20 61 64 64 5f 6d 6c 69 6e 6b  c void add_mlink
6220: 28 69 6e 74 20 70 69 64 2c 20 4d 61 6e 69 66 65  (int pid, Manife
6230: 73 74 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  st *pParent, int
6240: 20 63 69 64 2c 20 4d 61 6e 69 66 65 73 74 20 2a   cid, Manifest *
6250: 70 43 68 69 6c 64 29 7b 0a 20 20 4d 61 6e 69 66  pChild){.  Manif
6260: 65 73 74 20 6f 74 68 65 72 3b 0a 20 20 42 6c 6f  est other;.  Blo
6270: 62 20 6f 74 68 65 72 43 6f 6e 74 65 6e 74 3b 0a  b otherContent;.
6280: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 69    int i, j;..  i
6290: 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45  f( db_exists("SE
62a0: 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d 6c 69 6e  LECT 1 FROM mlin
62b0: 6b 20 57 48 45 52 45 20 6d 69 64 3d 25 64 22 2c  k WHERE mid=%d",
62c0: 20 63 69 64 29 20 29 7b 0a 20 20 20 20 72 65 74   cid) ){.    ret
62d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
62e0: 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c  t( pParent==0 ||
62f0: 20 70 43 68 69 6c 64 3d 3d 30 20 29 3b 0a 20 20   pChild==0 );.  
6300: 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
6310: 7b 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20  {.    pParent = 
6320: 26 6f 74 68 65 72 3b 0a 20 20 20 20 63 6f 6e 74  &other;.    cont
6330: 65 6e 74 5f 67 65 74 28 70 69 64 2c 20 26 6f 74  ent_get(pid, &ot
6340: 68 65 72 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d  herContent);.  }
6350: 65 6c 73 65 7b 0a 20 20 20 20 70 43 68 69 6c 64  else{.    pChild
6360: 20 3d 20 26 6f 74 68 65 72 3b 0a 20 20 20 20 63   = &other;.    c
6370: 6f 6e 74 65 6e 74 5f 67 65 74 28 63 69 64 2c 20  ontent_get(cid, 
6380: 26 6f 74 68 65 72 43 6f 6e 74 65 6e 74 29 3b 0a  &otherContent);.
6390: 20 20 7d 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73    }.  if( blob_s
63a0: 69 7a 65 28 26 6f 74 68 65 72 43 6f 6e 74 65 6e  ize(&otherConten
63b0: 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  t)==0 ) return;.
63c0: 20 20 69 66 28 20 6d 61 6e 69 66 65 73 74 5f 70    if( manifest_p
63d0: 61 72 73 65 28 26 6f 74 68 65 72 2c 20 26 6f 74  arse(&other, &ot
63e0: 68 65 72 43 6f 6e 74 65 6e 74 29 3d 3d 30 20 29  herContent)==0 )
63f0: 20 72 65 74 75 72 6e 3b 0a 20 20 63 6f 6e 74 65   return;.  conte
6400: 6e 74 5f 64 65 6c 74 69 66 79 28 70 69 64 2c 20  nt_deltify(pid, 
6410: 63 69 64 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  cid, 0);.  for(i
6420: 3d 6a 3d 30 3b 20 69 3c 70 50 61 72 65 6e 74 2d  =j=0; i<pParent-
6430: 3e 6e 46 69 6c 65 20 26 26 20 6a 3c 70 43 68 69  >nFile && j<pChi
6440: 6c 64 2d 3e 6e 46 69 6c 65 3b 20 29 7b 0a 20 20  ld->nFile; ){.  
6450: 20 20 69 6e 74 20 63 20 3d 20 73 74 72 63 6d 70    int c = strcmp
6460: 28 70 50 61 72 65 6e 74 2d 3e 61 46 69 6c 65 5b  (pParent->aFile[
6470: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 43 68 69 6c 64  i].zName, pChild
6480: 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a 4e 61 6d 65  ->aFile[j].zName
6490: 29 3b 0a 20 20 20 20 69 66 28 20 63 3c 30 20 29  );.    if( c<0 )
64a0: 7b 0a 20 20 20 20 20 20 61 64 64 5f 6f 6e 65 5f  {.      add_one_
64b0: 6d 6c 69 6e 6b 28 63 69 64 2c 20 70 50 61 72 65  mlink(cid, pPare
64c0: 6e 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a 55 75  nt->aFile[i].zUu
64d0: 69 64 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e  id, 0, pParent->
64e0: 61 46 69 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aFile[i].zName);
64f0: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
6500: 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
6510: 0a 20 20 20 20 20 20 61 64 64 5f 6f 6e 65 5f 6d  .      add_one_m
6520: 6c 69 6e 6b 28 63 69 64 2c 20 30 2c 20 70 43 68  link(cid, 0, pCh
6530: 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a 55  ild->aFile[j].zU
6540: 75 69 64 2c 20 70 43 68 69 6c 64 2d 3e 61 46 69  uid, pChild->aFi
6550: 6c 65 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  le[j].zName);.  
6560: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 65 6c      j++;.    }el
6570: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  se{.      if( st
6580: 72 63 6d 70 28 70 50 61 72 65 6e 74 2d 3e 61 46  rcmp(pParent->aF
6590: 69 6c 65 5b 69 5d 2e 7a 55 75 69 64 2c 20 70 43  ile[i].zUuid, pC
65a0: 68 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a  hild->aFile[j].z
65b0: 55 75 69 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  Uuid)!=0 ){.    
65c0: 20 20 61 64 64 5f 6f 6e 65 5f 6d 6c 69 6e 6b 28    add_one_mlink(
65d0: 63 69 64 2c 20 70 50 61 72 65 6e 74 2d 3e 61 46  cid, pParent->aF
65e0: 69 6c 65 5b 69 5d 2e 7a 55 75 69 64 2c 20 70 43  ile[i].zUuid, pC
65f0: 68 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a  hild->aFile[j].z
6600: 55 75 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  Uuid, .         
6610: 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c             pChil
6620: 64 2d 3e 61 46 69 6c 65 5b 6a 5d 2e 7a 4e 61 6d  d->aFile[j].zNam
6630: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
6640: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 6a 2b 2b    i++;.      j++
6650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
6660: 69 6c 65 28 20 69 3c 70 50 61 72 65 6e 74 2d 3e  ile( i<pParent->
6670: 6e 46 69 6c 65 20 29 7b 0a 20 20 20 20 61 64 64  nFile ){.    add
6680: 5f 6f 6e 65 5f 6d 6c 69 6e 6b 28 63 69 64 2c 20  _one_mlink(cid, 
6690: 70 50 61 72 65 6e 74 2d 3e 61 46 69 6c 65 5b 69  pParent->aFile[i
66a0: 5d 2e 7a 55 75 69 64 2c 20 30 2c 20 70 50 61 72  ].zUuid, 0, pPar
66b0: 65 6e 74 2d 3e 61 46 69 6c 65 5b 69 5d 2e 7a 4e  ent->aFile[i].zN
66c0: 61 6d 65 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20  ame);.    i++;. 
66d0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 6a 3c 70 43   }.  while( j<pC
66e0: 68 69 6c 64 2d 3e 6e 46 69 6c 65 20 29 7b 0a 20  hild->nFile ){. 
66f0: 20 20 20 61 64 64 5f 6f 6e 65 5f 6d 6c 69 6e 6b     add_one_mlink
6700: 28 63 69 64 2c 20 30 2c 20 70 43 68 69 6c 64 2d  (cid, 0, pChild-
6710: 3e 61 46 69 6c 65 5b 6a 5d 2e 7a 55 75 69 64 2c  >aFile[j].zUuid,
6720: 20 70 43 68 69 6c 64 2d 3e 61 46 69 6c 65 5b 6a   pChild->aFile[j
6730: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 6a 2b  ].zName);.    j+
6740: 2b 3b 0a 20 20 7d 0a 20 20 6d 61 6e 69 66 65 73  +;.  }.  manifes
6750: 74 5f 63 6c 65 61 72 28 26 6f 74 68 65 72 29 3b  t_clear(&other);
6760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 61  .}../*.** Scan a
6770: 72 74 69 66 61 63 74 20 72 69 64 2f 70 43 6f 6e  rtifact rid/pCon
6780: 74 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  tent to see if i
6790: 74 20 69 73 20 61 20 63 6f 6e 74 72 6f 6c 20 61  t is a control a
67a0: 72 74 69 66 61 63 74 20 6f 66 0a 2a 2a 20 61 6e  rtifact of.** an
67b0: 79 20 6b 65 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  y key:.**.**    
67c0: 20 20 2a 20 20 4d 61 6e 69 66 65 73 74 0a 2a 2a    *  Manifest.**
67d0: 20 20 20 20 20 20 2a 20 20 43 6f 6e 74 72 6f 6c        *  Control
67e0: 0a 2a 2a 20 20 20 20 20 20 2a 20 20 57 69 6b 69  .**      *  Wiki
67f0: 20 50 61 67 65 0a 2a 2a 20 20 20 20 20 20 2a 20   Page.**      * 
6800: 20 54 69 63 6b 65 74 20 43 68 61 6e 67 65 0a 2a   Ticket Change.*
6810: 2a 20 20 20 20 20 20 2a 20 20 43 6c 75 73 74 65  *      *  Cluste
6820: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  r.**.** If the i
6830: 6e 70 75 74 20 69 73 20 61 20 63 6f 6e 74 72 6f  nput is a contro
6840: 6c 20 61 72 74 69 66 61 63 74 2c 20 74 68 65 6e  l artifact, then
6850: 20 6d 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74   make appropriat
6860: 65 20 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20  e entries.** in 
6870: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 74 61  the auxiliary ta
6880: 62 6c 65 73 20 6f 66 20 74 68 65 20 64 61 74 61  bles of the data
6890: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  base in order to
68a0: 20 63 72 6f 73 73 6c 69 6e 6b 20 74 68 65 0a 2a   crosslink the.*
68b0: 2a 20 61 72 74 69 66 61 63 74 2e 0a 2a 2a 0a 2a  * artifact..**.*
68c0: 2a 20 49 66 20 67 6c 6f 62 61 6c 20 76 61 72 69  * If global vari
68d0: 61 62 6c 65 20 67 2e 78 6c 69 6e 6b 43 6c 75 73  able g.xlinkClus
68e0: 74 65 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2c  terOnly is true,
68f0: 20 74 68 65 6e 20 69 67 6e 6f 72 65 20 61 6c 6c   then ignore all
6900: 20 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 61 72 74   .** control art
6910: 69 66 61 63 74 73 20 6f 74 68 65 72 20 74 68 61  ifacts other tha
6920: 6e 20 63 6c 75 73 74 65 72 73 2e 0a 2a 2a 0a 2a  n clusters..**.*
6930: 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 6e 6f 74  * Historical not
6940: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
6950: 20 6f 72 69 67 69 6e 61 6c 20 70 72 6f 63 65 73   original proces
6960: 73 65 64 20 6d 61 6e 69 66 65 73 74 73 20 6f 6e  sed manifests on
6970: 6c 79 2e 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e  ly..** Processin
6980: 67 20 66 6f 72 20 6f 74 68 65 72 20 63 6f 6e 74  g for other cont
6990: 72 6f 6c 20 61 72 74 69 66 61 63 74 73 20 77 61  rol artifacts wa
69a0: 73 20 61 64 64 65 64 20 6c 61 74 65 72 2e 20 20  s added later.  
69b0: 54 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  The name.** of t
69c0: 68 65 20 72 6f 75 74 69 6e 65 2c 20 22 6d 61 6e  he routine, "man
69d0: 69 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 22  ifest_crosslink"
69e0: 2c 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  , and the name o
69f0: 66 20 74 68 69 73 20 73 6f 75 72 63 65 0a 2a 2a  f this source.**
6a00: 20 66 69 6c 65 2c 20 69 73 20 61 20 6c 65 67 61   file, is a lega
6a10: 63 79 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e  cy of its origin
6a20: 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 6d  al use..*/.int m
6a30: 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e  anifest_crosslin
6a40: 6b 28 69 6e 74 20 72 69 64 2c 20 42 6c 6f 62 20  k(int rid, Blob 
6a50: 2a 70 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e  *pContent){.  in
6a60: 74 20 69 3b 0a 20 20 4d 61 6e 69 66 65 73 74 20  t i;.  Manifest 
6a70: 6d 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  m;.  Stmt q;.  i
6a80: 6e 74 20 70 61 72 65 6e 74 69 64 20 3d 20 30 3b  nt parentid = 0;
6a90: 0a 0a 20 20 69 66 28 20 6d 61 6e 69 66 65 73 74  ..  if( manifest
6aa0: 5f 70 61 72 73 65 28 26 6d 2c 20 70 43 6f 6e 74  _parse(&m, pCont
6ab0: 65 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ent)==0 ){.    r
6ac0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
6ad0: 66 28 20 67 2e 78 6c 69 6e 6b 43 6c 75 73 74 65  f( g.xlinkCluste
6ae0: 72 4f 6e 6c 79 20 26 26 20 6d 2e 74 79 70 65 21  rOnly && m.type!
6af0: 3d 43 46 54 59 50 45 5f 43 4c 55 53 54 45 52 20  =CFTYPE_CLUSTER 
6b00: 29 7b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f  ){.    manifest_
6b10: 63 6c 65 61 72 28 26 6d 29 3b 0a 20 20 20 20 72  clear(&m);.    r
6b20: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 64  eturn 0;.  }.  d
6b30: 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  b_begin_transact
6b40: 69 6f 6e 28 29 3b 0a 20 20 69 66 28 20 6d 2e 74  ion();.  if( m.t
6b50: 79 70 65 3d 3d 43 46 54 59 50 45 5f 4d 41 4e 49  ype==CFTYPE_MANI
6b60: 46 45 53 54 20 29 7b 0a 20 20 20 20 69 66 28 20  FEST ){.    if( 
6b70: 21 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45  !db_exists("SELE
6b80: 43 54 20 31 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20  CT 1 FROM mlink 
6b90: 57 48 45 52 45 20 6d 69 64 3d 25 64 22 2c 20 72  WHERE mid=%d", r
6ba0: 69 64 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  id) ){.      for
6bb0: 28 69 3d 30 3b 20 69 3c 6d 2e 6e 50 61 72 65 6e  (i=0; i<m.nParen
6bc0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
6bd0: 20 69 6e 74 20 70 69 64 20 3d 20 75 75 69 64 5f   int pid = uuid_
6be0: 74 6f 5f 72 69 64 28 6d 2e 61 7a 50 61 72 65 6e  to_rid(m.azParen
6bf0: 74 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20  t[i], 1);.      
6c00: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
6c10: 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
6c20: 45 20 49 4e 54 4f 20 70 6c 69 6e 6b 28 70 69 64  E INTO plink(pid
6c30: 2c 20 63 69 64 2c 20 69 73 70 72 69 6d 2c 20 6d  , cid, isprim, m
6c40: 74 69 6d 65 29 22 0a 20 20 20 20 20 20 20 20 20  time)".         
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41               "VA
6c60: 4c 55 45 53 28 25 64 2c 20 25 64 2c 20 25 64 2c  LUES(%d, %d, %d,
6c70: 20 25 2e 31 37 67 29 22 2c 20 70 69 64 2c 20 72   %.17g)", pid, r
6c80: 69 64 2c 20 69 3d 3d 30 2c 20 6d 2e 72 44 61 74  id, i==0, m.rDat
6c90: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
6ca0: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i==0 ){.        
6cb0: 20 20 61 64 64 5f 6d 6c 69 6e 6b 28 70 69 64 2c    add_mlink(pid,
6cc0: 20 30 2c 20 72 69 64 2c 20 26 6d 29 3b 0a 20 20   0, rid, &m);.  
6cd0: 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 69 64          parentid
6ce0: 20 3d 20 70 69 64 3b 0a 20 20 20 20 20 20 20 20   = pid;.        
6cf0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6d00: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
6d10: 53 45 4c 45 43 54 20 63 69 64 20 46 52 4f 4d 20  SELECT cid FROM 
6d20: 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d  plink WHERE pid=
6d30: 25 64 20 41 4e 44 20 69 73 70 72 69 6d 22 2c 20  %d AND isprim", 
6d40: 72 69 64 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  rid);.      whil
6d50: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
6d60: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
6d70: 20 20 20 20 20 20 69 6e 74 20 63 69 64 20 3d 20        int cid = 
6d80: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
6d90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 64  , 0);.        ad
6da0: 64 5f 6d 6c 69 6e 6b 28 72 69 64 2c 20 26 6d 2c  d_mlink(rid, &m,
6db0: 20 63 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20   cid, 0);.      
6dc0: 7d 0a 20 20 20 20 20 20 64 62 5f 66 69 6e 61 6c  }.      db_final
6dd0: 69 7a 65 28 26 71 29 3b 0a 20 20 20 20 20 20 64  ize(&q);.      d
6de0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
6df0: 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49        "REPLACE I
6e00: 4e 54 4f 20 65 76 65 6e 74 28 74 79 70 65 2c 6d  NTO event(type,m
6e10: 74 69 6d 65 2c 6f 62 6a 69 64 2c 75 73 65 72 2c  time,objid,user,
6e20: 63 6f 6d 6d 65 6e 74 2c 22 0a 20 20 20 20 20 20  comment,".      
6e30: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
6e40: 20 20 20 20 20 62 67 63 6f 6c 6f 72 2c 62 72 62       bgcolor,brb
6e50: 67 63 6f 6c 6f 72 2c 65 75 73 65 72 2c 65 63 6f  gcolor,euser,eco
6e60: 6d 6d 65 6e 74 29 22 0a 20 20 20 20 20 20 20 20  mment)".        
6e70: 22 56 41 4c 55 45 53 28 27 63 69 27 2c 25 2e 31  "VALUES('ci',%.1
6e80: 37 67 2c 25 64 2c 25 51 2c 25 51 2c 22 0a 20 20  7g,%d,%Q,%Q,".  
6e90: 20 20 20 20 20 20 22 20 28 53 45 4c 45 43 54 20        " (SELECT 
6ea0: 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72  value FROM tagxr
6eb0: 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25  ef WHERE tagid=%
6ec0: 64 20 41 4e 44 20 72 69 64 3d 25 64 20 41 4e 44  d AND rid=%d AND
6ed0: 20 74 61 67 74 79 70 65 3d 31 29 2c 22 0a 20 20   tagtype=1),".  
6ee0: 20 20 20 20 20 20 22 28 53 45 4c 45 43 54 20 76        "(SELECT v
6ef0: 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72 65  alue FROM tagxre
6f00: 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25 64  f WHERE tagid=%d
6f10: 20 41 4e 44 20 72 69 64 3d 25 64 20 41 4e 44 20   AND rid=%d AND 
6f20: 74 61 67 74 79 70 65 21 3d 31 29 2c 22 0a 20 20  tagtype!=1),".  
6f30: 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54        "  (SELECT
6f40: 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78   value FROM tagx
6f50: 72 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d  ref WHERE tagid=
6f60: 25 64 20 41 4e 44 20 72 69 64 3d 25 64 29 2c 22  %d AND rid=%d),"
6f70: 0a 20 20 20 20 20 20 20 20 22 20 20 28 53 45 4c  .        "  (SEL
6f80: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74  ECT value FROM t
6f90: 61 67 78 72 65 66 20 57 48 45 52 45 20 74 61 67  agxref WHERE tag
6fa0: 69 64 3d 25 64 20 41 4e 44 20 72 69 64 3d 25 64  id=%d AND rid=%d
6fb0: 29 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 6d 2e  ));",.        m.
6fc0: 72 44 61 74 65 2c 20 72 69 64 2c 20 6d 2e 7a 55  rDate, rid, m.zU
6fd0: 73 65 72 2c 20 6d 2e 7a 43 6f 6d 6d 65 6e 74 2c  ser, m.zComment,
6fe0: 20 0a 20 20 20 20 20 20 20 20 54 41 47 5f 42 47   .        TAG_BG
6ff0: 43 4f 4c 4f 52 2c 20 72 69 64 2c 0a 20 20 20 20  COLOR, rid,.    
7000: 20 20 20 20 54 41 47 5f 42 47 43 4f 4c 4f 52 2c      TAG_BGCOLOR,
7010: 20 72 69 64 2c 0a 20 20 20 20 20 20 20 20 54 41   rid,.        TA
7020: 47 5f 55 53 45 52 2c 20 72 69 64 2c 0a 20 20 20  G_USER, rid,.   
7030: 20 20 20 20 20 54 41 47 5f 43 4f 4d 4d 45 4e 54       TAG_COMMENT
7040: 2c 20 72 69 64 0a 20 20 20 20 20 20 29 3b 0a 20  , rid.      );. 
7050: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
7060: 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 43 4c  .type==CFTYPE_CL
7070: 55 53 54 45 52 20 29 7b 0a 20 20 20 20 74 61 67  USTER ){.    tag
7080: 5f 69 6e 73 65 72 74 28 22 63 6c 75 73 74 65 72  _insert("cluster
7090: 22 2c 20 31 2c 20 30 2c 20 72 69 64 2c 20 6d 2e  ", 1, 0, rid, m.
70a0: 72 44 61 74 65 2c 20 72 69 64 29 3b 0a 20 20 20  rDate, rid);.   
70b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 2e 6e 43   for(i=0; i<m.nC
70c0: 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Child; i++){.   
70d0: 20 20 20 69 6e 74 20 6d 69 64 3b 0a 20 20 20 20     int mid;.    
70e0: 20 20 6d 69 64 20 3d 20 75 75 69 64 5f 74 6f 5f    mid = uuid_to_
70f0: 72 69 64 28 6d 2e 61 7a 43 43 68 69 6c 64 5b 69  rid(m.azCChild[i
7100: 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 1);.      if(
7110: 20 6d 69 64 3e 30 20 29 7b 0a 20 20 20 20 20 20   mid>0 ){.      
7120: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
7130: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 75 6e 63  "DELETE FROM unc
7140: 6c 75 73 74 65 72 65 64 20 57 48 45 52 45 20 72  lustered WHERE r
7150: 69 64 3d 25 64 22 2c 20 6d 69 64 29 3b 0a 20 20  id=%d", mid);.  
7160: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7170: 20 20 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46    if( m.type==CF
7180: 54 59 50 45 5f 43 4f 4e 54 52 4f 4c 20 7c 7c 20  TYPE_CONTROL || 
7190: 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 4d  m.type==CFTYPE_M
71a0: 41 4e 49 46 45 53 54 20 29 7b 0a 20 20 20 20 66  ANIFEST ){.    f
71b0: 6f 72 28 69 3d 30 3b 20 69 3c 6d 2e 6e 54 61 67  or(i=0; i<m.nTag
71c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
71d0: 74 20 74 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  t tid;.      int
71e0: 20 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28   type;.      if(
71f0: 20 6d 2e 61 54 61 67 5b 69 5d 2e 7a 55 75 69 64   m.aTag[i].zUuid
7200: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 69 64 20   ){.        tid 
7210: 3d 20 75 75 69 64 5f 74 6f 5f 72 69 64 28 6d 2e  = uuid_to_rid(m.
7220: 61 54 61 67 5b 69 5d 2e 7a 55 75 69 64 2c 20 31  aTag[i].zUuid, 1
7230: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7240: 20 20 20 20 20 20 20 20 74 69 64 20 3d 20 72 69          tid = ri
7250: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
7260: 20 69 66 28 20 74 69 64 20 29 7b 0a 20 20 20 20   if( tid ){.    
7270: 20 20 20 20 73 77 69 74 63 68 28 20 6d 2e 61 54      switch( m.aT
7280: 61 67 5b 69 5d 2e 7a 4e 61 6d 65 5b 30 5d 20 29  ag[i].zName[0] )
7290: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
72a0: 20 27 2b 27 3a 20 20 74 79 70 65 20 3d 20 31 3b   '+':  type = 1;
72b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
72c0: 20 20 63 61 73 65 20 27 2a 27 3a 20 20 74 79 70    case '*':  typ
72d0: 65 20 3d 20 32 3b 20 62 72 65 61 6b 3b 0a 20 20  e = 2; break;.  
72e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 2d 27          case '-'
72f0: 3a 20 20 74 79 70 65 20 3d 20 30 3b 20 62 72 65  :  type = 0; bre
7300: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  ak;.          de
7310: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
7320: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
7330: 22 75 6e 6b 6e 6f 77 6e 20 74 61 67 20 74 79 70  "unknown tag typ
7340: 65 20 69 6e 20 6d 61 6e 69 66 65 73 74 3a 20 25  e in manifest: %
7350: 73 22 2c 20 6d 2e 61 54 61 67 29 3b 0a 20 20 20  s", m.aTag);.   
7360: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7370: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
7380: 20 20 20 20 20 74 61 67 5f 69 6e 73 65 72 74 28       tag_insert(
7390: 26 6d 2e 61 54 61 67 5b 69 5d 2e 7a 4e 61 6d 65  &m.aTag[i].zName
73a0: 5b 31 5d 2c 20 74 79 70 65 2c 20 6d 2e 61 54 61  [1], type, m.aTa
73b0: 67 5b 69 5d 2e 7a 56 61 6c 75 65 2c 20 0a 20 20  g[i].zValue, .  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 72 69 64 2c 20 6d 2e 72 44 61 74 65 2c 20 74   rid, m.rDate, t
73e0: 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
73f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 72 65 6e   }.    if( paren
7400: 74 69 64 20 29 7b 0a 20 20 20 20 20 20 74 61 67  tid ){.      tag
7410: 5f 70 72 6f 70 61 67 61 74 65 5f 61 6c 6c 28 70  _propagate_all(p
7420: 61 72 65 6e 74 69 64 29 3b 0a 20 20 20 20 7d 0a  arentid);.    }.
7430: 20 20 7d 0a 20 20 69 66 28 20 6d 2e 74 79 70 65    }.  if( m.type
7440: 3d 3d 43 46 54 59 50 45 5f 57 49 4b 49 20 29 7b  ==CFTYPE_WIKI ){
7450: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 67 20  .    char *zTag 
7460: 3d 20 6d 70 72 69 6e 74 66 28 22 77 69 6b 69 2d  = mprintf("wiki-
7470: 25 73 22 2c 20 6d 2e 7a 57 69 6b 69 54 69 74 6c  %s", m.zWikiTitl
7480: 65 29 3b 0a 20 20 20 20 69 6e 74 20 74 61 67 69  e);.    int tagi
7490: 64 20 3d 20 74 61 67 5f 66 69 6e 64 69 64 28 7a  d = tag_findid(z
74a0: 54 61 67 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74  Tag, 1);.    int
74b0: 20 70 72 69 6f 72 3b 0a 20 20 20 20 63 68 61 72   prior;.    char
74c0: 20 2a 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20   *zComment;.    
74d0: 74 61 67 5f 69 6e 73 65 72 74 28 7a 54 61 67 2c  tag_insert(zTag,
74e0: 20 31 2c 20 30 2c 20 72 69 64 2c 20 6d 2e 72 44   1, 0, rid, m.rD
74f0: 61 74 65 2c 20 72 69 64 29 3b 0a 20 20 20 20 66  ate, rid);.    f
7500: 72 65 65 28 7a 54 61 67 29 3b 0a 20 20 20 20 70  ree(zTag);.    p
7510: 72 69 6f 72 20 3d 20 64 62 5f 69 6e 74 28 30 2c  rior = db_int(0,
7520: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72  .      "SELECT r
7530: 69 64 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22  id FROM tagxref"
7540: 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74  .      " WHERE t
7550: 61 67 69 64 3d 25 64 20 41 4e 44 20 6d 74 69 6d  agid=%d AND mtim
7560: 65 3c 25 2e 31 37 67 22 0a 20 20 20 20 20 20 22  e<%.17g".      "
7570: 20 4f 52 44 45 52 20 42 59 20 6d 74 69 6d 65 20   ORDER BY mtime 
7580: 44 45 53 43 22 2c 0a 20 20 20 20 20 20 74 61 67  DESC",.      tag
7590: 69 64 2c 20 6d 2e 72 44 61 74 65 0a 20 20 20 20  id, m.rDate.    
75a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 72 69 6f 72  );.    if( prior
75b0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 65 6e   ){.      conten
75c0: 74 5f 64 65 6c 74 69 66 79 28 70 72 69 6f 72 2c  t_deltify(prior,
75d0: 20 72 69 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a   rid, 0);.    }.
75e0: 20 20 20 20 7a 43 6f 6d 6d 65 6e 74 20 3d 20 6d      zComment = m
75f0: 70 72 69 6e 74 66 28 22 43 68 61 6e 67 65 73 20  printf("Changes 
7600: 74 6f 20 77 69 6b 69 20 70 61 67 65 20 5b 25 68  to wiki page [%h
7610: 5d 22 2c 20 6d 2e 7a 57 69 6b 69 54 69 74 6c 65  ]", m.zWikiTitle
7620: 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  );.    db_multi_
7630: 65 78 65 63 28 0a 20 20 20 20 20 20 22 52 45 50  exec(.      "REP
7640: 4c 41 43 45 20 49 4e 54 4f 20 65 76 65 6e 74 28  LACE INTO event(
7650: 74 79 70 65 2c 6d 74 69 6d 65 2c 6f 62 6a 69 64  type,mtime,objid
7660: 2c 75 73 65 72 2c 63 6f 6d 6d 65 6e 74 2c 22 0a  ,user,comment,".
7670: 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20        "         
7680: 20 20 20 20 20 20 20 20 20 62 67 63 6f 6c 6f 72           bgcolor
7690: 2c 62 72 62 67 63 6f 6c 6f 72 2c 65 75 73 65 72  ,brbgcolor,euser
76a0: 2c 65 63 6f 6d 6d 65 6e 74 29 22 0a 20 20 20 20  ,ecomment)".    
76b0: 20 20 22 56 41 4c 55 45 53 28 27 77 27 2c 25 2e    "VALUES('w',%.
76c0: 31 37 67 2c 25 64 2c 25 51 2c 25 51 2c 22 0a 20  17g,%d,%Q,%Q,". 
76d0: 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20       "  (SELECT 
76e0: 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72  value FROM tagxr
76f0: 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25  ef WHERE tagid=%
7700: 64 20 41 4e 44 20 72 69 64 3d 25 64 20 41 4e 44  d AND rid=%d AND
7710: 20 74 61 67 74 79 70 65 3d 31 29 2c 22 0a 20 20   tagtype=1),".  
7720: 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 76      "  (SELECT v
7730: 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72 65  alue FROM tagxre
7740: 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25 64  f WHERE tagid=%d
7750: 20 41 4e 44 20 72 69 64 3d 25 64 20 41 4e 44 20   AND rid=%d AND 
7760: 74 61 67 74 79 70 65 21 3d 31 29 2c 22 0a 20 20  tagtype!=1),".  
7770: 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 76      "  (SELECT v
7780: 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72 65  alue FROM tagxre
7790: 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25 64  f WHERE tagid=%d
77a0: 20 41 4e 44 20 72 69 64 3d 25 64 29 2c 22 0a 20   AND rid=%d),". 
77b0: 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20       "  (SELECT 
77c0: 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72  value FROM tagxr
77d0: 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25  ef WHERE tagid=%
77e0: 64 20 41 4e 44 20 72 69 64 3d 25 64 29 29 3b 22  d AND rid=%d));"
77f0: 2c 0a 20 20 20 20 20 20 6d 2e 72 44 61 74 65 2c  ,.      m.rDate,
7800: 20 72 69 64 2c 20 6d 2e 7a 55 73 65 72 2c 20 7a   rid, m.zUser, z
7810: 43 6f 6d 6d 65 6e 74 2c 20 0a 20 20 20 20 20 20  Comment, .      
7820: 54 41 47 5f 42 47 43 4f 4c 4f 52 2c 20 72 69 64  TAG_BGCOLOR, rid
7830: 2c 0a 20 20 20 20 20 20 54 41 47 5f 42 47 43 4f  ,.      TAG_BGCO
7840: 4c 4f 52 2c 20 72 69 64 2c 0a 20 20 20 20 20 20  LOR, rid,.      
7850: 54 41 47 5f 55 53 45 52 2c 20 72 69 64 2c 0a 20  TAG_USER, rid,. 
7860: 20 20 20 20 20 54 41 47 5f 43 4f 4d 4d 45 4e 54       TAG_COMMENT
7870: 2c 20 72 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  , rid.    );.   
7880: 20 66 72 65 65 28 7a 43 6f 6d 6d 65 6e 74 29 3b   free(zComment);
7890: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 2e 74 79 70  .  }.  if( m.typ
78a0: 65 3d 3d 43 46 54 59 50 45 5f 54 49 43 4b 45 54  e==CFTYPE_TICKET
78b0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   ){.    char *zT
78c0: 61 67 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6d  ag;.    Blob com
78d0: 6d 65 6e 74 3b 0a 0a 20 20 20 20 74 69 63 6b 65  ment;..    ticke
78e0: 74 5f 69 6e 73 65 72 74 28 26 6d 2c 20 31 2c 20  t_insert(&m, 1, 
78f0: 31 29 3b 0a 20 20 20 20 7a 54 61 67 20 3d 20 6d  1);.    zTag = m
7900: 70 72 69 6e 74 66 28 22 74 6b 74 2d 25 73 22 2c  printf("tkt-%s",
7910: 20 6d 2e 7a 54 69 63 6b 65 74 55 75 69 64 29 3b   m.zTicketUuid);
7920: 0a 20 20 20 20 74 61 67 5f 69 6e 73 65 72 74 28  .    tag_insert(
7930: 7a 54 61 67 2c 20 31 2c 20 30 2c 20 72 69 64 2c  zTag, 1, 0, rid,
7940: 20 6d 2e 72 44 61 74 65 2c 20 72 69 64 29 3b 0a   m.rDate, rid);.
7950: 20 20 20 20 66 72 65 65 28 7a 54 61 67 29 3b 0a      free(zTag);.
7960: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63      blob_zero(&c
7970: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  omment);.    if(
7980: 20 6d 2e 6e 46 69 65 6c 64 3d 3d 31 20 29 7b 0a   m.nField==1 ){.
7990: 20 20 20 20 20 20 69 66 28 20 6d 2e 61 46 69 65        if( m.aFie
79a0: 6c 64 5b 30 5d 2e 7a 4e 61 6d 65 5b 30 5d 3d 3d  ld[0].zName[0]==
79b0: 27 2b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 62  '+' ){.        b
79c0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 6f 6d  lob_appendf(&com
79d0: 6d 65 6e 74 2c 20 0a 20 20 20 20 20 20 20 20 20  ment, .         
79e0: 20 22 41 70 70 65 6e 64 65 64 20 74 6f 20 25 68   "Appended to %h
79f0: 20 69 6e 20 74 69 63 6b 65 74 20 5b 25 2e 31 30   in ticket [%.10
7a00: 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 26  s]",.          &
7a10: 6d 2e 61 46 69 65 6c 64 5b 30 5d 2e 7a 4e 61 6d  m.aField[0].zNam
7a20: 65 5b 31 5d 2c 20 6d 2e 7a 54 69 63 6b 65 74 55  e[1], m.zTicketU
7a30: 75 69 64 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  uid.        );. 
7a40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7a50: 74 72 6c 65 6e 28 6d 2e 61 46 69 65 6c 64 5b 30  trlen(m.aField[0
7a60: 5d 2e 7a 56 61 6c 75 65 29 3c 34 30 20 29 7b 0a  ].zValue)<40 ){.
7a70: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
7a80: 65 6e 64 66 28 26 63 6f 6d 6d 65 6e 74 2c 0a 20  endf(&comment,. 
7a90: 20 20 20 20 20 20 20 20 20 22 43 68 61 6e 67 65           "Change
7aa0: 64 20 25 68 20 74 6f 20 5c 22 25 68 5c 22 20 69  d %h to \"%h\" i
7ab0: 6e 20 74 69 63 6b 65 74 20 5b 25 2e 31 30 73 5d  n ticket [%.10s]
7ac0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6d 2e 61  ",.          m.a
7ad0: 46 69 65 6c 64 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  Field[0].zName, 
7ae0: 6d 2e 61 46 69 65 6c 64 5b 30 5d 2e 7a 56 61 6c  m.aField[0].zVal
7af0: 75 65 2c 20 6d 2e 7a 54 69 63 6b 65 74 55 75 69  ue, m.zTicketUui
7b00: 64 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  d.        );.   
7b10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b20: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
7b30: 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  comment,.       
7b40: 20 20 20 22 43 68 61 6e 67 65 64 20 25 68 20 69     "Changed %h i
7b50: 6e 20 74 69 63 6b 65 74 20 5b 25 2e 31 30 73 5d  n ticket [%.10s]
7b60: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6d 2e 61  ",.          m.a
7b70: 46 69 65 6c 64 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  Field[0].zName, 
7b80: 6d 2e 7a 54 69 63 6b 65 74 55 75 69 64 0a 20 20  m.zTicketUuid.  
7b90: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
7ba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  .    }else{.#if 
7bb0: 30 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  0.      int i;. 
7bc0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
7bd0: 2a 7a 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  *z;.      const 
7be0: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 20 22  char *zSep = " "
7bf0: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
7c00: 65 6e 64 66 28 26 63 6f 6d 6d 65 6e 74 2c 20 22  endf(&comment, "
7c10: 25 64 20 63 68 61 6e 67 65 73 20 74 6f 20 74 69  %d changes to ti
7c20: 63 6b 65 74 20 5b 25 2e 31 30 73 5d 3a 22 2c 0a  cket [%.10s]:",.
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 6d 2e 6e 46              m.nF
7c50: 69 65 6c 64 2c 20 6d 2e 7a 54 69 63 6b 65 74 55  ield, m.zTicketU
7c60: 75 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  uid);.      for(
7c70: 69 3d 30 3b 20 69 3c 6d 2e 6e 46 69 65 6c 64 3b  i=0; i<m.nField;
7c80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
7c90: 20 3d 20 6d 2e 61 46 69 65 6c 64 5b 69 5d 2e 7a   = m.aField[i].z
7ca0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
7cb0: 28 20 7a 5b 30 5d 3d 3d 27 2b 27 20 29 20 7a 2b  ( z[0]=='+' ) z+
7cc0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  +;.        blob_
7cd0: 61 70 70 65 6e 64 66 28 26 63 6f 6d 6d 65 6e 74  appendf(&comment
7ce0: 2c 20 22 25 73 25 68 22 2c 20 7a 53 65 70 2c 20  , "%s%h", zSep, 
7cf0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  z);.        zSep
7d00: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d   = ", ";.      }
7d10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 6c  .#endif.      bl
7d20: 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 6f 6d 6d  ob_appendf(&comm
7d30: 65 6e 74 2c 20 22 45 64 69 74 73 20 74 6f 20 74  ent, "Edits to t
7d40: 69 63 6b 65 74 20 5b 25 2e 31 30 73 5d 22 2c 20  icket [%.10s]", 
7d50: 6d 2e 7a 54 69 63 6b 65 74 55 75 69 64 29 3b 0a  m.zTicketUuid);.
7d60: 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c      }.    db_mul
7d70: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 22  ti_exec(.      "
7d80: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 65 76 65  REPLACE INTO eve
7d90: 6e 74 28 74 79 70 65 2c 6d 74 69 6d 65 2c 6f 62  nt(type,mtime,ob
7da0: 6a 69 64 2c 75 73 65 72 2c 63 6f 6d 6d 65 6e 74  jid,user,comment
7db0: 29 22 0a 20 20 20 20 20 20 22 56 41 4c 55 45 53  )".      "VALUES
7dc0: 28 27 74 27 2c 25 2e 31 37 67 2c 25 64 2c 25 51  ('t',%.17g,%d,%Q
7dd0: 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 6d 2e 72  ,%Q)",.      m.r
7de0: 44 61 74 65 2c 20 72 69 64 2c 20 6d 2e 7a 55 73  Date, rid, m.zUs
7df0: 65 72 2c 20 62 6c 6f 62 5f 73 74 72 28 26 63 6f  er, blob_str(&co
7e00: 6d 6d 65 6e 74 29 0a 20 20 20 20 29 3b 0a 20 20  mment).    );.  
7e10: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f    blob_reset(&co
7e20: 6d 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 64 62  mment);.  }.  db
7e30: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
7e40: 28 30 29 3b 0a 20 20 6d 61 6e 69 66 65 73 74 5f  (0);.  manifest_
7e50: 63 6c 65 61 72 28 26 6d 29 3b 0a 20 20 72 65 74  clear(&m);.  ret
7e60: 75 72 6e 20 31 3b 0a 7d 0a                       urn 1;.}.