Hex Artifact Content
Not logged in

Artifact 4a866358e30844ec8501e980dbe2d87f02c34406:

File src/checkin.c part of check-in [9346f2290c] - Added the "all" command for things like "fossil all sync". I am not sure "all" is quite the right name for this command, so I may yet change it. by drh on 2008-10-17 00:20:21.

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 68 65 63 6b 2d 69 6e 20  sed to check-in 
0390: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
03a0: 70 72 6f 6a 65 63 74 0a 2a 2a 20 66 72 6f 6d 20  project.** from 
03b0: 74 68 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69  the local reposi
03c0: 74 6f 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tory..*/.#includ
03d0: 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e  e "config.h".#in
03e0: 63 6c 75 64 65 20 22 63 68 65 63 6b 69 6e 2e 68  clude "checkin.h
03f0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  ".#include <asse
0400: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rt.h>../*.** Gen
0410: 65 72 61 74 65 20 74 65 78 74 20 64 65 73 63 72  erate text descr
0420: 69 62 69 6e 67 20 61 6c 6c 20 63 68 61 6e 67 65  ibing all change
0430: 73 2e 20 20 50 72 65 70 65 6e 64 20 7a 50 72 65  s.  Prepend zPre
0440: 66 69 78 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  fix to each line
0450: 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a  .** of output..*
0460: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
0470: 68 61 74 20 76 66 69 6c 65 5f 63 68 65 63 6b 5f  hat vfile_check_
0480: 73 69 67 6e 61 74 75 72 65 20 68 61 73 20 62 65  signature has be
0490: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69  en run..*/.stati
04a0: 63 20 76 6f 69 64 20 73 74 61 74 75 73 5f 72 65  c void status_re
04b0: 70 6f 72 74 28 42 6c 6f 62 20 2a 72 65 70 6f 72  port(Blob *repor
04c0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
04d0: 50 72 65 66 69 78 29 7b 0a 20 20 53 74 6d 74 20  Prefix){.  Stmt 
04e0: 71 3b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  q;.  int nPrefix
04f0: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69   = strlen(zPrefi
0500: 78 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  x);.  db_prepare
0510: 28 26 71 2c 20 0a 20 20 20 20 22 53 45 4c 45 43  (&q, .    "SELEC
0520: 54 20 70 61 74 68 6e 61 6d 65 2c 20 64 65 6c 65  T pathname, dele
0530: 74 65 64 2c 20 63 68 6e 67 65 64 2c 20 72 69 64  ted, chnged, rid
0540: 20 46 52 4f 4d 20 76 66 69 6c 65 20 22 0a 20 20   FROM vfile ".  
0550: 20 20 22 57 48 45 52 45 20 66 69 6c 65 5f 69 73    "WHERE file_is
0560: 5f 73 65 6c 65 63 74 65 64 28 69 64 29 20 41 4e  _selected(id) AN
0570: 44 20 28 63 68 6e 67 65 64 20 4f 52 20 64 65 6c  D (chnged OR del
0580: 65 74 65 64 20 4f 52 20 72 69 64 3d 30 29 20 4f  eted OR rid=0) O
0590: 52 44 45 52 20 42 59 20 31 22 0a 20 20 29 3b 0a  RDER BY 1".  );.
05a0: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
05b0: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
05c0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
05d0: 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
05e0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
05f0: 71 2c 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 73  q,0);.    int is
0600: 44 65 6c 65 74 65 64 20 3d 20 64 62 5f 63 6f 6c  Deleted = db_col
0610: 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31 29 3b 0a  umn_int(&q, 1);.
0620: 20 20 20 20 69 6e 74 20 69 73 43 68 6e 67 65 64      int isChnged
0630: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
0640: 28 26 71 2c 32 29 3b 0a 20 20 20 20 69 6e 74 20  (&q,2);.    int 
0650: 69 73 4e 65 77 20 3d 20 64 62 5f 63 6f 6c 75 6d  isNew = db_colum
0660: 6e 5f 69 6e 74 28 26 71 2c 33 29 3d 3d 30 3b 0a  n_int(&q,3)==0;.
0670: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 4e      char *zFullN
0680: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ame = mprintf("%
0690: 73 2f 25 73 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52  s/%s", g.zLocalR
06a0: 6f 6f 74 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  oot, zPathname);
06b0: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
06c0: 28 72 65 70 6f 72 74 2c 20 7a 50 72 65 66 69 78  (report, zPrefix
06d0: 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , nPrefix);.    
06e0: 69 66 28 20 69 73 44 65 6c 65 74 65 64 20 29 7b  if( isDeleted ){
06f0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
0700: 6e 64 66 28 72 65 70 6f 72 74 2c 20 22 44 45 4c  ndf(report, "DEL
0710: 45 54 45 44 20 20 25 73 5c 6e 22 2c 20 7a 50 61  ETED  %s\n", zPa
0720: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  thname);.    }el
0730: 73 65 20 69 66 28 20 61 63 63 65 73 73 28 7a 46  se if( access(zF
0740: 75 6c 6c 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  ullName, 0) ){. 
0750: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
0760: 66 28 72 65 70 6f 72 74 2c 20 22 4d 49 53 53 49  f(report, "MISSI
0770: 4e 47 20 20 25 73 5c 6e 22 2c 20 7a 50 61 74 68  NG  %s\n", zPath
0780: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  name);.    }else
0790: 20 69 66 28 20 69 73 4e 65 77 20 29 7b 0a 20 20   if( isNew ){.  
07a0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
07b0: 28 72 65 70 6f 72 74 2c 20 22 41 44 44 45 44 20  (report, "ADDED 
07c0: 20 20 20 25 73 5c 6e 22 2c 20 7a 50 61 74 68 6e     %s\n", zPathn
07d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
07e0: 69 66 28 20 69 73 44 65 6c 65 74 65 64 20 29 7b  if( isDeleted ){
07f0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
0800: 6e 64 66 28 72 65 70 6f 72 74 2c 20 22 44 45 4c  ndf(report, "DEL
0810: 45 54 45 44 20 20 25 73 5c 6e 22 2c 20 7a 50 61  ETED  %s\n", zPa
0820: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  thname);.    }el
0830: 73 65 20 69 66 28 20 69 73 43 68 6e 67 65 64 3d  se if( isChnged=
0840: 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  =2 ){.      blob
0850: 5f 61 70 70 65 6e 64 66 28 72 65 70 6f 72 74 2c  _appendf(report,
0860: 20 22 55 50 44 41 54 45 44 5f 42 59 5f 4d 45 52   "UPDATED_BY_MER
0870: 47 45 20 25 73 5c 6e 22 2c 20 7a 50 61 74 68 6e  GE %s\n", zPathn
0880: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
0890: 69 66 28 20 69 73 43 68 6e 67 65 64 3d 3d 33 20  if( isChnged==3 
08a0: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
08b0: 70 65 6e 64 66 28 72 65 70 6f 72 74 2c 20 22 41  pendf(report, "A
08c0: 44 44 45 44 5f 42 59 5f 4d 45 52 47 45 20 25 73  DDED_BY_MERGE %s
08d0: 5c 6e 22 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  \n", zPathname);
08e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
08f0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 72    blob_appendf(r
0900: 65 70 6f 72 74 2c 20 22 45 44 49 54 45 44 20 20  eport, "EDITED  
0910: 20 25 73 5c 6e 22 2c 20 7a 50 61 74 68 6e 61 6d   %s\n", zPathnam
0920: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  e);.    }.    fr
0930: 65 65 28 7a 46 75 6c 6c 4e 61 6d 65 29 3b 0a 20  ee(zFullName);. 
0940: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
0950: 28 26 71 29 3b 0a 20 20 64 62 5f 70 72 65 70 61  (&q);.  db_prepa
0960: 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 75  re(&q, "SELECT u
0970: 75 69 64 20 46 52 4f 4d 20 76 6d 65 72 67 65 20  uid FROM vmerge 
0980: 4a 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20 6d 65 72  JOIN blob ON mer
0990: 67 65 3d 72 69 64 22 0a 20 20 20 20 20 20 20 20  ge=rid".        
09a0: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
09b0: 20 69 64 3d 30 22 29 3b 0a 20 20 77 68 69 6c 65   id=0");.  while
09c0: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
09d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
09e0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 72 65 70   blob_append(rep
09f0: 6f 72 74 2c 20 7a 50 72 65 66 69 78 2c 20 6e 50  ort, zPrefix, nP
0a00: 72 65 66 69 78 29 3b 0a 20 20 20 20 62 6c 6f 62  refix);.    blob
0a10: 5f 61 70 70 65 6e 64 66 28 72 65 70 6f 72 74 2c  _appendf(report,
0a20: 20 22 4d 45 52 47 45 44 5f 57 49 54 48 20 25 73   "MERGED_WITH %s
0a30: 5c 6e 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  \n", db_column_t
0a40: 65 78 74 28 26 71 2c 20 30 29 29 3b 0a 20 20 7d  ext(&q, 0));.  }
0a50: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
0a60: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d  q);.}../*.** COM
0a70: 4d 41 4e 44 3a 20 63 68 61 6e 67 65 73 0a 2a 2a  MAND: changes.**
0a80: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
0a90: 69 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a  il changes.**.**
0aa0: 20 52 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 65   Report on the e
0ab0: 64 69 74 20 73 74 61 74 75 73 20 6f 66 20 61 6c  dit status of al
0ac0: 6c 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 63  l files in the c
0ad0: 75 72 72 65 6e 74 20 63 68 65 63 6b 6f 75 74 2e  urrent checkout.
0ae0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0af0: 20 22 73 74 61 74 75 73 22 20 61 6e 64 20 22 65   "status" and "e
0b00: 78 74 72 61 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a  xtra" commands..
0b10: 2a 2f 0a 76 6f 69 64 20 63 68 61 6e 67 65 73 5f  */.void changes_
0b20: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f  cmd(void){.  Blo
0b30: 62 20 72 65 70 6f 72 74 3b 0a 20 20 69 6e 74 20  b report;.  int 
0b40: 76 69 64 3b 0a 20 20 64 62 5f 6d 75 73 74 5f 62  vid;.  db_must_b
0b50: 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b  e_within_tree();
0b60: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 72 65  .  blob_zero(&re
0b70: 70 6f 72 74 29 3b 0a 20 20 76 69 64 20 3d 20 64  port);.  vid = d
0b80: 62 5f 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63  b_lget_int("chec
0b90: 6b 6f 75 74 22 2c 20 30 29 3b 0a 20 20 76 66 69  kout", 0);.  vfi
0ba0: 6c 65 5f 63 68 65 63 6b 5f 73 69 67 6e 61 74 75  le_check_signatu
0bb0: 72 65 28 76 69 64 29 3b 0a 20 20 73 74 61 74 75  re(vid);.  statu
0bc0: 73 5f 72 65 70 6f 72 74 28 26 72 65 70 6f 72 74  s_report(&report
0bd0: 2c 20 22 22 29 3b 0a 20 20 62 6c 6f 62 5f 77 72  , "");.  blob_wr
0be0: 69 74 65 5f 74 6f 5f 66 69 6c 65 28 26 72 65 70  ite_to_file(&rep
0bf0: 6f 72 74 2c 20 22 2d 22 29 3b 0a 7d 0a 0a 2f 2a  ort, "-");.}../*
0c00: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 73 74 61  .** COMMAND: sta
0c10: 74 75 73 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  tus.**.** Usage:
0c20: 20 25 66 6f 73 73 69 6c 20 73 74 61 74 75 73 0a   %fossil status.
0c30: 2a 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 6f 6e 20  **.** Report on 
0c40: 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
0c50: 65 20 63 75 72 72 65 6e 74 20 63 68 65 63 6b 6f  e current checko
0c60: 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 74 61 74  ut..*/.void stat
0c70: 75 73 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20  us_cmd(void){.  
0c80: 69 6e 74 20 76 69 64 3b 0a 20 20 64 62 5f 6d 75  int vid;.  db_mu
0c90: 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65  st_be_within_tre
0ca0: 65 28 29 3b 0a 20 20 20 20 20 20 20 2f 2a 20 30  e();.       /* 0
0cb0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 20 2a  12345678901234 *
0cc0: 2f 0a 20 20 70 72 69 6e 74 66 28 22 72 65 70 6f  /.  printf("repo
0cd0: 73 69 74 6f 72 79 3a 20 20 20 25 73 5c 6e 22 2c  sitory:   %s\n",
0ce0: 20 64 62 5f 6c 67 65 74 28 22 72 65 70 6f 73 69   db_lget("reposi
0cf0: 74 6f 72 79 22 2c 22 22 29 29 3b 0a 20 20 70 72  tory",""));.  pr
0d00: 69 6e 74 66 28 22 6c 6f 63 61 6c 2d 72 6f 6f 74  intf("local-root
0d10: 3a 20 20 20 25 73 5c 6e 22 2c 20 67 2e 7a 4c 6f  :   %s\n", g.zLo
0d20: 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 70 72 69 6e  calRoot);.  prin
0d30: 74 66 28 22 73 65 72 76 65 72 2d 63 6f 64 65 3a  tf("server-code:
0d40: 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28    %s\n", db_get(
0d50: 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 22  "server-code", "
0d60: 22 29 29 3b 0a 20 20 76 69 64 20 3d 20 64 62 5f  "));.  vid = db_
0d70: 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f  lget_int("checko
0d80: 75 74 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 76  ut", 0);.  if( v
0d90: 69 64 20 29 7b 0a 20 20 20 20 73 68 6f 77 5f 63  id ){.    show_c
0da0: 6f 6d 6d 6f 6e 5f 69 6e 66 6f 28 76 69 64 2c 20  ommon_info(vid, 
0db0: 22 63 68 65 63 6b 6f 75 74 3a 22 2c 20 30 29 3b  "checkout:", 0);
0dc0: 0a 20 20 7d 0a 20 20 63 68 61 6e 67 65 73 5f 63  .  }.  changes_c
0dd0: 6d 64 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  md();.}../*.** C
0de0: 4f 4d 4d 41 4e 44 3a 20 6c 73 0a 2a 2a 0a 2a 2a  OMMAND: ls.**.**
0df0: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
0e00: 6c 73 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 74 68  ls.**.** Show th
0e10: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 66  e names of all f
0e20: 69 6c 65 73 20 69 6e 20 74 68 65 20 63 75 72 72  iles in the curr
0e30: 65 6e 74 20 63 68 65 63 6b 6f 75 74 0a 2a 2f 0a  ent checkout.*/.
0e40: 76 6f 69 64 20 6c 73 5f 63 6d 64 28 76 6f 69 64  void ls_cmd(void
0e50: 29 7b 0a 20 20 69 6e 74 20 76 69 64 3b 0a 20 20  ){.  int vid;.  
0e60: 53 74 6d 74 20 71 3b 0a 0a 20 20 64 62 5f 6d 75  Stmt q;..  db_mu
0e70: 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65  st_be_within_tre
0e80: 65 28 29 3b 0a 20 20 76 69 64 20 3d 20 64 62 5f  e();.  vid = db_
0e90: 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f  lget_int("checko
0ea0: 75 74 22 2c 20 30 29 3b 0a 20 20 76 66 69 6c 65  ut", 0);.  vfile
0eb0: 5f 63 68 65 63 6b 5f 73 69 67 6e 61 74 75 72 65  _check_signature
0ec0: 28 76 69 64 29 3b 0a 20 20 64 62 5f 70 72 65 70  (vid);.  db_prep
0ed0: 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20  are(&q, "SELECT 
0ee0: 70 61 74 68 6e 61 6d 65 2c 20 64 65 6c 65 74 65  pathname, delete
0ef0: 64 2c 20 72 69 64 2c 20 63 68 6e 67 65 64 20 46  d, rid, chnged F
0f00: 52 4f 4d 20 76 66 69 6c 65 22 0a 20 20 20 20 20  ROM vfile".     
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
0f20: 44 45 52 20 42 59 20 31 22 29 3b 0a 20 20 77 68  DER BY 1");.  wh
0f30: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
0f40: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
0f50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0f60: 7a 50 61 74 68 6e 61 6d 65 20 3d 20 64 62 5f 63  zPathname = db_c
0f70: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 30 29  olumn_text(&q,0)
0f80: 3b 0a 20 20 20 20 69 6e 74 20 69 73 44 65 6c 65  ;.    int isDele
0f90: 74 65 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ted = db_column_
0fa0: 69 6e 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20  int(&q, 1);.    
0fb0: 69 6e 74 20 69 73 4e 65 77 20 3d 20 64 62 5f 63  int isNew = db_c
0fc0: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 32 29 3d  olumn_int(&q,2)=
0fd0: 3d 30 3b 0a 20 20 20 20 69 6e 74 20 63 68 6e 67  =0;.    int chng
0fe0: 65 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  ed = db_column_i
0ff0: 6e 74 28 26 71 2c 33 29 3b 0a 20 20 20 20 69 66  nt(&q,3);.    if
1000: 28 20 69 73 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( isNew ){.     
1010: 20 70 72 69 6e 74 66 28 22 41 44 44 45 44 20 20   printf("ADDED  
1020: 20 20 20 25 73 5c 6e 22 2c 20 7a 50 61 74 68 6e     %s\n", zPathn
1030: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1040: 69 66 28 20 69 73 44 65 6c 65 74 65 64 20 29 7b  if( isDeleted ){
1050: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 44  .      printf("D
1060: 45 4c 45 54 45 44 20 20 20 25 73 5c 6e 22 2c 20  ELETED   %s\n", 
1070: 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1080: 7d 65 6c 73 65 20 69 66 28 20 63 68 6e 67 65 64  }else if( chnged
1090: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
10a0: 28 22 45 44 49 54 45 44 20 20 20 20 25 73 5c 6e  ("EDITED    %s\n
10b0: 22 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ", zPathname);. 
10c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d0: 70 72 69 6e 74 66 28 22 55 4e 43 48 41 4e 47 45  printf("UNCHANGE
10e0: 44 20 25 73 5c 6e 22 2c 20 7a 50 61 74 68 6e 61  D %s\n", zPathna
10f0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
1100: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
1110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  ;.}../*.** COMMA
1120: 4e 44 3a 20 65 78 74 72 61 0a 2a 2a 20 55 73 61  ND: extra.** Usa
1130: 67 65 3a 20 25 66 6f 73 73 69 6c 20 65 78 74 72  ge: %fossil extr
1140: 61 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  a.**.** Print a 
1150: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 66 69 6c 65  list of all file
1160: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
1170: 74 72 65 65 20 74 68 61 74 20 61 72 65 20 6e 6f  tree that are no
1180: 74 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  t part of.** the
1190: 20 63 75 72 72 65 6e 74 20 63 68 65 63 6b 6f 75   current checkou
11a0: 74 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  t.  See also the
11b0: 20 22 63 6c 65 61 6e 22 20 63 6f 6d 6d 61 6e 64   "clean" command
11c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 65 78 74 72 61 5f  ..*/.void extra_
11d0: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f  cmd(void){.  Blo
11e0: 62 20 70 61 74 68 3b 0a 20 20 42 6c 6f 62 20 72  b path;.  Blob r
11f0: 65 70 6f 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  epo;.  Stmt q;. 
1200: 20 69 6e 74 20 6e 3b 0a 20 20 64 62 5f 6d 75 73   int n;.  db_mus
1210: 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65  t_be_within_tree
1220: 28 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65  ();.  db_multi_e
1230: 78 65 63 28 22 43 52 45 41 54 45 20 54 45 4d 50  xec("CREATE TEMP
1240: 20 54 41 42 4c 45 20 73 66 69 6c 65 28 78 20 54   TABLE sfile(x T
1250: 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 29  EXT PRIMARY KEY)
1260: 22 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e  ");.  n = strlen
1270: 28 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a  (g.zLocalRoot);.
1280: 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 70 61 74    blob_init(&pat
1290: 68 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c  h, g.zLocalRoot,
12a0: 20 6e 2d 31 29 3b 0a 20 20 76 66 69 6c 65 5f 73   n-1);.  vfile_s
12b0: 63 61 6e 28 30 2c 20 26 70 61 74 68 2c 20 62 6c  can(0, &path, bl
12c0: 6f 62 5f 73 69 7a 65 28 26 70 61 74 68 29 29 3b  ob_size(&path));
12d0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
12e0: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
12f0: 20 78 20 46 52 4f 4d 20 73 66 69 6c 65 22 0a 20   x FROM sfile". 
1300: 20 20 20 20 20 22 20 57 48 45 52 45 20 78 20 4e       " WHERE x N
1310: 4f 54 20 49 4e 20 28 27 6d 61 6e 69 66 65 73 74  OT IN ('manifest
1320: 27 2c 27 6d 61 6e 69 66 65 73 74 2e 75 75 69 64  ','manifest.uuid
1330: 27 2c 27 5f 46 4f 53 53 49 4c 5f 27 29 22 0a 20  ','_FOSSIL_')". 
1340: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
1350: 31 22 29 3b 0a 20 20 69 66 28 20 66 69 6c 65 5f  1");.  if( file_
1360: 74 72 65 65 5f 6e 61 6d 65 28 67 2e 7a 52 65 70  tree_name(g.zRep
1370: 6f 73 69 74 6f 72 79 4e 61 6d 65 2c 20 26 72 65  ositoryName, &re
1380: 70 6f 2c 20 30 29 20 29 7b 0a 20 20 20 20 64 62  po, 0) ){.    db
1390: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c  _multi_exec("DEL
13a0: 45 54 45 20 46 52 4f 4d 20 73 66 69 6c 65 20 57  ETE FROM sfile W
13b0: 48 45 52 45 20 78 3d 25 42 22 2c 20 26 72 65 70  HERE x=%B", &rep
13c0: 6f 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  o);.  }.  while(
13d0: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
13e0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
13f0: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 64  printf("%s\n", d
1400: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
1410: 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  , 0));.  }.  db_
1420: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a  finalize(&q);.}.
1430: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
1440: 63 6c 65 61 6e 0a 2a 2a 20 55 73 61 67 65 3a 20  clean.** Usage: 
1450: 25 66 6f 73 73 69 6c 20 63 6c 65 61 6e 20 3f 2d  %fossil clean ?-
1460: 61 6c 6c 3f 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  all?.**.** Delet
1470: 65 20 61 6c 6c 20 22 65 78 74 72 61 22 20 66 69  e all "extra" fi
1480: 6c 65 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  les in the sourc
1490: 65 20 74 72 65 65 2e 20 20 22 45 78 74 72 61 22  e tree.  "Extra"
14a0: 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 66 69   files are.** fi
14b0: 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  les that are not
14c0: 20 6f 66 66 69 63 69 61 6c 6c 79 20 70 61 72 74   officially part
14d0: 20 6f 66 20 74 68 65 20 63 68 65 63 6b 6f 75 74   of the checkout
14e0: 2e 20 20 53 65 65 20 61 6c 73 6f 0a 2a 2a 20 74  .  See also.** t
14f0: 68 65 20 22 65 78 74 72 61 22 20 63 6f 6d 6d 61  he "extra" comma
1500: 6e 64 2e 20 54 68 69 73 20 6f 70 65 72 61 74 69  nd. This operati
1510: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 6e 64  on cannot be und
1520: 6f 6e 65 2e 20 0a 2a 2a 0a 2a 2a 20 59 6f 75 20  one. .**.** You 
1530: 77 69 6c 6c 20 62 65 20 70 72 6f 6d 70 74 65 64  will be prompted
1540: 20 62 65 66 6f 72 65 20 72 65 6d 6f 76 69 6e 67   before removing
1550: 20 65 61 63 68 20 66 69 6c 65 2e 20 49 66 20 79   each file. If y
1560: 6f 75 20 61 72 65 0a 2a 2a 20 73 75 72 65 20 79  ou are.** sure y
1570: 6f 75 20 77 69 73 68 20 74 6f 20 72 65 6d 6f 76  ou wish to remov
1580: 65 20 61 6c 6c 20 22 65 78 74 72 61 22 20 66 69  e all "extra" fi
1590: 6c 65 73 20 79 6f 75 20 63 61 6e 20 73 70 65 63  les you can spec
15a0: 69 66 79 20 74 68 65 0a 2a 2a 20 6f 70 74 69 6f  ify the.** optio
15b0: 6e 61 6c 20 2d 61 6c 6c 20 66 6c 61 67 2e 0a 2a  nal -all flag..*
15c0: 2f 0a 76 6f 69 64 20 63 6c 65 61 6e 5f 63 6d 64  /.void clean_cmd
15d0: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 61 6c  (void){.  int al
15e0: 6c 46 6c 61 67 3b 0a 20 20 42 6c 6f 62 20 70 61  lFlag;.  Blob pa
15f0: 74 68 2c 20 72 65 70 6f 3b 0a 20 20 53 74 6d 74  th, repo;.  Stmt
1600: 20 71 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61   q;.  int n;.  a
1610: 6c 6c 46 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70  llFlag = find_op
1620: 74 69 6f 6e 28 22 61 6c 6c 22 2c 22 61 22 2c 30  tion("all","a",0
1630: 29 21 3d 30 3b 0a 20 20 64 62 5f 6d 75 73 74 5f  )!=0;.  db_must_
1640: 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29  be_within_tree()
1650: 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  ;.  db_multi_exe
1660: 63 28 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  c("CREATE TEMP T
1670: 41 42 4c 45 20 73 66 69 6c 65 28 78 20 54 45 58  ABLE sfile(x TEX
1680: 54 20 50 52 49 4d 41 52 59 20 4b 45 59 29 22 29  T PRIMARY KEY)")
1690: 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 67  ;.  n = strlen(g
16a0: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20  .zLocalRoot);.  
16b0: 62 6c 6f 62 5f 69 6e 69 74 28 26 70 61 74 68 2c  blob_init(&path,
16c0: 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20 6e   g.zLocalRoot, n
16d0: 2d 31 29 3b 0a 20 20 76 66 69 6c 65 5f 73 63 61  -1);.  vfile_sca
16e0: 6e 28 30 2c 20 26 70 61 74 68 2c 20 62 6c 6f 62  n(0, &path, blob
16f0: 5f 73 69 7a 65 28 26 70 61 74 68 29 29 3b 0a 20  _size(&path));. 
1700: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
1710: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25  .      "SELECT %
1720: 51 20 7c 7c 20 78 20 46 52 4f 4d 20 73 66 69 6c  Q || x FROM sfil
1730: 65 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  e".      " WHERE
1740: 20 78 20 4e 4f 54 20 49 4e 20 28 27 6d 61 6e 69   x NOT IN ('mani
1750: 66 65 73 74 27 2c 27 6d 61 6e 69 66 65 73 74 2e  fest','manifest.
1760: 75 75 69 64 27 2c 27 5f 46 4f 53 53 49 4c 5f 27  uuid','_FOSSIL_'
1770: 29 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52  )".      " ORDER
1780: 20 42 59 20 31 22 2c 20 67 2e 7a 4c 6f 63 61 6c   BY 1", g.zLocal
1790: 52 6f 6f 74 29 3b 0a 20 20 69 66 28 20 66 69 6c  Root);.  if( fil
17a0: 65 5f 74 72 65 65 5f 6e 61 6d 65 28 67 2e 7a 52  e_tree_name(g.zR
17b0: 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 2c 20 26  epositoryName, &
17c0: 72 65 70 6f 2c 20 30 29 20 29 7b 0a 20 20 20 20  repo, 0) ){.    
17d0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44  db_multi_exec("D
17e0: 45 4c 45 54 45 20 46 52 4f 4d 20 73 66 69 6c 65  ELETE FROM sfile
17f0: 20 57 48 45 52 45 20 78 3d 25 42 22 2c 20 26 72   WHERE x=%B", &r
1800: 65 70 6f 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  epo);.  }.  whil
1810: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
1820: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1830: 20 20 69 66 28 20 61 6c 6c 46 6c 61 67 20 29 7b    if( allFlag ){
1840: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 64 62  .      unlink(db
1850: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
1860: 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   0));.    }else{
1870: 0a 20 20 20 20 20 20 42 6c 6f 62 20 61 6e 73 3b  .      Blob ans;
1880: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 72 6f  .      char *pro
1890: 6d 70 74 20 3d 20 6d 70 72 69 6e 74 66 28 22 72  mpt = mprintf("r
18a0: 65 6d 6f 76 65 20 75 6e 6d 61 6e 61 67 65 64 20  emove unmanaged 
18b0: 66 69 6c 65 20 5c 22 25 73 5c 22 20 5b 79 2f 4e  file \"%s\" [y/N
18c0: 5d 3f 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]? ",.          
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65      db_column_te
18f0: 78 74 28 26 71 2c 20 30 29 29 3b 0a 20 20 20 20  xt(&q, 0));.    
1900: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 61 6e 73    blob_zero(&ans
1910: 29 3b 0a 20 20 20 20 20 20 70 72 6f 6d 70 74 5f  );.      prompt_
1920: 75 73 65 72 28 70 72 6f 6d 70 74 2c 20 26 61 6e  user(prompt, &an
1930: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 6c  s);.      if( bl
1940: 6f 62 5f 73 74 72 28 26 61 6e 73 29 5b 30 5d 3d  ob_str(&ans)[0]=
1950: 3d 27 79 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='y' ){.        
1960: 75 6e 6c 69 6e 6b 28 64 62 5f 63 6f 6c 75 6d 6e  unlink(db_column
1970: 5f 74 65 78 74 28 26 71 2c 20 30 29 29 3b 0a 20  _text(&q, 0));. 
1980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1990: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
19a0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  q);.}../*.** Pre
19b0: 70 61 72 65 20 61 20 63 6f 6d 6d 69 74 20 63 6f  pare a commit co
19c0: 6d 6d 65 6e 74 2e 20 20 4c 65 74 20 74 68 65 20  mment.  Let the 
19d0: 75 73 65 72 20 6d 6f 64 69 66 79 20 69 74 20 75  user modify it u
19e0: 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 64 69 74  sing the.** edit
19f0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
1a00: 74 68 65 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  the global_confi
1a10: 67 20 74 61 62 6c 65 20 6f 72 20 65 69 74 68 65  g table or eithe
1a20: 72 0a 2a 2a 20 74 68 65 20 56 49 53 55 41 4c 20  r.** the VISUAL 
1a30: 6f 72 20 45 44 49 54 4f 52 20 65 6e 76 69 72 6f  or EDITOR enviro
1a40: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 0a  nment variable..
1a50: 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  **.** Store the 
1a60: 66 69 6e 61 6c 20 63 6f 6d 6d 69 74 20 63 6f 6d  final commit com
1a70: 6d 65 6e 74 20 69 6e 20 70 43 6f 6d 6d 65 6e 74  ment in pComment
1a80: 2e 20 20 70 43 6f 6d 6d 65 6e 74 20 69 73 20 61  .  pComment is a
1a90: 73 73 75 6d 65 64 0a 2a 2a 20 74 6f 20 62 65 20  ssumed.** to be 
1aa0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20  uninitialized - 
1ab0: 61 6e 79 20 70 72 69 6f 72 20 63 6f 6e 74 65 6e  any prior conten
1ac0: 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  t is overwritten
1ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ae0: 20 70 72 65 70 61 72 65 5f 63 6f 6d 6d 69 74 5f   prepare_commit_
1af0: 63 6f 6d 6d 65 6e 74 28 42 6c 6f 62 20 2a 70 43  comment(Blob *pC
1b00: 6f 6d 6d 65 6e 74 29 7b 0a 20 20 63 6f 6e 73 74  omment){.  const
1b10: 20 63 68 61 72 20 2a 7a 45 64 69 74 6f 72 3b 0a   char *zEditor;.
1b20: 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
1b30: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 42  char *zFile;.  B
1b40: 6c 6f 62 20 74 65 78 74 2c 20 6c 69 6e 65 3b 0a  lob text, line;.
1b50: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74    char *zComment
1b60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 62 6c 6f  ;.  int i;.  blo
1b70: 62 5f 73 65 74 28 26 74 65 78 74 2c 0a 20 20 20  b_set(&text,.   
1b80: 20 22 5c 6e 23 20 45 6e 74 65 72 20 63 6f 6d 6d   "\n# Enter comm
1b90: 65 6e 74 73 20 6f 6e 20 74 68 69 73 20 63 6f 6d  ents on this com
1ba0: 6d 69 74 2e 20 20 4c 69 6e 65 73 20 62 65 67 69  mit.  Lines begi
1bb0: 6e 6e 69 6e 67 20 77 69 74 68 20 23 20 61 72 65  nning with # are
1bc0: 20 69 67 6e 6f 72 65 64 5c 6e 22 0a 20 20 20 20   ignored\n".    
1bd0: 22 23 5c 6e 22 0a 20 20 29 3b 0a 20 20 73 74 61  "#\n".  );.  sta
1be0: 74 75 73 5f 72 65 70 6f 72 74 28 26 74 65 78 74  tus_report(&text
1bf0: 2c 20 22 23 20 22 29 3b 0a 20 20 7a 45 64 69 74  , "# ");.  zEdit
1c00: 6f 72 20 3d 20 64 62 5f 67 65 74 28 22 65 64 69  or = db_get("edi
1c10: 74 6f 72 22 2c 20 30 29 3b 0a 20 20 69 66 28 20  tor", 0);.  if( 
1c20: 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20 20  zEditor==0 ){.  
1c30: 20 20 7a 45 64 69 74 6f 72 20 3d 20 67 65 74 65    zEditor = gete
1c40: 6e 76 28 22 56 49 53 55 41 4c 22 29 3b 0a 20 20  nv("VISUAL");.  
1c50: 7d 0a 20 20 69 66 28 20 7a 45 64 69 74 6f 72 3d  }.  if( zEditor=
1c60: 3d 30 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f  =0 ){.    zEdito
1c70: 72 20 3d 20 67 65 74 65 6e 76 28 22 45 44 49 54  r = getenv("EDIT
1c80: 4f 52 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OR");.  }.  if( 
1c90: 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 23 69  zEditor==0 ){.#i
1ca0: 66 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f  fdef __MINGW32__
1cb0: 0a 20 20 20 20 7a 45 64 69 74 6f 72 20 3d 20 22  .    zEditor = "
1cc0: 6e 6f 74 65 70 61 64 22 3b 0a 23 65 6c 73 65 0a  notepad";.#else.
1cd0: 20 20 20 20 7a 45 64 69 74 6f 72 20 3d 20 22 65      zEditor = "e
1ce0: 64 22 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d";.#endif.  }. 
1cf0: 20 7a 46 69 6c 65 20 3d 20 64 62 5f 74 65 78 74   zFile = db_text
1d00: 28 30 2c 20 22 53 45 4c 45 43 54 20 27 25 71 63  (0, "SELECT '%qc
1d10: 69 2d 63 6f 6d 6d 65 6e 74 2d 27 20 7c 7c 20 68  i-comment-' || h
1d20: 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 36 29  ex(randomblob(6)
1d30: 29 20 7c 7c 20 27 2e 74 78 74 27 22 2c 0a 20 20  ) || '.txt'",.  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a   g.zLocalRoot);.
1d60: 23 69 66 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32  #ifdef __MINGW32
1d70: 5f 5f 0a 20 20 62 6c 6f 62 5f 61 64 64 5f 63 72  __.  blob_add_cr
1d80: 28 26 74 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a  (&text);.#endif.
1d90: 20 20 62 6c 6f 62 5f 77 72 69 74 65 5f 74 6f 5f    blob_write_to_
1da0: 66 69 6c 65 28 26 74 65 78 74 2c 20 7a 46 69 6c  file(&text, zFil
1db0: 65 29 3b 0a 20 20 7a 43 6d 64 20 3d 20 6d 70 72  e);.  zCmd = mpr
1dc0: 69 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22  intf("%s \"%s\""
1dd0: 2c 20 7a 45 64 69 74 6f 72 2c 20 7a 46 69 6c 65  , zEditor, zFile
1de0: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73 5c  );.  printf("%s\
1df0: 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 69 66 28  n", zCmd);.  if(
1e00: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 20 29 7b   system(zCmd) ){
1e10: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69  .    fossil_pani
1e20: 63 28 22 65 64 69 74 6f 72 20 61 62 6f 72 74 65  c("editor aborte
1e30: 64 22 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  d");.  }.  blob_
1e40: 72 65 73 65 74 28 26 74 65 78 74 29 3b 0a 20 20  reset(&text);.  
1e50: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66  blob_read_from_f
1e60: 69 6c 65 28 26 74 65 78 74 2c 20 7a 46 69 6c 65  ile(&text, zFile
1e70: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 6d 6f 76 65  );.  blob_remove
1e80: 5f 63 72 28 26 74 65 78 74 29 3b 0a 20 20 75 6e  _cr(&text);.  un
1e90: 6c 69 6e 6b 28 7a 46 69 6c 65 29 3b 0a 20 20 66  link(zFile);.  f
1ea0: 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 62 6c  ree(zFile);.  bl
1eb0: 6f 62 5f 7a 65 72 6f 28 70 43 6f 6d 6d 65 6e 74  ob_zero(pComment
1ec0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 62 6c 6f 62  );.  while( blob
1ed0: 5f 6c 69 6e 65 28 26 74 65 78 74 2c 20 26 6c 69  _line(&text, &li
1ee0: 6e 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ne) ){.    int i
1ef0: 2c 20 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  , n;.    char *z
1f00: 3b 0a 20 20 20 20 6e 20 3d 20 62 6c 6f 62 5f 73  ;.    n = blob_s
1f10: 69 7a 65 28 26 6c 69 6e 65 29 3b 0a 20 20 20 20  ize(&line);.    
1f20: 7a 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 28  z = blob_buffer(
1f30: 26 6c 69 6e 65 29 3b 0a 20 20 20 20 66 6f 72 28  &line);.    for(
1f40: 69 3d 30 3b 20 69 3c 6e 20 26 26 20 69 73 73 70  i=0; i<n && issp
1f50: 61 63 65 28 7a 5b 69 5d 29 3b 20 20 69 2b 2b 29  ace(z[i]);  i++)
1f60: 7b 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 20 26  {}.    if( i<n &
1f70: 26 20 7a 5b 69 5d 3d 3d 27 23 27 20 29 20 63 6f  & z[i]=='#' ) co
1f80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1f90: 69 3c 6e 20 7c 7c 20 62 6c 6f 62 5f 73 69 7a 65  i<n || blob_size
1fa0: 28 70 43 6f 6d 6d 65 6e 74 29 3e 30 20 29 7b 0a  (pComment)>0 ){.
1fb0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
1fc0: 64 66 28 70 43 6f 6d 6d 65 6e 74 2c 20 22 25 62  df(pComment, "%b
1fd0: 22 2c 20 26 6c 69 6e 65 29 3b 0a 20 20 20 20 7d  ", &line);.    }
1fe0: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65  .  }.  blob_rese
1ff0: 74 28 26 74 65 78 74 29 3b 0a 20 20 7a 43 6f 6d  t(&text);.  zCom
2000: 6d 65 6e 74 20 3d 20 62 6c 6f 62 5f 73 74 72 28  ment = blob_str(
2010: 70 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 69 20 3d  pComment);.  i =
2020: 20 73 74 72 6c 65 6e 28 7a 43 6f 6d 6d 65 6e 74   strlen(zComment
2030: 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  );.  while( i>0 
2040: 26 26 20 69 73 73 70 61 63 65 28 7a 43 6f 6d 6d  && isspace(zComm
2050: 65 6e 74 5b 69 2d 31 5d 29 20 29 7b 20 69 2d 2d  ent[i-1]) ){ i--
2060: 3b 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a  ; }.  blob_resiz
2070: 65 28 70 43 6f 6d 6d 65 6e 74 2c 20 69 29 3b 0a  e(pComment, i);.
2080: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
2090: 65 20 74 68 65 20 47 6c 6f 62 61 6c 2e 61 43 6f  e the Global.aCo
20a0: 6d 6d 69 74 46 69 6c 65 5b 5d 20 62 61 73 65 64  mmitFile[] based
20b0: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
20c0: 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 2a  line arguments.*
20d0: 2a 20 74 6f 20 61 20 5b 63 6f 6d 6d 69 74 5d 20  * to a [commit] 
20e0: 63 6f 6d 6d 61 6e 64 2e 20 47 6c 6f 62 61 6c 2e  command. Global.
20f0: 61 43 6f 6d 6d 69 74 46 69 6c 65 20 69 73 20 61  aCommitFile is a
2100: 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
2110: 65 72 73 0a 2a 2a 20 73 69 7a 65 64 20 61 74 20  ers.** sized at 
2120: 28 4e 2b 31 29 2c 20 77 68 65 72 65 20 4e 20 69  (N+1), where N i
2130: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2140: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
2150: 20 74 6f 20 5b 63 6f 6d 6d 69 74 5d 2e 0a 2a 2a   to [commit]..**
2160: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 61 72   The contents ar
2170: 65 20 74 68 65 20 5b 69 64 5d 20 76 61 6c 75 65  e the [id] value
2180: 73 20 66 72 6f 6d 20 74 68 65 20 76 66 69 6c 65  s from the vfile
2190: 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e   table correspon
21a0: 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ding.** to the f
21b0: 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
21c0: 61 73 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a  as arguments..**
21d0: 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 65 6c 65  .** The last ele
21e0: 6d 65 6e 74 20 6f 66 20 61 43 6f 6d 6d 69 74 46  ment of aCommitF
21f0: 69 6c 65 5b 5d 20 69 73 20 61 6c 77 61 79 73 20  ile[] is always 
2200: 30 20 2d 20 69 6e 64 69 63 61 74 69 6e 67 20 74  0 - indicating t
2210: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65  he end.** of the
2220: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   array..**.** If
2230: 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 61   there were no a
2240: 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
2250: 74 6f 20 5b 63 6f 6d 6d 69 74 5d 2c 20 61 43 6f  to [commit], aCo
2260: 6d 6d 69 74 46 69 6c 65 20 69 73 20 6e 6f 74 0a  mmitFile is not.
2270: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
2280: 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 20 4f   remains NULL. O
2290: 74 68 65 72 20 70 61 72 74 73 20 6f 66 20 74 68  ther parts of th
22a0: 65 20 63 6f 64 65 20 69 6e 74 65 72 70 72 65 74  e code interpret
22b0: 20 74 68 69 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e   this.** to mean
22c0: 20 22 61 6c 6c 20 66 69 6c 65 73 22 2e 0a 2a 2f   "all files"..*/
22d0: 0a 76 6f 69 64 20 73 65 6c 65 63 74 5f 63 6f 6d  .void select_com
22e0: 6d 69 74 5f 66 69 6c 65 73 28 76 6f 69 64 29 7b  mit_files(void){
22f0: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3e 32 20  .  if( g.argc>2 
2300: 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  ){.    int ii;. 
2310: 20 20 20 42 6c 6f 62 20 62 3b 0a 20 20 20 20 62     Blob b;.    b
2320: 6c 6f 62 5f 7a 65 72 6f 28 26 62 29 3b 0a 20 20  lob_zero(&b);.  
2330: 20 20 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 20    g.aCommitFile 
2340: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
2350: 69 6e 74 29 2a 28 67 2e 61 72 67 63 2d 31 29 29  int)*(g.argc-1))
2360: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 32 3b  ;..    for(ii=2;
2370: 20 69 69 3c 67 2e 61 72 67 63 3b 20 69 69 2b 2b   ii<g.argc; ii++
2380: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
2390: 3b 0a 20 20 20 20 20 20 66 69 6c 65 5f 74 72 65  ;.      file_tre
23a0: 65 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b 69 69  e_name(g.argv[ii
23b0: 5d 2c 20 26 62 2c 20 31 29 3b 0a 20 20 20 20 20  ], &b, 1);.     
23c0: 20 69 49 64 20 3d 20 64 62 5f 69 6e 74 28 2d 31   iId = db_int(-1
23d0: 2c 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f  , "SELECT id FRO
23e0: 4d 20 76 66 69 6c 65 20 57 48 45 52 45 20 70 61  M vfile WHERE pa
23f0: 74 68 6e 61 6d 65 3d 25 51 22 2c 20 62 6c 6f 62  thname=%Q", blob
2400: 5f 73 74 72 28 26 62 29 29 3b 0a 20 20 20 20 20  _str(&b));.     
2410: 20 69 66 28 20 69 49 64 3c 30 20 29 7b 0a 20 20   if( iId<0 ){.  
2420: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
2430: 61 6c 28 22 66 6f 73 73 69 6c 20 6b 6e 6f 77 73  al("fossil knows
2440: 20 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 3a 20   nothing about: 
2450: 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 69 5d 29  %s", g.argv[ii])
2460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2470: 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 69 69  g.aCommitFile[ii
2480: 2d 32 5d 20 3d 20 69 49 64 3b 0a 20 20 20 20 20  -2] = iId;.     
2490: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 62 29 3b   blob_reset(&b);
24a0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 2e 61 43 6f  .    }.    g.aCo
24b0: 6d 6d 69 74 46 69 6c 65 5b 69 69 2d 32 5d 20 3d  mmitFile[ii-2] =
24c0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
24d0: 20 43 4f 4d 4d 41 4e 44 3a 20 63 6f 6d 6d 69 74   COMMAND: commit
24e0: 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66  .**.** Usage: %f
24f0: 6f 73 73 69 6c 20 63 6f 6d 6d 69 74 20 3f 2d 6d  ossil commit ?-m
2500: 20 43 4f 4d 4d 45 4e 54 3f 20 3f 2d 2d 6e 6f 73   COMMENT? ?--nos
2510: 69 67 6e 3f 20 3f 46 49 4c 45 2e 2e 2e 3f 0a 2a  ign? ?FILE...?.*
2520: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2530: 77 20 76 65 72 73 69 6f 6e 20 63 6f 6e 74 61 69  w version contai
2540: 6e 69 6e 67 20 61 6c 6c 20 6f 66 20 74 68 65 20  ning all of the 
2550: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63  changes in the c
2560: 75 72 72 65 6e 74 0a 2a 2a 20 63 68 65 63 6b 6f  urrent.** checko
2570: 75 74 2e 20 20 59 6f 75 20 77 69 6c 6c 20 62 65  ut.  You will be
2580: 20 70 72 6f 6d 70 74 65 64 20 74 6f 20 65 6e 74   prompted to ent
2590: 65 72 20 61 20 63 68 65 63 6b 2d 69 6e 20 63 6f  er a check-in co
25a0: 6d 6d 65 6e 74 20 75 6e 6c 65 73 73 0a 2a 2a 20  mment unless.** 
25b0: 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20  the "-m" option 
25c0: 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
25d0: 66 79 20 61 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e  fy a comment lin
25e0: 65 2e 20 20 59 6f 75 20 77 69 6c 6c 20 62 65 0a  e.  You will be.
25f0: 2a 2a 20 70 72 6f 6d 70 74 65 64 20 66 6f 72 20  ** prompted for 
2600: 79 6f 75 72 20 47 50 47 20 70 61 73 73 70 68 72  your GPG passphr
2610: 61 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ase in order to 
2620: 73 69 67 6e 20 74 68 65 20 6e 65 77 20 6d 61 6e  sign the new man
2630: 69 66 65 73 74 0a 2a 2a 20 75 6e 6c 65 73 73 20  ifest.** unless 
2640: 74 68 65 20 22 2d 2d 6e 6f 73 69 67 6e 22 20 6f  the "--nosign" o
2650: 70 74 69 6f 6e 73 20 69 73 20 75 73 65 64 2e 20  ptions is used. 
2660: 20 41 6c 6c 20 66 69 6c 65 73 20 74 68 61 74 20   All files that 
2670: 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 20  have.** changed 
2680: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
2690: 64 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 73 75  d unless some su
26a0: 62 73 65 74 20 6f 66 20 66 69 6c 65 73 20 69 73  bset of files is
26b0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f 6e   specified.** on
26c0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
26d0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6f 6d 6d 69  e..*/.void commi
26e0: 74 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 69  t_cmd(void){.  i
26f0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 76 69 64  nt rc;.  int vid
2700: 2c 20 6e 72 69 64 2c 20 6e 76 69 64 2c 20 77 6f  , nrid, nvid, wo
2710: 75 6c 64 46 6f 72 6b 3d 30 3b 0a 20 20 42 6c 6f  uldFork=0;.  Blo
2720: 62 20 63 6f 6d 6d 65 6e 74 3b 0a 20 20 63 6f 6e  b comment;.  con
2730: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e  st char *zCommen
2740: 74 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 53  t;.  Stmt q;.  S
2750: 74 6d 74 20 71 32 3b 0a 20 20 63 68 61 72 20 2a  tmt q2;.  char *
2760: 7a 55 75 69 64 2c 20 2a 7a 44 61 74 65 3b 0a 20  zUuid, *zDate;. 
2770: 20 69 6e 74 20 6e 6f 53 69 67 6e 20 3d 20 30 3b   int noSign = 0;
2780: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2790: 74 6f 20 6f 6d 69 74 20 73 69 67 6e 69 6e 67 20  to omit signing 
27a0: 74 68 65 20 6d 61 6e 69 66 65 73 74 20 75 73 69  the manifest usi
27b0: 6e 67 20 47 50 47 20 2a 2f 0a 20 20 69 6e 74 20  ng GPG */.  int 
27c0: 69 73 41 4d 65 72 67 65 20 3d 20 30 3b 20 20 20  isAMerge = 0;   
27d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 68     /* True if ch
27e0: 65 63 6b 69 6e 67 20 69 6e 20 61 20 6d 65 72 67  ecking in a merg
27f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 63 65  e */.  int force
2800: 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Flag = 0;     /*
2810: 20 46 6f 72 63 65 20 61 20 66 6f 72 6b 20 2a 2f   Force a fork */
2820: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6e 69 66 65  .  char *zManife
2830: 73 74 46 69 6c 65 3b 20 20 20 2f 2a 20 4e 61 6d  stFile;   /* Nam
2840: 65 20 6f 66 20 74 68 65 20 6d 61 6e 69 66 65 73  e of the manifes
2850: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  t file */.  int 
2860: 6e 42 61 73 65 6e 61 6d 65 3b 20 20 20 20 20 20  nBasename;      
2870: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
2880: 22 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2f 22 20  "g.zLocalRoot/" 
2890: 2a 2f 0a 20 20 42 6c 6f 62 20 66 69 6c 65 6e 61  */.  Blob filena
28a0: 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63  me;         /* c
28b0: 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65  omplete filename
28c0: 20 2a 2f 0a 20 20 42 6c 6f 62 20 6d 61 6e 69 66   */.  Blob manif
28d0: 65 73 74 3b 0a 20 20 42 6c 6f 62 20 6d 75 75 69  est;.  Blob muui
28e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
28f0: 20 4d 61 6e 69 66 65 73 74 20 75 75 69 64 20 2a   Manifest uuid *
2900: 2f 0a 20 20 42 6c 6f 62 20 6d 63 6b 73 75 6d 3b  /.  Blob mcksum;
2910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2920: 6c 66 2d 63 68 65 63 6b 73 75 6d 20 6f 6e 20 74  lf-checksum on t
2930: 68 65 20 6d 61 6e 69 66 65 73 74 20 2a 2f 0a 20  he manifest */. 
2940: 20 42 6c 6f 62 20 63 6b 73 75 6d 31 2c 20 63 6b   Blob cksum1, ck
2950: 73 75 6d 32 3b 20 20 20 2f 2a 20 42 65 66 6f 72  sum2;   /* Befor
2960: 65 20 61 6e 64 20 61 66 74 65 72 20 63 6f 6d 6d  e and after comm
2970: 69 74 20 63 68 65 63 6b 73 75 6d 73 20 2a 2f 0a  it checksums */.
2980: 20 20 42 6c 6f 62 20 63 6b 73 75 6d 31 62 3b 20    Blob cksum1b; 
2990: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
29a0: 6b 73 75 6d 20 72 65 63 6f 72 64 65 64 20 69 6e  ksum recorded in
29b0: 20 74 68 65 20 6d 61 6e 69 66 65 73 74 20 2a 2f   the manifest */
29c0: 0a 20 0a 20 20 75 72 6c 5f 70 72 6f 78 79 5f 6f  . .  url_proxy_o
29d0: 70 74 69 6f 6e 73 28 29 3b 0a 20 20 6e 6f 53 69  ptions();.  noSi
29e0: 67 6e 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e  gn = find_option
29f0: 28 22 6e 6f 73 69 67 6e 22 2c 22 22 2c 30 29 21  ("nosign","",0)!
2a00: 3d 30 3b 0a 20 20 7a 43 6f 6d 6d 65 6e 74 20 3d  =0;.  zComment =
2a10: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 63 6f   find_option("co
2a20: 6d 6d 65 6e 74 22 2c 22 6d 22 2c 31 29 3b 0a 20  mment","m",1);. 
2a30: 20 66 6f 72 63 65 46 6c 61 67 20 3d 20 66 69 6e   forceFlag = fin
2a40: 64 5f 6f 70 74 69 6f 6e 28 22 66 6f 72 63 65 22  d_option("force"
2a50: 2c 20 22 66 22 2c 20 30 29 21 3d 30 3b 0a 20 20  , "f", 0)!=0;.  
2a60: 64 62 5f 6d 75 73 74 5f 62 65 5f 77 69 74 68 69  db_must_be_withi
2a70: 6e 5f 74 72 65 65 28 29 3b 0a 20 20 6e 6f 53 69  n_tree();.  noSi
2a80: 67 6e 20 3d 20 64 62 5f 67 65 74 5f 62 6f 6f 6c  gn = db_get_bool
2a90: 65 61 6e 28 22 6f 6d 69 74 73 69 67 6e 22 2c 20  ean("omitsign", 
2aa0: 30 29 7c 6e 6f 53 69 67 6e 3b 0a 20 20 69 66 28  0)|noSign;.  if(
2ab0: 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28   db_get_boolean(
2ac0: 22 63 6c 65 61 72 73 69 67 6e 22 2c 20 31 29 3d  "clearsign", 1)=
2ad0: 3d 30 20 29 7b 20 6e 6f 53 69 67 6e 20 3d 20 31  =0 ){ noSign = 1
2ae0: 3b 20 7d 0a 20 20 76 65 72 69 66 79 5f 61 6c 6c  ; }.  verify_all
2af0: 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 0a 20 20 2f  _options();..  /
2b00: 2a 0a 20 20 2a 2a 20 41 75 74 6f 73 79 6e 63 20  *.  ** Autosync 
2b10: 69 66 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  if requested..  
2b20: 2a 2f 0a 20 20 61 75 74 6f 73 79 6e 63 28 41 55  */.  autosync(AU
2b30: 54 4f 53 59 4e 43 5f 50 55 4c 4c 29 3b 0a 20 20  TOSYNC_PULL);.  
2b40: 0a 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20  .  /* There are 
2b50: 74 77 6f 20 77 61 79 73 20 74 68 69 73 20 63 6f  two ways this co
2b60: 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20 65 78 65  mmand may be exe
2b70: 63 75 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  cuted. If there 
2b80: 61 72 65 0a 20 20 2a 2a 20 6e 6f 20 61 72 67 75  are.  ** no argu
2b90: 6d 65 6e 74 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ments following 
2ba0: 74 68 65 20 77 6f 72 64 20 22 63 6f 6d 6d 69 74  the word "commit
2bb0: 22 2c 20 74 68 65 6e 20 61 6c 6c 20 6d 6f 64 69  ", then all modi
2bc0: 66 69 65 64 20 66 69 6c 65 73 0a 20 20 2a 2a 20  fied files.  ** 
2bd0: 69 6e 20 74 68 65 20 63 68 65 63 6b 65 64 20 6f  in the checked o
2be0: 75 74 20 64 69 72 65 63 74 6f 72 79 20 61 72 65  ut directory are
2bf0: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 6f   committed. If o
2c00: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ne or more argum
2c10: 65 6e 74 73 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  ents.  ** follow
2c20: 73 20 22 63 6f 6d 6d 69 74 22 2c 20 74 68 65 6e  s "commit", then
2c30: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 66 69 6c 65   only those file
2c40: 73 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 2e  s are committed.
2c50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 66 74 65 72  .  **.  ** After
2c60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
2c70: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 68 61 73  unction call has
2c80: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 47   returned, the G
2c90: 6c 6f 62 61 6c 2e 61 43 6f 6d 6d 69 74 46 69 6c  lobal.aCommitFil
2ca0: 65 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20 69  e[].  ** array i
2cb0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 63  s allocated to c
2cc0: 6f 6e 74 61 69 6e 20 74 68 65 20 22 69 64 22 20  ontain the "id" 
2cd0: 66 69 65 6c 64 20 66 72 6f 6d 20 74 68 65 20 76  field from the v
2ce0: 66 69 6c 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20  file table.  ** 
2cf0: 66 6f 72 20 65 61 63 68 20 66 69 6c 65 20 74 6f  for each file to
2d00: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 20 4f   be committed. O
2d10: 72 2c 20 69 66 20 61 43 6f 6d 6d 69 74 46 69 6c  r, if aCommitFil
2d20: 65 20 69 73 20 4e 55 4c 4c 2c 20 61 6c 6c 20 66  e is NULL, all f
2d30: 69 6c 65 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  iles.  ** should
2d40: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 20   be committed.. 
2d50: 20 2a 2f 0a 20 20 73 65 6c 65 63 74 5f 63 6f 6d   */.  select_com
2d60: 6d 69 74 5f 66 69 6c 65 73 28 29 3b 0a 20 20 69  mit_files();.  i
2d70: 73 41 4d 65 72 67 65 20 3d 20 64 62 5f 65 78 69  sAMerge = db_exi
2d80: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
2d90: 4f 4d 20 76 6d 65 72 67 65 22 29 3b 0a 20 20 69  OM vmerge");.  i
2da0: 66 28 20 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65  f( g.aCommitFile
2db0: 20 26 26 20 69 73 41 4d 65 72 67 65 20 29 7b 0a   && isAMerge ){.
2dc0: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
2dd0: 28 22 63 61 6e 6e 6f 74 20 64 6f 20 61 20 70 61  ("cannot do a pa
2de0: 72 74 69 61 6c 20 63 6f 6d 6d 69 74 20 6f 66 20  rtial commit of 
2df0: 61 20 6d 65 72 67 65 22 29 3b 0a 20 20 7d 0a 0a  a merge");.  }..
2e00: 20 20 75 73 65 72 5f 73 65 6c 65 63 74 28 29 3b    user_select();
2e10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
2e20: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65   that the user e
2e30: 78 69 73 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  xists..  */.  if
2e40: 28 20 21 64 62 5f 65 78 69 73 74 73 28 22 53 45  ( !db_exists("SE
2e50: 4c 45 43 54 20 31 20 46 52 4f 4d 20 75 73 65 72  LECT 1 FROM user
2e60: 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d 25 51 22   WHERE login=%Q"
2e70: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 20 29 7b 0a 20  , g.zLogin) ){. 
2e80: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
2e90: 22 6e 6f 20 73 75 63 68 20 75 73 65 72 3a 20 25  "no such user: %
2ea0: 73 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20  s", g.zLogin);. 
2eb0: 20 7d 0a 20 20 0a 20 20 64 62 5f 62 65 67 69 6e   }.  .  db_begin
2ec0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  _transaction();.
2ed0: 20 20 64 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f    db_record_repo
2ee0: 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28  sitory_filename(
2ef0: 30 29 3b 0a 20 20 72 63 20 3d 20 75 6e 73 61 76  0);.  rc = unsav
2f00: 65 64 5f 63 68 61 6e 67 65 73 28 29 3b 0a 20 20  ed_changes();.  
2f10: 69 66 28 20 72 63 3d 3d 30 20 26 26 20 21 69 73  if( rc==0 && !is
2f20: 41 4d 65 72 67 65 20 26 26 20 21 66 6f 72 63 65  AMerge && !force
2f30: 46 6c 61 67 20 29 7b 0a 20 20 20 20 66 6f 73 73  Flag ){.    foss
2f40: 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 74 68 69 6e  il_panic("nothin
2f50: 67 20 68 61 73 20 63 68 61 6e 67 65 64 22 29 3b  g has changed");
2f60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
2f70: 65 20 6f 72 20 6d 6f 72 65 20 66 69 6c 65 73 20  e or more files 
2f80: 74 68 61 74 20 77 65 72 65 20 6e 61 6d 65 64 20  that were named 
2f90: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
2fa0: 69 6e 65 20 68 61 76 65 20 6e 6f 74 0a 20 20 2a  ine have not.  *
2fb0: 2a 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c  * been modified,
2fc0: 20 62 61 69 6c 20 6f 75 74 20 6e 6f 77 2e 0a 20   bail out now.. 
2fd0: 20 2a 2f 0a 20 20 69 66 28 20 67 2e 61 43 6f 6d   */.  if( g.aCom
2fe0: 6d 69 74 46 69 6c 65 20 29 7b 0a 20 20 20 20 42  mitFile ){.    B
2ff0: 6c 6f 62 20 75 6e 6d 6f 64 69 66 69 65 64 3b 0a  lob unmodified;.
3000: 20 20 20 20 6d 65 6d 73 65 74 28 26 75 6e 6d 6f      memset(&unmo
3010: 64 69 66 69 65 64 2c 20 30 2c 20 73 69 7a 65 6f  dified, 0, sizeo
3020: 66 28 42 6c 6f 62 29 29 3b 0a 20 20 20 20 62 6c  f(Blob));.    bl
3030: 6f 62 5f 69 6e 69 74 28 26 75 6e 6d 6f 64 69 66  ob_init(&unmodif
3040: 69 65 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ied, 0, 0);.    
3050: 64 62 5f 62 6c 6f 62 28 26 75 6e 6d 6f 64 69 66  db_blob(&unmodif
3060: 69 65 64 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  ied, .      "SEL
3070: 45 43 54 20 70 61 74 68 6e 61 6d 65 20 46 52 4f  ECT pathname FRO
3080: 4d 20 76 66 69 6c 65 20 57 48 45 52 45 20 63 68  M vfile WHERE ch
3090: 6e 67 65 64 20 3d 20 30 20 41 4e 44 20 66 69 6c  nged = 0 AND fil
30a0: 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 28 69 64  e_is_selected(id
30b0: 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  )".    );.    if
30c0: 28 20 73 74 72 6c 65 6e 28 62 6c 6f 62 5f 73 74  ( strlen(blob_st
30d0: 72 28 26 75 6e 6d 6f 64 69 66 69 65 64 29 29 20  r(&unmodified)) 
30e0: 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  ){.      fossil_
30f0: 70 61 6e 69 63 28 22 66 69 6c 65 20 25 73 20 68  panic("file %s h
3100: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 22 2c  as not changed",
3110: 20 62 6c 6f 62 5f 73 74 72 28 26 75 6e 6d 6f 64   blob_str(&unmod
3120: 69 66 69 65 64 29 29 3b 0a 20 20 20 20 7d 0a 20  ified));.    }. 
3130: 20 7d 0a 0a 20 20 76 69 64 20 3d 20 64 62 5f 6c   }..  vid = db_l
3140: 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75  get_int("checkou
3150: 74 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  t", 0);.  if( db
3160: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
3170: 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  1 FROM plink WHE
3180: 52 45 20 70 69 64 3d 25 64 22 2c 20 76 69 64 29  RE pid=%d", vid)
3190: 20 29 7b 0a 20 20 20 20 77 6f 75 6c 64 46 6f 72   ){.    wouldFor
31a0: 6b 3d 31 3b 0a 20 20 20 20 69 66 28 20 66 6f 72  k=1;.    if( for
31b0: 63 65 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  ceFlag==0 ){.   
31c0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
31d0: 22 77 6f 75 6c 64 20 66 6f 72 6b 2e 20 20 75 73  "would fork.  us
31e0: 65 20 2d 66 20 6f 72 20 2d 2d 66 6f 72 63 65 22  e -f or --force"
31f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  );.    }.  }.  v
3200: 66 69 6c 65 5f 61 67 67 72 65 67 61 74 65 5f 63  file_aggregate_c
3210: 68 65 63 6b 73 75 6d 5f 64 69 73 6b 28 76 69 64  hecksum_disk(vid
3220: 2c 20 26 63 6b 73 75 6d 31 29 3b 0a 20 20 69 66  , &cksum1);.  if
3230: 28 20 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ( zComment ){.  
3240: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6d    blob_zero(&com
3250: 6d 65 6e 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  ment);.    blob_
3260: 61 70 70 65 6e 64 28 26 63 6f 6d 6d 65 6e 74 2c  append(&comment,
3270: 20 7a 43 6f 6d 6d 65 6e 74 2c 20 2d 31 29 3b 0a   zComment, -1);.
3280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 65    }else{.    pre
3290: 70 61 72 65 5f 63 6f 6d 6d 69 74 5f 63 6f 6d 6d  pare_commit_comm
32a0: 65 6e 74 28 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20  ent(&comment);. 
32b0: 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 31 3a   }..  /* Step 1:
32c0: 20 49 6e 73 65 72 74 20 72 65 63 6f 72 64 73 20   Insert records 
32d0: 66 6f 72 20 61 6c 6c 20 6d 6f 64 69 66 69 65 64  for all modified
32e0: 20 66 69 6c 65 73 20 69 6e 74 6f 20 74 68 65 20   files into the 
32f0: 62 6c 6f 62 20 0a 20 20 2a 2a 20 74 61 62 6c 65  blob .  ** table
3300: 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  . If there were 
3310: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
3320: 20 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   to this command
3330: 2c 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20  , only.  ** the 
3340: 69 64 65 6e 74 69 66 69 65 64 20 66 69 6c 73 20  identified fils 
3350: 61 72 65 20 69 6e 73 65 72 74 65 64 20 28 69 66  are inserted (if
3360: 20 74 68 65 79 20 68 61 76 65 20 62 65 65 6e 20   they have been 
3370: 6d 6f 64 69 66 69 65 64 29 2e 0a 20 20 2a 2f 0a  modified)..  */.
3380: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
3390: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c  .    "SELECT id,
33a0: 20 25 51 20 7c 7c 20 70 61 74 68 6e 61 6d 65 2c   %Q || pathname,
33b0: 20 6d 72 69 64 20 46 52 4f 4d 20 76 66 69 6c 65   mrid FROM vfile
33c0: 20 22 0a 20 20 20 20 22 57 48 45 52 45 20 63 68   ".    "WHERE ch
33d0: 6e 67 65 64 3d 3d 31 20 41 4e 44 20 4e 4f 54 20  nged==1 AND NOT 
33e0: 64 65 6c 65 74 65 64 20 41 4e 44 20 66 69 6c 65  deleted AND file
33f0: 5f 69 73 5f 73 65 6c 65 63 74 65 64 28 69 64 29  _is_selected(id)
3400: 22 0a 20 20 20 20 2c 20 67 2e 7a 4c 6f 63 61 6c  ".    , g.zLocal
3410: 52 6f 6f 74 0a 20 20 29 3b 0a 20 20 77 68 69 6c  Root.  );.  whil
3420: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
3430: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
3440: 20 20 69 6e 74 20 69 64 2c 20 72 69 64 3b 0a 20    int id, rid;. 
3450: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
3460: 46 75 6c 6c 6e 61 6d 65 3b 0a 20 20 20 20 42 6c  Fullname;.    Bl
3470: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 0a 20 20 20  ob content;..   
3480: 20 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f   id = db_column_
3490: 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  int(&q, 0);.    
34a0: 7a 46 75 6c 6c 6e 61 6d 65 20 3d 20 64 62 5f 63  zFullname = db_c
34b0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
34c0: 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 64 62 5f  );.    rid = db_
34d0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 32  column_int(&q, 2
34e0: 29 3b 0a 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72  );..    blob_zer
34f0: 6f 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  o(&content);.   
3500: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f   blob_read_from_
3510: 66 69 6c 65 28 26 63 6f 6e 74 65 6e 74 2c 20 7a  file(&content, z
3520: 46 75 6c 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Fullname);.    n
3530: 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75  rid = content_pu
3540: 74 28 26 63 6f 6e 74 65 6e 74 2c 20 30 2c 20 30  t(&content, 0, 0
3550: 29 3b 0a 20 20 20 20 69 66 28 20 72 69 64 3e 30  );.    if( rid>0
3560: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 65 6e   ){.      conten
3570: 74 5f 64 65 6c 74 69 66 79 28 72 69 64 2c 20 6e  t_deltify(rid, n
3580: 72 69 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  rid, 0);.    }. 
3590: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
35a0: 28 22 55 50 44 41 54 45 20 76 66 69 6c 65 20 53  ("UPDATE vfile S
35b0: 45 54 20 6d 72 69 64 3d 25 64 2c 20 72 69 64 3d  ET mrid=%d, rid=
35c0: 25 64 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c  %d WHERE id=%d",
35d0: 20 6e 72 69 64 2c 6e 72 69 64 2c 69 64 29 3b 0a   nrid,nrid,id);.
35e0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
35f0: 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e  c("INSERT OR IGN
3600: 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e 74 20  ORE INTO unsent 
3610: 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e 72 69  VALUES(%d)", nri
3620: 64 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  d);.  }.  db_fin
3630: 61 6c 69 7a 65 28 26 71 29 3b 0a 0a 20 20 2f 2a  alize(&q);..  /*
3640: 20 43 72 65 61 74 65 20 74 68 65 20 6d 61 6e 69   Create the mani
3650: 66 65 73 74 20 2a 2f 0a 20 20 62 6c 6f 62 5f 7a  fest */.  blob_z
3660: 65 72 6f 28 26 6d 61 6e 69 66 65 73 74 29 3b 0a  ero(&manifest);.
3670: 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28    if( blob_size(
3680: 26 63 6f 6d 6d 65 6e 74 29 3d 3d 30 20 29 7b 0a  &comment)==0 ){.
3690: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
36a0: 26 63 6f 6d 6d 65 6e 74 2c 20 22 28 6e 6f 20 63  &comment, "(no c
36b0: 6f 6d 6d 65 6e 74 29 22 2c 20 2d 31 29 3b 0a 20  omment)", -1);. 
36c0: 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64   }.  blob_append
36d0: 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 43 20  f(&manifest, "C 
36e0: 25 46 5c 6e 22 2c 20 62 6c 6f 62 5f 73 74 72 28  %F\n", blob_str(
36f0: 26 63 6f 6d 6d 65 6e 74 29 29 3b 0a 20 20 7a 44  &comment));.  zD
3700: 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ate = db_text(0,
3710: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
3720: 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20 20 7a 44  e('now')");.  zD
3730: 61 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20  ate[10] = 'T';. 
3740: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d   blob_appendf(&m
3750: 61 6e 69 66 65 73 74 2c 20 22 44 20 25 73 5c 6e  anifest, "D %s\n
3760: 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 64 62 5f  ", zDate);.  db_
3770: 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20  prepare(&q,.    
3780: 22 53 45 4c 45 43 54 20 70 61 74 68 6e 61 6d 65  "SELECT pathname
3790: 2c 20 75 75 69 64 20 46 52 4f 4d 20 76 66 69 6c  , uuid FROM vfil
37a0: 65 20 4a 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20 76  e JOIN blob ON v
37b0: 66 69 6c 65 2e 6d 72 69 64 3d 62 6c 6f 62 2e 72  file.mrid=blob.r
37c0: 69 64 22 0a 20 20 20 20 22 20 57 48 45 52 45 20  id".    " WHERE 
37d0: 4e 4f 54 20 64 65 6c 65 74 65 64 20 41 4e 44 20  NOT deleted AND 
37e0: 76 66 69 6c 65 2e 76 69 64 3d 25 64 22 0a 20 20  vfile.vid=%d".  
37f0: 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 22 2c    " ORDER BY 1",
3800: 20 76 69 64 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65   vid);.  blob_ze
3810: 72 6f 28 26 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  ro(&filename);. 
3820: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 66   blob_appendf(&f
3830: 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2f 22 2c 20  ilename, "%s/", 
3840: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  g.zLocalRoot);. 
3850: 20 6e 42 61 73 65 6e 61 6d 65 20 3d 20 62 6c 6f   nBasename = blo
3860: 62 5f 73 69 7a 65 28 26 66 69 6c 65 6e 61 6d 65  b_size(&filename
3870: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73  );.  while( db_s
3880: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
3890: 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
38a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64   char *zName = d
38b0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
38c0: 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 0);.    const 
38d0: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62  char *zUuid = db
38e0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
38f0: 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
3900: 68 61 72 20 2a 7a 50 65 72 6d 3b 0a 20 20 20 20  har *zPerm;.    
3910: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 66 69 6c  blob_append(&fil
3920: 65 6e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  ename, zName, -1
3930: 29 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  );.    if( file_
3940: 69 73 65 78 65 28 62 6c 6f 62 5f 73 74 72 28 26  isexe(blob_str(&
3950: 66 69 6c 65 6e 61 6d 65 29 29 20 29 7b 0a 20 20  filename)) ){.  
3960: 20 20 20 20 7a 50 65 72 6d 20 3d 20 22 20 78 22      zPerm = " x"
3970: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3980: 20 20 20 7a 50 65 72 6d 20 3d 20 22 22 3b 0a 20     zPerm = "";. 
3990: 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72 65     }.    blob_re
39a0: 73 69 7a 65 28 26 66 69 6c 65 6e 61 6d 65 2c 20  size(&filename, 
39b0: 6e 42 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nBasename);.    
39c0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
39d0: 6e 69 66 65 73 74 2c 20 22 46 20 25 46 20 25 73  nifest, "F %F %s
39e0: 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 7a 55  %s\n", zName, zU
39f0: 75 69 64 2c 20 7a 50 65 72 6d 29 3b 0a 20 20 7d  uid, zPerm);.  }
3a00: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66  .  blob_reset(&f
3a10: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 64 62 5f 66  ilename);.  db_f
3a20: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7a  inalize(&q);.  z
3a30: 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30  Uuid = db_text(0
3a40: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
3a50: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
3a60: 69 64 3d 25 64 22 2c 20 76 69 64 29 3b 0a 20 20  id=%d", vid);.  
3a70: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
3a80: 6e 69 66 65 73 74 2c 20 22 50 20 25 73 22 2c 20  nifest, "P %s", 
3a90: 7a 55 75 69 64 29 3b 0a 0a 20 20 64 62 5f 70 72  zUuid);..  db_pr
3aa0: 65 70 61 72 65 28 26 71 32 2c 20 22 53 45 4c 45  epare(&q2, "SELE
3ab0: 43 54 20 6d 65 72 67 65 20 46 52 4f 4d 20 76 6d  CT merge FROM vm
3ac0: 65 72 67 65 20 57 48 45 52 45 20 69 64 3d 3a 69  erge WHERE id=:i
3ad0: 64 22 29 3b 0a 20 20 64 62 5f 62 69 6e 64 5f 69  d");.  db_bind_i
3ae0: 6e 74 28 26 71 32 2c 20 22 3a 69 64 22 2c 20 30  nt(&q2, ":id", 0
3af0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73  );.  while( db_s
3b00: 74 65 70 28 26 71 32 29 3d 3d 53 51 4c 49 54 45  tep(&q2)==SQLITE
3b10: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
3b20: 6d 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  mid = db_column_
3b30: 69 6e 74 28 26 71 32 2c 20 30 29 3b 0a 20 20 20  int(&q2, 0);.   
3b40: 20 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74   zUuid = db_text
3b50: 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64  (0, "SELECT uuid
3b60: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
3b70: 20 72 69 64 3d 25 64 22 2c 20 6d 69 64 29 3b 0a   rid=%d", mid);.
3b80: 20 20 20 20 69 66 28 20 7a 55 75 69 64 20 29 7b      if( zUuid ){
3b90: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
3ba0: 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22  ndf(&manifest, "
3bb0: 20 25 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20   %s", zUuid);.  
3bc0: 20 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b      free(zUuid);
3bd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f  .    }.  }.  db_
3be0: 72 65 73 65 74 28 26 71 32 29 3b 0a 0a 20 20 62  reset(&q2);..  b
3bf0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
3c00: 69 66 65 73 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ifest, "\n");.  
3c10: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
3c20: 6e 69 66 65 73 74 2c 20 22 52 20 25 62 5c 6e 22  nifest, "R %b\n"
3c30: 2c 20 26 63 6b 73 75 6d 31 29 3b 0a 20 20 62 6c  , &cksum1);.  bl
3c40: 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69  ob_appendf(&mani
3c50: 66 65 73 74 2c 20 22 55 20 25 46 5c 6e 22 2c 20  fest, "U %F\n", 
3c60: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 6d 64 35  g.zLogin);.  md5
3c70: 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e 69 66 65  sum_blob(&manife
3c80: 73 74 2c 20 26 6d 63 6b 73 75 6d 29 3b 0a 20 20  st, &mcksum);.  
3c90: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
3ca0: 6e 69 66 65 73 74 2c 20 22 5a 20 25 62 5c 6e 22  nifest, "Z %b\n"
3cb0: 2c 20 26 6d 63 6b 73 75 6d 29 3b 0a 20 20 7a 4d  , &mcksum);.  zM
3cc0: 61 6e 69 66 65 73 74 46 69 6c 65 20 3d 20 6d 70  anifestFile = mp
3cd0: 72 69 6e 74 66 28 22 25 73 6d 61 6e 69 66 65 73  rintf("%smanifes
3ce0: 74 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74  t", g.zLocalRoot
3cf0: 29 3b 0a 20 20 69 66 28 20 21 6e 6f 53 69 67 6e  );.  if( !noSign
3d00: 20 26 26 20 63 6c 65 61 72 73 69 67 6e 28 26 6d   && clearsign(&m
3d10: 61 6e 69 66 65 73 74 2c 20 26 6d 61 6e 69 66 65  anifest, &manife
3d20: 73 74 29 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20  st) ){.    Blob 
3d30: 61 6e 73 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65  ans;.    blob_ze
3d40: 72 6f 28 26 61 6e 73 29 3b 0a 20 20 20 20 70 72  ro(&ans);.    pr
3d50: 6f 6d 70 74 5f 75 73 65 72 28 22 75 6e 61 62 6c  ompt_user("unabl
3d60: 65 20 74 6f 20 73 69 67 6e 20 6d 61 6e 69 66 65  e to sign manife
3d70: 73 74 2e 20 20 63 6f 6e 74 69 6e 75 65 20 5b 79  st.  continue [y
3d80: 2f 4e 5d 3f 20 22 2c 20 26 61 6e 73 29 3b 0a 20  /N]? ", &ans);. 
3d90: 20 20 20 69 66 28 20 62 6c 6f 62 5f 73 74 72 28     if( blob_str(
3da0: 26 61 6e 73 29 5b 30 5d 21 3d 27 79 27 20 29 7b  &ans)[0]!='y' ){
3db0: 0a 20 20 20 20 20 20 64 62 5f 65 6e 64 5f 74 72  .      db_end_tr
3dc0: 61 6e 73 61 63 74 69 6f 6e 28 31 29 3b 0a 20 20  ansaction(1);.  
3dd0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
3de0: 20 7d 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 77 72   }.  }.  blob_wr
3df0: 69 74 65 5f 74 6f 5f 66 69 6c 65 28 26 6d 61 6e  ite_to_file(&man
3e00: 69 66 65 73 74 2c 20 7a 4d 61 6e 69 66 65 73 74  ifest, zManifest
3e10: 46 69 6c 65 29 3b 0a 20 20 62 6c 6f 62 5f 72 65  File);.  blob_re
3e20: 73 65 74 28 26 6d 61 6e 69 66 65 73 74 29 3b 0a  set(&manifest);.
3e30: 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d    blob_read_from
3e40: 5f 66 69 6c 65 28 26 6d 61 6e 69 66 65 73 74 2c  _file(&manifest,
3e50: 20 7a 4d 61 6e 69 66 65 73 74 46 69 6c 65 29 3b   zManifestFile);
3e60: 0a 20 20 66 72 65 65 28 7a 4d 61 6e 69 66 65 73  .  free(zManifes
3e70: 74 46 69 6c 65 29 3b 0a 20 20 6e 76 69 64 20 3d  tFile);.  nvid =
3e80: 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 6d 61   content_put(&ma
3e90: 6e 69 66 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20  nifest, 0, 0);. 
3ea0: 20 69 66 28 20 6e 76 69 64 3d 3d 30 20 29 7b 0a   if( nvid==0 ){.
3eb0: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63      fossil_panic
3ec0: 28 22 74 72 6f 75 62 6c 65 20 63 6f 6d 6d 69 74  ("trouble commit
3ed0: 74 69 6e 67 20 6d 61 6e 69 66 65 73 74 3a 20 25  ting manifest: %
3ee0: 73 22 2c 20 67 2e 7a 45 72 72 4d 73 67 29 3b 0a  s", g.zErrMsg);.
3ef0: 20 20 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65    }.  db_multi_e
3f00: 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49  xec("INSERT OR I
3f10: 47 4e 4f 52 45 20 49 4e 54 4f 20 75 6e 73 65 6e  GNORE INTO unsen
3f20: 74 20 56 41 4c 55 45 53 28 25 64 29 22 2c 20 6e  t VALUES(%d)", n
3f30: 76 69 64 29 3b 0a 20 20 6d 61 6e 69 66 65 73 74  vid);.  manifest
3f40: 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e 76 69 64 2c  _crosslink(nvid,
3f50: 20 26 6d 61 6e 69 66 65 73 74 29 3b 0a 20 20 63   &manifest);.  c
3f60: 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66 79 28 76  ontent_deltify(v
3f70: 69 64 2c 20 6e 76 69 64 2c 20 30 29 3b 0a 20 20  id, nvid, 0);.  
3f80: 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28  zUuid = db_text(
3f90: 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20  0, "SELECT uuid 
3fa0: 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20  FROM blob WHERE 
3fb0: 72 69 64 3d 25 64 22 2c 20 6e 76 69 64 29 3b 0a  rid=%d", nvid);.
3fc0: 20 20 70 72 69 6e 74 66 28 22 4e 65 77 5f 56 65    printf("New_Ve
3fd0: 72 73 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 55  rsion: %s\n", zU
3fe0: 75 69 64 29 3b 0a 20 20 7a 4d 61 6e 69 66 65 73  uid);.  zManifes
3ff0: 74 46 69 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28  tFile = mprintf(
4000: 22 25 73 6d 61 6e 69 66 65 73 74 2e 75 75 69 64  "%smanifest.uuid
4010: 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29  ", g.zLocalRoot)
4020: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d  ;.  blob_zero(&m
4030: 75 75 69 64 29 3b 0a 20 20 62 6c 6f 62 5f 61 70  uuid);.  blob_ap
4040: 70 65 6e 64 66 28 26 6d 75 75 69 64 2c 20 22 25  pendf(&muuid, "%
4050: 73 5c 6e 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20  s\n", zUuid);.  
4060: 62 6c 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69  blob_write_to_fi
4070: 6c 65 28 26 6d 75 75 69 64 2c 20 7a 4d 61 6e 69  le(&muuid, zMani
4080: 66 65 73 74 46 69 6c 65 29 3b 0a 20 20 66 72 65  festFile);.  fre
4090: 65 28 7a 4d 61 6e 69 66 65 73 74 46 69 6c 65 29  e(zManifestFile)
40a0: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
40b0: 6d 75 75 69 64 29 3b 0a 0a 20 20 0a 20 20 2f 2a  muuid);..  .  /*
40c0: 20 55 70 64 61 74 65 20 74 68 65 20 76 66 69 6c   Update the vfil
40d0: 65 20 61 6e 64 20 76 6d 65 72 67 65 20 74 61 62  e and vmerge tab
40e0: 6c 65 73 20 2a 2f 0a 20 20 64 62 5f 6d 75 6c 74  les */.  db_mult
40f0: 69 5f 65 78 65 63 28 0a 20 20 20 20 22 44 45 4c  i_exec(.    "DEL
4100: 45 54 45 20 46 52 4f 4d 20 76 66 69 6c 65 20 57  ETE FROM vfile W
4110: 48 45 52 45 20 28 76 69 64 21 3d 25 64 20 4f 52  HERE (vid!=%d OR
4120: 20 64 65 6c 65 74 65 64 29 20 41 4e 44 20 66 69   deleted) AND fi
4130: 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 28 69  le_is_selected(i
4140: 64 29 3b 22 0a 20 20 20 20 22 44 45 4c 45 54 45  d);".    "DELETE
4150: 20 46 52 4f 4d 20 76 6d 65 72 67 65 20 57 48 45   FROM vmerge WHE
4160: 52 45 20 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63  RE file_is_selec
4170: 74 65 64 28 69 64 29 20 4f 52 20 69 64 3d 30 3b  ted(id) OR id=0;
4180: 22 0a 20 20 20 20 22 55 50 44 41 54 45 20 76 66  ".    "UPDATE vf
4190: 69 6c 65 20 53 45 54 20 76 69 64 3d 25 64 3b 22  ile SET vid=%d;"
41a0: 0a 20 20 20 20 22 55 50 44 41 54 45 20 76 66 69  .    "UPDATE vfi
41b0: 6c 65 20 53 45 54 20 72 69 64 3d 6d 72 69 64 2c  le SET rid=mrid,
41c0: 20 63 68 6e 67 65 64 3d 30 2c 20 64 65 6c 65 74   chnged=0, delet
41d0: 65 64 3d 30 20 57 48 45 52 45 20 66 69 6c 65 5f  ed=0 WHERE file_
41e0: 69 73 5f 73 65 6c 65 63 74 65 64 28 69 64 29 3b  is_selected(id);
41f0: 22 0a 20 20 20 20 2c 20 76 69 64 2c 20 6e 76 69  ".    , vid, nvi
4200: 64 0a 20 20 29 3b 0a 20 20 64 62 5f 6c 73 65 74  d.  );.  db_lset
4210: 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22 2c  _int("checkout",
4220: 20 6e 76 69 64 29 3b 0a 0a 20 20 2f 2a 20 56 65   nvid);..  /* Ve
4230: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  rify that the re
4240: 70 6f 73 69 74 6f 72 79 20 63 68 65 63 6b 73 75  pository checksu
4250: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78  m matches the ex
4260: 70 65 63 74 65 64 20 63 68 65 63 6b 73 75 6d 0a  pected checksum.
4270: 20 20 2a 2a 20 63 61 6c 63 75 6c 61 74 65 64 20    ** calculated 
4280: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
4290: 69 6e 20 73 74 61 72 74 65 64 20 28 61 6e 64 20  in started (and 
42a0: 73 74 6f 72 65 64 20 61 73 20 74 68 65 20 52 20  stored as the R 
42b0: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 6f 66 20 74  record.  ** of t
42c0: 68 65 20 6d 61 6e 69 66 65 73 74 20 66 69 6c 65  he manifest file
42d0: 29 2e 0a 20 20 2a 2f 0a 20 20 76 66 69 6c 65 5f  )..  */.  vfile_
42e0: 61 67 67 72 65 67 61 74 65 5f 63 68 65 63 6b 73  aggregate_checks
42f0: 75 6d 5f 72 65 70 6f 73 69 74 6f 72 79 28 6e 76  um_repository(nv
4300: 69 64 2c 20 26 63 6b 73 75 6d 32 29 3b 0a 20 20  id, &cksum2);.  
4310: 69 66 28 20 62 6c 6f 62 5f 63 6f 6d 70 61 72 65  if( blob_compare
4320: 28 26 63 6b 73 75 6d 31 2c 20 26 63 6b 73 75 6d  (&cksum1, &cksum
4330: 32 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  2) ){.    fossil
4340: 5f 70 61 6e 69 63 28 22 74 72 65 65 20 63 68 65  _panic("tree che
4350: 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  cksum does not m
4360: 61 74 63 68 20 72 65 70 6f 73 69 74 6f 72 79 20  atch repository 
4370: 61 66 74 65 72 20 63 6f 6d 6d 69 74 22 29 3b 0a  after commit");.
4380: 20 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79    }..  /* Verify
4390: 20 74 68 61 74 20 74 68 65 20 6d 61 6e 69 66 65   that the manife
43a0: 73 74 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  st checksum matc
43b0: 68 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64  hes the expected
43c0: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 76   checksum */.  v
43d0: 66 69 6c 65 5f 61 67 67 72 65 67 61 74 65 5f 63  file_aggregate_c
43e0: 68 65 63 6b 73 75 6d 5f 6d 61 6e 69 66 65 73 74  hecksum_manifest
43f0: 28 6e 76 69 64 2c 20 26 63 6b 73 75 6d 32 2c 20  (nvid, &cksum2, 
4400: 26 63 6b 73 75 6d 31 62 29 3b 0a 20 20 69 66 28  &cksum1b);.  if(
4410: 20 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 63   blob_compare(&c
4420: 6b 73 75 6d 31 2c 20 26 63 6b 73 75 6d 31 62 29  ksum1, &cksum1b)
4430: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70   ){.    fossil_p
4440: 61 6e 69 63 28 22 6d 61 6e 69 66 65 73 74 20 63  anic("manifest c
4450: 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
4460: 20 61 67 72 65 65 20 77 69 74 68 20 6d 61 6e 69   agree with mani
4470: 66 65 73 74 3a 20 22 0a 20 20 20 20 20 20 20 20  fest: ".        
4480: 20 20 20 20 20 20 20 20 20 22 25 62 20 76 65 72           "%b ver
4490: 73 75 73 20 25 62 22 2c 20 26 63 6b 73 75 6d 31  sus %b", &cksum1
44a0: 2c 20 26 63 6b 73 75 6d 31 62 29 3b 0a 20 20 7d  , &cksum1b);.  }
44b0: 0a 20 20 69 66 28 20 62 6c 6f 62 5f 63 6f 6d 70  .  if( blob_comp
44c0: 61 72 65 28 26 63 6b 73 75 6d 31 2c 20 26 63 6b  are(&cksum1, &ck
44d0: 73 75 6d 32 29 20 29 7b 0a 20 20 20 20 66 6f 73  sum2) ){.    fos
44e0: 73 69 6c 5f 70 61 6e 69 63 28 22 74 72 65 65 20  sil_panic("tree 
44f0: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f  checksum does no
4500: 74 20 6d 61 74 63 68 20 6d 61 6e 69 66 65 73 74  t match manifest
4510: 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 3a 20 22   after commit: "
4520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4530: 20 20 22 25 62 20 76 65 72 73 75 73 20 25 62 22    "%b versus %b"
4540: 2c 20 26 63 6b 73 75 6d 31 2c 20 26 63 6b 73 75  , &cksum1, &cksu
4550: 6d 32 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56  m2);.  }..  /* V
4560: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
4570: 6f 6d 6d 69 74 20 64 69 64 20 6e 6f 74 20 6d 6f  ommit did not mo
4580: 64 69 66 79 20 61 6e 79 20 64 69 73 6b 20 69 6d  dify any disk im
4590: 61 67 65 73 2e 20 2a 2f 0a 20 20 76 66 69 6c 65  ages. */.  vfile
45a0: 5f 61 67 67 72 65 67 61 74 65 5f 63 68 65 63 6b  _aggregate_check
45b0: 73 75 6d 5f 64 69 73 6b 28 6e 76 69 64 2c 20 26  sum_disk(nvid, &
45c0: 63 6b 73 75 6d 32 29 3b 0a 20 20 69 66 28 20 62  cksum2);.  if( b
45d0: 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 63 6b 73  lob_compare(&cks
45e0: 75 6d 31 2c 20 26 63 6b 73 75 6d 32 29 20 29 7b  um1, &cksum2) ){
45f0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69  .    fossil_pani
4600: 63 28 22 74 72 65 65 20 63 68 65 63 6b 73 75 6d  c("tree checksum
4610: 73 20 62 65 66 6f 72 65 20 61 6e 64 20 61 66 74  s before and aft
4620: 65 72 20 63 6f 6d 6d 69 74 20 64 6f 20 6e 6f 74  er commit do not
4630: 20 6d 61 74 63 68 22 29 3b 0a 20 20 7d 0a 0a 20   match");.  }.. 
4640: 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 75 6e   /* Clear the un
4650: 64 6f 2f 72 65 64 6f 20 73 74 61 63 6b 20 2a 2f  do/redo stack */
4660: 0a 20 20 75 6e 64 6f 5f 72 65 73 65 74 28 29 3b  .  undo_reset();
4670: 0a 0a 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 2a 2f  ..  /* Commit */
4680: 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61  .  db_end_transa
4690: 63 74 69 6f 6e 28 30 29 3b 0a 0a 20 20 61 75 74  ction(0);..  aut
46a0: 6f 73 79 6e 63 28 41 55 54 4f 53 59 4e 43 5f 50  osync(AUTOSYNC_P
46b0: 55 53 48 29 3b 20 20 0a 20 20 69 66 28 20 64 62  USH);  .  if( db
46c0: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
46d0: 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  1 FROM plink WHE
46e0: 52 45 20 70 69 64 3d 25 64 20 41 4e 44 20 63 69  RE pid=%d AND ci
46f0: 64 21 3d 25 64 22 2c 20 76 69 64 2c 20 6e 76 69  d!=%d", vid, nvi
4700: 64 29 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  d) ){.    printf
4710: 28 22 2a 2a 2a 2a 20 77 61 72 6e 69 6e 67 3a 20  ("**** warning: 
4720: 61 20 66 6f 72 6b 20 68 61 73 20 6f 63 63 75 72  a fork has occur
4730: 72 65 64 20 2a 2a 2a 2a 2a 5c 6e 22 29 3b 0a 20  red *****\n");. 
4740: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d   }.}../*.** COMM
4750: 41 4e 44 3a 20 74 65 73 74 2d 69 6d 70 6f 72 74  AND: test-import
4760: 2d 6d 61 6e 69 66 65 73 74 0a 2a 2a 0a 2a 2a 20  -manifest.**.** 
4770: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74  Usage: %fossil t
4780: 65 73 74 2d 69 6d 70 6f 72 74 2d 6d 61 6e 69 66  est-import-manif
4790: 65 73 74 20 44 41 54 45 20 43 4f 4d 4d 45 4e 54  est DATE COMMENT
47a0: 20 3f 2d 70 20 50 41 52 45 4e 54 5f 52 45 43 4f   ?-p PARENT_RECO
47b0: 52 44 49 44 3f 2e 2e 2e 20 3f 2d 66 20 28 46 49  RDID?... ?-f (FI
47c0: 4c 45 5f 52 45 43 4f 52 44 49 44 20 50 41 54 48  LE_RECORDID PATH
47d0: 29 3f 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61  )?....**.** Crea
47e0: 74 65 20 61 20 6e 65 77 20 76 65 72 73 69 6f 6e  te a new version
47f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4800: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 0a 2a  specified file.*
4810: 2a 20 72 65 76 69 73 69 6f 6e 73 20 28 69 66 20  * revisions (if 
4820: 61 6e 79 29 2c 20 61 6e 64 20 63 68 69 6c 64 20  any), and child 
4830: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 50 41 52  of the given PAR
4840: 45 4e 54 20 76 65 72 73 69 6f 6e 2e 0a 2a 2f 0a  ENT version..*/.
4850: 76 6f 69 64 20 69 6d 70 6f 72 74 5f 6d 61 6e 69  void import_mani
4860: 66 65 73 74 5f 63 6d 64 28 76 6f 69 64 29 7b 0a  fest_cmd(void){.
4870: 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 7a 44    const char* zD
4880: 61 74 65 3b 20 20 20 20 2f 2a 20 61 72 67 75 6d  ate;    /* argum
4890: 65 6e 74 20 2d 20 74 69 6d 65 73 74 61 6d 70 2c  ent - timestamp,
48a0: 20 61 73 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   as seconds sinc
48b0: 65 20 65 70 6f 63 68 20 28 69 6e 74 29 20 2a 2f  e epoch (int) */
48c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 7a  .  const char* z
48d0: 43 6f 6d 6d 65 6e 74 3b 20 2f 2a 20 61 72 67 75  Comment; /* argu
48e0: 6d 65 6e 74 20 2d 20 6d 61 6e 69 66 65 73 74 20  ment - manifest 
48f0: 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61  comment */.  cha
4900: 72 2a 20 7a 44 61 74 65 46 6d 74 3b 20 20 20 20  r* zDateFmt;    
4910: 20 20 20 2f 2a 20 74 69 6d 65 73 74 61 6d 70 20     /* timestamp 
4920: 66 6f 72 6d 61 74 74 65 64 20 66 6f 72 20 74 68  formatted for th
4930: 65 20 6d 61 6e 69 66 65 73 74 20 2a 2f 0a 20 20  e manifest */.  
4940: 69 6e 74 2a 20 7a 50 61 72 65 6e 74 73 3b 20 20  int* zParents;  
4950: 20 20 20 20 20 20 2f 2a 20 61 72 67 75 6d 65 6e        /* argumen
4960: 74 73 20 2d 20 61 72 72 61 79 20 6f 66 20 70 61  ts - array of pa
4970: 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
4980: 2a 2f 0a 20 20 69 6e 74 20 7a 50 61 72 65 6e 74  */.  int zParent
4990: 43 6f 75 6e 74 3b 20 20 20 20 20 2f 2a 20 6e 75  Count;     /* nu
49a0: 6d 62 65 72 20 6f 66 20 66 6f 75 6e 64 20 70 61  mber of found pa
49b0: 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
49c0: 2a 2f 0a 20 20 42 6c 6f 62 20 6d 61 6e 69 66 65  */.  Blob manife
49d0: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  st;        /* co
49e0: 6e 74 61 69 6e 65 72 20 66 6f 72 20 74 68 65 20  ntainer for the 
49f0: 6d 61 6e 69 66 65 73 74 20 74 6f 20 62 65 20 67  manifest to be g
4a00: 65 6e 65 72 61 74 65 64 20 2a 2f 0a 20 20 42 6c  enerated */.  Bl
4a10: 6f 62 20 6d 63 6b 73 75 6d 3b 20 20 20 20 20 20  ob mcksum;      
4a20: 20 20 20 20 2f 2a 20 53 65 6c 66 2d 63 68 65 63      /* Self-chec
4a30: 6b 73 75 6d 20 6f 6e 20 74 68 65 20 6d 61 6e 69  ksum on the mani
4a40: 66 65 73 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 63  fest */.  Blob c
4a50: 6b 73 75 6d 2c 20 63 6b 73 75 6d 32 3b 20 20 20  ksum, cksum2;   
4a60: 2f 2a 20 42 65 66 6f 72 65 20 61 6e 64 20 61 66  /* Before and af
4a70: 74 65 72 20 63 6f 6d 6d 69 74 20 63 68 65 63 6b  ter commit check
4a80: 73 75 6d 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 63  sums */.  Blob c
4a90: 6b 73 75 6d 31 62 3b 20 20 20 20 20 20 20 20 20  ksum1b;         
4aa0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 72 65 63 6f  /* Checksum reco
4ab0: 72 64 65 64 20 69 6e 20 74 68 65 20 6d 61 6e 69  rded in the mani
4ac0: 66 65 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  fest */.  const 
4ad0: 63 68 61 72 2a 20 70 61 72 65 6e 74 3b 20 20 20  char* parent;   
4ae0: 2f 2a 20 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65  /* loop variable
4af0: 20 77 68 65 6e 20 63 6f 6c 6c 65 63 74 69 6e 67   when collecting
4b00: 20 70 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63   parent referenc
4b10: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6d  es */.  int i, m
4b20: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id;           /*
4b30: 20 41 6e 6f 74 68 65 72 20 6c 6f 6f 70 20 69 6e   Another loop in
4b40: 64 65 78 2c 20 61 6e 64 20 69 64 20 6f 66 20 6e  dex, and id of n
4b50: 65 77 20 6d 61 6e 69 66 65 73 74 20 2a 2f 0a 20  ew manifest */. 
4b60: 20 53 74 6d 74 20 71 3b 20 20 20 20 20 20 20 20   Stmt q;        
4b70: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 20 73 74         /* sql st
4b80: 61 74 65 6d 65 6e 74 20 74 6f 20 71 75 65 72 79  atement to query
4b90: 20 74 61 62 6c 65 20 6f 66 20 66 69 6c 65 73 20   table of files 
4ba0: 2a 2f 0a 20 20 63 68 61 72 2a 20 7a 4d 69 64 55  */.  char* zMidU
4bb0: 75 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 55 75  uid;       /* Uu
4bc0: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79  id for the newly
4bd0: 20 67 65 6e 65 72 61 74 65 64 20 6d 61 6e 69 66   generated manif
4be0: 65 73 74 20 2a 2f 0a 0a 0a 23 64 65 66 69 6e 65  est */...#define
4bf0: 20 55 53 41 47 45 20 28 22 44 41 54 45 20 43 4f   USAGE ("DATE CO
4c00: 4d 4d 45 4e 54 20 3f 2d 70 7c 2d 70 61 72 65 6e  MMENT ?-p|-paren
4c10: 74 20 50 41 52 45 4e 54 5f 52 49 44 2e 2e 2e 3f  t PARENT_RID...?
4c20: 20 3f 2d 66 7c 2d 66 69 6c 65 20 28 46 49 4c 45   ?-f|-file (FILE
4c30: 5f 52 49 44 20 50 41 54 48 29 2e 2e 2e 3f 22 29  _RID PATH)...?")
4c40: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 6c 69  ..  /*.  ** Vali
4c50: 64 61 74 65 20 61 6e 64 20 70 72 6f 63 65 73 73  date and process
4c60: 20 61 72 67 75 6d 65 6e 74 73 2c 20 63 6f 6c 6c   arguments, coll
4c70: 65 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ect information.
4c80: 0a 20 20 2a 2f 0a 0a 20 20 64 62 5f 6d 75 73 74  .  */..  db_must
4c90: 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28  _be_within_tree(
4ca0: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6e 64 61 74 6f  );..  /* Mandato
4cb0: 72 79 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ry arguments */.
4cc0: 20 20 69 66 20 28 67 2e 61 72 67 63 20 3c 20 34    if (g.argc < 4
4cd0: 29 20 7b 0a 20 20 20 20 75 73 61 67 65 20 28 55  ) {.    usage (U
4ce0: 53 41 47 45 29 3b 0a 20 20 7d 0a 0a 20 20 7a 44  SAGE);.  }..  zD
4cf0: 61 74 65 20 20 20 20 3d 20 67 2e 61 72 67 76 5b  ate    = g.argv[
4d00: 32 5d 3b 0a 20 20 7a 43 6f 6d 6d 65 6e 74 20 3d  2];.  zComment =
4d10: 20 67 2e 61 72 67 76 5b 33 5d 3b 0a 0a 20 20 72   g.argv[3];..  r
4d20: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76 20  emove_from_argv 
4d30: 28 32 2c 32 29 3b 0a 0a 20 20 2f 2a 20 50 75 6c  (2,2);..  /* Pul
4d40: 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 70  l the optional p
4d50: 61 72 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 0a  arent arguments.
4d60: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20    **.  ** Note: 
4d70: 49 6e 20 70 72 69 6e 63 69 70 6c 65 20 69 74 20  In principle it 
4d80: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
4d90: 20 74 68 65 20 6c 6f 6f 70 20 62 65 6c 6f 77 20   the loop below 
4da0: 65 78 74 72 61 63 74 73 0a 20 20 2a 2a 20 74 68  extracts.  ** th
4db0: 65 20 77 72 6f 6e 67 20 61 72 67 75 6d 65 6e 74  e wrong argument
4dc0: 73 2c 20 69 66 20 77 65 20 65 76 65 72 20 74 72  s, if we ever tr
4dd0: 79 20 74 6f 20 69 6d 70 6f 72 74 20 61 20 66 69  y to import a fi
4de0: 6c 65 20 77 68 6f 73 65 20 70 61 74 68 0a 20 20  le whose path.  
4df0: 2a 2a 20 73 74 61 72 74 73 20 77 69 74 68 20 2d  ** starts with -
4e00: 70 2f 2d 70 61 72 65 6e 74 2e 20 49 6e 20 74 68  p/-parent. In th
4e10: 61 74 20 63 61 73 65 20 68 6f 77 65 76 65 72 20  at case however 
4e20: 74 68 65 20 72 65 6d 6f 76 61 6c 20 6f 66 20 74  the removal of t
4e30: 77 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  wo.  ** argument
4e40: 73 20 77 69 6c 6c 20 6c 65 61 76 65 20 74 68 65  s will leave the
4e50: 20 66 69 6c 65 20 62 65 72 65 66 74 20 6f 66 20   file bereft of 
4e60: 61 6e 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  an argument and 
4e70: 74 68 65 0a 20 20 2a 2a 20 72 65 63 68 65 63 6b  the.  ** recheck
4e80: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
4e90: 66 20 61 72 67 75 6d 65 6e 74 73 20 62 65 6c 6f  f arguments belo
4ea0: 77 20 73 68 6f 75 6c 64 20 63 61 74 63 68 20 74  w should catch t
4eb0: 68 61 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  hat..  **.  ** F
4ec0: 6f 72 20 61 20 74 65 73 74 20 63 6f 6d 6d 61 6e  or a test comman
4ed0: 64 20 74 68 69 73 20 69 73 20 61 63 63 65 70 74  d this is accept
4ee0: 61 62 6c 65 2c 20 69 74 20 77 6f 6e 27 74 20 68  able, it won't h
4ef0: 61 76 65 20 6c 6f 74 73 20 6f 66 0a 20 20 2a 2a  ave lots of.  **
4f00: 20 73 61 66 65 74 79 20 6e 65 74 73 2e 0a 20 20   safety nets..  
4f10: 2a 2f 0a 0a 20 20 7a 50 61 72 65 6e 74 43 6f 75  */..  zParentCou
4f20: 6e 74 20 3d 20 30 3b 0a 20 20 7a 50 61 72 65 6e  nt = 0;.  zParen
4f30: 74 73 20 3d 20 28 69 6e 74 2a 29 6d 61 6c 6c 6f  ts = (int*)mallo
4f40: 63 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 31  c(sizeof(int)*(1
4f50: 2b 67 2e 61 72 67 63 29 29 3b 0a 20 20 2f 2a 20  +g.argc));.  /* 
4f60: 31 2b 2c 20 74 6f 20 62 65 20 6f 6b 20 77 69 74  1+, to be ok wit
4f70: 68 20 74 68 65 20 64 65 66 61 75 6c 74 20 65 76  h the default ev
4f80: 65 6e 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e  en if no argumen
4f90: 74 73 20 61 72 6f 75 6e 64 20 2a 2f 0a 0a 20 20  ts around */..  
4fa0: 77 68 69 6c 65 20 28 28 70 61 72 65 6e 74 20 3d  while ((parent =
4fb0: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 70 61   find_option("pa
4fc0: 72 65 6e 74 22 2c 22 70 22 2c 31 29 29 20 21 3d  rent","p",1)) !=
4fd0: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 2f 2a 20   NULL) {.    /* 
4fe0: 43 68 65 63 6b 20 61 6e 64 20 73 74 6f 72 65 20  Check and store 
4ff0: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 72 65  ... */.    zPare
5000: 6e 74 73 20 5b 7a 50 61 72 65 6e 74 43 6f 75 6e  nts [zParentCoun
5010: 74 5d 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64  t] = name_to_rid
5020: 20 28 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7a   (parent);.    z
5030: 50 61 72 65 6e 74 43 6f 75 6e 74 20 2b 2b 3b 0a  ParentCount ++;.
5040: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
5050: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
5060: 72 6f 6f 74 20 6d 61 6e 69 66 65 73 74 20 61 73  root manifest as
5070: 20 70 61 72 65 6e 74 20 69 66 20 6e 6f 6e 65 20   parent if none 
5080: 77 65 72 65 20 73 70 65 63 69 66 69 65 64 0a 20  were specified. 
5090: 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 2e 0a   ** explicitly..
50a0: 20 20 2a 2f 0a 0a 20 20 69 66 20 28 21 7a 50 61    */..  if (!zPa
50b0: 72 65 6e 74 43 6f 75 6e 74 29 20 7b 0a 20 20 20  rentCount) {.   
50c0: 20 7a 50 61 72 65 6e 74 73 20 5b 7a 50 61 72 65   zParents [zPare
50d0: 6e 74 43 6f 75 6e 74 5d 20 3d 20 31 3b 20 2f 2a  ntCount] = 1; /*
50e0: 20 48 41 43 4b 3a 20 72 69 64 20 31 20 69 73 20   HACK: rid 1 is 
50f0: 74 68 65 20 62 61 73 65 6c 69 6e 65 20 6d 61 6e  the baseline man
5100: 69 66 65 73 74 0a 09 09 09 09 20 2a 2a 20 77 68  ifest..... ** wh
5110: 69 63 68 20 77 61 73 20 65 6e 74 65 72 65 64 20  ich was entered 
5120: 77 68 65 6e 20 74 68 65 20 72 65 70 6f 73 69 74  when the reposit
5130: 6f 72 79 0a 09 09 09 09 20 2a 2a 20 77 61 73 20  ory..... ** was 
5140: 63 72 65 61 74 65 64 20 76 69 61 20 27 6e 65 77  created via 'new
5150: 27 2e 20 49 74 20 61 6c 77 61 79 73 20 68 61 73  '. It always has
5160: 0a 09 09 09 09 20 2a 2a 20 72 69 64 20 31 2e 0a  ..... ** rid 1..
5170: 09 09 09 09 20 2a 2f 0a 20 20 20 20 7a 50 61 72  .... */.    zPar
5180: 65 6e 74 43 6f 75 6e 74 20 2b 2b 3b 0a 20 20 7d  entCount ++;.  }
5190: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
51a0: 66 69 6c 65 20 61 72 67 75 6d 65 6e 74 73 2c 20  file arguments, 
51b0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 68 61 73  at least one has
51c0: 20 74 6f 20 62 65 20 70 72 65 73 65 6e 74 2e 20   to be present. 
51d0: 54 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 74 68  They are.  ** th
51e0: 65 20 6f 6e 6c 79 20 74 68 69 6e 67 73 20 77 65  e only things we
51f0: 20 63 61 6e 20 68 61 76 65 20 68 65 72 65 2c 20   can have here, 
5200: 6e 6f 77 2c 20 61 6e 64 20 74 68 65 79 20 61 72  now, and they ar
5210: 65 20 74 72 69 70 6c 65 73 20 6f 66 0a 20 20 2a  e triples of.  *
5220: 2a 20 27 2d 66 20 46 49 44 20 50 41 54 48 27 2c  * '-f FID PATH',
5230: 20 73 6f 20 75 73 65 20 6f 66 20 66 69 6e 64 5f   so use of find_
5240: 6f 70 74 69 6f 6e 20 69 73 20 6f 75 74 2c 20 61  option is out, a
5250: 6e 64 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20  nd we can check 
5260: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
5270: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  of arguments..  
5280: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 57 65  **.  ** Note: We
5290: 20 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20   store the data 
52a0: 69 6e 20 61 20 74 65 6d 70 2e 20 74 61 62 6c 65  in a temp. table
52b0: 2c 20 73 6f 20 74 68 61 74 20 77 65 20 6c 61 74  , so that we lat
52c0: 65 72 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 20  er can.  **     
52d0: 20 20 70 75 6c 6c 20 69 74 20 73 6f 72 74 65 64    pull it sorted
52e0: 2c 20 61 6e 64 20 61 6c 73 6f 20 65 61 73 69 6c  , and also easil
52f0: 79 20 67 65 74 20 74 68 65 20 61 73 73 6f 63 69  y get the associ
5300: 61 74 65 64 20 68 61 73 68 0a 20 20 2a 2a 20 20  ated hash.  **  
5310: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 72 73       identifiers
5320: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
5330: 20 32 3a 20 57 65 20 65 78 70 65 63 74 20 61 74   2: We expect at
5340: 20 6c 65 61 73 74 20 6f 6e 65 20 66 69 6c 65 2c   least one file,
5350: 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20 6d   otherwise the m
5360: 61 6e 69 66 65 73 74 20 77 6f 6e 27 74 0a 20 20  anifest won't.  
5370: 2a 2a 20 62 65 20 72 65 63 6f 67 6e 69 7a 65 64  ** be recognized
5380: 20 61 73 20 61 20 62 61 73 65 6c 69 6e 65 20 62   as a baseline b
5390: 79 20 74 68 65 20 6d 61 6e 69 66 65 73 74 20 70  y the manifest p
53a0: 61 72 73 65 72 2e 0a 20 20 2a 2f 0a 0a 20 20 69  arser..  */..  i
53b0: 66 20 28 28 28 67 2e 61 72 67 63 2d 32 29 20 25  f (((g.argc-2) %
53c0: 20 33 20 21 3d 20 30 29 20 7c 7c 20 28 67 2e 61   3 != 0) || (g.a
53d0: 72 67 63 20 3c 20 35 29 29 20 7b 0a 20 20 20 20  rgc < 5)) {.    
53e0: 75 73 61 67 65 20 28 55 53 41 47 45 29 3b 0a 20  usage (USAGE);. 
53f0: 20 7d 0a 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74   }..  db_begin_t
5400: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
5410: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 20 28 22  db_multi_exec ("
5420: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
5430: 45 20 5f 5f 69 6d 20 28 22 0a 09 09 20 22 72 69  E __im ("... "ri
5440: 64 20 20 20 20 20 20 49 4e 54 45 47 45 52 20 4e  d      INTEGER N
5450: 4f 54 20 4e 55 4c 4c 2c 22 0a 09 09 20 22 70 61  OT NULL,"... "pa
5460: 74 68 6e 61 6d 65 20 54 45 58 54 20 20 20 20 4e  thname TEXT    N
5470: 4f 54 20 4e 55 4c 4c 29 22 20 29 3b 0a 0a 20 20  OT NULL)" );..  
5480: 77 68 69 6c 65 20 28 67 2e 61 72 67 63 20 3e 20  while (g.argc > 
5490: 32 29 20 7b 0a 20 20 20 20 2f 2a 20 43 68 65 63  2) {.    /* Chec
54a0: 6b 20 61 6e 64 20 73 74 6f 72 65 20 2e 2e 2e 20  k and store ... 
54b0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 72 63 6d  */.    if (strcm
54c0: 70 28 22 2d 66 22 2c 20 20 20 67 2e 61 72 67 76  p("-f",   g.argv
54d0: 5b 32 5d 29 20 26 26 0a 09 73 74 72 63 6d 70 28  [2]) &&..strcmp(
54e0: 22 2d 66 69 6c 65 22 2c 67 2e 61 72 67 76 5b 32  "-file",g.argv[2
54f0: 5d 29 29 20 7b 0a 20 20 20 20 20 20 75 73 61 67  ])) {.      usag
5500: 65 20 28 55 53 41 47 45 29 3b 0a 20 20 20 20 7d  e (USAGE);.    }
5510: 0a 0a 20 20 20 20 2f 2a 20 44 41 4e 47 45 52 20  ..    /* DANGER 
5520: 54 68 65 20 25 73 20 66 6f 72 20 74 68 65 20 70  The %s for the p
5530: 61 74 68 20 6d 69 67 68 74 20 6c 65 61 64 20 69  ath might lead i
5540: 74 73 65 6c 66 20 74 6f 20 61 6e 20 69 6e 6a 65  tself to an inje
5550: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 61 74 74  ction.    ** att
5560: 61 63 6b 2e 20 46 6f 72 20 6e 6f 77 20 28 69 2e  ack. For now (i.
5570: 65 2e 20 74 65 73 74 69 6e 67 29 20 74 68 69 73  e. testing) this
5580: 20 69 73 20 6f 6b 2c 20 62 75 74 20 64 6f 20 73   is ok, but do s
5590: 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 2a 2a 20  omething.    ** 
55a0: 62 65 74 74 65 72 20 69 6e 20 74 68 65 20 66 75  better in the fu
55b0: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 0a 20 20  ture..    */..  
55c0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
55d0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5f 5f 69  "INSERT INTO __i
55e0: 6d 20 56 41 4c 55 45 53 28 25 64 2c 27 25 73 27  m VALUES(%d,'%s'
55f0: 29 22 2c 0a 09 09 20 20 6e 61 6d 65 5f 74 6f 5f  )",...  name_to_
5600: 72 69 64 20 28 67 2e 61 72 67 76 5b 33 5d 29 2c  rid (g.argv[3]),
5610: 20 67 2e 61 72 67 76 5b 34 5d 20 29 3b 0a 20 20   g.argv[4] );.  
5620: 20 20 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72    remove_from_ar
5630: 67 76 20 28 32 2c 33 29 3b 0a 20 20 7d 0a 0a 20  gv (2,3);.  }.. 
5640: 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69   verify_all_opti
5650: 6f 6e 73 28 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  ons();..  /*.  *
5660: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
5670: 75 73 65 72 20 74 68 65 20 6d 61 6e 69 66 65 73  user the manifes
5680: 74 20 77 69 6c 6c 20 62 65 6c 6f 6e 67 20 74 6f  t will belong to
5690: 2c 20 61 6e 64 20 63 68 65 63 6b 20 74 68 61 74  , and check that
56a0: 0a 20 20 2a 2a 20 74 68 69 73 20 75 73 65 72 20  .  ** this user 
56b0: 65 78 69 73 74 73 2e 0a 20 20 2a 2f 0a 0a 20 20  exists..  */..  
56c0: 75 73 65 72 5f 73 65 6c 65 63 74 28 29 3b 0a 20  user_select();. 
56d0: 20 69 66 28 20 21 64 62 5f 65 78 69 73 74 73 28   if( !db_exists(
56e0: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 75  "SELECT 1 FROM u
56f0: 73 65 72 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d  ser WHERE login=
5700: 25 51 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 20 29  %Q", g.zLogin) )
5710: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
5720: 61 6c 28 22 6e 6f 20 73 75 63 68 20 75 73 65 72  al("no such user
5730: 3a 20 25 73 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29  : %s", g.zLogin)
5740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
5750: 20 4e 6f 77 20 67 65 6e 65 72 61 74 65 20 74 68   Now generate th
5760: 65 20 6d 61 6e 69 66 65 73 74 20 69 6e 20 6d 65  e manifest in me
5770: 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mory..  **.  ** 
5780: 53 74 61 72 74 20 77 69 74 68 20 63 6f 6d 6d 65  Start with comme
5790: 6e 74 20 61 6e 64 20 64 61 74 65 2e 20 54 68 65  nt and date. The
57a0: 20 6c 61 74 74 65 72 20 69 73 20 63 6f 6e 76 65   latter is conve
57b0: 72 74 65 64 20 74 6f 20 74 68 65 0a 20 20 2a 2a  rted to the.  **
57c0: 20 70 72 6f 70 65 72 20 66 6f 72 6d 61 74 20 62   proper format b
57d0: 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6f 6e 2e  efore insertion.
57e0: 0a 20 20 2a 2f 0a 0a 20 20 62 6c 6f 62 5f 7a 65  .  */..  blob_ze
57f0: 72 6f 28 26 6d 61 6e 69 66 65 73 74 29 3b 0a 0a  ro(&manifest);..
5800: 20 20 69 66 20 28 21 73 74 72 6c 65 6e 28 7a 43    if (!strlen(zC
5810: 6f 6d 6d 65 6e 74 29 29 20 7b 0a 20 20 20 20 62  omment)) {.    b
5820: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
5830: 69 66 65 73 74 2c 20 22 43 20 25 46 5c 6e 22 2c  ifest, "C %F\n",
5840: 20 22 28 6e 6f 20 63 6f 6d 6d 65 6e 74 29 22 29   "(no comment)")
5850: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
5860: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d   blob_appendf(&m
5870: 61 6e 69 66 65 73 74 2c 20 22 43 20 25 46 5c 6e  anifest, "C %F\n
5880: 22 2c 20 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  ", zComment);.  
5890: 7d 0a 0a 20 20 7a 44 61 74 65 46 6d 74 20 3d 20  }..  zDateFmt = 
58a0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
58b0: 43 54 20 64 61 74 65 74 69 6d 65 28 25 51 2c 27  CT datetime(%Q,'
58c0: 75 6e 69 78 65 70 6f 63 68 27 29 22 2c 7a 44 61  unixepoch')",zDa
58d0: 74 65 29 3b 0a 20 20 7a 44 61 74 65 46 6d 74 5b  te);.  zDateFmt[
58e0: 31 30 5d 20 3d 20 27 54 27 3b 0a 20 20 62 6c 6f  10] = 'T';.  blo
58f0: 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66  b_appendf(&manif
5900: 65 73 74 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a  est, "D %s\n", z
5910: 44 61 74 65 46 6d 74 29 3b 0a 20 20 66 72 65 65  DateFmt);.  free
5920: 28 7a 44 61 74 65 46 6d 74 29 3b 0a 0a 20 20 2f  (zDateFmt);..  /
5930: 2a 0a 20 20 2a 2a 20 46 6f 6c 6c 6f 77 20 77 69  *.  ** Follow wi
5940: 74 68 20 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 65  th all the colle
5950: 63 74 65 64 20 66 69 6c 65 73 2c 20 70 72 6f 70  cted files, prop
5960: 65 72 6c 79 20 73 6f 72 74 65 64 2e 20 48 65 72  erly sorted. Her
5970: 65 20 77 65 72 65 0a 20 20 2a 2a 20 61 6c 73 6f  e were.  ** also
5980: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 68 65   compute the che
5990: 63 6b 73 75 6d 20 6f 76 65 72 20 74 68 65 20 66  cksum over the f
59a0: 69 6c 65 73 20 28 70 61 74 68 73 2c 20 73 69 7a  iles (paths, siz
59b0: 65 73 2c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  es,.  ** content
59c0: 73 29 2c 20 73 69 6d 69 6c 61 72 20 74 6f 20 77  s), similar to w
59d0: 68 61 74 20 27 76 66 69 6c 65 5f 61 67 67 72 65  hat 'vfile_aggre
59e0: 67 61 74 65 5f 63 68 65 63 6b 73 75 6d 5f 72 65  gate_checksum_re
59f0: 70 6f 73 69 74 6f 72 79 27 0a 20 20 2a 2a 20 64  pository'.  ** d
5a00: 6f 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 6d 64 35  oes..  */..  md5
5a10: 73 75 6d 5f 69 6e 69 74 28 29 3b 0a 20 20 64 62  sum_init();.  db
5a20: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 09 20 20  _prepare(&q,..  
5a30: 20 20 20 22 53 45 4c 45 43 54 20 70 61 74 68 6e     "SELECT pathn
5a40: 61 6d 65 2c 20 75 75 69 64 2c 20 5f 5f 69 6d 2e  ame, uuid, __im.
5a50: 72 69 64 22 0a 09 20 20 20 20 20 22 20 46 52 4f  rid"..     " FRO
5a60: 4d 20 5f 5f 69 6d 20 4a 4f 49 4e 20 62 6c 6f 62  M __im JOIN blob
5a70: 20 4f 4e 20 5f 5f 69 6d 2e 72 69 64 3d 62 6c 6f   ON __im.rid=blo
5a80: 62 2e 72 69 64 22 0a 09 20 20 20 20 20 22 20 4f  b.rid"..     " O
5a90: 52 44 45 52 20 42 59 20 31 22 29 3b 0a 0a 20 20  RDER BY 1");..  
5aa0: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
5ab0: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
5ac0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
5ad0: 31 30 30 5d 3b 0a 20 20 20 20 42 6c 6f 62 20 66  100];.    Blob f
5ae0: 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
5af0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f  har *zName = db_
5b00: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
5b10: 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0);.    const ch
5b20: 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63  ar *zUuid = db_c
5b30: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
5b40: 29 3b 0a 20 20 20 20 69 6e 74 20 20 20 20 20 20  );.    int      
5b50: 20 20 20 7a 52 69 64 20 20 3d 20 64 62 5f 63 6f     zRid  = db_co
5b60: 6c 75 6d 6e 5f 69 6e 74 20 28 26 71 2c 20 32 29  lumn_int (&q, 2)
5b70: 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64  ;..    /* Extend
5b80: 20 74 68 65 20 6d 61 6e 69 66 65 73 74 20 2a 2f   the manifest */
5b90: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
5ba0: 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 46 20  f(&manifest, "F 
5bb0: 25 46 20 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c  %F %s\n", zName,
5bc0: 20 7a 55 75 69 64 29 3b 0a 0a 20 20 20 20 2f 2a   zUuid);..    /*
5bd0: 20 55 70 64 61 74 65 20 74 68 65 20 63 68 65 63   Update the chec
5be0: 6b 73 75 6d 20 2a 2f 0a 20 20 20 20 6d 64 35 73  ksum */.    md5s
5bf0: 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 7a 4e 61  um_step_text(zNa
5c00: 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 62 6c 6f  me, -1);.    blo
5c10: 62 5f 7a 65 72 6f 28 26 66 69 6c 65 29 3b 0a 20  b_zero(&file);. 
5c20: 20 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 7a     content_get(z
5c30: 52 69 64 2c 20 26 66 69 6c 65 29 3b 0a 20 20 20  Rid, &file);.   
5c40: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
5c50: 20 25 64 5c 6e 22 2c 20 62 6c 6f 62 5f 73 69 7a   %d\n", blob_siz
5c60: 65 28 26 66 69 6c 65 29 29 3b 0a 20 20 20 20 6d  e(&file));.    m
5c70: 64 35 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28  d5sum_step_text(
5c80: 7a 42 75 66 2c 20 2d 31 29 3b 0a 20 20 20 20 6d  zBuf, -1);.    m
5c90: 64 35 73 75 6d 5f 73 74 65 70 5f 62 6c 6f 62 28  d5sum_step_blob(
5ca0: 26 66 69 6c 65 29 3b 0a 20 20 20 20 62 6c 6f 62  &file);.    blob
5cb0: 5f 72 65 73 65 74 28 26 66 69 6c 65 29 3b 0a 20  _reset(&file);. 
5cc0: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
5cd0: 28 26 71 29 3b 0a 20 20 6d 64 35 73 75 6d 5f 66  (&q);.  md5sum_f
5ce0: 69 6e 69 73 68 20 28 26 63 6b 73 75 6d 29 3b 0a  inish (&cksum);.
5cf0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 6c 6c 6f  .  /*.  ** Follo
5d00: 77 20 77 69 74 68 20 61 6c 6c 20 74 68 65 20 73  w with all the s
5d10: 70 65 63 69 66 69 65 64 20 70 61 72 65 6e 74 73  pecified parents
5d20: 2e 20 57 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  . We know that t
5d30: 68 65 72 65 20 69 73 20 61 74 0a 20 20 2a 2a 20  here is at.  ** 
5d40: 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  least one..  */.
5d50: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
5d60: 26 6d 61 6e 69 66 65 73 74 2c 20 22 50 22 29 3b  &manifest, "P");
5d70: 0a 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 7a 50  .  for (i=0;i<zP
5d80: 61 72 65 6e 74 43 6f 75 6e 74 3b 69 2b 2b 29 20  arentCount;i++) 
5d90: 7b 0a 20 20 20 20 63 68 61 72 2a 20 7a 55 75 69  {.    char* zUui
5da0: 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  d = db_text(0, "
5db0: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
5dc0: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
5dd0: 25 64 22 2c 20 7a 50 61 72 65 6e 74 73 20 5b 69  %d", zParents [i
5de0: 5d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  ]);.    blob_app
5df0: 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20  endf(&manifest, 
5e00: 22 20 25 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20  " %s", zUuid);. 
5e10: 20 20 20 66 72 65 65 28 7a 55 75 69 64 29 3b 0a     free(zUuid);.
5e20: 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e    }.  blob_appen
5e30: 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 5c  df(&manifest, "\
5e40: 6e 22 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  n");..  /*.  ** 
5e50: 43 6f 6d 70 6c 65 74 65 20 74 68 65 20 6d 61 6e  Complete the man
5e60: 69 66 65 73 74 20 77 69 74 68 20 75 73 65 72 20  ifest with user 
5e70: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 76 61 72  name and the var
5e80: 69 6f 75 73 20 63 68 65 63 6b 73 75 6d 73 0a 20  ious checksums. 
5e90: 20 2a 2f 0a 0a 20 20 62 6c 6f 62 5f 61 70 70 65   */..  blob_appe
5ea0: 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22  ndf(&manifest, "
5eb0: 52 20 25 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29  R %b\n", &cksum)
5ec0: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
5ed0: 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 55 20 25  (&manifest, "U %
5ee0: 46 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b  F\n", g.zLogin);
5ef0: 0a 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26  .  md5sum_blob(&
5f00: 6d 61 6e 69 66 65 73 74 2c 20 26 6d 63 6b 73 75  manifest, &mcksu
5f10: 6d 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  m);.  blob_appen
5f20: 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 5a  df(&manifest, "Z
5f30: 20 25 62 5c 6e 22 2c 20 26 6d 63 6b 73 75 6d 29   %b\n", &mcksum)
5f40: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 6f 77  ;..  /*.  ** Now
5f50: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   insert the new 
5f60: 6d 61 6e 69 66 65 73 74 2c 20 74 72 79 20 74 6f  manifest, try to
5f70: 20 63 6f 6d 70 72 65 73 73 20 69 74 20 72 65 6c   compress it rel
5f80: 61 74 69 76 65 20 74 6f 20 66 69 72 73 74 0a 20  ative to first. 
5f90: 20 2a 2a 20 70 61 72 65 6e 74 20 28 70 72 69 6d   ** parent (prim
5fa0: 61 72 79 29 2e 0a 20 20 20 2a 2f 0a 0a 20 20 2f  ary)..   */..  /
5fb0: 2a 62 6c 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66  *blob_write_to_f
5fc0: 69 6c 65 20 28 26 6d 61 6e 69 66 65 73 74 2c 20  ile (&manifest, 
5fd0: 22 54 45 53 54 5f 4d 41 4e 49 46 45 53 54 22 29  "TEST_MANIFEST")
5fe0: 3b 2a 2f 0a 0a 20 20 6d 69 64 20 3d 20 63 6f 6e  ;*/..  mid = con
5ff0: 74 65 6e 74 5f 70 75 74 28 26 6d 61 6e 69 66 65  tent_put(&manife
6000: 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  st, 0, 0);.  if(
6010: 20 6d 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 66   mid==0 ){.    f
6020: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 74 72 6f  ossil_panic("tro
6030: 75 62 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  uble committing 
6040: 6d 61 6e 69 66 65 73 74 3a 20 25 73 22 2c 20 67  manifest: %s", g
6050: 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 0a  .zErrMsg);.  }..
6060: 20 20 63 6f 6e 74 65 6e 74 5f 64 65 6c 74 69 66    content_deltif
6070: 79 28 7a 50 61 72 65 6e 74 73 5b 30 5d 2c 20 6d  y(zParents[0], m
6080: 69 64 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 56 65  id, 0);..  /* Ve
6090: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  rify that the re
60a0: 70 6f 73 69 74 6f 72 79 20 63 68 65 63 6b 73 75  pository checksu
60b0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78  m matches the ex
60c0: 70 65 63 74 65 64 20 63 68 65 63 6b 73 75 6d 0a  pected checksum.
60d0: 20 20 2a 2a 20 63 61 6c 63 75 6c 61 74 65 64 20    ** calculated 
60e0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
60f0: 69 6e 20 73 74 61 72 74 65 64 20 28 61 6e 64 20  in started (and 
6100: 73 74 6f 72 65 64 20 61 73 20 74 68 65 20 52 20  stored as the R 
6110: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 6f 66 20 74  record.  ** of t
6120: 68 65 20 6d 61 6e 69 66 65 73 74 20 66 69 6c 65  he manifest file
6130: 29 2e 0a 20 20 2a 2f 0a 0a 20 20 76 66 69 6c 65  )..  */..  vfile
6140: 5f 61 67 67 72 65 67 61 74 65 5f 63 68 65 63 6b  _aggregate_check
6150: 73 75 6d 5f 6d 61 6e 69 66 65 73 74 28 6d 69 64  sum_manifest(mid
6160: 2c 20 26 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  , &cksum2, &cksu
6170: 6d 31 62 29 3b 0a 20 20 69 66 28 20 62 6c 6f 62  m1b);.  if( blob
6180: 5f 63 6f 6d 70 61 72 65 28 26 63 6b 73 75 6d 2c  _compare(&cksum,
6190: 20 26 63 6b 73 75 6d 31 62 29 20 29 7b 0a 20 20   &cksum1b) ){.  
61a0: 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22    fossil_panic("
61b0: 6d 61 6e 69 66 65 73 74 20 63 68 65 63 6b 73 75  manifest checksu
61c0: 6d 20 64 6f 65 73 20 6e 6f 74 20 61 67 72 65 65  m does not agree
61d0: 20 77 69 74 68 20 6d 61 6e 69 66 65 73 74 3a 20   with manifest: 
61e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
61f0: 20 20 20 22 25 62 20 76 65 72 73 75 73 20 25 62     "%b versus %b
6200: 22 2c 20 26 63 6b 73 75 6d 2c 20 26 63 6b 73 75  ", &cksum, &cksu
6210: 6d 31 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  m1b);.  }.  if( 
6220: 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 63 6b  blob_compare(&ck
6230: 73 75 6d 2c 20 26 63 6b 73 75 6d 32 29 20 29 7b  sum, &cksum2) ){
6240: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69  .    fossil_pani
6250: 63 28 22 74 72 65 65 20 63 68 65 63 6b 73 75 6d  c("tree checksum
6260: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
6270: 6d 61 6e 69 66 65 73 74 20 61 66 74 65 72 20 63  manifest after c
6280: 6f 6d 6d 69 74 3a 20 22 0a 20 20 20 20 20 20 20  ommit: ".       
6290: 20 20 20 20 20 20 20 20 20 20 22 25 62 20 76 65            "%b ve
62a0: 72 73 75 73 20 25 62 22 2c 20 26 63 6b 73 75 6d  rsus %b", &cksum
62b0: 2c 20 26 63 6b 73 75 6d 32 29 3b 0a 20 20 7d 0a  , &cksum2);.  }.
62c0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 74 20 6c 61  .  /*.  ** At la
62d0: 73 74 20 63 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  st commit all ch
62e0: 61 6e 67 65 73 2c 20 61 66 74 65 72 20 67 65 74  anges, after get
62f0: 74 69 6e 67 20 72 69 64 20 6f 66 20 74 68 65 20  ting rid of the 
6300: 74 65 6d 70 0a 20 20 2a 2a 20 68 6f 6c 64 65 72  temp.  ** holder
6310: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 73 2c 20   for the files, 
6320: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 6f  and release allo
6330: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 20 20  cated memory..  
6340: 2a 2f 0a 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65  */..  db_multi_e
6350: 78 65 63 28 22 44 52 4f 50 20 54 41 42 4c 45 20  xec("DROP TABLE 
6360: 5f 5f 69 6d 22 29 3b 0a 20 20 7a 4d 69 64 55 75  __im");.  zMidUu
6370: 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  id = db_text(0, 
6380: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
6390: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
63a0: 3d 25 64 22 2c 20 6d 69 64 29 3b 0a 20 20 64 62  =%d", mid);.  db
63b0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
63c0: 28 30 29 3b 0a 20 20 66 72 65 65 28 7a 50 61 72  (0);.  free(zPar
63d0: 65 6e 74 73 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  ents);..  /*.  *
63e0: 2a 20 41 74 20 74 68 65 20 76 65 72 79 20 6c 61  * At the very la
63f0: 73 74 20 69 6e 66 6f 72 6d 20 74 68 65 20 63 61  st inform the ca
6400: 6c 6c 65 72 20 61 62 6f 75 74 20 74 68 65 20 69  ller about the i
6410: 64 20 61 6e 64 20 75 75 69 64 20 6f 66 20 74 68  d and uuid of th
6420: 65 0a 20 20 2a 2a 20 6e 65 77 20 6d 61 6e 69 66  e.  ** new manif
6430: 65 73 74 2e 0a 20 20 2a 2f 0a 0a 0a 20 20 70 72  est..  */...  pr
6440: 69 6e 74 66 28 22 69 6e 73 65 72 74 65 64 20 61  intf("inserted a
6450: 73 20 72 65 63 6f 72 64 20 25 64 2c 20 25 73 5c  s record %d, %s\
6460: 6e 22 2c 20 6d 69 64 2c 20 7a 4d 69 64 55 75 69  n", mid, zMidUui
6470: 64 29 3b 0a 20 20 66 72 65 65 28 7a 4d 69 64 55  d);.  free(zMidU
6480: 75 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  uid);.  return;.
6490: 0a 23 75 6e 64 65 66 20 55 53 41 47 45 0a 7d 0a  .#undef USAGE.}.