Hex Artifact Content
Not logged in

Artifact 882972137d800a25c13d2ba8488edd0bc9da3a1a:

File src/vfile.c part of check-in [76f169fca6] - Detect when the check-out contains missing files and filesystem objects that ought to be files but are not. Issue reasonable warnings. by drh on 2009-12-18 00:29:51. Also file src/vfile.c part of check-in [76bc05d739] - merge with trunk by btheado on 2009-12-30 20:33:59.

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 50 72 6f 63 65 64 75 72 65  .**.** Procedure
0370: 73 20 66 6f 72 20 6d 61 6e 61 67 69 6e 67 20 74  s for managing t
0380: 68 65 20 56 46 49 4c 45 20 74 61 62 6c 65 2e 0a  he VFILE table..
0390: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e  */.#include "con
03a0: 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  fig.h".#include 
03b0: 22 76 66 69 6c 65 2e 68 22 0a 23 69 6e 63 6c 75  "vfile.h".#inclu
03c0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
03d0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
03e0: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 64  s.h>.#include <d
03f0: 69 72 65 6e 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  irent.h>../*.** 
0400: 47 69 76 65 6e 20 61 20 55 55 49 44 2c 20 72 65  Given a UUID, re
0410: 74 75 72 6e 20 74 68 65 20 63 6f 72 72 65 73 70  turn the corresp
0420: 6f 6e 64 69 6e 67 20 72 65 63 6f 72 64 20 49 44  onding record ID
0430: 2e 20 20 49 66 20 74 68 65 20 55 55 49 44 0a 2a  .  If the UUID.*
0440: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
0450: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  , then return 0.
0460: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20  .**.** For this 
0470: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 55 55 49  routine, the UUI
0480: 44 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 2e  D must be exact.
0490: 20 20 46 6f 72 20 61 20 6d 61 74 63 68 20 61 67    For a match ag
04a0: 61 69 6e 73 74 0a 2a 2a 20 75 73 65 72 20 69 6e  ainst.** user in
04b0: 70 75 74 20 77 69 74 68 20 6d 69 78 65 64 20 63  put with mixed c
04c0: 61 73 65 2c 20 75 73 65 20 72 65 73 6f 6c 76 65  ase, use resolve
04d0: 5f 75 75 69 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  _uuid()..**.** I
04e0: 66 20 74 68 65 20 55 55 49 44 20 69 73 20 6e 6f  f the UUID is no
04f0: 74 20 66 6f 75 6e 64 20 61 6e 64 20 70 68 61 6e  t found and phan
0500: 74 6f 6d 69 7a 65 20 69 73 20 31 2c 20 74 68 65  tomize is 1, the
0510: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  n attempt to .**
0520: 20 63 72 65 61 74 65 20 61 20 70 68 61 6e 74 6f   create a phanto
0530: 6d 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 69 6e 74  m record..*/.int
0540: 20 75 75 69 64 5f 74 6f 5f 72 69 64 28 63 6f 6e   uuid_to_rid(con
0550: 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 2c 20  st char *zUuid, 
0560: 69 6e 74 20 70 68 61 6e 74 6f 6d 69 7a 65 29 7b  int phantomize){
0570: 0a 20 20 69 6e 74 20 72 69 64 2c 20 73 7a 3b 0a  .  int rid, sz;.
0580: 20 20 73 74 61 74 69 63 20 53 74 6d 74 20 71 3b    static Stmt q;
0590: 0a 20 20 63 68 61 72 20 7a 5b 55 55 49 44 5f 53  .  char z[UUID_S
05a0: 49 5a 45 2b 31 5d 3b 0a 20 20 0a 20 20 73 7a 20  IZE+1];.  .  sz 
05b0: 3d 20 73 74 72 6c 65 6e 28 7a 55 75 69 64 29 3b  = strlen(zUuid);
05c0: 0a 20 20 69 66 28 20 73 7a 21 3d 55 55 49 44 5f  .  if( sz!=UUID_
05d0: 53 49 5a 45 20 7c 7c 20 21 76 61 6c 69 64 61 74  SIZE || !validat
05e0: 65 31 36 28 7a 55 75 69 64 2c 20 73 7a 29 20 29  e16(zUuid, sz) )
05f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
0600: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 7a 2c 20    }.  strcpy(z, 
0610: 7a 55 75 69 64 29 3b 0a 20 20 63 61 6e 6f 6e 69  zUuid);.  canoni
0620: 63 61 6c 31 36 28 7a 2c 20 73 7a 29 3b 0a 20 20  cal16(z, sz);.  
0630: 64 62 5f 73 74 61 74 69 63 5f 70 72 65 70 61 72  db_static_prepar
0640: 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 72 69  e(&q, "SELECT ri
0650: 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  d FROM blob WHER
0660: 45 20 75 75 69 64 3d 3a 75 75 69 64 22 29 3b 0a  E uuid=:uuid");.
0670: 20 20 64 62 5f 62 69 6e 64 5f 74 65 78 74 28 26    db_bind_text(&
0680: 71 2c 20 22 3a 75 75 69 64 22 2c 20 7a 29 3b 0a  q, ":uuid", z);.
0690: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
06a0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
06b0: 0a 20 20 20 20 72 69 64 20 3d 20 64 62 5f 63 6f  .    rid = db_co
06c0: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b  lumn_int(&q, 0);
06d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 69  .  }else{.    ri
06e0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 64 62 5f  d = 0;.  }.  db_
06f0: 72 65 73 65 74 28 26 71 29 3b 0a 20 20 69 66 28  reset(&q);.  if(
0700: 20 72 69 64 3d 3d 30 20 26 26 20 70 68 61 6e 74   rid==0 && phant
0710: 6f 6d 69 7a 65 20 29 7b 0a 20 20 20 20 72 69 64  omize ){.    rid
0720: 20 3d 20 63 6f 6e 74 65 6e 74 5f 6e 65 77 28 7a   = content_new(z
0730: 55 75 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Uuid);.  }.  ret
0740: 75 72 6e 20 72 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn rid;.}../*.*
0750: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6e  * Verify that an
0760: 20 6f 62 6a 65 63 74 20 69 73 20 6e 6f 74 20 61   object is not a
0770: 20 70 68 61 6e 74 6f 6d 2e 20 20 49 66 20 74 68   phantom.  If th
0780: 65 20 6f 62 6a 65 63 74 20 69 73 0a 2a 2a 20 61  e object is.** a
0790: 20 70 68 61 6e 74 6f 6d 2c 20 6f 75 74 70 75 74   phantom, output
07a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
07b0: 65 20 61 6e 64 20 71 75 69 63 6b 2e 0a 2a 2f 0a  e and quick..*/.
07c0: 76 6f 69 64 20 76 66 69 6c 65 5f 76 65 72 69 66  void vfile_verif
07d0: 79 5f 6e 6f 74 5f 70 68 61 6e 74 6f 6d 28 69 6e  y_not_phantom(in
07e0: 74 20 72 69 64 2c 20 63 6f 6e 73 74 20 63 68 61  t rid, const cha
07f0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
0800: 20 69 66 28 20 64 62 5f 69 6e 74 28 2d 31 2c 20   if( db_int(-1, 
0810: 22 53 45 4c 45 43 54 20 73 69 7a 65 20 46 52 4f  "SELECT size FRO
0820: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
0830: 3d 25 64 22 2c 20 72 69 64 29 3c 30 20 29 7b 0a  =%d", rid)<0 ){.
0840: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
0850: 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  e ){.      fossi
0860: 6c 5f 66 61 74 61 6c 28 22 63 6f 6e 74 65 6e 74  l_fatal("content
0870: 20 6d 69 73 73 69 6e 67 20 66 6f 72 20 25 73 22   missing for %s"
0880: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
0890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
08a0: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
08b0: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
08c0: 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57  uuid FROM blob W
08d0: 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69  HERE rid=%d", ri
08e0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 55  d);.      if( zU
08f0: 75 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 66  uid ){.        f
0900: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 6f 6e  ossil_fatal("con
0910: 74 65 6e 74 20 6d 69 73 73 69 6e 67 20 66 6f 72  tent missing for
0920: 20 5b 25 2e 31 30 73 5d 22 2c 20 7a 55 75 69 64   [%.10s]", zUuid
0930: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
0940: 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70          fossil_p
0950: 61 6e 69 63 28 22 62 61 64 20 6f 62 6a 65 63 74  anic("bad object
0960: 20 69 64 3a 20 25 64 22 2c 20 72 69 64 29 3b 0a   id: %d", rid);.
0970: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64  }.}../*.** Build
0990: 20 61 20 63 61 74 61 6c 6f 67 20 6f 66 20 61 6c   a catalog of al
09a0: 6c 20 66 69 6c 65 73 20 69 6e 20 61 20 62 61 73  l files in a bas
09b0: 65 6c 69 6e 65 2e 0a 2a 2a 20 57 65 20 73 63 61  eline..** We sca
09c0: 6e 20 74 68 65 20 62 61 73 65 6c 69 6e 65 20 66  n the baseline f
09d0: 69 6c 65 20 66 6f 72 20 6c 69 6e 65 73 20 6f 66  ile for lines of
09e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
09f0: 20 20 20 20 20 46 20 4e 41 4d 45 20 55 55 49 44       F NAME UUID
0a00: 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 73 75 63 68  .**.** Each such
0a10: 20 6c 69 6e 65 20 6d 61 6b 65 73 20 61 6e 20 65   line makes an e
0a20: 6e 74 72 79 20 69 6e 20 74 68 65 20 56 46 49 4c  ntry in the VFIL
0a30: 45 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  E table..*/.void
0a40: 20 76 66 69 6c 65 5f 62 75 69 6c 64 28 69 6e 74   vfile_build(int
0a50: 20 76 69 64 2c 20 42 6c 6f 62 20 2a 70 29 7b 0a   vid, Blob *p){.
0a60: 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 63 68 61    int rid;.  cha
0a70: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 55 75 69 64  r *zName, *zUuid
0a80: 3b 0a 20 20 53 74 6d 74 20 69 6e 73 3b 0a 20 20  ;.  Stmt ins;.  
0a90: 42 6c 6f 62 20 6c 69 6e 65 2c 20 74 6f 6b 65 6e  Blob line, token
0aa0: 2c 20 6e 61 6d 65 2c 20 75 75 69 64 3b 0a 20 20  , name, uuid;.  
0ab0: 69 6e 74 20 73 65 65 6e 48 65 61 64 65 72 20 3d  int seenHeader =
0ac0: 20 30 3b 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74   0;.  db_begin_t
0ad0: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
0ae0: 76 66 69 6c 65 5f 76 65 72 69 66 79 5f 6e 6f 74  vfile_verify_not
0af0: 5f 70 68 61 6e 74 6f 6d 28 76 69 64 2c 20 30 29  _phantom(vid, 0)
0b00: 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  ;.  db_multi_exe
0b10: 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 76  c("DELETE FROM v
0b20: 66 69 6c 65 20 57 48 45 52 45 20 76 69 64 3d 25  file WHERE vid=%
0b30: 64 22 2c 20 76 69 64 29 3b 0a 20 20 64 62 5f 70  d", vid);.  db_p
0b40: 72 65 70 61 72 65 28 26 69 6e 73 2c 0a 20 20 20  repare(&ins,.   
0b50: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 66   "INSERT INTO vf
0b60: 69 6c 65 28 76 69 64 2c 72 69 64 2c 6d 72 69 64  ile(vid,rid,mrid
0b70: 2c 70 61 74 68 6e 61 6d 65 29 20 22 0a 20 20 20  ,pathname) ".   
0b80: 20 22 20 56 41 4c 55 45 53 28 3a 76 69 64 2c 3a   " VALUES(:vid,:
0b90: 69 64 2c 3a 69 64 2c 3a 6e 61 6d 65 29 22 29 3b  id,:id,:name)");
0ba0: 0a 20 20 64 62 5f 62 69 6e 64 5f 69 6e 74 28 26  .  db_bind_int(&
0bb0: 69 6e 73 2c 20 22 3a 76 69 64 22 2c 20 76 69 64  ins, ":vid", vid
0bc0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 62 6c 6f 62  );.  while( blob
0bd0: 5f 6c 69 6e 65 28 70 2c 20 26 6c 69 6e 65 29 20  _line(p, &line) 
0be0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
0bf0: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 69   blob_buffer(&li
0c00: 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  ne);.    if( z[0
0c10: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
0c20: 69 66 28 20 73 65 65 6e 48 65 61 64 65 72 20 29  if( seenHeader )
0c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 68   break;.      wh
0c40: 69 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e 65 28 70  ile( blob_line(p
0c50: 2c 20 26 6c 69 6e 65 29 3e 32 20 29 7b 7d 0a 20  , &line)>2 ){}. 
0c60: 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 6c 69       if( blob_li
0c70: 6e 65 28 70 2c 20 26 6c 69 6e 65 29 3d 3d 30 20  ne(p, &line)==0 
0c80: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
0c90: 20 20 20 73 65 65 6e 48 65 61 64 65 72 20 3d 20     seenHeader = 
0ca0: 31 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  1;.    if( z[0]!
0cb0: 3d 27 46 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 20  ='F' || z[1]!=' 
0cc0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
0cd0: 20 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69    blob_token(&li
0ce0: 6e 65 2c 20 26 74 6f 6b 65 6e 29 3b 20 20 2f 2a  ne, &token);  /*
0cf0: 20 53 6b 69 70 20 74 68 65 20 22 46 22 20 74 6f   Skip the "F" to
0d00: 6b 65 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ken */.    if( b
0d10: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c  lob_token(&line,
0d20: 20 26 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65   &name)==0 ) bre
0d30: 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 6c 6f 62  ak;.    if( blob
0d40: 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c 20 26 75  _token(&line, &u
0d50: 75 69 64 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  uid)==0 ) break;
0d60: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 62 6c 6f  .    zName = blo
0d70: 62 5f 73 74 72 28 26 6e 61 6d 65 29 3b 0a 20 20  b_str(&name);.  
0d80: 20 20 64 65 66 6f 73 73 69 6c 69 7a 65 28 7a 4e    defossilize(zN
0d90: 61 6d 65 29 3b 0a 20 20 20 20 7a 55 75 69 64 20  ame);.    zUuid 
0da0: 3d 20 62 6c 6f 62 5f 73 74 72 28 26 75 75 69 64  = blob_str(&uuid
0db0: 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 75 75 69  );.    rid = uui
0dc0: 64 5f 74 6f 5f 72 69 64 28 7a 55 75 69 64 2c 20  d_to_rid(zUuid, 
0dd0: 30 29 3b 0a 20 20 20 20 76 66 69 6c 65 5f 76 65  0);.    vfile_ve
0de0: 72 69 66 79 5f 6e 6f 74 5f 70 68 61 6e 74 6f 6d  rify_not_phantom
0df0: 28 72 69 64 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  (rid, zName);.  
0e00: 20 20 69 66 28 20 72 69 64 3e 30 20 26 26 20 66    if( rid>0 && f
0e10: 69 6c 65 5f 69 73 5f 73 69 6d 70 6c 65 5f 70 61  ile_is_simple_pa
0e20: 74 68 6e 61 6d 65 28 7a 4e 61 6d 65 29 20 29 7b  thname(zName) ){
0e30: 0a 20 20 20 20 20 20 64 62 5f 62 69 6e 64 5f 69  .      db_bind_i
0e40: 6e 74 28 26 69 6e 73 2c 20 22 3a 69 64 22 2c 20  nt(&ins, ":id", 
0e50: 72 69 64 29 3b 0a 20 20 20 20 20 20 64 62 5f 62  rid);.      db_b
0e60: 69 6e 64 5f 74 65 78 74 28 26 69 6e 73 2c 20 22  ind_text(&ins, "
0e70: 3a 6e 61 6d 65 22 2c 20 7a 4e 61 6d 65 29 3b 0a  :name", zName);.
0e80: 20 20 20 20 20 20 64 62 5f 73 74 65 70 28 26 69        db_step(&i
0e90: 6e 73 29 3b 0a 20 20 20 20 20 20 64 62 5f 72 65  ns);.      db_re
0ea0: 73 65 74 28 26 69 6e 73 29 3b 0a 20 20 20 20 7d  set(&ins);.    }
0eb0: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  .    blob_reset(
0ec0: 26 6e 61 6d 65 29 3b 0a 20 20 20 20 62 6c 6f 62  &name);.    blob
0ed0: 5f 72 65 73 65 74 28 26 75 75 69 64 29 3b 0a 20  _reset(&uuid);. 
0ee0: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
0ef0: 28 26 69 6e 73 29 3b 0a 20 20 64 62 5f 65 6e 64  (&ins);.  db_end
0f00: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b  _transaction(0);
0f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
0f20: 74 68 65 20 66 69 6c 65 20 73 69 67 6e 61 74 75  the file signatu
0f30: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 69  re of the disk i
0f40: 6d 61 67 65 20 66 6f 72 20 65 76 65 72 79 20 56  mage for every V
0f50: 46 49 4c 45 20 6f 66 20 76 69 64 2e 0a 2a 2a 0a  FILE of vid..**.
0f60: 2a 2a 20 53 65 74 20 74 68 65 20 56 46 49 4c 45  ** Set the VFILE
0f70: 2e 43 48 4e 47 45 44 20 66 69 65 6c 64 20 6f 6e  .CHNGED field on
0f80: 20 65 76 65 72 79 20 66 69 6c 65 20 74 68 61 74   every file that
0f90: 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 41   has changed.  A
0fa0: 6c 73 6f 20 0a 2a 2a 20 73 65 74 20 56 46 49 4c  lso .** set VFIL
0fb0: 45 2e 43 48 4e 47 45 44 20 6f 6e 20 65 76 65 72  E.CHNGED on ever
0fc0: 79 20 66 6f 6c 64 65 72 20 74 68 61 74 20 63 6f  y folder that co
0fd0: 6e 74 61 69 6e 73 20 61 20 66 69 6c 65 20 6f 72  ntains a file or
0fe0: 20 66 6f 6c 64 65 72 20 0a 2a 2a 20 74 68 61 74   folder .** that
0ff0: 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 2a 2a   has changed..**
1000: 0a 2a 2a 20 49 66 20 56 46 49 4c 45 2e 44 45 4c  .** If VFILE.DEL
1010: 45 54 45 44 20 69 73 20 6e 75 6c 6c 20 6f 72 20  ETED is null or 
1020: 69 66 20 56 46 49 4c 45 2e 52 49 44 20 69 73 20  if VFILE.RID is 
1030: 7a 65 72 6f 2c 20 74 68 65 6e 20 77 65 20 63 61  zero, then we ca
1040: 6e 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 65 20  n assume.** the 
1050: 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
1060: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1070: 74 68 65 20 63 68 65 63 6b 20 74 68 65 20 6f 6e  the check the on
1080: 2d 64 69 73 6b 20 69 6d 61 67 65 2e 0a 2a 2f 0a  -disk image..*/.
1090: 76 6f 69 64 20 76 66 69 6c 65 5f 63 68 65 63 6b  void vfile_check
10a0: 5f 73 69 67 6e 61 74 75 72 65 28 69 6e 74 20 76  _signature(int v
10b0: 69 64 2c 20 69 6e 74 20 6e 6f 74 46 69 6c 65 49  id, int notFileI
10c0: 73 46 61 74 61 6c 29 7b 0a 20 20 69 6e 74 20 6e  sFatal){.  int n
10d0: 45 72 72 20 3d 20 30 3b 0a 20 20 53 74 6d 74 20  Err = 0;.  Stmt 
10e0: 71 3b 0a 20 20 42 6c 6f 62 20 66 69 6c 65 43 6b  q;.  Blob fileCk
10f0: 73 75 6d 2c 20 6f 72 69 67 43 6b 73 75 6d 3b 0a  sum, origCksum;.
1100: 20 20 69 6e 74 20 63 68 65 63 6b 4d 74 69 6d 65    int checkMtime
1110: 20 3d 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61   = db_get_boolea
1120: 6e 28 22 6d 74 69 6d 65 2d 63 68 61 6e 67 65 73  n("mtime-changes
1130: 22 2c 20 30 29 3b 0a 0a 20 20 64 62 5f 62 65 67  ", 0);..  db_beg
1140: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  in_transaction()
1150: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
1160: 71 2c 20 22 53 45 4c 45 43 54 20 69 64 2c 20 25  q, "SELECT id, %
1170: 51 20 7c 7c 20 70 61 74 68 6e 61 6d 65 2c 22 0a  Q || pathname,".
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 22 20 20 20 20 20 20 20 76 66 69 6c 65 2e 6d   "       vfile.m
11a0: 72 69 64 2c 20 64 65 6c 65 74 65 64 2c 20 63 68  rid, deleted, ch
11b0: 6e 67 65 64 2c 20 75 75 69 64 2c 20 6d 74 69 6d  nged, uuid, mtim
11c0: 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
11d0: 20 20 20 20 22 20 20 46 52 4f 4d 20 76 66 69 6c      "  FROM vfil
11e0: 65 20 4c 45 46 54 20 4a 4f 49 4e 20 62 6c 6f 62  e LEFT JOIN blob
11f0: 20 4f 4e 20 76 66 69 6c 65 2e 6d 72 69 64 3d 62   ON vfile.mrid=b
1200: 6c 6f 62 2e 72 69 64 22 0a 20 20 20 20 20 20 20  lob.rid".       
1210: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
1220: 45 20 76 69 64 3d 25 64 20 22 2c 20 67 2e 7a 4c  E vid=%d ", g.zL
1230: 6f 63 61 6c 52 6f 6f 74 2c 20 76 69 64 29 3b 0a  ocalRoot, vid);.
1240: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
1250: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
1260: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 2c 20   ){.    int id, 
1270: 72 69 64 2c 20 69 73 44 65 6c 65 74 65 64 3b 0a  rid, isDeleted;.
1280: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1290: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63  zName;.    int c
12a0: 68 6e 67 65 64 20 3d 20 30 3b 0a 20 20 20 20 69  hnged = 0;.    i
12b0: 6e 74 20 6f 6c 64 43 68 6e 67 65 64 3b 0a 20 20  nt oldChnged;.  
12c0: 20 20 69 36 34 20 6f 6c 64 4d 74 69 6d 65 3b 0a    i64 oldMtime;.
12d0: 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 4d      i64 currentM
12e0: 74 69 6d 65 3b 0a 0a 20 20 20 20 69 64 20 3d 20  time;..    id = 
12f0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
1300: 2c 20 30 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  , 0);.    zName 
1310: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
1320: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 72 69 64  (&q, 1);.    rid
1330: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
1340: 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 69 73 44  (&q, 2);.    isD
1350: 65 6c 65 74 65 64 20 3d 20 64 62 5f 63 6f 6c 75  eleted = db_colu
1360: 6d 6e 5f 69 6e 74 28 26 71 2c 20 33 29 3b 0a 20  mn_int(&q, 3);. 
1370: 20 20 20 6f 6c 64 43 68 6e 67 65 64 20 3d 20 64     oldChnged = d
1380: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
1390: 20 34 29 3b 0a 20 20 20 20 6f 6c 64 4d 74 69 6d   4);.    oldMtim
13a0: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  e = db_column_in
13b0: 74 36 34 28 26 71 2c 20 36 29 3b 0a 20 20 20 20  t64(&q, 6);.    
13c0: 69 66 28 20 21 66 69 6c 65 5f 69 73 66 69 6c 65  if( !file_isfile
13d0: 28 7a 4e 61 6d 65 29 20 26 26 20 66 69 6c 65 5f  (zName) && file_
13e0: 73 69 7a 65 28 7a 4e 61 6d 65 29 3e 3d 30 20 29  size(zName)>=0 )
13f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74 46  {.      if( notF
1400: 69 6c 65 49 73 46 61 74 61 6c 20 29 7b 0a 20 20  ileIsFatal ){.  
1410: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72        fossil_war
1420: 6e 69 6e 67 28 22 6e 6f 74 20 61 20 6f 72 64 69  ning("not a ordi
1430: 6e 61 72 79 20 66 69 6c 65 3a 20 25 73 22 2c 20  nary file: %s", 
1440: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1450: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
1460: 20 20 20 20 20 20 63 68 6e 67 65 64 20 3d 20 31        chnged = 1
1470: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1480: 6f 6c 64 43 68 6e 67 65 64 3e 3d 32 20 29 7b 0a  oldChnged>=2 ){.
1490: 20 20 20 20 20 20 63 68 6e 67 65 64 20 3d 20 6f        chnged = o
14a0: 6c 64 43 68 6e 67 65 64 3b 0a 20 20 20 20 7d 65  ldChnged;.    }e
14b0: 6c 73 65 20 69 66 28 20 69 73 44 65 6c 65 74 65  lse if( isDelete
14c0: 64 20 7c 7c 20 72 69 64 3d 3d 30 20 29 7b 0a 20  d || rid==0 ){. 
14d0: 20 20 20 20 20 63 68 6e 67 65 64 20 3d 20 31 3b       chnged = 1;
14e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
14f0: 68 6e 67 65 64 21 3d 31 20 29 7b 0a 20 20 20 20  hnged!=1 ){.    
1500: 20 20 63 75 72 72 65 6e 74 4d 74 69 6d 65 20 3d    currentMtime =
1510: 20 66 69 6c 65 5f 6d 74 69 6d 65 28 7a 4e 61 6d   file_mtime(zNam
1520: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
1530: 28 20 63 68 6e 67 65 64 21 3d 31 20 26 26 20 28  ( chnged!=1 && (
1540: 63 68 65 63 6b 4d 74 69 6d 65 3d 3d 30 20 7c 7c  checkMtime==0 ||
1550: 20 63 75 72 72 65 6e 74 4d 74 69 6d 65 21 3d 6f   currentMtime!=o
1560: 6c 64 4d 74 69 6d 65 29 20 29 7b 0a 20 20 20 20  ldMtime) ){.    
1570: 20 20 64 62 5f 65 70 68 65 6d 65 72 61 6c 5f 62    db_ephemeral_b
1580: 6c 6f 62 28 26 71 2c 20 35 2c 20 26 6f 72 69 67  lob(&q, 5, &orig
1590: 43 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 69 66  Cksum);.      if
15a0: 28 20 73 68 61 31 73 75 6d 5f 66 69 6c 65 28 7a  ( sha1sum_file(z
15b0: 4e 61 6d 65 2c 20 26 66 69 6c 65 43 6b 73 75 6d  Name, &fileCksum
15c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f  ) ){.        blo
15d0: 62 5f 7a 65 72 6f 28 26 66 69 6c 65 43 6b 73 75  b_zero(&fileCksu
15e0: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
15f0: 20 20 69 66 28 20 62 6c 6f 62 5f 63 6f 6d 70 61    if( blob_compa
1600: 72 65 28 26 66 69 6c 65 43 6b 73 75 6d 2c 20 26  re(&fileCksum, &
1610: 6f 72 69 67 43 6b 73 75 6d 29 20 29 7b 0a 20 20  origCksum) ){.  
1620: 20 20 20 20 20 20 63 68 6e 67 65 64 20 3d 20 31        chnged = 1
1630: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1640: 28 20 63 75 72 72 65 6e 74 4d 74 69 6d 65 21 3d  ( currentMtime!=
1650: 6f 6c 64 4d 74 69 6d 65 20 29 7b 0a 20 20 20 20  oldMtime ){.    
1660: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
1670: 63 28 22 55 50 44 41 54 45 20 76 66 69 6c 65 20  c("UPDATE vfile 
1680: 53 45 54 20 6d 74 69 6d 65 3d 25 6c 6c 64 20 57  SET mtime=%lld W
1690: 48 45 52 45 20 69 64 3d 25 64 22 2c 0a 20 20 20  HERE id=%d",.   
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 63 75 72 72 65 6e 74 4d 74 69 6d 65 2c     currentMtime,
16c0: 20 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   id);.      }.  
16d0: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
16e0: 6f 72 69 67 43 6b 73 75 6d 29 3b 0a 20 20 20 20  origCksum);.    
16f0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 69    blob_reset(&fi
1700: 6c 65 43 6b 73 75 6d 29 3b 0a 20 20 20 20 7d 0a  leCksum);.    }.
1710: 20 20 20 20 69 66 28 20 63 68 6e 67 65 64 21 3d      if( chnged!=
1720: 6f 6c 64 43 68 6e 67 65 64 20 29 7b 0a 20 20 20  oldChnged ){.   
1730: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
1740: 28 22 55 50 44 41 54 45 20 76 66 69 6c 65 20 53  ("UPDATE vfile S
1750: 45 54 20 63 68 6e 67 65 64 3d 25 64 20 57 48 45  ET chnged=%d WHE
1760: 52 45 20 69 64 3d 25 64 22 2c 20 63 68 6e 67 65  RE id=%d", chnge
1770: 64 2c 20 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  d, id);.    }.  
1780: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
1790: 26 71 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 20  &q);.  if( nErr 
17a0: 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22  ) fossil_fatal("
17b0: 61 62 6f 72 74 20 64 75 65 20 74 6f 20 70 72 69  abort due to pri
17c0: 6f 72 20 65 72 72 6f 72 73 22 29 3b 0a 20 20 64  or errors");.  d
17d0: 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  b_end_transactio
17e0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n(0);.}../*.** W
17f0: 72 69 74 65 20 61 6c 6c 20 66 69 6c 65 73 20 66  rite all files f
1800: 72 6f 6d 20 76 69 64 20 74 6f 20 74 68 65 20 64  rom vid to the d
1810: 69 73 6b 2e 20 20 4f 72 20 69 66 20 76 69 64 3d  isk.  Or if vid=
1820: 3d 30 20 61 6e 64 20 69 64 21 3d 30 0a 2a 2a 20  =0 and id!=0.** 
1830: 77 72 69 74 65 20 6a 75 73 74 20 74 68 65 20 73  write just the s
1840: 70 65 63 69 66 69 63 20 66 69 6c 65 20 77 68 65  pecific file whe
1850: 72 65 20 56 46 49 4c 45 2e 49 44 3d 69 64 2e 0a  re VFILE.ID=id..
1860: 2a 2f 0a 76 6f 69 64 20 76 66 69 6c 65 5f 74 6f  */.void vfile_to
1870: 5f 64 69 73 6b 28 69 6e 74 20 76 69 64 2c 20 69  _disk(int vid, i
1880: 6e 74 20 69 64 2c 20 69 6e 74 20 76 65 72 62 6f  nt id, int verbo
1890: 73 65 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  se){.  Stmt q;. 
18a0: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20   Blob content;. 
18b0: 20 69 6e 74 20 6e 52 65 70 6f 73 20 3d 20 73 74   int nRepos = st
18c0: 72 6c 65 6e 28 67 2e 7a 4c 6f 63 61 6c 52 6f 6f  rlen(g.zLocalRoo
18d0: 74 29 3b 0a 0a 20 20 69 66 28 20 76 69 64 3e 30  t);..  if( vid>0
18e0: 20 26 26 20 69 64 3d 3d 30 20 29 7b 0a 20 20 20   && id==0 ){.   
18f0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
1900: 22 53 45 4c 45 43 54 20 69 64 2c 20 25 51 20 7c  "SELECT id, %Q |
1910: 7c 20 70 61 74 68 6e 61 6d 65 2c 20 6d 72 69 64  | pathname, mrid
1920: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1930: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 76 66 69       "  FROM vfi
1940: 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  le".            
1950: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 76         " WHERE v
1960: 69 64 3d 25 64 20 41 4e 44 20 6d 72 69 64 3e 30  id=%d AND mrid>0
1970: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1980: 20 20 20 20 20 20 67 2e 7a 4c 6f 63 61 6c 52 6f        g.zLocalRo
1990: 6f 74 2c 20 76 69 64 29 3b 0a 20 20 7d 65 6c 73  ot, vid);.  }els
19a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  e{.    assert( v
19b0: 69 64 3d 3d 30 20 26 26 20 69 64 3e 30 20 29 3b  id==0 && id>0 );
19c0: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
19d0: 26 71 2c 20 22 53 45 4c 45 43 54 20 69 64 2c 20  &q, "SELECT id, 
19e0: 25 51 20 7c 7c 20 70 61 74 68 6e 61 6d 65 2c 20  %Q || pathname, 
19f0: 6d 72 69 64 22 0a 20 20 20 20 20 20 20 20 20 20  mrid".          
1a00: 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
1a10: 20 76 66 69 6c 65 22 0a 20 20 20 20 20 20 20 20   vfile".        
1a20: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
1a30: 52 45 20 69 64 3d 25 64 20 41 4e 44 20 6d 72 69  RE id=%d AND mri
1a40: 64 3e 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d>0",.          
1a50: 20 20 20 20 20 20 20 20 20 67 2e 7a 4c 6f 63 61           g.zLoca
1a60: 6c 52 6f 6f 74 2c 20 69 64 29 3b 0a 20 20 7d 0a  lRoot, id);.  }.
1a70: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
1a80: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
1a90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 2c 20   ){.    int id, 
1aa0: 72 69 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  rid;.    const c
1ab0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 20  har *zName;..   
1ac0: 20 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f   id = db_column_
1ad0: 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  int(&q, 0);.    
1ae0: 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  zName = db_colum
1af0: 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20  n_text(&q, 1);. 
1b00: 20 20 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75     rid = db_colu
1b10: 6d 6e 5f 69 6e 74 28 26 71 2c 20 32 29 3b 0a 20  mn_int(&q, 2);. 
1b20: 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72     content_get(r
1b30: 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20  id, &content);. 
1b40: 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 20 29     if( verbose )
1b50: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
1b60: 26 7a 4e 61 6d 65 5b 6e 52 65 70 6f 73 5d 29 3b  &zName[nRepos]);
1b70: 0a 20 20 20 20 62 6c 6f 62 5f 77 72 69 74 65 5f  .    blob_write_
1b80: 74 6f 5f 66 69 6c 65 28 26 63 6f 6e 74 65 6e 74  to_file(&content
1b90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62  , zName);.    db
1ba0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 55 50 44  _multi_exec("UPD
1bb0: 41 54 45 20 76 66 69 6c 65 20 53 45 54 20 6d 74  ATE vfile SET mt
1bc0: 69 6d 65 3d 25 6c 6c 64 20 57 48 45 52 45 20 69  ime=%lld WHERE i
1bd0: 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d=%d",.         
1be0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f 6d 74           file_mt
1bf0: 69 6d 65 28 7a 4e 61 6d 65 29 2c 20 69 64 29 3b  ime(zName), id);
1c00: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
1c10: 7a 65 28 26 71 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ze(&q);.}.../*.*
1c20: 2a 20 44 65 6c 65 74 65 20 66 72 6f 6d 20 74 68  * Delete from th
1c30: 65 20 64 69 73 6b 20 65 76 65 72 79 20 66 69 6c  e disk every fil
1c40: 65 20 69 6e 20 56 46 49 4c 45 20 76 69 64 2e 0a  e in VFILE vid..
1c50: 2a 2f 0a 76 6f 69 64 20 76 66 69 6c 65 5f 75 6e  */.void vfile_un
1c60: 6c 69 6e 6b 28 69 6e 74 20 76 69 64 29 7b 0a 20  link(int vid){. 
1c70: 20 53 74 6d 74 20 71 3b 0a 20 20 64 62 5f 70 72   Stmt q;.  db_pr
1c80: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
1c90: 54 20 25 51 20 7c 7c 20 70 61 74 68 6e 61 6d 65  T %Q || pathname
1ca0: 20 46 52 4f 4d 20 76 66 69 6c 65 22 0a 20 20 20   FROM vfile".   
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1cc0: 57 48 45 52 45 20 76 69 64 3d 25 64 20 41 4e 44  WHERE vid=%d AND
1cd0: 20 6d 72 69 64 3e 30 22 2c 20 67 2e 7a 4c 6f 63   mrid>0", g.zLoc
1ce0: 61 6c 52 6f 6f 74 2c 20 76 69 64 29 3b 0a 20 20  alRoot, vid);.  
1cf0: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
1d00: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
1d10: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1d20: 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 7a 4e   *zName;..    zN
1d30: 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ame = db_column_
1d40: 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  text(&q, 0);.   
1d50: 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a   unlink(zName);.
1d60: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
1d70: 65 28 26 71 29 3b 0a 20 20 64 62 5f 6d 75 6c 74  e(&q);.  db_mult
1d80: 69 5f 65 78 65 63 28 22 55 50 44 41 54 45 20 76  i_exec("UPDATE v
1d90: 66 69 6c 65 20 53 45 54 20 6d 74 69 6d 65 3d 4e  file SET mtime=N
1da0: 55 4c 4c 20 57 48 45 52 45 20 76 69 64 3d 25 64  ULL WHERE vid=%d
1db0: 20 41 4e 44 20 6d 72 69 64 3e 30 22 2c 20 76 69   AND mrid>0", vi
1dc0: 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  d);.}../*.** Loa
1dd0: 64 20 69 6e 74 6f 20 74 61 62 6c 65 20 53 46 49  d into table SFI
1de0: 4c 45 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  LE the name of e
1df0: 76 65 72 79 20 6f 72 64 69 6e 61 72 79 20 66 69  very ordinary fi
1e00: 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 64 69 72  le in.** the dir
1e10: 65 63 74 6f 72 79 20 70 50 61 74 68 2e 20 20 20  ectory pPath.   
1e20: 4f 6d 69 74 20 74 68 65 20 66 69 72 73 74 20 6e  Omit the first n
1e30: 50 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  Prefix character
1e40: 73 20 6f 66 0a 2a 2a 20 6f 66 20 70 50 61 74 68  s of.** of pPath
1e50: 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
1e60: 69 6e 74 6f 20 74 68 65 20 53 46 49 4c 45 20 74  into the SFILE t
1e70: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 64  able..**.** Subd
1e80: 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 20 73  irectories are s
1e90: 63 61 6e 6e 65 64 20 72 65 63 75 72 73 69 76 65  canned recursive
1ea0: 6c 79 2e 0a 2a 2a 20 4f 6d 69 74 20 66 69 6c 65  ly..** Omit file
1eb0: 73 20 6e 61 6d 65 64 20 69 6e 20 56 46 49 4c 45  s named in VFILE
1ec0: 2e 76 69 64 0a 2a 2f 0a 76 6f 69 64 20 76 66 69  .vid.*/.void vfi
1ed0: 6c 65 5f 73 63 61 6e 28 69 6e 74 20 76 69 64 2c  le_scan(int vid,
1ee0: 20 42 6c 6f 62 20 2a 70 50 61 74 68 2c 20 69 6e   Blob *pPath, in
1ef0: 74 20 6e 50 72 65 66 69 78 2c 20 69 6e 74 20 61  t nPrefix, int a
1f00: 6c 6c 46 6c 61 67 29 7b 0a 20 20 44 49 52 20 2a  llFlag){.  DIR *
1f10: 64 3b 0a 20 20 69 6e 74 20 6f 72 69 67 53 69 7a  d;.  int origSiz
1f20: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
1f30: 2a 7a 44 69 72 3b 0a 20 20 73 74 72 75 63 74 20  *zDir;.  struct 
1f40: 64 69 72 65 6e 74 20 2a 70 45 6e 74 72 79 3b 0a  dirent *pEntry;.
1f50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1f60: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c  har *zSql = "SEL
1f70: 45 43 54 20 31 20 46 52 4f 4d 20 76 66 69 6c 65  ECT 1 FROM vfile
1f80: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fa0: 20 57 48 45 52 45 20 70 61 74 68 6e 61 6d 65 3d   WHERE pathname=
1fb0: 25 51 20 41 4e 44 20 4e 4f 54 20 64 65 6c 65 74  %Q AND NOT delet
1fc0: 65 64 22 3b 0a 0a 20 20 6f 72 69 67 53 69 7a 65  ed";..  origSize
1fd0: 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 50 61   = blob_size(pPa
1fe0: 74 68 29 3b 0a 20 20 7a 44 69 72 20 3d 20 62 6c  th);.  zDir = bl
1ff0: 6f 62 5f 73 74 72 28 70 50 61 74 68 29 3b 0a 20  ob_str(pPath);. 
2000: 20 64 20 3d 20 6f 70 65 6e 64 69 72 28 7a 44 69   d = opendir(zDi
2010: 72 29 3b 0a 20 20 69 66 28 20 64 20 29 7b 0a 20  r);.  if( d ){. 
2020: 20 20 20 77 68 69 6c 65 28 20 28 70 45 6e 74 72     while( (pEntr
2030: 79 3d 72 65 61 64 64 69 72 28 64 29 29 21 3d 30  y=readdir(d))!=0
2040: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2050: 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 69 66 28  zPath;.      if(
2060: 20 70 45 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 5b   pEntry->d_name[
2070: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
2080: 20 20 20 69 66 28 20 21 61 6c 6c 46 6c 61 67 20     if( !allFlag 
2090: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20a0: 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e      if( pEntry->
20b0: 64 5f 6e 61 6d 65 5b 31 5d 3d 3d 30 20 29 20 63  d_name[1]==0 ) c
20c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20d0: 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 64 5f 6e   if( pEntry->d_n
20e0: 61 6d 65 5b 31 5d 3d 3d 27 2e 27 20 26 26 20 70  ame[1]=='.' && p
20f0: 45 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 5b 32 5d  Entry->d_name[2]
2100: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c        }.      bl
2120: 6f 62 5f 61 70 70 65 6e 64 66 28 70 50 61 74 68  ob_appendf(pPath
2130: 2c 20 22 2f 25 73 22 2c 20 70 45 6e 74 72 79 2d  , "/%s", pEntry-
2140: 3e 64 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  >d_name);.      
2150: 7a 50 61 74 68 20 3d 20 62 6c 6f 62 5f 73 74 72  zPath = blob_str
2160: 28 70 50 61 74 68 29 3b 0a 20 20 20 20 20 20 69  (pPath);.      i
2170: 66 28 20 66 69 6c 65 5f 69 73 64 69 72 28 7a 50  f( file_isdir(zP
2180: 61 74 68 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ath)==1 ){.     
2190: 20 20 20 76 66 69 6c 65 5f 73 63 61 6e 28 76 69     vfile_scan(vi
21a0: 64 2c 20 70 50 61 74 68 2c 20 6e 50 72 65 66 69  d, pPath, nPrefi
21b0: 78 2c 20 61 6c 6c 46 6c 61 67 29 3b 0a 20 20 20  x, allFlag);.   
21c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 69 6c     }else if( fil
21d0: 65 5f 69 73 66 69 6c 65 28 7a 50 61 74 68 29 20  e_isfile(zPath) 
21e0: 26 26 20 21 64 62 5f 65 78 69 73 74 73 28 7a 53  && !db_exists(zS
21f0: 71 6c 2c 20 26 7a 50 61 74 68 5b 6e 50 72 65 66  ql, &zPath[nPref
2200: 69 78 2b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  ix+1]) ){.      
2210: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
2220: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 66 69  "INSERT INTO sfi
2230: 6c 65 20 56 41 4c 55 45 53 28 25 51 29 22 2c 20  le VALUES(%Q)", 
2240: 26 7a 50 61 74 68 5b 6e 50 72 65 66 69 78 2b 31  &zPath[nPrefix+1
2250: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2260: 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70 50    blob_resize(pP
2270: 61 74 68 2c 20 6f 72 69 67 53 69 7a 65 29 3b 0a  ath, origSize);.
2280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6c 6f 73      }.  }.  clos
2290: 65 64 69 72 28 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  edir(d);.}../*.*
22a0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 20 61 67 67  * Compute an agg
22b0: 72 65 67 61 74 65 20 4d 44 35 20 63 68 65 63 6b  regate MD5 check
22c0: 73 75 6d 20 6f 76 65 72 20 74 68 65 20 64 69 73  sum over the dis
22d0: 6b 20 69 6d 61 67 65 20 6f 66 20 65 76 65 72 79  k image of every
22e0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 76 69 64 2e  .** file in vid.
22f0: 20 20 54 68 65 20 66 69 6c 65 20 6e 61 6d 65 73    The file names
2300: 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65   are part of the
2310: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a   checksum..**.**
2320: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
2330: 70 65 72 61 74 65 73 20 64 69 66 66 65 72 65 6e  perates differen
2340: 74 6c 79 20 69 66 20 74 68 65 20 47 6c 6f 62 61  tly if the Globa
2350: 6c 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 0a 2a 2a  l.aCommitFile.**
2360: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74   variable is not
2370: 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 61 74 20 63   NULL. In that c
2380: 61 73 65 2c 20 74 68 65 20 64 69 73 6b 20 69 6d  ase, the disk im
2390: 61 67 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a  age is used for.
23a0: 2a 2a 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  ** each file in 
23b0: 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 5d 20 61 6e  aCommitFile[] an
23c0: 64 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  d the repository
23d0: 20 69 6d 61 67 65 20 28 73 65 65 0a 2a 2a 20 76   image (see.** v
23e0: 66 69 6c 65 5f 61 67 67 72 65 67 61 74 65 5f 63  file_aggregate_c
23f0: 68 65 63 6b 73 75 6d 5f 72 65 70 6f 73 69 74 6f  hecksum_reposito
2400: 72 79 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  ry() is used for
2410: 20 61 6c 6c 20 6f 74 68 65 72 73 29 2e 0a 2a 2a   all others)..**
2420: 20 4e 65 77 6c 79 20 61 64 64 65 64 20 66 69 6c   Newly added fil
2430: 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
2440: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2450: 20 72 65 70 6f 73 69 74 6f 72 79 20 61 72 65 0a   repository are.
2460: 2a 2a 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  ** omitted from 
2470: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 66 20  the checksum if 
2480: 74 68 65 79 20 61 72 65 20 6e 6f 74 20 69 6e 20  they are not in 
2490: 47 6c 6f 62 61 6c 2e 61 43 6f 6d 6d 69 74 46 69  Global.aCommitFi
24a0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
24b0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 63   the resulting c
24c0: 68 65 63 6b 73 75 6d 20 69 6e 20 62 6c 6f 62 20  hecksum in blob 
24d0: 70 4f 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 76 66  pOut..*/.void vf
24e0: 69 6c 65 5f 61 67 67 72 65 67 61 74 65 5f 63 68  ile_aggregate_ch
24f0: 65 63 6b 73 75 6d 5f 64 69 73 6b 28 69 6e 74 20  ecksum_disk(int 
2500: 76 69 64 2c 20 42 6c 6f 62 20 2a 70 4f 75 74 29  vid, Blob *pOut)
2510: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
2520: 53 74 6d 74 20 71 3b 0a 20 20 63 68 61 72 20 7a  Stmt q;.  char z
2530: 42 75 66 5b 34 30 39 36 5d 3b 0a 0a 20 20 64 62  Buf[4096];..  db
2540: 5f 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f  _must_be_within_
2550: 74 72 65 65 28 29 3b 0a 20 20 64 62 5f 70 72 65  tree();.  db_pre
2560: 70 61 72 65 28 26 71 2c 20 0a 20 20 20 20 20 20  pare(&q, .      
2570: 22 53 45 4c 45 43 54 20 25 51 20 7c 7c 20 70 61  "SELECT %Q || pa
2580: 74 68 6e 61 6d 65 2c 20 70 61 74 68 6e 61 6d 65  thname, pathname
2590: 2c 20 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63 74  , file_is_select
25a0: 65 64 28 69 64 29 2c 20 72 69 64 20 46 52 4f 4d  ed(id), rid FROM
25b0: 20 76 66 69 6c 65 22 0a 20 20 20 20 20 20 22 20   vfile".      " 
25c0: 57 48 45 52 45 20 4e 4f 54 20 64 65 6c 65 74 65  WHERE NOT delete
25d0: 64 20 41 4e 44 20 76 69 64 3d 25 64 22 0a 20 20  d AND vid=%d".  
25e0: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 70      " ORDER BY p
25f0: 61 74 68 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  athname",.      
2600: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20 76 69  g.zLocalRoot, vi
2610: 64 0a 20 20 29 3b 0a 20 20 6d 64 35 73 75 6d 5f  d.  );.  md5sum_
2620: 69 6e 69 74 28 29 3b 0a 20 20 77 68 69 6c 65 28  init();.  while(
2630: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
2640: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6c  const char *zFul
2660: 6c 70 61 74 68 20 3d 20 64 62 5f 63 6f 6c 75 6d  lpath = db_colum
2670: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20  n_text(&q, 0);. 
2680: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2690: 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Name = db_column
26a0: 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20  _text(&q, 1);.  
26b0: 20 20 69 6e 74 20 69 73 53 65 6c 65 63 74 65 64    int isSelected
26c0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
26d0: 28 26 71 2c 20 32 29 3b 0a 0a 20 20 20 20 69 66  (&q, 2);..    if
26e0: 28 20 69 73 53 65 6c 65 63 74 65 64 20 29 7b 0a  ( isSelected ){.
26f0: 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 73 74 65        md5sum_ste
2700: 70 5f 74 65 78 74 28 7a 4e 61 6d 65 2c 20 2d 31  p_text(zName, -1
2710: 29 3b 0a 20 20 20 20 20 20 69 6e 20 3d 20 66 6f  );.      in = fo
2720: 70 65 6e 28 7a 46 75 6c 6c 70 61 74 68 2c 22 72  pen(zFullpath,"r
2730: 62 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  b");.      if( i
2740: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
2750: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74  md5sum_step_text
2760: 28 22 20 30 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20  (" 0\n", -1);.  
2770: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 73        }.      fs
2790: 65 65 6b 28 69 6e 2c 20 30 4c 2c 20 53 45 45 4b  eek(in, 0L, SEEK
27a0: 5f 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 70 72  _END);.      spr
27b0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 20 25 6c 64  intf(zBuf, " %ld
27c0: 5c 6e 22 2c 20 66 74 65 6c 6c 28 69 6e 29 29 3b  \n", ftell(in));
27d0: 0a 20 20 20 20 20 20 66 73 65 65 6b 28 69 6e 2c  .      fseek(in,
27e0: 20 30 4c 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a   0L, SEEK_SET);.
27f0: 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 73 74 65        md5sum_ste
2800: 70 5f 74 65 78 74 28 7a 42 75 66 2c 20 2d 31 29  p_text(zBuf, -1)
2810: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  ;.      for(;;){
2820: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
2830: 20 20 20 20 20 20 20 20 6e 20 3d 20 66 72 65 61          n = frea
2840: 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f  d(zBuf, 1, sizeo
2850: 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20  f(zBuf), in);.  
2860: 20 20 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29        if( n<=0 )
2870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2880: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74  md5sum_step_text
2890: 28 7a 42 75 66 2c 20 6e 29 3b 0a 20 20 20 20 20  (zBuf, n);.     
28a0: 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
28b0: 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  in);.    }else{.
28c0: 20 20 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20        int rid = 
28d0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
28e0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 68 61 72  , 3);.      char
28f0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20   zBuf[100];.    
2900: 20 20 42 6c 6f 62 20 66 69 6c 65 3b 0a 0a 20 20    Blob file;..  
2910: 20 20 20 20 69 66 28 20 72 69 64 3e 30 20 29 7b      if( rid>0 ){
2920: 0a 20 20 20 20 20 20 20 20 6d 64 35 73 75 6d 5f  .        md5sum_
2930: 73 74 65 70 5f 74 65 78 74 28 7a 4e 61 6d 65 2c  step_text(zName,
2940: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 6c   -1);.        bl
2950: 6f 62 5f 7a 65 72 6f 28 26 66 69 6c 65 29 3b 0a  ob_zero(&file);.
2960: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 5f          content_
2970: 67 65 74 28 72 69 64 2c 20 26 66 69 6c 65 29 3b  get(rid, &file);
2980: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
2990: 28 7a 42 75 66 2c 20 22 20 25 64 5c 6e 22 2c 20  (zBuf, " %d\n", 
29a0: 62 6c 6f 62 5f 73 69 7a 65 28 26 66 69 6c 65 29  blob_size(&file)
29b0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 64 35 73 75  );.        md5su
29c0: 6d 5f 73 74 65 70 5f 74 65 78 74 28 7a 42 75 66  m_step_text(zBuf
29d0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 6d  , -1);.        m
29e0: 64 35 73 75 6d 5f 73 74 65 70 5f 62 6c 6f 62 28  d5sum_step_blob(
29f0: 26 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  &file);.        
2a00: 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 69 6c 65  blob_reset(&file
2a10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a20: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
2a30: 7a 65 28 26 71 29 3b 0a 20 20 6d 64 35 73 75 6d  ze(&q);.  md5sum
2a40: 5f 66 69 6e 69 73 68 28 70 4f 75 74 29 3b 0a 7d  _finish(pOut);.}
2a50: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
2a60: 61 6e 20 61 67 67 72 65 67 61 74 65 20 4d 44 35  an aggregate MD5
2a70: 20 63 68 65 63 6b 73 75 6d 20 6f 76 65 72 20 74   checksum over t
2a80: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6d  he repository im
2a90: 61 67 65 20 6f 66 20 65 76 65 72 79 0a 2a 2a 20  age of every.** 
2aa0: 66 69 6c 65 20 69 6e 20 76 69 64 2e 20 20 54 68  file in vid.  Th
2ab0: 65 20 66 69 6c 65 20 6e 61 6d 65 73 20 61 72 65  e file names are
2ac0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 65   part of the che
2ad0: 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cksum..**.** Ret
2ae0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  urn the resultin
2af0: 67 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 62 6c  g checksum in bl
2b00: 6f 62 20 70 4f 75 74 2e 0a 2a 2f 0a 76 6f 69 64  ob pOut..*/.void
2b10: 20 76 66 69 6c 65 5f 61 67 67 72 65 67 61 74 65   vfile_aggregate
2b20: 5f 63 68 65 63 6b 73 75 6d 5f 72 65 70 6f 73 69  _checksum_reposi
2b30: 74 6f 72 79 28 69 6e 74 20 76 69 64 2c 20 42 6c  tory(int vid, Bl
2b40: 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 42 6c 6f  ob *pOut){.  Blo
2b50: 62 20 66 69 6c 65 3b 0a 20 20 53 74 6d 74 20 71  b file;.  Stmt q
2b60: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
2b70: 30 5d 3b 0a 0a 20 20 64 62 5f 6d 75 73 74 5f 62  0];..  db_must_b
2b80: 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b  e_within_tree();
2b90: 0a 20 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  . .  db_prepare(
2ba0: 26 71 2c 20 22 53 45 4c 45 43 54 20 70 61 74 68  &q, "SELECT path
2bb0: 6e 61 6d 65 2c 20 72 69 64 20 46 52 4f 4d 20 76  name, rid FROM v
2bc0: 66 69 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20  file".          
2bd0: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 4e         " WHERE N
2be0: 4f 54 20 64 65 6c 65 74 65 64 20 41 4e 44 20 72  OT deleted AND r
2bf0: 69 64 3e 30 20 41 4e 44 20 76 69 64 3d 25 64 22  id>0 AND vid=%d"
2c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c10: 20 20 22 20 4f 52 44 45 52 20 42 59 20 70 61 74    " ORDER BY pat
2c20: 68 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20  hname",.        
2c30: 20 20 20 20 20 20 20 20 20 76 69 64 29 3b 0a 20           vid);. 
2c40: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 66 69 6c 65   blob_zero(&file
2c50: 29 3b 0a 20 20 6d 64 35 73 75 6d 5f 69 6e 69 74  );.  md5sum_init
2c60: 28 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f  ();.  while( db_
2c70: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
2c80: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
2c90: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
2ca0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
2cb0: 71 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72  q, 0);.    int r
2cc0: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
2cd0: 6e 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 6d  nt(&q, 1);.    m
2ce0: 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28  d5sum_step_text(
2cf0: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20  zName, -1);.    
2d00: 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c  content_get(rid,
2d10: 20 26 66 69 6c 65 29 3b 0a 20 20 20 20 73 70 72   &file);.    spr
2d20: 69 6e 74 66 28 7a 42 75 66 2c 20 22 20 25 64 5c  intf(zBuf, " %d\
2d30: 6e 22 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 66  n", blob_size(&f
2d40: 69 6c 65 29 29 3b 0a 20 20 20 20 6d 64 35 73 75  ile));.    md5su
2d50: 6d 5f 73 74 65 70 5f 74 65 78 74 28 7a 42 75 66  m_step_text(zBuf
2d60: 2c 20 2d 31 29 3b 0a 20 20 20 20 6d 64 35 73 75  , -1);.    md5su
2d70: 6d 5f 73 74 65 70 5f 62 6c 6f 62 28 26 66 69 6c  m_step_blob(&fil
2d80: 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  e);.    blob_res
2d90: 65 74 28 26 66 69 6c 65 29 3b 0a 20 20 7d 0a 20  et(&file);.  }. 
2da0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
2db0: 3b 0a 20 20 6d 64 35 73 75 6d 5f 66 69 6e 69 73  ;.  md5sum_finis
2dc0: 68 28 70 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  h(pOut);.}../*.*
2dd0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 20 61 67 67  * Compute an agg
2de0: 72 65 67 61 74 65 20 4d 44 35 20 63 68 65 63 6b  regate MD5 check
2df0: 73 75 6d 20 6f 76 65 72 20 74 68 65 20 72 65 70  sum over the rep
2e00: 6f 73 69 74 6f 72 79 20 69 6d 61 67 65 20 6f 66  ository image of
2e10: 20 65 76 65 72 79 0a 2a 2a 20 66 69 6c 65 20 69   every.** file i
2e20: 6e 20 6d 61 6e 69 66 65 73 74 20 76 69 64 2e 20  n manifest vid. 
2e30: 20 54 68 65 20 66 69 6c 65 20 6e 61 6d 65 73 20   The file names 
2e40: 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  are part of the 
2e50: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 52 65 74  checksum..** Ret
2e60: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  urn the resultin
2e70: 67 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 62 6c  g checksum in bl
2e80: 6f 62 20 70 4f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49  ob pOut..**.** I
2e90: 66 20 70 4d 61 6e 4f 75 74 20 69 73 20 6e 6f 74  f pManOut is not
2ea0: 20 4e 55 4c 4c 20 74 68 65 6e 20 66 69 6c 6c 20   NULL then fill 
2eb0: 69 74 20 77 69 74 68 20 74 68 65 20 63 68 65 63  it with the chec
2ec0: 6b 73 75 6d 20 66 6f 75 6e 64 20 69 6e 20 74 68  ksum found in th
2ed0: 65 0a 2a 2a 20 22 52 22 20 63 61 72 64 20 6e 65  e.** "R" card ne
2ee0: 61 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ar the end of th
2ef0: 65 20 6d 61 6e 69 66 65 73 74 2e 20 20 0a 2a 2f  e manifest.  .*/
2f00: 0a 76 6f 69 64 20 76 66 69 6c 65 5f 61 67 67 72  .void vfile_aggr
2f10: 65 67 61 74 65 5f 63 68 65 63 6b 73 75 6d 5f 6d  egate_checksum_m
2f20: 61 6e 69 66 65 73 74 28 69 6e 74 20 76 69 64 2c  anifest(int vid,
2f30: 20 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 42 6c 6f   Blob *pOut, Blo
2f40: 62 20 2a 70 4d 61 6e 4f 75 74 29 7b 0a 20 20 69  b *pManOut){.  i
2f50: 6e 74 20 69 2c 20 66 69 64 3b 0a 20 20 42 6c 6f  nt i, fid;.  Blo
2f60: 62 20 66 69 6c 65 2c 20 6d 66 69 6c 65 3b 0a 20  b file, mfile;. 
2f70: 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20 20 63   Manifest m;.  c
2f80: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
2f90: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 4f 75 74    blob_zero(pOut
2fa0: 29 3b 0a 20 20 69 66 28 20 70 4d 61 6e 4f 75 74  );.  if( pManOut
2fb0: 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72   ){.    blob_zer
2fc0: 6f 28 70 4d 61 6e 4f 75 74 29 3b 0a 20 20 7d 0a  o(pManOut);.  }.
2fd0: 20 20 64 62 5f 6d 75 73 74 5f 62 65 5f 77 69 74    db_must_be_wit
2fe0: 68 69 6e 5f 74 72 65 65 28 29 3b 0a 20 20 63 6f  hin_tree();.  co
2ff0: 6e 74 65 6e 74 5f 67 65 74 28 76 69 64 2c 20 26  ntent_get(vid, &
3000: 6d 66 69 6c 65 29 3b 0a 20 20 69 66 28 20 6d 61  mfile);.  if( ma
3010: 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d 2c  nifest_parse(&m,
3020: 20 26 6d 66 69 6c 65 29 3d 3d 30 20 29 7b 0a 20   &mfile)==0 ){. 
3030: 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28     fossil_panic(
3040: 22 6d 61 6e 69 66 65 73 74 20 66 69 6c 65 20 28  "manifest file (
3050: 25 64 29 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  %d) is malformed
3060: 22 2c 20 76 69 64 29 3b 0a 20 20 7d 0a 20 20 66  ", vid);.  }.  f
3070: 6f 72 28 69 3d 30 3b 20 69 3c 6d 2e 6e 46 69 6c  or(i=0; i<m.nFil
3080: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 69 64  e; i++){.    fid
3090: 20 3d 20 75 75 69 64 5f 74 6f 5f 72 69 64 28 6d   = uuid_to_rid(m
30a0: 2e 61 46 69 6c 65 5b 69 5d 2e 7a 55 75 69 64 2c  .aFile[i].zUuid,
30b0: 20 30 29 3b 0a 20 20 20 20 6d 64 35 73 75 6d 5f   0);.    md5sum_
30c0: 73 74 65 70 5f 74 65 78 74 28 6d 2e 61 46 69 6c  step_text(m.aFil
30d0: 65 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b  e[i].zName, -1);
30e0: 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74  .    content_get
30f0: 28 66 69 64 2c 20 26 66 69 6c 65 29 3b 0a 20 20  (fid, &file);.  
3100: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
3110: 22 20 25 64 5c 6e 22 2c 20 62 6c 6f 62 5f 73 69  " %d\n", blob_si
3120: 7a 65 28 26 66 69 6c 65 29 29 3b 0a 20 20 20 20  ze(&file));.    
3130: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74  md5sum_step_text
3140: 28 7a 42 75 66 2c 20 2d 31 29 3b 0a 20 20 20 20  (zBuf, -1);.    
3150: 6d 64 35 73 75 6d 5f 73 74 65 70 5f 62 6c 6f 62  md5sum_step_blob
3160: 28 26 66 69 6c 65 29 3b 0a 20 20 20 20 62 6c 6f  (&file);.    blo
3170: 62 5f 72 65 73 65 74 28 26 66 69 6c 65 29 3b 0a  b_reset(&file);.
3180: 20 20 7d 0a 20 20 69 66 28 20 70 4d 61 6e 4f 75    }.  if( pManOu
3190: 74 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  t ){.    blob_ap
31a0: 70 65 6e 64 28 70 4d 61 6e 4f 75 74 2c 20 6d 2e  pend(pManOut, m.
31b0: 7a 52 65 70 6f 43 6b 73 75 6d 2c 20 2d 31 29 3b  zRepoCksum, -1);
31c0: 0a 20 20 7d 0a 20 20 6d 61 6e 69 66 65 73 74 5f  .  }.  manifest_
31d0: 63 6c 65 61 72 28 26 6d 29 3b 0a 20 20 6d 64 35  clear(&m);.  md5
31e0: 73 75 6d 5f 66 69 6e 69 73 68 28 70 4f 75 74 29  sum_finish(pOut)
31f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  ;.}../*.** COMMA
3200: 4e 44 3a 20 74 65 73 74 2d 61 67 67 2d 63 6b 73  ND: test-agg-cks
3210: 75 6d 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f  um.*/.void test_
3220: 61 67 67 5f 63 6b 73 75 6d 5f 63 6d 64 28 76 6f  agg_cksum_cmd(vo
3230: 69 64 29 7b 0a 20 20 69 6e 74 20 76 69 64 3b 0a  id){.  int vid;.
3240: 20 20 42 6c 6f 62 20 68 61 73 68 2c 20 68 61 73    Blob hash, has
3250: 68 32 3b 0a 20 20 64 62 5f 6d 75 73 74 5f 62 65  h2;.  db_must_be
3260: 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b 0a  _within_tree();.
3270: 20 20 76 69 64 20 3d 20 64 62 5f 6c 67 65 74 5f    vid = db_lget_
3280: 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22 2c 20  int("checkout", 
3290: 30 29 3b 0a 20 20 76 66 69 6c 65 5f 61 67 67 72  0);.  vfile_aggr
32a0: 65 67 61 74 65 5f 63 68 65 63 6b 73 75 6d 5f 64  egate_checksum_d
32b0: 69 73 6b 28 76 69 64 2c 20 26 68 61 73 68 29 3b  isk(vid, &hash);
32c0: 0a 20 20 70 72 69 6e 74 66 28 22 64 69 73 6b 3a  .  printf("disk:
32d0: 20 20 20 20 20 25 73 5c 6e 22 2c 20 62 6c 6f 62       %s\n", blob
32e0: 5f 73 74 72 28 26 68 61 73 68 29 29 3b 0a 20 20  _str(&hash));.  
32f0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73 68  blob_reset(&hash
3300: 29 3b 0a 20 20 76 66 69 6c 65 5f 61 67 67 72 65  );.  vfile_aggre
3310: 67 61 74 65 5f 63 68 65 63 6b 73 75 6d 5f 72 65  gate_checksum_re
3320: 70 6f 73 69 74 6f 72 79 28 76 69 64 2c 20 26 68  pository(vid, &h
3330: 61 73 68 29 3b 0a 20 20 70 72 69 6e 74 66 28 22  ash);.  printf("
3340: 61 72 63 68 69 76 65 3a 20 20 25 73 5c 6e 22 2c  archive:  %s\n",
3350: 20 62 6c 6f 62 5f 73 74 72 28 26 68 61 73 68 29   blob_str(&hash)
3360: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  );.  blob_reset(
3370: 26 68 61 73 68 29 3b 0a 20 20 76 66 69 6c 65 5f  &hash);.  vfile_
3380: 61 67 67 72 65 67 61 74 65 5f 63 68 65 63 6b 73  aggregate_checks
3390: 75 6d 5f 6d 61 6e 69 66 65 73 74 28 76 69 64 2c  um_manifest(vid,
33a0: 20 26 68 61 73 68 2c 20 26 68 61 73 68 32 29 3b   &hash, &hash2);
33b0: 0a 20 20 70 72 69 6e 74 66 28 22 6d 61 6e 69 66  .  printf("manif
33c0: 65 73 74 3a 20 25 73 5c 6e 22 2c 20 62 6c 6f 62  est: %s\n", blob
33d0: 5f 73 74 72 28 26 68 61 73 68 29 29 3b 0a 20 20  _str(&hash));.  
33e0: 70 72 69 6e 74 66 28 22 72 65 63 6f 72 64 65 64  printf("recorded
33f0: 3a 20 25 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73 74  : %s\n", blob_st
3400: 72 28 26 68 61 73 68 32 29 29 3b 0a 7d 0a        r(&hash2));.}.