Fossil

Hex Artifact Content
Login

Artifact d1d99096ad0283231a4565a545462b803ef2586687b99744d51c3af7aa3accdf:


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 36 20 44 2e 20 52 69 63 68  (c) 2006 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 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79   but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f   warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69  ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f  ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70  r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75  urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66  thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64  ormation:.**   d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20  rh@hwaci.com.** 
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61    http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a  ci.com/drh/.**.*
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
0250: 2a 0a 2a 2a 20 46 69 6c 65 20 75 74 69 6c 69 74  *.** File utilit
0260: 69 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ies..*/.#include
0270: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
0280: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
0290: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
02a0: 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /stat.h>.#includ
02b0: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e  e <unistd.h>.#in
02c0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
02d0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72  .h>.#include <er
02f0: 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rno.h>.#include 
0300: 22 66 69 6c 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  "file.h"../*.** 
0310: 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 69 6e 63 6c  On Windows, incl
0320: 75 64 65 20 74 68 65 20 50 6c 61 74 66 6f 72 6d  ude the Platform
0330: 20 53 44 4b 20 68 65 61 64 65 72 20 66 69 6c 65   SDK header file
0340: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e  ..*/.#ifdef _WIN
0350: 33 32 0a 23 20 69 6e 63 6c 75 64 65 20 3c 64 69  32.# include <di
0360: 72 65 63 74 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  rect.h>.# includ
0370: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 20  e <windows.h>.# 
0380: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 75 74 69  include <sys/uti
0390: 6d 65 2e 68 3e 0a 23 65 6c 73 65 0a 23 20 69 6e  me.h>.#else.# in
03a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
03b0: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 49  h>.#endif..#if I
03c0: 4e 54 45 52 46 41 43 45 0a 0a 2f 2a 20 4d 61 6e  NTERFACE../* Man
03d0: 79 20 41 50 49 73 20 74 61 6b 65 20 61 20 65 46  y APIs take a eF
03e0: 54 79 70 65 20 61 72 67 75 6d 65 6e 74 20 77 68  Type argument wh
03f0: 69 63 68 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ich must be one 
0400: 6f 66 20 45 78 74 46 49 4c 45 2c 20 52 65 70 6f  of ExtFILE, Repo
0410: 46 49 4c 45 2c 0a 2a 2a 20 6f 72 20 53 79 6d 46  FILE,.** or SymF
0420: 49 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ILE..**.** The d
0430: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6e 20  ifference is in 
0440: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
0450: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 2e 20  symbolic links. 
0460: 20 52 65 70 6f 46 49 4c 45 20 73 68 6f 75 6c 64   RepoFILE should
0470: 20 62 65 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20   be.** used for 
0480: 66 69 6c 65 73 20 74 68 61 74 20 61 72 65 20 75  files that are u
0490: 6e 64 65 72 20 6d 61 6e 61 67 65 6d 65 6e 74 20  nder management 
04a0: 62 79 20 61 20 46 6f 73 73 69 6c 20 72 65 70 6f  by a Fossil repo
04b0: 73 69 74 6f 72 79 2e 20 20 45 78 74 46 49 4c 45  sitory.  ExtFILE
04c0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 75 73  .** should be us
04d0: 65 64 20 66 6f 72 20 66 69 6c 65 73 20 74 68 61  ed for files tha
04e0: 74 20 61 72 65 20 6e 6f 74 20 75 6e 64 65 72 20  t are not under 
04f0: 6d 61 6e 61 67 65 6d 65 6e 74 2e 20 20 53 79 6d  management.  Sym
0500: 46 49 4c 45 20 69 73 20 66 6f 72 0a 2a 2a 20 61  FILE is for.** a
0510: 20 66 65 77 20 73 70 65 63 69 61 6c 20 63 61 73   few special cas
0520: 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 22  es such as the "
0530: 66 6f 73 73 69 6c 20 74 65 73 74 2d 74 61 72 62  fossil test-tarb
0540: 61 6c 6c 22 20 63 6f 6d 6d 61 6e 64 20 77 68 65  all" command whe
0550: 6e 20 77 65 20 6e 65 76 65 72 0a 2a 2a 20 77 61  n we never.** wa
0560: 6e 74 20 74 6f 20 66 6f 6c 6c 6f 77 20 73 79 6d  nt to follow sym
0570: 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  links..**.** If 
0580: 52 65 70 6f 46 49 4c 45 20 69 73 20 75 73 65 64  RepoFILE is used
0590: 20 61 6e 64 20 69 66 20 74 68 65 20 61 6c 6c 6f   and if the allo
05a0: 77 2d 73 79 6d 6c 69 6e 6b 73 20 73 65 74 74 69  w-symlinks setti
05b0: 6e 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 69  ng is true and i
05c0: 66 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  f.** the object 
05d0: 69 73 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  is a symbolic li
05e0: 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 62 6a  nk, then the obj
05f0: 65 63 74 20 69 73 20 74 72 65 61 74 65 64 20 6c  ect is treated l
0600: 69 6b 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 0a  ike an ordinary.
0610: 2a 2a 20 66 69 6c 65 20 77 68 6f 73 65 20 63 6f  ** file whose co
0620: 6e 74 65 6e 74 20 69 73 20 6e 61 6d 65 20 6f 66  ntent is name of
0630: 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 77   the object to w
0640: 68 69 63 68 20 74 68 65 20 73 79 6d 62 6f 6c 69  hich the symboli
0650: 63 20 6c 69 6e 6b 0a 2a 2a 20 70 6f 69 6e 74 73  c link.** points
0660: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 45 78 74 46 49  ..**.** If ExtFI
0670: 4c 45 20 69 73 20 75 73 65 64 20 6f 72 20 61 6c  LE is used or al
0680: 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 69 73 20  low-symlinks is 
0690: 66 61 6c 73 65 2c 20 74 68 65 6e 20 6f 70 65 72  false, then oper
06a0: 61 74 69 6f 6e 73 20 6f 6e 20 61 0a 2a 2a 20 73  ations on a.** s
06b0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 61 72 65  ymbolic link are
06c0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 65   the same as ope
06d0: 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 6f  rations on the o
06e0: 62 6a 65 63 74 20 74 6f 20 77 68 69 63 68 20 74  bject to which t
06f0: 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 69 63 20 6c  he.** symbolic l
0700: 69 6e 6b 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a  ink points..**.*
0710: 2a 20 53 79 6d 46 49 4c 45 20 69 73 20 6c 69 6b  * SymFILE is lik
0720: 65 20 52 65 70 6f 46 49 4c 45 20 65 78 63 65 70  e RepoFILE excep
0730: 74 20 74 68 61 74 20 69 74 20 61 6c 77 61 79 73  t that it always
0740: 20 75 73 65 73 20 74 68 65 20 74 61 72 67 65 74   uses the target
0750: 20 66 69 6c 65 6e 61 6d 65 20 6f 66 0a 2a 2a 20   filename of.** 
0760: 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20  a symbolic link 
0770: 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c 20  as the content, 
0780: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 63  instead of the c
0790: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6f 62  ontent of the ob
07a0: 6a 65 63 74 0a 2a 2a 20 74 68 61 74 20 74 68 65  ject.** that the
07b0: 20 73 79 6d 6c 69 6e 6b 20 70 6f 69 6e 74 73 20   symlink points 
07c0: 74 6f 2e 20 20 53 79 6d 46 49 4c 45 20 61 63 74  to.  SymFILE act
07d0: 73 20 61 73 20 69 66 20 61 6c 6c 6f 77 2d 73 79  s as if allow-sy
07e0: 6d 6c 69 6e 6b 73 20 69 73 20 61 6c 77 61 79 73  mlinks is always
07f0: 20 4f 4e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   ON..*/.#define 
0800: 45 78 74 46 49 4c 45 20 20 20 20 30 20 20 2f 2a  ExtFILE    0  /*
0810: 20 41 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20 73   Always follow s
0820: 79 6d 6c 69 6e 6b 73 20 2a 2f 0a 23 64 65 66 69  ymlinks */.#defi
0830: 6e 65 20 52 65 70 6f 46 49 4c 45 20 20 20 31 20  ne RepoFILE   1 
0840: 20 2f 2a 20 46 6f 6c 6c 6f 77 20 73 79 6d 6c 69   /* Follow symli
0850: 6e 6b 73 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  nks if and only 
0860: 69 66 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b  if allow-symlink
0870: 73 20 69 73 20 4f 46 46 20 2a 2f 0a 23 64 65 66  s is OFF */.#def
0880: 69 6e 65 20 53 79 6d 46 49 4c 45 20 20 20 20 32  ine SymFILE    2
0890: 20 20 2f 2a 20 4e 65 76 65 72 20 66 6f 6c 6c 6f    /* Never follo
08a0: 77 20 73 79 6d 6c 69 6e 6b 73 20 2a 2f 0a 0a 23  w symlinks */..#
08b0: 69 6e 63 6c 75 64 65 20 3c 64 69 72 65 6e 74 2e  include <dirent.
08c0: 68 3e 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  h>.#if defined(_
08d0: 57 49 4e 33 32 29 0a 23 20 64 65 66 69 6e 65 20  WIN32).# define 
08e0: 44 49 52 20 5f 57 44 49 52 0a 23 20 64 65 66 69  DIR _WDIR.# defi
08f0: 6e 65 20 64 69 72 65 6e 74 20 5f 77 64 69 72 65  ne dirent _wdire
0900: 6e 74 0a 23 20 64 65 66 69 6e 65 20 6f 70 65 6e  nt.# define open
0910: 64 69 72 20 5f 77 6f 70 65 6e 64 69 72 0a 23 20  dir _wopendir.# 
0920: 64 65 66 69 6e 65 20 72 65 61 64 64 69 72 20 5f  define readdir _
0930: 77 72 65 61 64 64 69 72 0a 23 20 64 65 66 69 6e  wreaddir.# defin
0940: 65 20 63 6c 6f 73 65 64 69 72 20 5f 77 63 6c 6f  e closedir _wclo
0950: 73 65 64 69 72 0a 23 65 6e 64 69 66 20 2f 2a 20  sedir.#endif /* 
0960: 5f 57 49 4e 33 32 20 2a 2f 0a 0a 23 69 66 20 64  _WIN32 */..#if d
0970: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26  efined(_WIN32) &
0980: 26 20 28 64 65 66 69 6e 65 64 28 5f 5f 4d 53 56  & (defined(__MSV
0990: 43 52 54 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  CRT__) || define
09a0: 64 28 5f 4d 53 43 5f 56 45 52 29 29 0a 2f 2a 0a  d(_MSC_VER))./*.
09b0: 2a 2a 20 46 69 6c 65 20 73 74 61 74 75 73 20 69  ** File status i
09c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 77  nformation for w
09d0: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
09e0: 2a 2f 0a 73 74 72 75 63 74 20 66 6f 73 73 69 6c  */.struct fossil
09f0: 53 74 61 74 20 7b 0a 20 20 20 20 69 36 34 20 73  Stat {.    i64 s
0a00: 74 5f 73 69 7a 65 3b 0a 20 20 20 20 69 36 34 20  t_size;.    i64 
0a10: 73 74 5f 6d 74 69 6d 65 3b 0a 20 20 20 20 69 6e  st_mtime;.    in
0a20: 74 20 73 74 5f 6d 6f 64 65 3b 0a 7d 3b 0a 23 65  t st_mode;.};.#e
0a30: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
0a40: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
0a50: 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
0a60: 0a 23 20 64 65 66 69 6e 65 20 66 6f 73 73 69 6c  .# define fossil
0a70: 5f 69 73 64 69 72 73 65 70 28 61 29 20 20 20 20  _isdirsep(a)    
0a80: 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c  (((a) == '/') ||
0a90: 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a   ((a) == '\\')).
0aa0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
0ab0: 6f 73 73 69 6c 5f 69 73 64 69 72 73 65 70 28 61  ossil_isdirsep(a
0ac0: 29 20 20 20 20 28 28 61 29 20 3d 3d 20 27 2f 27  )    ((a) == '/'
0ad0: 29 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  ).#endif..#endif
0ae0: 20 2f 2a 20 49 4e 54 45 52 46 41 43 45 20 2a 2f   /* INTERFACE */
0af0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
0b00: 57 49 4e 33 32 29 20 7c 7c 20 21 28 64 65 66 69  WIN32) || !(defi
0b10: 6e 65 64 28 5f 5f 4d 53 56 43 52 54 5f 5f 29 20  ned(__MSVCRT__) 
0b20: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f  || defined(_MSC_
0b30: 56 45 52 29 29 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  VER))./*.** File
0b40: 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74   status informat
0b50: 69 6f 6e 20 66 6f 72 20 75 6e 69 78 20 73 79 73  ion for unix sys
0b60: 74 65 6d 73 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  tems.*/.# define
0b70: 20 66 6f 73 73 69 6c 53 74 61 74 20 73 74 61 74   fossilStat stat
0b80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
0b90: 6e 20 57 69 6e 64 6f 77 73 20 53 5f 49 53 4c 4e  n Windows S_ISLN
0ba0: 4b 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  K always returns
0bb0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 23 69 66 20 21   FALSE..*/.#if !
0bc0: 64 65 66 69 6e 65 64 28 53 5f 49 53 4c 4e 4b 29  defined(S_ISLNK)
0bd0: 0a 23 20 64 65 66 69 6e 65 20 53 5f 49 53 4c 4e  .# define S_ISLN
0be0: 4b 28 78 29 20 28 30 29 0a 23 65 6e 64 69 66 0a  K(x) (0).#endif.
0bf0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 6c 20 73 74 61  ./*.** Local sta
0c00: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  te information f
0c10: 6f 72 20 74 68 65 20 66 69 6c 65 20 73 74 61 74  or the file stat
0c20: 75 73 20 72 6f 75 74 69 6e 65 73 0a 2a 2f 0a 73  us routines.*/.s
0c30: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0c40: 20 73 74 72 75 63 74 20 66 6f 73 73 69 6c 53 74   struct fossilSt
0c50: 61 74 20 66 69 6c 65 53 74 61 74 3b 20 20 2f 2a  at fileStat;  /*
0c60: 20 46 69 6c 65 20 73 74 61 74 75 73 20 66 72 6f   File status fro
0c70: 6d 20 6c 61 73 74 20 66 6f 73 73 69 6c 5f 73 74  m last fossil_st
0c80: 61 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 66 69  at() */.  int fi
0c90: 6c 65 53 74 61 74 56 61 6c 69 64 3b 20 20 20 20  leStatValid;    
0ca0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0cb0: 66 20 66 69 6c 65 53 74 61 74 20 69 73 20 76 61  f fileStat is va
0cc0: 6c 69 64 20 2a 2f 0a 7d 20 66 78 3b 0a 0a 2f 2a  lid */.} fx;../*
0cd0: 0a 2a 2a 20 46 69 6c 6c 20 2a 62 75 66 20 77 69  .** Fill *buf wi
0ce0: 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  th information a
0cf0: 62 6f 75 74 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  bout zFilename..
0d00: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
0d10: 6d 65 20 72 65 66 65 72 73 20 74 6f 20 61 20 73  me refers to a s
0d20: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 3a 0a 2a 2a  ymbolic link:.**
0d30: 0a 2a 2a 20 20 28 41 29 20 49 66 20 61 6c 6c 6f  .**  (A) If allo
0d40: 77 2d 73 79 6d 6c 69 6e 6b 73 20 69 73 20 6f 6e  w-symlinks is on
0d50: 20 61 6e 64 20 65 46 54 79 70 65 20 69 73 20 52   and eFType is R
0d60: 65 70 6f 46 49 4c 45 2c 20 74 68 65 6e 20 66 69  epoFILE, then fi
0d70: 6c 6c 0a 2a 2a 20 20 20 20 20 20 2a 62 75 66 20  ll.**      *buf 
0d80: 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  with information
0d90: 20 61 62 6f 75 74 20 74 68 65 20 73 79 6d 62 6f   about the symbo
0da0: 6c 69 63 20 6c 69 6e 6b 20 69 74 73 65 6c 66 2e  lic link itself.
0db0: 0a 2a 2a 0a 2a 2a 20 20 28 42 29 20 49 66 20 61  .**.**  (B) If a
0dc0: 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 69 73  llow-symlinks is
0dd0: 20 6f 66 66 20 6f 72 20 65 46 54 79 70 65 20 69   off or eFType i
0de0: 73 20 45 78 74 46 49 4c 45 2c 20 74 68 65 6e 20  s ExtFILE, then 
0df0: 66 69 6c 6c 0a 2a 2a 20 20 20 20 20 20 2a 62 75  fill.**      *bu
0e00: 66 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  f with informati
0e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 6f 62 6a  on about the obj
0e20: 65 63 74 20 74 68 61 74 20 74 68 65 20 73 79 6d  ect that the sym
0e30: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 20 20  bolic link.**   
0e40: 20 20 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f     points to..*/
0e50: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6f 73 73  .static int foss
0e60: 69 6c 5f 73 74 61 74 28 0a 20 20 63 6f 6e 73 74  il_stat(.  const
0e70: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
0e80: 2c 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 66 69  ,  /* name of fi
0e90: 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 20  le or directory 
0ea0: 74 6f 20 69 6e 73 70 65 63 74 2e 20 2a 2f 0a 20  to inspect. */. 
0eb0: 20 73 74 72 75 63 74 20 66 6f 73 73 69 6c 53 74   struct fossilSt
0ec0: 61 74 20 2a 62 75 66 2c 20 2f 2a 20 70 6f 69 6e  at *buf, /* poin
0ed0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 77 68  ter to buffer wh
0ee0: 65 72 65 20 69 6e 66 6f 20 73 68 6f 75 6c 64 20  ere info should 
0ef0: 67 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 46 54  go. */.  int eFT
0f00: 79 70 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ype             
0f10: 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 73 79 6d 6c   /* Look at syml
0f20: 69 6e 6b 20 69 74 73 65 6c 66 20 69 66 20 52 65  ink itself if Re
0f30: 70 6f 46 49 4c 45 20 61 6e 64 20 65 6e 61 62 6c  poFILE and enabl
0f40: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ed. */.){.  int 
0f50: 72 63 3b 0a 20 20 76 6f 69 64 20 2a 7a 4d 62 63  rc;.  void *zMbc
0f60: 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f  s = fossil_utf8_
0f70: 74 6f 5f 70 61 74 68 28 7a 46 69 6c 65 6e 61 6d  to_path(zFilenam
0f80: 65 2c 20 30 29 3b 0a 23 69 66 20 21 64 65 66 69  e, 0);.#if !defi
0f90: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 69 66  ned(_WIN32).  if
0fa0: 28 20 65 46 54 79 70 65 3e 3d 52 65 70 6f 46 49  ( eFType>=RepoFI
0fb0: 4c 45 20 26 26 20 28 65 46 54 79 70 65 3d 3d 53  LE && (eFType==S
0fc0: 79 6d 46 49 4c 45 20 7c 7c 20 64 62 5f 61 6c 6c  ymFILE || db_all
0fd0: 6f 77 5f 73 79 6d 6c 69 6e 6b 73 28 29 29 20 29  ow_symlinks()) )
0fe0: 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 74 61 74  {.    rc = lstat
0ff0: 28 7a 4d 62 63 73 2c 20 62 75 66 29 3b 0a 20 20  (zMbcs, buf);.  
1000: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1010: 73 74 61 74 28 7a 4d 62 63 73 2c 20 62 75 66 29  stat(zMbcs, buf)
1020: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 72 63  ;.  }.#else.  rc
1030: 20 3d 20 77 69 6e 33 32 5f 73 74 61 74 28 7a 4d   = win32_stat(zM
1040: 62 63 73 2c 20 62 75 66 2c 20 65 46 54 79 70 65  bcs, buf, eFType
1050: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 73 73  );.#endif.  foss
1060: 69 6c 5f 70 61 74 68 5f 66 72 65 65 28 7a 4d 62  il_path_free(zMb
1070: 63 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  cs);.  return rc
1080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
1090: 73 20 74 68 65 20 66 78 2e 66 69 6c 65 53 74 61  s the fx.fileSta
10a0: 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 69  t variable and i
10b0: 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 76 61  ts associated va
10c0: 6c 69 64 69 74 79 20 66 6c 61 67 2e 0a 2a 2f 0a  lidity flag..*/.
10d0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
10e0: 74 53 74 61 74 28 29 7b 0a 20 20 66 78 2e 66 69  tStat(){.  fx.fi
10f0: 6c 65 53 74 61 74 56 61 6c 69 64 20 3d 20 30 3b  leStatValid = 0;
1100: 0a 20 20 6d 65 6d 73 65 74 28 26 66 78 2e 66 69  .  memset(&fx.fi
1110: 6c 65 53 74 61 74 2c 20 30 2c 20 73 69 7a 65 6f  leStat, 0, sizeo
1120: 66 28 73 74 72 75 63 74 20 66 6f 73 73 69 6c 53  f(struct fossilS
1130: 74 61 74 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tat));.}../*.** 
1140: 46 69 6c 6c 20 69 6e 20 74 68 65 20 66 78 2e 66  Fill in the fx.f
1150: 69 6c 65 53 74 61 74 20 76 61 72 69 61 62 6c 65  ileStat variable
1160: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 6e 61   for the file na
1170: 6d 65 64 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  med zFilename..*
1180: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  * If zFilename==
1190: 30 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  0, then use the 
11a0: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 6f  previous value o
11b0: 66 20 66 78 2e 66 69 6c 65 53 74 61 74 20 69 66  f fx.fileStat if
11c0: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 70  .** there is a p
11d0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 0a 2a  revious value..*
11e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11f0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1200: 2e 20 20 4e 6f 20 65 72 72 6f 72 20 6d 65 73 73  .  No error mess
1210: 61 67 65 73 20 61 72 65 20 67 65 6e 65 72 61 74  ages are generat
1220: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1230: 74 20 67 65 74 53 74 61 74 28 63 6f 6e 73 74 20  t getStat(const 
1240: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1250: 20 69 6e 74 20 65 46 54 79 70 65 29 7b 0a 20 20   int eFType){.  
1260: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  int rc = 0;.  if
1270: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
1280: 7b 0a 20 20 20 20 69 66 28 20 66 78 2e 66 69 6c  {.    if( fx.fil
1290: 65 53 74 61 74 56 61 6c 69 64 3d 3d 30 20 29 20  eStatValid==0 ) 
12a0: 72 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rc = 1;.  }else{
12b0: 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  .    if( fossil_
12c0: 73 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  stat(zFilename, 
12d0: 26 66 78 2e 66 69 6c 65 53 74 61 74 2c 20 65 46  &fx.fileStat, eF
12e0: 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Type)!=0 ){.    
12f0: 20 20 66 78 2e 66 69 6c 65 53 74 61 74 56 61 6c    fx.fileStatVal
1300: 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  id = 0;.      rc
1310: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1320: 0a 20 20 20 20 20 20 66 78 2e 66 69 6c 65 53 74  .      fx.fileSt
1330: 61 74 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  atValid = 1;.   
1340: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
1350: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1370: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1380: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 2e 20 20  file in bytes.  
1390: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
13a0: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 0a 2a   file does not.*
13b0: 2a 20 65 78 69 73 74 2e 20 20 49 66 20 7a 46 69  * exist.  If zFi
13c0: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20  lename is NULL, 
13d0: 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  return the size 
13e0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
13f0: 6e 74 6c 79 0a 2a 2a 20 73 74 61 74 2d 65 64 20  ntly.** stat-ed 
1400: 66 69 6c 65 2e 0a 2a 2f 0a 69 36 34 20 66 69 6c  file..*/.i64 fil
1410: 65 5f 73 69 7a 65 28 63 6f 6e 73 74 20 63 68 61  e_size(const cha
1420: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1430: 74 20 65 46 54 79 70 65 29 7b 0a 20 20 72 65 74  t eFType){.  ret
1440: 75 72 6e 20 67 65 74 53 74 61 74 28 7a 46 69 6c  urn getStat(zFil
1450: 65 6e 61 6d 65 2c 20 65 46 54 79 70 65 29 20 3f  ename, eFType) ?
1460: 20 2d 31 20 3a 20 66 78 2e 66 69 6c 65 53 74 61   -1 : fx.fileSta
1470: 74 2e 73 74 5f 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a  t.st_size;.}../*
1480: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
1490: 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65  odification time
14a0: 20 66 6f 72 20 61 20 66 69 6c 65 2e 20 20 52 65   for a file.  Re
14b0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 66  turn -1 if the f
14c0: 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
14d0: 65 78 69 73 74 2e 20 20 49 66 20 7a 46 69 6c 65  exist.  If zFile
14e0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 72 65 74  name is NULL ret
14f0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1500: 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 72 65 63 65  the most.** rece
1510: 6e 74 6c 79 20 73 74 61 74 2d 65 64 20 66 69 6c  ntly stat-ed fil
1520: 65 2e 0a 2a 2f 0a 69 36 34 20 66 69 6c 65 5f 6d  e..*/.i64 file_m
1530: 74 69 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  time(const char 
1540: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1550: 65 46 54 79 70 65 29 7b 0a 20 20 72 65 74 75 72  eFType){.  retur
1560: 6e 20 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e  n getStat(zFilen
1570: 61 6d 65 2c 20 65 46 54 79 70 65 29 20 3f 20 2d  ame, eFType) ? -
1580: 31 20 3a 20 66 78 2e 66 69 6c 65 53 74 61 74 2e  1 : fx.fileStat.
1590: 73 74 5f 6d 74 69 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  st_mtime;.}../*.
15a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
15b0: 64 65 20 62 69 74 73 20 66 6f 72 20 61 20 66 69  de bits for a fi
15c0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
15d0: 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
15e0: 6e 6f 74 0a 2a 2a 20 65 78 69 73 74 2e 20 20 49  not.** exist.  I
15f0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
1600: 55 4c 4c 20 72 65 74 75 72 6e 20 74 68 65 20 73  ULL return the s
1610: 69 7a 65 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ize of the most 
1620: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 73 74 61 74  recently.** stat
1630: 2d 65 64 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  -ed file..*/.int
1640: 20 66 69 6c 65 5f 6d 6f 64 65 28 63 6f 6e 73 74   file_mode(const
1650: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1660: 2c 20 69 6e 74 20 65 46 54 79 70 65 29 7b 0a 20  , int eFType){. 
1670: 20 72 65 74 75 72 6e 20 67 65 74 53 74 61 74 28   return getStat(
1680: 7a 46 69 6c 65 6e 61 6d 65 2c 20 65 46 54 79 70  zFilename, eFTyp
1690: 65 29 20 3f 20 2d 31 20 3a 20 66 78 2e 66 69 6c  e) ? -1 : fx.fil
16a0: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 3b 0a 7d  eStat.st_mode;.}
16b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
16c0: 52 55 45 20 69 66 20 65 69 74 68 65 72 20 6f 66  RUE if either of
16d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
16e0: 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
16f0: 20 28 31 29 20 7a 46 69 6c 65 6e 61 6d 65 20 69   (1) zFilename i
1700: 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 66 69  s an ordinary fi
1710: 6c 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 61  le.**.**   (2) a
1720: 6c 6c 6f 77 5f 73 79 6d 6c 69 6e 6b 73 20 69 73  llow_symlinks is
1730: 20 6f 6e 20 61 6e 64 20 7a 46 69 6c 65 6e 61 6d   on and zFilenam
1740: 65 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63 20  e is a symbolic 
1750: 6c 69 6e 6b 20 74 6f 0a 2a 2a 20 20 20 20 20 20  link to.**      
1760: 20 61 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f   a file, directo
1770: 72 79 2c 20 6f 72 20 6f 74 68 65 72 20 6f 62 6a  ry, or other obj
1780: 65 63 74 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  ect.*/.int file_
1790: 69 73 66 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 28 63  isfile_or_link(c
17a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
17b0: 6e 61 6d 65 29 7b 0a 20 20 69 66 28 20 67 65 74  name){.  if( get
17c0: 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Stat(zFilename, 
17d0: 52 65 70 6f 46 49 4c 45 29 20 29 7b 0a 20 20 20  RepoFILE) ){.   
17e0: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 73   return 0;  /* s
17f0: 74 61 74 28 29 20 66 61 69 6c 65 64 2e 20 20 52  tat() failed.  R
1800: 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 2a 2f 0a  eturn false. */.
1810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 5f 49    }.  return S_I
1820: 53 52 45 47 28 66 78 2e 66 69 6c 65 53 74 61 74  SREG(fx.fileStat
1830: 2e 73 74 5f 6d 6f 64 65 29 20 7c 7c 20 53 5f 49  .st_mode) || S_I
1840: 53 4c 4e 4b 28 66 78 2e 66 69 6c 65 53 74 61 74  SLNK(fx.fileStat
1850: 2e 73 74 5f 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  .st_mode);.}../*
1860: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1870: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
1880: 65 20 69 73 20 61 6e 20 6f 72 64 69 6e 61 72 79  e is an ordinary
1890: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 66   file.  Return f
18a0: 61 6c 73 65 0a 2a 2a 20 66 6f 72 20 64 69 72 65  alse.** for dire
18b0: 63 74 6f 72 69 65 73 2c 20 64 65 76 69 63 65 73  ctories, devices
18c0: 2c 20 66 69 66 6f 73 2c 20 73 79 6d 6c 69 6e 6b  , fifos, symlink
18d0: 73 2c 20 65 74 63 2e 0a 2a 2f 0a 69 6e 74 20 66  s, etc..*/.int f
18e0: 69 6c 65 5f 69 73 66 69 6c 65 28 63 6f 6e 73 74  ile_isfile(const
18f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1900: 2c 20 69 6e 74 20 65 46 54 79 70 65 29 7b 0a 20  , int eFType){. 
1910: 20 72 65 74 75 72 6e 20 67 65 74 53 74 61 74 28   return getStat(
1920: 7a 46 69 6c 65 6e 61 6d 65 2c 20 65 46 54 79 70  zFilename, eFTyp
1930: 65 29 20 3f 20 30 20 3a 20 53 5f 49 53 52 45 47  e) ? 0 : S_ISREG
1940: 28 66 78 2e 66 69 6c 65 53 74 61 74 2e 73 74 5f  (fx.fileStat.st_
1950: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mode);.}../*.** 
1960: 43 72 65 61 74 65 20 61 20 73 79 6d 62 6f 6c 69  Create a symboli
1970: 63 20 6c 69 6e 6b 20 6e 61 6d 65 64 20 7a 4c 69  c link named zLi
1980: 6e 6b 46 69 6c 65 20 74 68 61 74 20 70 6f 69 6e  nkFile that poin
1990: 74 73 20 74 6f 20 7a 54 61 72 67 65 74 46 69 6c  ts to zTargetFil
19a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 6f  e..**.** If allo
19b0: 77 2d 73 79 6d 6c 69 6e 6b 73 20 69 73 20 6f 66  w-symlinks is of
19c0: 66 2c 20 63 72 65 61 74 65 20 61 6e 20 6f 72 64  f, create an ord
19d0: 69 6e 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 64  inary file named
19e0: 20 7a 4c 69 6e 6b 46 69 6c 65 0a 2a 2a 20 77 69   zLinkFile.** wi
19f0: 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 7a  th the name of z
1a00: 54 61 72 67 65 74 46 69 6c 65 20 61 73 20 69 74  TargetFile as it
1a10: 73 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 2f 0a 76  s content..**/.v
1a20: 6f 69 64 20 73 79 6d 6c 69 6e 6b 5f 63 72 65 61  oid symlink_crea
1a30: 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  te(const char *z
1a40: 54 61 72 67 65 74 46 69 6c 65 2c 20 63 6f 6e 73  TargetFile, cons
1a50: 74 20 63 68 61 72 20 2a 7a 4c 69 6e 6b 46 69 6c  t char *zLinkFil
1a60: 65 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  e){.#if !defined
1a70: 28 5f 57 49 4e 33 32 29 0a 20 20 69 66 28 20 64  (_WIN32).  if( d
1a80: 62 5f 61 6c 6c 6f 77 5f 73 79 6d 6c 69 6e 6b 73  b_allow_symlinks
1a90: 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  () ){.    int i,
1aa0: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72   nName;.    char
1ab0: 20 2a 7a 4e 61 6d 65 2c 20 7a 42 75 66 5b 31 30   *zName, zBuf[10
1ac0: 30 30 5d 3b 0a 0a 20 20 20 20 6e 4e 61 6d 65 20  00];..    nName 
1ad0: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 6b 46 69  = strlen(zLinkFi
1ae0: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 4e 61  le);.    if( nNa
1af0: 6d 65 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29  me>=sizeof(zBuf)
1b00: 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   ){.      zName 
1b10: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  = mprintf("%s", 
1b20: 7a 4c 69 6e 6b 46 69 6c 65 29 3b 0a 20 20 20 20  zLinkFile);.    
1b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
1b40: 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 20  me = zBuf;.     
1b50: 20 6d 65 6d 63 70 79 28 7a 4e 61 6d 65 2c 20 7a   memcpy(zName, z
1b60: 4c 69 6e 6b 46 69 6c 65 2c 20 6e 4e 61 6d 65 2b  LinkFile, nName+
1b70: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e  1);.    }.    nN
1b80: 61 6d 65 20 3d 20 66 69 6c 65 5f 73 69 6d 70 6c  ame = file_simpl
1b90: 69 66 79 5f 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20  ify_name(zName, 
1ba0: 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 66  nName, 0);.    f
1bb0: 6f 72 28 69 3d 31 3b 20 69 3c 6e 4e 61 6d 65 3b  or(i=1; i<nName;
1bc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1bd0: 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 2f 27 20 29   zName[i]=='/' )
1be0: 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  {.        zName[
1bf0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  i] = 0;.        
1c00: 69 66 28 20 66 69 6c 65 5f 6d 6b 64 69 72 28 7a  if( file_mkdir(z
1c10: 4e 61 6d 65 2c 20 45 78 74 46 49 4c 45 2c 20 31  Name, ExtFILE, 1
1c20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
1c30: 6f 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65 63 75  ossil_fatal_recu
1c40: 72 73 69 76 65 28 22 75 6e 61 62 6c 65 20 74 6f  rsive("unable to
1c50: 20 63 72 65 61 74 65 20 64 69 72 65 63 74 6f 72   create director
1c60: 79 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  y %s", zName);. 
1c70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
1c80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c90: 20 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 27 2f     zName[i] = '/
1ca0: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
1cb0: 0a 20 20 20 20 69 66 28 20 73 79 6d 6c 69 6e 6b  .    if( symlink
1cc0: 28 7a 54 61 72 67 65 74 46 69 6c 65 2c 20 7a 4e  (zTargetFile, zN
1cd0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
1ce0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65   fossil_fatal_re
1cf0: 63 75 72 73 69 76 65 28 22 75 6e 61 62 6c 65 20  cursive("unable 
1d00: 74 6f 20 63 72 65 61 74 65 20 73 79 6d 6c 69 6e  to create symlin
1d10: 6b 20 5c 22 25 73 5c 22 22 2c 20 7a 4e 61 6d 65  k \"%s\"", zName
1d20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1d30: 20 7a 4e 61 6d 65 21 3d 7a 42 75 66 20 29 20 66   zName!=zBuf ) f
1d40: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ree(zName);.  }e
1d50: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1d60: 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b     Blob content;
1d70: 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 26 63  .    blob_set(&c
1d80: 6f 6e 74 65 6e 74 2c 20 7a 54 61 72 67 65 74 46  ontent, zTargetF
1d90: 69 6c 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 77  ile);.    blob_w
1da0: 72 69 74 65 5f 74 6f 5f 66 69 6c 65 28 26 63 6f  rite_to_file(&co
1db0: 6e 74 65 6e 74 2c 20 7a 4c 69 6e 6b 46 69 6c 65  ntent, zLinkFile
1dc0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
1dd0: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d  t(&content);.  }
1de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 73  .}../*.** Copy s
1df0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 66 72 6f  ymbolic link fro
1e00: 6d 20 7a 46 72 6f 6d 20 74 6f 20 7a 54 6f 2e 0a  m zFrom to zTo..
1e10: 2a 2f 0a 76 6f 69 64 20 73 79 6d 6c 69 6e 6b 5f  */.void symlink_
1e20: 63 6f 70 79 28 63 6f 6e 73 74 20 63 68 61 72 20  copy(const char 
1e30: 2a 7a 46 72 6f 6d 2c 20 63 6f 6e 73 74 20 63 68  *zFrom, const ch
1e40: 61 72 20 2a 7a 54 6f 29 7b 0a 20 20 42 6c 6f 62  ar *zTo){.  Blob
1e50: 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 62 6c 6f 62   content;.  blob
1e60: 5f 72 65 61 64 5f 6c 69 6e 6b 28 26 63 6f 6e 74  _read_link(&cont
1e70: 65 6e 74 2c 20 7a 46 72 6f 6d 29 3b 0a 20 20 73  ent, zFrom);.  s
1e80: 79 6d 6c 69 6e 6b 5f 63 72 65 61 74 65 28 62 6c  ymlink_create(bl
1e90: 6f 62 5f 73 74 72 28 26 63 6f 6e 74 65 6e 74 29  ob_str(&content)
1ea0: 2c 20 7a 54 6f 29 3b 0a 20 20 62 6c 6f 62 5f 72  , zTo);.  blob_r
1eb0: 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a  eset(&content);.
1ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ed0: 66 69 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  file permissions
1ee0: 20 28 6e 6f 72 6d 61 6c 2c 20 65 78 65 63 75 74   (normal, execut
1ef0: 61 62 6c 65 2c 20 6f 72 20 73 79 6d 6c 69 6e 6b  able, or symlink
1f00: 29 3a 0a 2a 2a 20 20 20 2d 20 50 45 52 4d 5f 45  ):.**   - PERM_E
1f10: 58 45 20 6f 6e 20 55 6e 69 78 20 69 66 20 66 69  XE on Unix if fi
1f20: 6c 65 20 69 73 20 65 78 65 63 75 74 61 62 6c 65  le is executable
1f30: 3b 0a 2a 2a 20 20 20 2d 20 50 45 52 4d 5f 4c 4e  ;.**   - PERM_LN
1f40: 4b 20 6f 6e 20 55 6e 69 78 20 69 66 20 66 69 6c  K on Unix if fil
1f50: 65 20 69 73 20 73 79 6d 6c 69 6e 6b 20 61 6e 64  e is symlink and
1f60: 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20   allow-symlinks 
1f70: 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 3b 0a 2a 2a  option is on;.**
1f80: 20 20 20 2d 20 50 45 52 4d 5f 52 45 47 20 66 6f     - PERM_REG fo
1f90: 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  r all other case
1fa0: 73 20 28 72 65 67 75 6c 61 72 20 66 69 6c 65 2c  s (regular file,
1fb0: 20 64 69 72 65 63 74 6f 72 79 2c 20 66 69 66 6f   directory, fifo
1fc0: 2c 20 65 74 63 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  , etc)..**.** If
1fd0: 20 65 46 54 79 70 65 20 69 73 20 45 78 74 46 69   eFType is ExtFi
1fe0: 6c 65 20 74 68 65 6e 20 73 79 6d 62 6f 6c 69 63  le then symbolic
1ff0: 20 6c 69 6e 6b 73 20 61 72 65 20 66 6f 6c 6c 6f   links are follo
2000: 77 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 0a  wed and so this.
2010: 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6f  ** routine can o
2020: 6e 6c 79 20 72 65 74 75 72 6e 20 50 45 52 4d 5f  nly return PERM_
2030: 45 58 45 20 61 6e 64 20 50 45 52 4d 5f 52 45 47  EXE and PERM_REG
2040: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 77 69 6e 64 6f  ..**.** On windo
2050: 77 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ws, this routine
2060: 20 72 65 74 75 72 6e 73 20 6f 6e 6c 79 20 50 45   returns only PE
2070: 52 4d 5f 52 45 47 2e 0a 2a 2f 0a 69 6e 74 20 66  RM_REG..*/.int f
2080: 69 6c 65 5f 70 65 72 6d 28 63 6f 6e 73 74 20 63  ile_perm(const c
2090: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
20a0: 69 6e 74 20 65 46 54 79 70 65 29 7b 0a 23 69 66  int eFType){.#if
20b0: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
20c0: 29 0a 20 20 69 66 28 20 21 67 65 74 53 74 61 74  ).  if( !getStat
20d0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 65 70 6f  (zFilename, Repo
20e0: 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 20 69 66  FILE) ){.     if
20f0: 28 20 53 5f 49 53 52 45 47 28 66 78 2e 66 69 6c  ( S_ISREG(fx.fil
2100: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20 26  eStat.st_mode) &
2110: 26 20 28 28 53 5f 49 58 55 53 52 29 26 66 78 2e  & ((S_IXUSR)&fx.
2120: 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65  fileStat.st_mode
2130: 29 21 3d 30 20 29 0a 20 20 20 20 20 20 72 65 74  )!=0 ).      ret
2140: 75 72 6e 20 50 45 52 4d 5f 45 58 45 3b 0a 20 20  urn PERM_EXE;.  
2150: 20 20 65 6c 73 65 20 69 66 28 20 64 62 5f 61 6c    else if( db_al
2160: 6c 6f 77 5f 73 79 6d 6c 69 6e 6b 73 28 29 20 26  low_symlinks() &
2170: 26 20 53 5f 49 53 4c 4e 4b 28 66 78 2e 66 69 6c  & S_ISLNK(fx.fil
2180: 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20 29  eStat.st_mode) )
2190: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 45  .      return PE
21a0: 52 4d 5f 4c 4e 4b 3b 0a 20 20 7d 0a 23 65 6e 64  RM_LNK;.  }.#end
21b0: 69 66 0a 20 20 72 65 74 75 72 6e 20 50 45 52 4d  if.  return PERM
21c0: 5f 52 45 47 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  _REG;.}../*.** R
21d0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
21e0: 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
21f0: 61 6e 20 65 78 65 63 75 74 61 62 6c 65 2e 20 20  an executable.  
2200: 52 65 74 75 72 6e 20 66 61 6c 73 65 0a 2a 2a 20  Return false.** 
2210: 66 6f 72 20 64 69 72 65 63 74 6f 72 69 65 73 2c  for directories,
2220: 20 64 65 76 69 63 65 73 2c 20 66 69 66 6f 73 2c   devices, fifos,
2230: 20 73 79 6d 6c 69 6e 6b 73 2c 20 65 74 63 2e 0a   symlinks, etc..
2240: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 69 73 65 78  */.int file_isex
2250: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
2260: 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 65 46 54  ilename, int eFT
2270: 79 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ype){.  return f
2280: 69 6c 65 5f 70 65 72 6d 28 7a 46 69 6c 65 6e 61  ile_perm(zFilena
2290: 6d 65 2c 20 65 46 54 79 70 65 29 3d 3d 50 45 52  me, eFType)==PER
22a0: 4d 5f 45 58 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  M_EXE;.}../*.** 
22b0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
22c0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73  he named file is
22d0: 20 61 20 73 79 6d 6c 69 6e 6b 20 61 6e 64 20 73   a symlink and s
22e0: 79 6d 6c 69 6e 6b 73 20 61 72 65 20 61 6c 6c 6f  ymlinks are allo
22f0: 77 65 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  wed..** Return f
2300: 61 6c 73 65 20 66 6f 72 20 61 6c 6c 20 6f 74 68  alse for all oth
2310: 65 72 20 63 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  er cases..**.** 
2320: 54 68 69 73 20 72 6f 75 74 69 6e 65 73 20 52 65  This routines Re
2330: 70 6f 46 49 4c 45 20 2d 20 74 68 61 74 20 7a 46  poFILE - that zF
2340: 69 6c 65 6e 61 6d 65 20 69 73 20 61 6c 77 61 79  ilename is alway
2350: 73 20 61 20 66 69 6c 65 20 75 6e 64 65 72 20 6d  s a file under m
2360: 61 6e 61 67 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  anagement..**.**
2370: 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c 77   On Windows, alw
2380: 61 79 73 20 72 65 74 75 72 6e 20 46 61 6c 73 65  ays return False
2390: 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 69 73  ..*/.int file_is
23a0: 6c 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  link(const char 
23b0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72  *zFilename){.  r
23c0: 65 74 75 72 6e 20 66 69 6c 65 5f 70 65 72 6d 28  eturn file_perm(
23d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 65 70 6f 46  zFilename, RepoF
23e0: 49 4c 45 29 3d 3d 50 45 52 4d 5f 4c 4e 4b 3b 0a  ILE)==PERM_LNK;.
23f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2400: 31 20 69 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  1 if zFilename i
2410: 73 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  s a directory.  
2420: 52 65 74 75 72 6e 20 30 20 69 66 20 7a 46 69 6c  Return 0 if zFil
2430: 65 6e 61 6d 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f  ename.** does no
2440: 74 20 65 78 69 73 74 2e 20 20 52 65 74 75 72 6e  t exist.  Return
2450: 20 32 20 69 66 20 7a 46 69 6c 65 6e 61 6d 65 20   2 if zFilename 
2460: 65 78 69 73 74 73 20 62 75 74 20 69 73 20 73 6f  exists but is so
2470: 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  mething.** other
2480: 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72   than a director
2490: 79 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 69  y..*/.int file_i
24a0: 73 64 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20  sdir(const char 
24b0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
24c0: 65 46 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  eFType){.  int r
24d0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 4e 3b 0a  c;.  char *zFN;.
24e0: 0a 20 20 7a 46 4e 20 3d 20 6d 70 72 69 6e 74 66  .  zFN = mprintf
24f0: 28 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ("%s", zFilename
2500: 29 3b 0a 20 20 66 69 6c 65 5f 73 69 6d 70 6c 69  );.  file_simpli
2510: 66 79 5f 6e 61 6d 65 28 7a 46 4e 2c 20 2d 31 2c  fy_name(zFN, -1,
2520: 20 30 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 53   0);.  rc = getS
2530: 74 61 74 28 7a 46 4e 2c 20 65 46 54 79 70 65 29  tat(zFN, eFType)
2540: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2550: 20 20 72 63 20 3d 20 30 3b 20 2f 2a 20 49 74 20    rc = 0; /* It 
2560: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 61  does not exist a
2570: 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 65 6c 73  t all. */.  }els
2580: 65 20 69 66 28 20 53 5f 49 53 44 49 52 28 66 78  e if( S_ISDIR(fx
2590: 2e 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64  .fileStat.st_mod
25a0: 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  e) ){.    rc = 1
25b0: 3b 20 2f 2a 20 49 74 20 65 78 69 73 74 73 20 61  ; /* It exists a
25c0: 6e 64 20 69 73 20 61 20 72 65 61 6c 20 64 69 72  nd is a real dir
25d0: 65 63 74 6f 72 79 2e 20 2a 2f 0a 20 20 7d 65 6c  ectory. */.  }el
25e0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 20  se{.    rc = 2; 
25f0: 2f 2a 20 49 74 20 65 78 69 73 74 73 20 61 6e 64  /* It exists and
2600: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c   is something el
2610: 73 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 66 72 65  se. */.  }.  fre
2620: 65 28 7a 46 4e 29 3b 0a 20 20 72 65 74 75 72 6e  e(zFN);.  return
2630: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
2640: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68  rapper around th
2650: 65 20 61 63 63 65 73 73 28 29 20 73 79 73 74 65  e access() syste
2660: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 66  m call..*/.int f
2670: 69 6c 65 5f 61 63 63 65 73 73 28 63 6f 6e 73 74  ile_access(const
2680: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2690: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
26a0: 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a  int rc;.  void *
26b0: 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f 75  zMbcs = fossil_u
26c0: 74 66 38 5f 74 6f 5f 70 61 74 68 28 7a 46 69 6c  tf8_to_path(zFil
26d0: 65 6e 61 6d 65 2c 20 30 29 3b 0a 23 69 66 64 65  ename, 0);.#ifde
26e0: 66 20 5f 57 49 4e 33 32 0a 20 20 72 63 20 3d 20  f _WIN32.  rc = 
26f0: 77 69 6e 33 32 5f 61 63 63 65 73 73 28 7a 4d 62  win32_access(zMb
2700: 63 73 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6c 73  cs, flags);.#els
2710: 65 0a 20 20 72 63 20 3d 20 61 63 63 65 73 73 28  e.  rc = access(
2720: 7a 4d 62 63 73 2c 20 66 6c 61 67 73 29 3b 0a 23  zMbcs, flags);.#
2730: 65 6e 64 69 66 0a 20 20 66 6f 73 73 69 6c 5f 70  endif.  fossil_p
2740: 61 74 68 5f 66 72 65 65 28 7a 4d 62 63 73 29 3b  ath_free(zMbcs);
2750: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2760: 0a 2f 2a 0a 2a 2a 20 57 72 61 70 70 65 72 20 61  ./*.** Wrapper a
2770: 72 6f 75 6e 64 20 74 68 65 20 63 68 64 69 72 28  round the chdir(
2780: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  ) system call..*
2790: 2a 20 49 66 20 62 43 68 72 6f 6f 74 3d 31 2c 20  * If bChroot=1, 
27a0: 64 6f 20 61 20 63 68 72 6f 6f 74 20 74 6f 20 74  do a chroot to t
27b0: 68 69 73 20 64 69 72 20 61 73 20 77 65 6c 6c 0a  his dir as well.
27c0: 2a 2a 20 28 55 4e 49 58 20 6f 6e 6c 79 29 0a 2a  ** (UNIX only).*
27d0: 2f 0a 69 6e 74 20 66 69 6c 65 5f 63 68 64 69 72  /.int file_chdir
27e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68  (const char *zCh
27f0: 44 69 72 2c 20 69 6e 74 20 62 43 68 72 6f 6f 74  Dir, int bChroot
2800: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  ){.  int rc;.  v
2810: 6f 69 64 20 2a 7a 50 61 74 68 20 3d 20 66 6f 73  oid *zPath = fos
2820: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 70 61 74 68  sil_utf8_to_path
2830: 28 7a 43 68 44 69 72 2c 20 31 29 3b 0a 23 69 66  (zChDir, 1);.#if
2840: 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 72 63 20  def _WIN32.  rc 
2850: 3d 20 77 69 6e 33 32 5f 63 68 64 69 72 28 7a 50  = win32_chdir(zP
2860: 61 74 68 2c 20 62 43 68 72 6f 6f 74 29 3b 0a 23  ath, bChroot);.#
2870: 65 6c 73 65 0a 20 20 72 63 20 3d 20 63 68 64 69  else.  rc = chdi
2880: 72 28 7a 50 61 74 68 29 3b 0a 20 20 69 66 28 20  r(zPath);.  if( 
2890: 21 72 63 20 26 26 20 62 43 68 72 6f 6f 74 20 29  !rc && bChroot )
28a0: 7b 0a 20 20 20 20 72 63 20 3d 20 63 68 72 6f 6f  {.    rc = chroo
28b0: 74 28 7a 50 61 74 68 29 3b 0a 20 20 20 20 69 66  t(zPath);.    if
28c0: 28 20 21 72 63 20 29 20 72 63 20 3d 20 63 68 64  ( !rc ) rc = chd
28d0: 69 72 28 22 2f 22 29 3b 0a 20 20 7d 0a 23 65 6e  ir("/");.  }.#en
28e0: 64 69 66 0a 20 20 66 6f 73 73 69 6c 5f 70 61 74  dif.  fossil_pat
28f0: 68 5f 66 72 65 65 28 7a 50 61 74 68 29 3b 0a 20  h_free(zPath);. 
2900: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2910: 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 75 6e 75  *.** Find an unu
2920: 73 65 64 20 66 69 6c 65 6e 61 6d 65 20 73 69 6d  sed filename sim
2930: 69 6c 61 72 20 74 6f 20 7a 42 61 73 65 20 77 69  ilar to zBase wi
2940: 74 68 20 7a 53 75 66 66 69 78 20 61 70 70 65 6e  th zSuffix appen
2950: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20  ded..**.** Make 
2960: 74 68 65 20 6e 61 6d 65 20 72 65 6c 61 74 69 76  the name relativ
2970: 65 20 74 6f 20 74 68 65 20 77 6f 72 6b 69 6e 67  e to the working
2980: 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 72 65   directory if re
2990: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  lFlag is true..*
29a0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
29b0: 6c 64 20 74 68 65 20 6e 65 77 20 66 69 6c 65 6e  ld the new filen
29c0: 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ame is obtained 
29d0: 66 6f 72 6d 20 6d 70 72 69 6e 74 66 28 29 20 61  form mprintf() a
29e0: 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
29f0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
2a00: 6c 65 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 69  ler..*/.char *fi
2a10: 6c 65 5f 6e 65 77 6e 61 6d 65 28 63 6f 6e 73 74  le_newname(const
2a20: 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 63 6f   char *zBase, co
2a30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
2a40: 78 2c 20 69 6e 74 20 72 65 6c 46 6c 61 67 29 7b  x, int relFlag){
2a50: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  .  char *z = 0;.
2a60: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
2a70: 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73   z = mprintf("%s
2a80: 2d 25 73 22 2c 20 7a 42 61 73 65 2c 20 7a 53 75  -%s", zBase, zSu
2a90: 66 66 69 78 29 3b 0a 20 20 77 68 69 6c 65 28 20  ffix);.  while( 
2aa0: 66 69 6c 65 5f 73 69 7a 65 28 7a 2c 20 45 78 74  file_size(z, Ext
2ab0: 46 49 4c 45 29 3e 3d 30 20 29 7b 0a 20 20 20 20  FILE)>=0 ){.    
2ac0: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b 0a  fossil_free(z);.
2ad0: 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28      z = mprintf(
2ae0: 22 25 73 2d 25 73 2d 25 64 22 2c 20 7a 42 61 73  "%s-%s-%d", zBas
2af0: 65 2c 20 7a 53 75 66 66 69 78 2c 20 63 6e 74 2b  e, zSuffix, cnt+
2b00: 2b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  +);.  }.  if( re
2b10: 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 42 6c 6f  lFlag ){.    Blo
2b20: 62 20 78 3b 0a 20 20 20 20 66 69 6c 65 5f 72 65  b x;.    file_re
2b30: 6c 61 74 69 76 65 5f 6e 61 6d 65 28 7a 2c 20 26  lative_name(z, &
2b40: 78 2c 20 30 29 3b 0a 20 20 20 20 66 6f 73 73 69  x, 0);.    fossi
2b50: 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7a  l_free(z);.    z
2b60: 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 78 29 3b   = blob_str(&x);
2b70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
2b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2b90: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 61 20 66   the tail of a f
2ba0: 69 6c 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 54  ile pathname.  T
2bb0: 68 65 20 74 61 69 6c 20 69 73 20 74 68 65 20 6c  he tail is the l
2bc0: 61 73 74 20 63 6f 6d 70 6f 6e 65 6e 74 0a 2a 2a  ast component.**
2bd0: 20 6f 66 20 74 68 65 20 70 61 74 68 2e 20 20 46   of the path.  F
2be0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
2bf0: 74 61 69 6c 20 6f 66 20 22 2f 61 2f 62 2f 63 2e  tail of "/a/b/c.
2c00: 64 22 20 69 73 20 22 63 2e 64 22 2e 0a 2a 2f 0a  d" is "c.d"..*/.
2c10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2c20: 5f 74 61 69 6c 28 63 6f 6e 73 74 20 63 68 61 72  _tail(const char
2c30: 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *z){.  const ch
2c40: 61 72 20 2a 7a 54 61 69 6c 20 3d 20 7a 3b 0a 20  ar *zTail = z;. 
2c50: 20 69 66 28 20 21 7a 54 61 69 6c 20 29 20 72 65   if( !zTail ) re
2c60: 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
2c70: 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28   z[0] ){.    if(
2c80: 20 66 6f 73 73 69 6c 5f 69 73 64 69 72 73 65 70   fossil_isdirsep
2c90: 28 7a 5b 30 5d 29 20 29 20 7a 54 61 69 6c 20 3d  (z[0]) ) zTail =
2ca0: 20 26 7a 5b 31 5d 3b 0a 20 20 20 20 7a 2b 2b 3b   &z[1];.    z++;
2cb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54  .  }.  return zT
2cc0: 61 69 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ail;.}../*.** Re
2cd0: 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
2ce0: 72 79 20 6f 66 20 61 20 66 69 6c 65 20 70 61 74  ry of a file pat
2cf0: 68 20 6e 61 6d 65 2e 20 20 54 68 65 20 64 69 72  h name.  The dir
2d00: 65 63 74 6f 72 79 20 69 73 20 61 6c 6c 20 63 6f  ectory is all co
2d10: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 20 65 78 63 65  mponents.** exce
2d20: 70 74 20 74 68 65 20 6c 61 73 74 20 6f 6e 65 2e  pt the last one.
2d30: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
2d40: 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
2d50: 22 2f 61 2f 62 2f 63 2e 64 22 20 69 73 20 22 2f  "/a/b/c.d" is "/
2d60: 61 2f 62 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72  a/b"..** If ther
2d70: 65 20 69 73 20 6e 6f 20 64 69 72 65 63 74 6f 72  e is no director
2d80: 79 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  y, NULL is retur
2d90: 6e 65 64 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ned; otherwise, 
2da0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 6d 65 6d  the returned mem
2db0: 6f 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  ory.** should be
2dc0: 20 66 72 65 65 64 20 76 69 61 20 66 6f 73 73 69   freed via fossi
2dd0: 6c 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 63 68 61  l_free()..*/.cha
2de0: 72 20 2a 66 69 6c 65 5f 64 69 72 6e 61 6d 65 28  r *file_dirname(
2df0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
2e00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2e10: 61 69 6c 20 3d 20 66 69 6c 65 5f 74 61 69 6c 28  ail = file_tail(
2e20: 7a 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20  z);.  if( zTail 
2e30: 26 26 20 7a 54 61 69 6c 21 3d 7a 20 29 7b 0a 20  && zTail!=z ){. 
2e40: 20 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74     return mprint
2e50: 66 28 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 28  f("%.*s", (int)(
2e60: 7a 54 61 69 6c 2d 7a 2d 31 29 2c 20 7a 29 3b 0a  zTail-z-1), z);.
2e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2e80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
2e90: 0a 2a 2a 20 52 65 6e 61 6d 65 20 61 20 66 69 6c  .** Rename a fil
2ea0: 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 2e 0a  e or directory..
2eb0: 2a 2a 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20  ** Returns zero 
2ec0: 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  upon success..*/
2ed0: 0a 69 6e 74 20 66 69 6c 65 5f 72 65 6e 61 6d 65  .int file_rename
2ee0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2ef0: 7a 46 72 6f 6d 2c 0a 20 20 63 6f 6e 73 74 20 63  zFrom,.  const c
2f00: 68 61 72 20 2a 7a 54 6f 2c 0a 20 20 69 6e 74 20  har *zTo,.  int 
2f10: 69 73 46 72 6f 6d 44 69 72 2c 0a 20 20 69 6e 74  isFromDir,.  int
2f20: 20 69 73 54 6f 44 69 72 0a 29 7b 0a 20 20 69 6e   isToDir.){.  in
2f30: 74 20 72 63 3b 0a 23 69 66 20 64 65 66 69 6e 65  t rc;.#if define
2f40: 64 28 5f 57 49 4e 33 32 29 0a 20 20 77 63 68 61  d(_WIN32).  wcha
2f50: 72 5f 74 20 2a 7a 4d 62 63 73 46 72 6f 6d 20 3d  r_t *zMbcsFrom =
2f60: 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f   fossil_utf8_to_
2f70: 70 61 74 68 28 7a 46 72 6f 6d 2c 20 69 73 46 72  path(zFrom, isFr
2f80: 6f 6d 44 69 72 29 3b 0a 20 20 77 63 68 61 72 5f  omDir);.  wchar_
2f90: 74 20 2a 7a 4d 62 63 73 54 6f 20 3d 20 66 6f 73  t *zMbcsTo = fos
2fa0: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 70 61 74 68  sil_utf8_to_path
2fb0: 28 7a 54 6f 2c 20 69 73 54 6f 44 69 72 29 3b 0a  (zTo, isToDir);.
2fc0: 20 20 72 63 20 3d 20 5f 77 72 65 6e 61 6d 65 28    rc = _wrename(
2fd0: 7a 4d 62 63 73 46 72 6f 6d 2c 20 7a 4d 62 63 73  zMbcsFrom, zMbcs
2fe0: 54 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61  To);.#else.  cha
2ff0: 72 20 2a 7a 4d 62 63 73 46 72 6f 6d 20 3d 20 66  r *zMbcsFrom = f
3000: 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 70 61  ossil_utf8_to_pa
3010: 74 68 28 7a 46 72 6f 6d 2c 20 69 73 46 72 6f 6d  th(zFrom, isFrom
3020: 44 69 72 29 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  Dir);.  char *zM
3030: 62 63 73 54 6f 20 3d 20 66 6f 73 73 69 6c 5f 75  bcsTo = fossil_u
3040: 74 66 38 5f 74 6f 5f 70 61 74 68 28 7a 54 6f 2c  tf8_to_path(zTo,
3050: 20 69 73 54 6f 44 69 72 29 3b 0a 20 20 72 63 20   isToDir);.  rc 
3060: 3d 20 72 65 6e 61 6d 65 28 7a 4d 62 63 73 46 72  = rename(zMbcsFr
3070: 6f 6d 2c 20 7a 4d 62 63 73 54 6f 29 3b 0a 23 65  om, zMbcsTo);.#e
3080: 6e 64 69 66 0a 20 20 66 6f 73 73 69 6c 5f 70 61  ndif.  fossil_pa
3090: 74 68 5f 66 72 65 65 28 7a 4d 62 63 73 54 6f 29  th_free(zMbcsTo)
30a0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 61 74 68 5f  ;.  fossil_path_
30b0: 66 72 65 65 28 7a 4d 62 63 73 46 72 6f 6d 29 3b  free(zMbcsFrom);
30c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30d0: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
30e0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 6c  content of a fil
30f0: 65 20 66 72 6f 6d 20 6f 6e 65 20 70 6c 61 63 65  e from one place
3100: 20 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a   to another..*/.
3110: 76 6f 69 64 20 66 69 6c 65 5f 63 6f 70 79 28 63  void file_copy(c
3120: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d  onst char *zFrom
3130: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
3140: 6f 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 2c 20  o){.  FILE *in, 
3150: 2a 6f 75 74 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *out;.  int got;
3160: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 38 31 39  .  char zBuf[819
3170: 32 5d 3b 0a 20 20 69 6e 20 3d 20 66 6f 73 73 69  2];.  in = fossi
3180: 6c 5f 66 6f 70 65 6e 28 7a 46 72 6f 6d 2c 20 22  l_fopen(zFrom, "
3190: 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
31a0: 30 20 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c  0 ) fossil_fatal
31b0: 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  ("cannot open \"
31c0: 25 73 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67  %s\" for reading
31d0: 22 2c 20 7a 46 72 6f 6d 29 3b 0a 20 20 66 69 6c  ", zFrom);.  fil
31e0: 65 5f 6d 6b 66 6f 6c 64 65 72 28 7a 54 6f 2c 20  e_mkfolder(zTo, 
31f0: 45 78 74 46 49 4c 45 2c 20 30 2c 20 30 29 3b 0a  ExtFILE, 0, 0);.
3200: 20 20 6f 75 74 20 3d 20 66 6f 73 73 69 6c 5f 66    out = fossil_f
3210: 6f 70 65 6e 28 7a 54 6f 2c 20 22 77 62 22 29 3b  open(zTo, "wb");
3220: 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 20  .  if( out==0 ) 
3230: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61  fossil_fatal("ca
3240: 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
3250: 20 66 6f 72 20 77 72 69 74 69 6e 67 22 2c 20 7a   for writing", z
3260: 54 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 67  To);.  while( (g
3270: 6f 74 3d 66 72 65 61 64 28 7a 42 75 66 2c 20 31  ot=fread(zBuf, 1
3280: 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
3290: 69 6e 29 29 3e 30 20 29 7b 0a 20 20 20 20 66 77  in))>0 ){.    fw
32a0: 72 69 74 65 28 7a 42 75 66 2c 20 31 2c 20 67 6f  rite(zBuf, 1, go
32b0: 74 2c 20 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 66  t, out);.  }.  f
32c0: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c  close(in);.  fcl
32d0: 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  ose(out);.}../*.
32e0: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74  ** COMMAND: test
32f0: 2d 66 69 6c 65 2d 63 6f 70 79 0a 2a 2a 0a 2a 2a  -file-copy.**.**
3300: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
3310: 74 65 73 74 2d 66 69 6c 65 2d 63 6f 70 79 20 53  test-file-copy S
3320: 4f 55 52 43 45 20 44 45 53 54 49 4e 41 54 49 4f  OURCE DESTINATIO
3330: 4e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  N.**.** Make a c
3340: 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 20  opy of the file 
3350: 61 74 20 53 4f 55 52 43 45 20 69 6e 74 6f 20 61  at SOURCE into a
3360: 20 6e 65 77 20 6e 61 6d 65 20 44 45 53 54 49 4e   new name DESTIN
3370: 41 54 49 4f 4e 2e 20 20 41 6e 79 0a 2a 2a 20 64  ATION.  Any.** d
3380: 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 74 68  irectories in th
3390: 65 20 70 61 74 68 20 6c 65 61 64 69 6e 67 20 75  e path leading u
33a0: 70 20 74 6f 20 44 45 53 54 49 4e 41 54 49 4f 4e  p to DESTINATION
33b0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 6c 72   that do not alr
33c0: 65 61 64 79 0a 2a 2a 20 65 78 69 73 74 20 61 72  eady.** exist ar
33d0: 65 20 63 72 65 61 74 65 64 20 61 75 74 6f 6d 61  e created automa
33e0: 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  tically..*/.void
33f0: 20 74 65 73 74 5f 66 69 6c 65 5f 63 6f 70 79 28   test_file_copy(
3400: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 2e 61  void){.  if( g.a
3410: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 66 6f  rgc!=4 ){.    fo
3420: 73 73 69 6c 5f 66 61 74 61 6c 28 22 55 73 61 67  ssil_fatal("Usag
3430: 65 3a 20 25 73 20 74 65 73 74 2d 66 69 6c 65 2d  e: %s test-file-
3440: 63 6f 70 79 20 53 4f 55 52 43 45 20 44 45 53 54  copy SOURCE DEST
3450: 49 4e 41 54 49 4f 4e 22 2c 20 67 2e 61 72 67 76  INATION", g.argv
3460: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  [0]);.  }.  file
3470: 5f 63 6f 70 79 28 67 2e 61 72 67 76 5b 32 5d 2c  _copy(g.argv[2],
3480: 20 67 2e 61 72 67 76 5b 33 5d 29 3b 0a 7d 0a 0a   g.argv[3]);.}..
3490: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65  /*.** Set or cle
34a0: 61 72 20 74 68 65 20 65 78 65 63 75 74 65 20 62  ar the execute b
34b0: 69 74 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 52  it on a file.  R
34c0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 20  eturn true if a 
34d0: 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63 75 72 72  change.** occurr
34e0: 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  ed and false if 
34f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
3500: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
3510: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75  his routine assu
3520: 6d 65 73 20 52 65 70 6f 46 49 4c 45 20 61 73 20  mes RepoFILE as 
3530: 74 68 65 20 65 46 54 79 70 65 2e 20 20 49 6e 20  the eFType.  In 
3540: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 0a  other words, if.
3550: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
3560: 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c  a symbolic link,
3570: 20 69 74 20 69 73 20 74 68 65 20 6f 62 6a 65 63   it is the objec
3580: 74 20 74 68 61 74 20 7a 46 69 6c 65 6e 61 6d 65  t that zFilename
3590: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 74 68   points.** to th
35a0: 61 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a  at is modified..
35b0: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 73 65 74 65  */.int file_sete
35c0: 78 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  xe(const char *z
35d0: 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 6f 6e  Filename, int on
35e0: 6f 66 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  off){.  int rc =
35f0: 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   0;.#if !defined
3600: 28 5f 57 49 4e 33 32 29 0a 20 20 73 74 72 75 63  (_WIN32).  struc
3610: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 66  t stat buf;.  if
3620: 28 20 66 6f 73 73 69 6c 5f 73 74 61 74 28 7a 46  ( fossil_stat(zF
3630: 69 6c 65 6e 61 6d 65 2c 20 26 62 75 66 2c 20 52  ilename, &buf, R
3640: 65 70 6f 46 49 4c 45 29 21 3d 30 20 7c 7c 20 53  epoFILE)!=0 || S
3650: 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f  _ISLNK(buf.st_mo
3660: 64 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  de) ){.    retur
3670: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  n 0;.  }.  if( o
3680: 6e 6f 66 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  noff ){.    int 
3690: 74 61 72 67 65 74 4d 6f 64 65 20 3d 20 28 62 75  targetMode = (bu
36a0: 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30 34 34 34  f.st_mode & 0444
36b0: 29 3e 3e 32 3b 0a 20 20 20 20 69 66 28 20 28 62  )>>2;.    if( (b
36c0: 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30 31 30  uf.st_mode & 010
36d0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  0)==0 ){.      c
36e0: 68 6d 6f 64 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  hmod(zFilename, 
36f0: 62 75 66 2e 73 74 5f 6d 6f 64 65 20 7c 20 74 61  buf.st_mode | ta
3700: 72 67 65 74 4d 6f 64 65 29 3b 0a 20 20 20 20 20  rgetMode);.     
3710: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
3720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3730: 28 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30  (buf.st_mode & 0
3740: 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  100)!=0 ){.     
3750: 20 63 68 6d 6f 64 28 7a 46 69 6c 65 6e 61 6d 65   chmod(zFilename
3760: 2c 20 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20  , buf.st_mode & 
3770: 7e 30 31 31 31 29 3b 0a 20 20 20 20 20 20 72 63  ~0111);.      rc
3780: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
3790: 23 65 6e 64 69 66 20 2f 2a 20 5f 57 49 4e 33 32  #endif /* _WIN32
37a0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
37b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
37c0: 65 20 6d 74 69 6d 65 20 66 6f 72 20 61 20 66 69  e mtime for a fi
37d0: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65  le..*/.void file
37e0: 5f 73 65 74 5f 6d 74 69 6d 65 28 63 6f 6e 73 74  _set_mtime(const
37f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
3800: 2c 20 69 36 34 20 6e 65 77 4d 54 69 6d 65 29 7b  , i64 newMTime){
3810: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
3820: 49 4e 33 32 29 0a 20 20 63 68 61 72 20 2a 7a 4d  IN32).  char *zM
3830: 62 63 73 3b 0a 20 20 73 74 72 75 63 74 20 74 69  bcs;.  struct ti
3840: 6d 65 76 61 6c 20 74 76 5b 32 5d 3b 0a 20 20 6d  meval tv[2];.  m
3850: 65 6d 73 65 74 28 74 76 2c 20 30 2c 20 73 69 7a  emset(tv, 0, siz
3860: 65 6f 66 28 74 76 5b 30 5d 29 2a 32 29 3b 0a 20  eof(tv[0])*2);. 
3870: 20 74 76 5b 30 5d 2e 74 76 5f 73 65 63 20 3d 20   tv[0].tv_sec = 
3880: 6e 65 77 4d 54 69 6d 65 3b 0a 20 20 74 76 5b 31  newMTime;.  tv[1
3890: 5d 2e 74 76 5f 73 65 63 20 3d 20 6e 65 77 4d 54  ].tv_sec = newMT
38a0: 69 6d 65 3b 0a 20 20 7a 4d 62 63 73 20 3d 20 66  ime;.  zMbcs = f
38b0: 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 70 61  ossil_utf8_to_pa
38c0: 74 68 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  th(zFilename, 0)
38d0: 3b 0a 20 20 75 74 69 6d 65 73 28 7a 4d 62 63 73  ;.  utimes(zMbcs
38e0: 2c 20 74 76 29 3b 0a 23 65 6c 73 65 0a 20 20 73  , tv);.#else.  s
38f0: 74 72 75 63 74 20 5f 75 74 69 6d 62 75 66 20 74  truct _utimbuf t
3900: 62 3b 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 4d  b;.  wchar_t *zM
3910: 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66  bcs = fossil_utf
3920: 38 5f 74 6f 5f 70 61 74 68 28 7a 46 69 6c 65 6e  8_to_path(zFilen
3930: 61 6d 65 2c 20 30 29 3b 0a 20 20 74 62 2e 61 63  ame, 0);.  tb.ac
3940: 74 69 6d 65 20 3d 20 6e 65 77 4d 54 69 6d 65 3b  time = newMTime;
3950: 0a 20 20 74 62 2e 6d 6f 64 74 69 6d 65 20 3d 20  .  tb.modtime = 
3960: 6e 65 77 4d 54 69 6d 65 3b 0a 20 20 5f 77 75 74  newMTime;.  _wut
3970: 69 6d 65 28 7a 4d 62 63 73 2c 20 26 74 62 29 3b  ime(zMbcs, &tb);
3980: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 73 73 69 6c  .#endif.  fossil
3990: 5f 70 61 74 68 5f 66 72 65 65 28 7a 4d 62 63 73  _path_free(zMbcs
39a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  );.}../*.** COMM
39b0: 41 4e 44 3a 20 74 65 73 74 2d 73 65 74 2d 6d 74  AND: test-set-mt
39c0: 69 6d 65 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  ime.**.** Usage:
39d0: 20 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 73 65   %fossil test-se
39e0: 74 2d 6d 74 69 6d 65 20 46 49 4c 45 4e 41 4d 45  t-mtime FILENAME
39f0: 20 44 41 54 45 2f 54 49 4d 45 0a 2a 2a 0a 2a 2a   DATE/TIME.**.**
3a00: 20 53 65 74 73 20 74 68 65 20 6d 74 69 6d 65 20   Sets the mtime 
3a10: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  of the named fil
3a20: 65 20 74 6f 20 74 68 65 20 64 61 74 65 2f 74 69  e to the date/ti
3a30: 6d 65 20 73 68 6f 77 6e 2e 0a 2a 2f 0a 76 6f 69  me shown..*/.voi
3a40: 64 20 74 65 73 74 5f 73 65 74 5f 6d 74 69 6d 65  d test_set_mtime
3a50: 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20  (void){.  const 
3a60: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
3a70: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 69 36  har *zDate;.  i6
3a80: 34 20 69 4d 54 69 6d 65 3b 0a 20 20 69 66 28 20  4 iMTime;.  if( 
3a90: 67 2e 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  g.argc!=4 ){.   
3aa0: 20 75 73 61 67 65 28 22 46 49 4c 45 4e 41 4d 45   usage("FILENAME
3ab0: 20 44 41 54 45 2f 54 49 4d 45 22 29 3b 0a 20 20   DATE/TIME");.  
3ac0: 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61  }.  db_open_or_a
3ad0: 74 74 61 63 68 28 22 3a 6d 65 6d 6f 72 79 3a 22  ttach(":memory:"
3ae0: 2c 20 22 6d 65 6d 22 29 3b 0a 20 20 69 4d 54 69  , "mem");.  iMTi
3af0: 6d 65 20 3d 20 64 62 5f 69 6e 74 36 34 28 30 2c  me = db_int64(0,
3b00: 20 22 53 45 4c 45 43 54 20 73 74 72 66 74 69 6d   "SELECT strftim
3b10: 65 28 27 25 25 73 27 2c 25 51 29 22 2c 20 67 2e  e('%%s',%Q)", g.
3b20: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 7a 46 69 6c  argv[3]);.  zFil
3b30: 65 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20  e = g.argv[2];. 
3b40: 20 66 69 6c 65 5f 73 65 74 5f 6d 74 69 6d 65 28   file_set_mtime(
3b50: 7a 46 69 6c 65 2c 20 69 4d 54 69 6d 65 29 3b 0a  zFile, iMTime);.
3b60: 20 20 69 4d 54 69 6d 65 20 3d 20 66 69 6c 65 5f    iMTime = file_
3b70: 6d 74 69 6d 65 28 7a 46 69 6c 65 2c 20 52 65 70  mtime(zFile, Rep
3b80: 6f 46 49 4c 45 29 3b 0a 20 20 7a 44 61 74 65 20  oFILE);.  zDate 
3b90: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
3ba0: 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 25 6c  LECT datetime(%l
3bb0: 6c 64 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29  ld, 'unixepoch')
3bc0: 22 2c 20 69 4d 54 69 6d 65 29 3b 0a 20 20 66 6f  ", iMTime);.  fo
3bd0: 73 73 69 6c 5f 70 72 69 6e 74 28 22 53 65 74 20  ssil_print("Set 
3be0: 6d 74 69 6d 65 20 6f 66 20 5c 22 25 73 5c 22 20  mtime of \"%s\" 
3bf0: 74 6f 20 25 73 20 28 25 6c 6c 64 29 5c 6e 22 2c  to %s (%lld)\n",
3c00: 20 7a 46 69 6c 65 2c 20 7a 44 61 74 65 2c 20 69   zFile, zDate, i
3c10: 4d 54 69 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  MTime);.}../*.**
3c20: 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a   Delete a file..
3c30: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
3c40: 6d 65 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63  me is a symbolic
3c50: 20 6c 69 6e 6b 2c 20 74 68 65 6e 20 69 74 20 69   link, then it i
3c60: 73 20 74 68 65 20 6c 69 6e 6b 20 69 74 73 65 6c  s the link itsel
3c70: 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 6d  f that is.** rem
3c80: 6f 76 65 64 2c 20 6e 6f 74 20 74 68 65 20 6f 62  oved, not the ob
3c90: 6a 65 63 74 20 74 68 61 74 20 7a 46 69 6c 65 6e  ject that zFilen
3ca0: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  ame points to..*
3cb0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 7a 65 72  *.** Returns zer
3cc0: 6f 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0a  o upon success..
3cd0: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 64 65 6c 65  */.int file_dele
3ce0: 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  te(const char *z
3cf0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
3d00: 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e   rc;.#ifdef _WIN
3d10: 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20  32.  wchar_t *z 
3d20: 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f  = fossil_utf8_to
3d30: 5f 70 61 74 68 28 7a 46 69 6c 65 6e 61 6d 65 2c  _path(zFilename,
3d40: 20 30 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e   0);.  rc = _wun
3d50: 6c 69 6e 6b 28 7a 29 3b 0a 23 65 6c 73 65 0a 20  link(z);.#else. 
3d60: 20 63 68 61 72 20 2a 7a 20 3d 20 66 6f 73 73 69   char *z = fossi
3d70: 6c 5f 75 74 66 38 5f 74 6f 5f 70 61 74 68 28 7a  l_utf8_to_path(z
3d80: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
3d90: 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  rc = unlink(zFil
3da0: 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
3db0: 20 66 6f 73 73 69 6c 5f 70 61 74 68 5f 66 72 65   fossil_path_fre
3dc0: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(z);.  return r
3dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
3de0: 74 65 20 61 20 64 69 72 65 63 74 6f 72 79 20 63  te a directory c
3df0: 61 6c 6c 65 64 20 7a 4e 61 6d 65 2c 20 69 66 20  alled zName, if 
3e00: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
3e10: 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 20 49 66  ady exist..** If
3e20: 20 66 6f 72 63 65 46 6c 61 67 20 69 73 20 31 2c   forceFlag is 1,
3e30: 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 69 6f   delete any prio
3e40: 72 20 6e 6f 6e 2d 64 69 72 65 63 74 6f 72 79 20  r non-directory 
3e50: 6f 62 6a 65 63 74 0a 2a 2a 20 77 69 74 68 20 74  object.** with t
3e60: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 2a 2a  he same name..**
3e70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
3e80: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
3e90: 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 6d 6b 64  .*/.int file_mkd
3ea0: 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ir(const char *z
3eb0: 4e 61 6d 65 2c 20 69 6e 74 20 65 46 54 79 70 65  Name, int eFType
3ec0: 2c 20 69 6e 74 20 66 6f 72 63 65 46 6c 61 67 29  , int forceFlag)
3ed0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 69 6c  {.  int rc = fil
3ee0: 65 5f 69 73 64 69 72 28 7a 4e 61 6d 65 2c 20 65  e_isdir(zName, e
3ef0: 46 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63  FType);.  if( rc
3f00: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==2 ){.    if( !
3f10: 66 6f 72 63 65 46 6c 61 67 20 29 20 72 65 74 75  forceFlag ) retu
3f20: 72 6e 20 31 3b 0a 20 20 20 20 66 69 6c 65 5f 64  rn 1;.    file_d
3f30: 65 6c 65 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  elete(zName);.  
3f40: 7d 0a 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b  }.  if( rc!=1 ){
3f50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
3f60: 4e 33 32 29 0a 20 20 20 20 77 63 68 61 72 5f 74  N32).    wchar_t
3f70: 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c   *zMbcs = fossil
3f80: 5f 75 74 66 38 5f 74 6f 5f 70 61 74 68 28 7a 4e  _utf8_to_path(zN
3f90: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 72 63 20  ame, 1);.    rc 
3fa0: 3d 20 5f 77 6d 6b 64 69 72 28 7a 4d 62 63 73 29  = _wmkdir(zMbcs)
3fb0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 68 61 72  ;.#else.    char
3fc0: 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c   *zMbcs = fossil
3fd0: 5f 75 74 66 38 5f 74 6f 5f 70 61 74 68 28 7a 4e  _utf8_to_path(zN
3fe0: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 72 63 20  ame, 1);.    rc 
3ff0: 3d 20 6d 6b 64 69 72 28 7a 4e 61 6d 65 2c 20 30  = mkdir(zName, 0
4000: 37 35 35 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  755);.#endif.   
4010: 20 66 6f 73 73 69 6c 5f 70 61 74 68 5f 66 72 65   fossil_path_fre
4020: 65 28 7a 4d 62 63 73 29 3b 0a 20 20 20 20 72 65  e(zMbcs);.    re
4030: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
4040: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4050: 2a 20 43 72 65 61 74 65 20 74 68 65 20 74 72 65  * Create the tre
4060: 65 20 6f 66 20 64 69 72 65 63 74 6f 72 69 65 73  e of directories
4070: 20 69 6e 20 77 68 69 63 68 20 7a 46 69 6c 65 6e   in which zFilen
4080: 61 6d 65 20 62 65 6c 6f 6e 67 73 2c 20 69 66 20  ame belongs, if 
4090: 74 68 61 74 20 73 65 71 75 65 6e 63 65 0a 2a 2a  that sequence.**
40a0: 20 6f 66 20 64 69 72 65 63 74 6f 72 69 65 73 20   of directories 
40b0: 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
40c0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e   exist..**.** On
40d0: 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
40e0: 20 7a 65 72 6f 2e 20 20 4f 6e 20 65 72 72 6f 72   zero.  On error
40f0: 2c 20 72 65 74 75 72 6e 20 65 72 72 6f 72 52 65  , return errorRe
4100: 74 75 72 6e 20 69 66 20 70 6f 73 69 74 69 76 65  turn if positive
4110: 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 70  , otherwise.** p
4120: 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65  rint an error me
4130: 73 73 61 67 65 20 61 6e 64 20 61 62 6f 72 74 2e  ssage and abort.
4140: 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 6d 6b 66  .*/.int file_mkf
4150: 6f 6c 64 65 72 28 0a 20 20 63 6f 6e 73 74 20 63  older(.  const c
4160: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
4170: 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 73 68    /* Pathname sh
4180: 6f 77 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  owing directorie
4190: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
41a0: 2a 2f 0a 20 20 69 6e 74 20 65 46 54 79 70 65 2c  */.  int eFType,
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41c0: 20 46 6f 6c 6c 6f 77 20 73 79 6d 6c 69 6e 6b 73   Follow symlinks
41d0: 20 69 66 20 45 78 74 46 49 4c 45 20 2a 2f 0a 20   if ExtFILE */. 
41e0: 20 69 6e 74 20 66 6f 72 63 65 46 6c 61 67 2c 20   int forceFlag, 
41f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
4200: 65 74 65 20 6e 6f 6e 2d 64 69 72 65 63 74 6f 72  ete non-director
4210: 79 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  y objects in the
4220: 20 77 61 79 20 2a 2f 0a 20 20 69 6e 74 20 65 72   way */.  int er
4230: 72 6f 72 52 65 74 75 72 6e 20 20 20 20 20 20 20  rorReturn       
4240: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
4250: 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 69   when an error i
4260: 73 20 73 65 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69  s seen */.){.  i
4270: 6e 74 20 6e 4e 61 6d 65 2c 20 72 63 20 3d 20 30  nt nName, rc = 0
4280: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
4290: 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  ..  nName = strl
42a0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  en(zFilename);. 
42b0: 20 7a 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66   zName = mprintf
42c0: 28 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ("%s", zFilename
42d0: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 66 69 6c  );.  nName = fil
42e0: 65 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28  e_simplify_name(
42f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29  zName, nName, 0)
4300: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4e 61 6d 65  ;.  while( nName
4310: 3e 30 20 26 26 20 7a 4e 61 6d 65 5b 6e 4e 61 6d  >0 && zName[nNam
4320: 65 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6e 4e 61  e-1]!='/' ){ nNa
4330: 6d 65 2d 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 4e  me--; }.  if( nN
4340: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
4350: 5b 6e 4e 61 6d 65 2d 31 5d 20 3d 20 30 3b 0a 20  [nName-1] = 0;. 
4360: 20 20 20 69 66 28 20 66 69 6c 65 5f 69 73 64 69     if( file_isdi
4370: 72 28 7a 4e 61 6d 65 2c 20 65 46 54 79 70 65 29  r(zName, eFType)
4380: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=1 ){.      rc 
4390: 3d 20 66 69 6c 65 5f 6d 6b 66 6f 6c 64 65 72 28  = file_mkfolder(
43a0: 7a 4e 61 6d 65 2c 20 65 46 54 79 70 65 2c 20 66  zName, eFType, f
43b0: 6f 72 63 65 46 6c 61 67 2c 20 65 72 72 6f 72 52  orceFlag, errorR
43c0: 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 69 66  eturn);.      if
43d0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc==0 ){.     
43e0: 20 20 20 69 66 28 20 66 69 6c 65 5f 6d 6b 64 69     if( file_mkdi
43f0: 72 28 7a 4e 61 6d 65 2c 20 65 46 54 79 70 65 2c  r(zName, eFType,
4400: 20 66 6f 72 63 65 46 6c 61 67 29 0a 20 20 20 20   forceFlag).    
4410: 20 20 20 20 20 26 26 20 66 69 6c 65 5f 69 73 64       && file_isd
4420: 69 72 28 7a 4e 61 6d 65 2c 20 65 46 54 79 70 65  ir(zName, eFType
4430: 29 21 3d 31 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=1.        ){.
4440: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
4450: 72 6f 72 52 65 74 75 72 6e 20 3c 3d 20 30 20 29  rorReturn <= 0 )
4460: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
4470: 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65 63 75 72  ssil_fatal_recur
4480: 73 69 76 65 28 22 75 6e 61 62 6c 65 20 74 6f 20  sive("unable to 
4490: 63 72 65 61 74 65 20 64 69 72 65 63 74 6f 72 79  create directory
44a0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
44b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
44c0: 20 20 20 20 72 63 20 3d 20 65 72 72 6f 72 52 65      rc = errorRe
44d0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
44e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
44f0: 7d 0a 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b  }.  free(zName);
4500: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4510: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74  ./*.** Removes t
4520: 68 65 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  he directory nam
4530: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
4540: 6e 74 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  nt, if it exists
4550: 2e 20 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  .  The directory
4560: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 6d 70 74  .** must be empt
4570: 79 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20  y and cannot be 
4580: 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65  the current dire
4590: 63 74 6f 72 79 20 6f 72 20 74 68 65 20 72 6f 6f  ctory or the roo
45a0: 74 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2a 0a  t directory..**.
45b0: 2a 2a 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20  ** Returns zero 
45c0: 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  upon success..*/
45d0: 0a 69 6e 74 20 66 69 6c 65 5f 72 6d 64 69 72 28  .int file_rmdir(
45e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
45f0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66  e){.  int rc = f
4600: 69 6c 65 5f 69 73 64 69 72 28 7a 4e 61 6d 65 2c  ile_isdir(zName,
4610: 20 52 65 70 6f 46 49 4c 45 29 3b 0a 20 20 69 66   RepoFILE);.  if
4620: 28 20 72 63 3d 3d 32 20 29 20 72 65 74 75 72 6e  ( rc==2 ) return
4630: 20 31 3b 20 2f 2a 20 63 61 6e 6e 6f 74 20 72 65   1; /* cannot re
4640: 6d 6f 76 65 20 6e 6f 72 6d 61 6c 20 66 69 6c 65  move normal file
4650: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 31 20   */.  if( rc==1 
4660: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
4670: 57 49 4e 33 32 29 0a 20 20 20 20 77 63 68 61 72  WIN32).    wchar
4680: 5f 74 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73  _t *zMbcs = foss
4690: 69 6c 5f 75 74 66 38 5f 74 6f 5f 70 61 74 68 28  il_utf8_to_path(
46a0: 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 72  zName, 1);.    r
46b0: 63 20 3d 20 5f 77 72 6d 64 69 72 28 7a 4d 62 63  c = _wrmdir(zMbc
46c0: 73 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 68  s);.#else.    ch
46d0: 61 72 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73  ar *zMbcs = foss
46e0: 69 6c 5f 75 74 66 38 5f 74 6f 5f 70 61 74 68 28  il_utf8_to_path(
46f0: 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 72  zName, 1);.    r
4700: 63 20 3d 20 72 6d 64 69 72 28 7a 4e 61 6d 65 29  c = rmdir(zName)
4710: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 6f 73  ;.#endif.    fos
4720: 73 69 6c 5f 70 61 74 68 5f 66 72 65 65 28 7a 4d  sil_path_free(zM
4730: 62 63 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  bcs);.    return
4740: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
4750: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
4760: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
4770: 20 66 69 6c 65 6e 61 6d 65 20 67 69 76 65 6e 20   filename given 
4780: 69 73 20 61 20 76 61 6c 69 64 20 66 69 6c 65 6e  is a valid filen
4790: 61 6d 65 20 66 6f 72 0a 2a 2a 20 61 20 66 69 6c  ame for.** a fil
47a0: 65 20 69 6e 20 61 20 72 65 70 6f 73 69 74 6f 72  e in a repositor
47b0: 79 2e 20 20 56 61 6c 69 64 20 66 69 6c 65 6e 61  y.  Valid filena
47c0: 6d 65 73 20 66 6f 6c 6c 6f 77 20 61 6c 6c 20 6f  mes follow all o
47d0: 66 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  f the.** followi
47e0: 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
47f0: 20 20 20 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20      *  Does not 
4800: 62 65 67 69 6e 20 77 69 74 68 20 22 2f 22 0a 2a  begin with "/".*
4810: 2a 20 20 20 20 20 2a 20 20 44 6f 65 73 20 6e 6f  *     *  Does no
4820: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 70 61  t contain any pa
4830: 74 68 20 65 6c 65 6d 65 6e 74 20 6e 61 6d 65 64  th element named
4840: 20 22 2e 22 20 6f 72 20 22 2e 2e 22 0a 2a 2a 20   "." or "..".** 
4850: 20 20 20 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20      *  Does not 
4860: 63 6f 6e 74 61 69 6e 20 61 6e 79 20 6f 66 20 74  contain any of t
4870: 68 65 73 65 20 63 68 61 72 61 63 74 65 72 73 20  hese characters 
4880: 69 6e 20 74 68 65 20 70 61 74 68 3a 20 22 5c 22  in the path: "\"
4890: 0a 2a 2a 20 20 20 20 20 2a 20 20 44 6f 65 73 20  .**     *  Does 
48a0: 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22  not end with "/"
48b0: 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 44 6f 65 73  ..**     *  Does
48c0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 77 6f   not contain two
48d0: 20 6f 72 20 6d 6f 72 65 20 22 2f 22 20 63 68 61   or more "/" cha
48e0: 72 61 63 74 65 72 73 20 69 6e 20 61 20 72 6f 77  racters in a row
48f0: 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 43 6f 6e 74  ..**     *  Cont
4900: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
4910: 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 0a 2a  e character.**.*
4920: 2a 20 49 6e 76 61 6c 69 64 20 55 54 46 38 20 63  * Invalid UTF8 c
4930: 68 61 72 61 63 74 65 72 73 20 72 65 73 75 6c 74  haracters result
4940: 20 69 6e 20 61 20 66 61 6c 73 65 20 72 65 74 75   in a false retu
4950: 72 6e 20 69 66 20 62 53 74 72 69 63 74 55 74 66  rn if bStrictUtf
4960: 38 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 49  8 is.** true.  I
4970: 66 20 62 53 74 72 69 63 74 55 74 66 38 20 69 73  f bStrictUtf8 is
4980: 20 66 61 6c 73 65 2c 20 69 6e 76 61 6c 69 64 20   false, invalid 
4990: 55 54 46 38 20 63 68 61 72 61 63 74 65 72 73 20  UTF8 characters 
49a0: 61 72 65 20 73 69 6c 65 6e 74 6c 79 0a 2a 2a 20  are silently.** 
49b0: 69 67 6e 6f 72 65 64 2e 20 53 65 65 20 68 74 74  ignored. See htt
49c0: 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61  p://en.wikipedia
49d0: 2e 6f 72 67 2f 77 69 6b 69 2f 55 54 46 2d 38 23  .org/wiki/UTF-8#
49e0: 49 6e 76 61 6c 69 64 5f 62 79 74 65 5f 73 65 71  Invalid_byte_seq
49f0: 75 65 6e 63 65 73 0a 2a 2a 20 61 6e 64 20 68 74  uences.** and ht
4a00: 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69  tp://en.wikipedi
4a10: 61 2e 6f 72 67 2f 77 69 6b 69 2f 55 6e 69 63 6f  a.org/wiki/Unico
4a20: 64 65 20 28 66 6f 72 20 74 68 65 20 6e 6f 6e 63  de (for the nonc
4a30: 68 61 72 61 63 74 65 72 73 29 0a 2a 2a 0a 2a 2a  haracters).**.**
4a40: 20 54 68 65 20 62 53 74 72 69 63 74 55 74 66 38   The bStrictUtf8
4a50: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 66 6f   flag is true fo
4a60: 72 20 6e 65 77 20 69 6e 70 75 74 73 2c 20 62 75  r new inputs, bu
4a70: 74 20 69 73 20 66 61 6c 73 65 20 77 68 65 6e 20  t is false when 
4a80: 70 61 72 73 69 6e 67 0a 2a 2a 20 6c 65 67 61 63  parsing.** legac
4a90: 79 20 6d 61 6e 69 66 65 73 74 73 2c 20 66 6f 72  y manifests, for
4aa0: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
4ab0: 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 69 6e 74  tibility..*/.int
4ac0: 20 66 69 6c 65 5f 69 73 5f 73 69 6d 70 6c 65 5f   file_is_simple_
4ad0: 70 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63  pathname(const c
4ae0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 74 72  har *z, int bStr
4af0: 69 63 74 55 74 66 38 29 7b 0a 20 20 69 6e 74 20  ictUtf8){.  int 
4b00: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
4b10: 61 72 20 63 20 3d 20 28 75 6e 73 69 67 6e 65 64  ar c = (unsigned
4b20: 20 63 68 61 72 29 20 7a 5b 30 5d 3b 0a 20 20 63   char) z[0];.  c
4b30: 68 61 72 20 6d 61 73 6b 4e 6f 6e 41 73 63 69 69  har maskNonAscii
4b40: 20 3d 20 62 53 74 72 69 63 74 55 74 66 38 20 3f   = bStrictUtf8 ?
4b50: 20 30 78 38 30 20 3a 20 30 78 30 30 3b 0a 20 20   0x80 : 0x00;.  
4b60: 69 66 28 20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d  if( c=='/' || c=
4b70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4b80: 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20   if( c=='.' ){. 
4b90: 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27     if( z[1]=='/'
4ba0: 20 7c 7c 20 7a 5b 31 5d 3d 3d 30 20 29 20 72 65   || z[1]==0 ) re
4bb0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
4bc0: 7a 5b 31 5d 3d 3d 27 2e 27 20 26 26 20 28 7a 5b  z[1]=='.' && (z[
4bd0: 32 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 32 5d 3d  2]=='/' || z[2]=
4be0: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
4bf0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28    }.  for(i=0; (
4c00: 63 3d 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c=(unsigned char
4c10: 29 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  )z[i])!=0; i++){
4c20: 0a 20 20 20 20 69 66 28 20 63 20 26 20 6d 61 73  .    if( c & mas
4c30: 6b 4e 6f 6e 41 73 63 69 69 20 29 7b 0a 20 20 20  kNonAscii ){.   
4c40: 20 20 20 69 66 28 20 28 7a 5b 2b 2b 69 5d 26 30     if( (z[++i]&0
4c50: 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a 20 20  xc0)!=0x80 ){.  
4c60: 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64        /* Invalid
4c70: 20 66 69 72 73 74 20 63 6f 6e 74 69 6e 75 61 74   first continuat
4c80: 69 6f 6e 20 62 79 74 65 20 2a 2f 0a 20 20 20 20  ion byte */.    
4c90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4cb0: 63 3c 30 78 63 32 20 29 7b 0a 20 20 20 20 20 20  c<0xc2 ){.      
4cc0: 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 31 2d 62    /* Invalid 1-b
4cd0: 79 74 65 20 55 54 46 2d 38 20 73 65 71 75 65 6e  yte UTF-8 sequen
4ce0: 63 65 2c 20 6f 72 20 32 2d 62 79 74 65 20 6f 76  ce, or 2-byte ov
4cf0: 65 72 6c 6f 6e 67 20 66 6f 72 6d 2e 20 2a 2f 0a  erlong form. */.
4d00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
4d10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4d20: 28 20 28 63 26 30 78 65 30 29 3d 3d 30 78 65 30  ( (c&0xe0)==0xe0
4d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 33   ){.        /* 3
4d40: 2d 62 79 74 65 20 6f 72 20 6d 6f 72 65 20 2a 2f  -byte or more */
4d50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69  .        int uni
4d60: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  code;.        if
4d70: 28 20 63 26 30 78 31 30 20 29 7b 0a 20 20 20 20  ( c&0x10 ){.    
4d80: 20 20 20 20 20 20 2f 2a 20 55 6e 69 63 6f 64 65        /* Unicode
4d90: 20 63 68 61 72 61 63 74 65 72 73 20 3e 20 55 2b   characters > U+
4da0: 46 46 46 46 20 61 72 65 20 6e 6f 74 20 73 75 70  FFFF are not sup
4db0: 70 6f 72 74 65 64 2e 0a 20 20 20 20 20 20 20 20  ported..        
4dc0: 20 20 20 2a 20 57 69 6e 64 6f 77 73 20 58 50 20     * Windows XP 
4dd0: 61 6e 64 20 65 61 72 6c 69 65 72 20 63 61 6e 6e  and earlier cann
4de0: 6f 74 20 68 61 6e 64 6c 65 20 74 68 65 6d 2e 0a  ot handle them..
4df0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
4e00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
4e10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4e20: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
4e30: 20 33 2d 62 79 74 65 20 55 54 46 2d 38 20 63 68   3-byte UTF-8 ch
4e40: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20  aracter */.     
4e50: 20 20 20 75 6e 69 63 6f 64 65 20 3d 20 28 28 63     unicode = ((c
4e60: 26 30 78 30 66 29 3c 3c 31 32 29 20 2b 20 28 28  &0x0f)<<12) + ((
4e70: 7a 5b 69 5d 26 30 78 33 66 29 3c 3c 36 29 20 2b  z[i]&0x3f)<<6) +
4e80: 20 28 7a 5b 69 2b 31 5d 26 30 78 33 66 29 3b 0a   (z[i+1]&0x3f);.
4e90: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 63          if( unic
4ea0: 6f 64 65 20 3c 3d 20 30 78 30 37 66 66 20 29 7b  ode <= 0x07ff ){
4eb0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 76  .          /* ov
4ec0: 65 72 6c 6f 6e 67 20 66 6f 72 6d 20 2a 2f 0a 20  erlong form */. 
4ed0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4ee0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
4ef0: 20 69 66 28 20 75 6e 69 63 6f 64 65 3e 3d 30 78   if( unicode>=0x
4f00: 65 30 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e000 ){.        
4f10: 20 20 2f 2a 20 55 2b 45 30 30 30 2e 2e 55 2b 46    /* U+E000..U+F
4f20: 46 46 46 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  FFF */.         
4f30: 20 69 66 28 20 28 75 6e 69 63 6f 64 65 3c 3d 30   if( (unicode<=0
4f40: 78 66 38 66 66 29 20 7c 7c 20 28 75 6e 69 63 6f  xf8ff) || (unico
4f50: 64 65 3e 3d 30 78 66 66 66 65 29 20 29 7b 0a 20  de>=0xfffe) ){. 
4f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 2b             /* U+
4f70: 45 30 30 30 2e 2e 55 2b 46 38 46 46 20 61 72 65  E000..U+F8FF are
4f80: 20 66 6f 72 20 70 72 69 76 61 74 65 20 75 73 65   for private use
4f90: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  ..             *
4fa0: 20 55 2b 46 46 46 45 2e 2e 55 2b 46 46 46 46 20   U+FFFE..U+FFFF 
4fb0: 61 72 65 20 6e 6f 6e 63 68 61 72 61 63 74 65 72  are noncharacter
4fc0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
4fd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4fe0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28        } else if(
4ff0: 20 28 75 6e 69 63 6f 64 65 3e 3d 30 78 66 64 64   (unicode>=0xfdd
5000: 30 29 20 26 26 20 28 75 6e 69 63 6f 64 65 3c 3d  0) && (unicode<=
5010: 30 78 66 64 65 66 29 20 29 7b 0a 20 20 20 20 20  0xfdef) ){.     
5020: 20 20 20 20 20 20 20 2f 2a 20 55 2b 46 44 44 30         /* U+FDD0
5030: 2e 2e 55 2b 46 44 45 46 20 61 72 65 20 6e 6f 6e  ..U+FDEF are non
5040: 63 68 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a 20  characters. */. 
5050: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
5060: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 0;.          }
5070: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
5080: 66 28 20 28 75 6e 69 63 6f 64 65 3e 3d 30 78 64  f( (unicode>=0xd
5090: 38 30 30 29 20 26 26 20 28 75 6e 69 63 6f 64 65  800) && (unicode
50a0: 3c 3d 30 78 64 66 66 66 29 20 29 7b 0a 20 20 20  <=0xdfff) ){.   
50b0: 20 20 20 20 20 20 20 2f 2a 20 55 2b 44 38 30 30         /* U+D800
50c0: 2e 2e 55 2b 44 46 46 46 20 61 72 65 20 66 6f 72  ..U+DFFF are for
50d0: 20 73 75 72 72 6f 67 61 74 65 20 70 61 69 72 73   surrogate pairs
50e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
50f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
5100: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
5110: 7a 5b 2b 2b 69 5d 26 30 78 63 30 29 21 3d 30 78  z[++i]&0xc0)!=0x
5120: 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  80 ){.          
5130: 2f 2a 20 49 6e 76 61 6c 69 64 20 73 65 63 6f 6e  /* Invalid secon
5140: 64 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 62  d continuation b
5150: 79 74 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  yte */.         
5160: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
5170: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5180: 20 7d 65 6c 73 65 20 69 66 28 20 62 53 74 72 69   }else if( bStri
5190: 63 74 55 74 66 38 20 26 26 20 28 63 3d 3d 27 5c  ctUtf8 && (c=='\
51a0: 5c 27 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  \') ){.      ret
51b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
51c0: 20 69 66 28 20 63 3d 3d 27 2f 27 20 29 7b 0a 20   if( c=='/' ){. 
51d0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
51e0: 3d 27 2f 27 20 29 20 72 65 74 75 72 6e 20 30 3b  ='/' ) return 0;
51f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
5200: 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
5210: 20 20 69 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2f    if( z[i+2]=='/
5220: 27 20 7c 7c 20 7a 5b 69 2b 32 5d 3d 3d 30 20 29  ' || z[i+2]==0 )
5230: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
5240: 20 20 20 69 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27     if( z[i+2]=='
5250: 2e 27 20 26 26 20 28 7a 5b 69 2b 33 5d 3d 3d 27  .' && (z[i+3]=='
5260: 2f 27 20 7c 7c 20 7a 5b 69 2b 33 5d 3d 3d 30 29  /' || z[i+3]==0)
5270: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5290: 20 69 66 28 20 7a 5b 69 2d 31 5d 3d 3d 27 2f 27   if( z[i-1]=='/'
52a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
52b0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
52c0: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  * If the last co
52d0: 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 70  mponent of the p
52e0: 61 74 68 6e 61 6d 65 20 69 6e 20 7a 5b 30 5d 2e  athname in z[0].
52f0: 2e 7a 5b 6a 2d 31 5d 20 69 73 20 73 6f 6d 65 74  .z[j-1] is somet
5300: 68 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 20 74 68  hing.** other th
5310: 61 6e 20 22 2e 2e 22 20 74 68 65 6e 20 62 61 63  an ".." then bac
5320: 6b 20 69 74 20 6f 75 74 20 61 6e 64 20 72 65 74  k it out and ret
5330: 75 72 6e 20 74 72 75 65 2e 20 20 49 66 20 74 68  urn true.  If th
5340: 65 20 6c 61 73 74 0a 2a 2a 20 63 6f 6d 70 6f 6e  e last.** compon
5350: 65 6e 74 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ent is empty or 
5360: 69 66 20 69 74 20 69 73 20 22 2e 2e 22 20 74 68  if it is ".." th
5370: 65 6e 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  en return false.
5380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5390: 61 63 6b 75 70 5f 64 69 72 28 63 6f 6e 73 74 20  ackup_dir(const 
53a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 4a  char *z, int *pJ
53b0: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2a 70 4a  ){.  int j = *pJ
53c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
53d0: 20 6a 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30   j<=0 ) return 0
53e0: 3b 0a 20 20 66 6f 72 28 69 3d 6a 2d 31 3b 20 69  ;.  for(i=j-1; i
53f0: 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 2f  >0 && z[i-1]!='/
5400: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
5410: 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 69 3d 3d  z[i]=='.' && i==
5420: 6a 2d 32 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27  j-2 && z[i+1]=='
5430: 2e 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .' ) return 0;. 
5440: 20 2a 70 4a 20 3d 20 69 2d 31 3b 0a 20 20 72 65   *pJ = i-1;.  re
5450: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
5460: 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65   Simplify a file
5470: 6e 61 6d 65 20 62 79 0a 2a 2a 0a 2a 2a 20 20 2a  name by.**.**  *
5480: 20 52 65 6d 6f 76 65 20 65 78 74 65 6e 64 65 64   Remove extended
5490: 20 70 61 74 68 20 70 72 65 66 69 78 20 6f 6e 20   path prefix on 
54a0: 77 69 6e 64 6f 77 73 20 61 6e 64 20 63 79 67 77  windows and cygw
54b0: 69 6e 0a 2a 2a 20 20 2a 20 43 6f 6e 76 65 72 74  in.**  * Convert
54c0: 20 61 6c 6c 20 5c 20 69 6e 74 6f 20 2f 20 6f 6e   all \ into / on
54d0: 20 77 69 6e 64 6f 77 73 20 61 6e 64 20 63 79 67   windows and cyg
54e0: 77 69 6e 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  win.**  * removi
54f0: 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ng any trailing 
5500: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a  and duplicate /.
5510: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 2f  **  * removing /
5520: 2e 2f 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  ./.**  * removin
5530: 67 20 2f 41 2f 2e 2e 2f 0a 2a 2a 0a 2a 2a 20 43  g /A/../.**.** C
5540: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
5550: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
5560: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
5570: 65 6e 67 74 68 2e 0a 2a 2a 20 49 66 20 74 68 65  ength..** If the
5580: 20 73 6c 61 73 68 20 70 61 72 61 6d 65 74 65 72   slash parameter
5590: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
55a0: 65 20 74 72 61 69 6c 69 6e 67 20 73 6c 61 73 68  e trailing slash
55b0: 2c 20 69 66 20 61 6e 79 2c 0a 2a 2a 20 69 73 20  , if any,.** is 
55c0: 72 65 74 61 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  retained..*/.int
55d0: 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e   file_simplify_n
55e0: 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ame(char *z, int
55f0: 20 6e 2c 20 69 6e 74 20 73 6c 61 73 68 29 7b 0a   n, int slash){.
5600: 20 20 69 6e 74 20 69 20 3d 20 31 2c 20 6a 3b 0a    int i = 1, j;.
5610: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
5620: 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20  ;.  if( n<0 ) n 
5630: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 0a 20 20  = strlen(z);..  
5640: 2f 2a 20 4f 6e 20 77 69 6e 64 6f 77 73 20 61 6e  /* On windows an
5650: 64 20 63 79 67 77 69 6e 20 63 6f 6e 76 65 72 74  d cygwin convert
5660: 20 61 6c 6c 20 5c 20 63 68 61 72 61 63 74 65 72   all \ character
5670: 73 20 74 6f 20 2f 0a 20 20 20 2a 20 61 6e 64 20  s to /.   * and 
5680: 72 65 6d 6f 76 65 20 65 78 74 65 6e 64 65 64 20  remove extended 
5690: 70 61 74 68 20 70 72 65 66 69 78 20 69 66 20 70  path prefix if p
56a0: 72 65 73 65 6e 74 20 2a 2f 0a 23 69 66 20 64 65  resent */.#if de
56b0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
56c0: 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
56d0: 4e 5f 5f 29 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  N__).  for(j=0; 
56e0: 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  j<n; j++){.    i
56f0: 66 28 20 7a 5b 6a 5d 3d 3d 27 5c 5c 27 20 29 20  f( z[j]=='\\' ) 
5700: 7a 5b 6a 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a  z[j] = '/';.  }.
5710: 20 20 69 66 28 20 6e 3e 33 20 26 26 20 21 6d 65    if( n>3 && !me
5720: 6d 63 6d 70 28 7a 2c 20 22 2f 2f 3f 2f 22 2c 20  mcmp(z, "//?/", 
5730: 34 29 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6f  4) ){.    if( fo
5740: 73 73 69 6c 5f 73 74 72 6e 69 63 6d 70 28 7a 2b  ssil_strnicmp(z+
5750: 34 2c 22 55 4e 43 22 2c 20 33 29 20 29 7b 0a 20  4,"UNC", 3) ){. 
5760: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
5770: 20 20 20 7a 5b 30 5d 20 3d 20 7a 5b 34 5d 3b 0a     z[0] = z[4];.
5780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5790: 20 69 20 2b 3d 20 36 3b 0a 20 20 20 20 20 20 7a   i += 6;.      z
57a0: 5b 30 5d 20 3d 20 27 2f 27 3b 0a 20 20 20 20 7d  [0] = '/';.    }
57b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
57c0: 2a 20 52 65 6d 6f 76 69 6e 67 20 74 72 61 69 6c  * Removing trail
57d0: 69 6e 67 20 22 2f 22 20 63 68 61 72 61 63 74 65  ing "/" characte
57e0: 72 73 20 2a 2f 0a 20 20 69 66 28 20 21 73 6c 61  rs */.  if( !sla
57f0: 73 68 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  sh ){.    while(
5800: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
5810: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
5820: 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 64  }..  /* Remove d
5830: 75 70 6c 69 63 61 74 65 20 27 2f 27 20 63 68 61  uplicate '/' cha
5840: 72 61 63 74 65 72 73 2e 20 20 45 78 63 65 70 74  racters.  Except
5850: 2c 20 74 77 6f 20 2f 2f 20 61 74 20 74 68 65 20  , two // at the 
5860: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
5870: 66 20 61 20 70 61 74 68 6e 61 6d 65 20 69 73 20  f a pathname is 
5880: 61 6c 6c 6f 77 65 64 20 73 69 6e 63 65 20 74 68  allowed since th
5890: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
58a0: 6f 6e 20 77 69 6e 64 6f 77 73 2e 20 2a 2f 0a 20  on windows. */. 
58b0: 20 66 6f 72 28 6a 3d 31 3b 20 69 3c 6e 3b 20 69   for(j=1; i<n; i
58c0: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20  ++){.    z[j++] 
58d0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c  = z[i];.    whil
58e0: 65 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 26 26 20  e( z[i]=='/' && 
58f0: 69 3c 6e 2d 31 20 26 26 20 7a 5b 69 2b 31 5d 3d  i<n-1 && z[i+1]=
5900: 3d 27 2f 27 20 29 20 69 2b 2b 3b 0a 20 20 7d 0a  ='/' ) i++;.  }.
5910: 20 20 6e 20 3d 20 6a 3b 0a 0a 20 20 2f 2a 20 53    n = j;..  /* S
5920: 6b 69 70 20 6f 76 65 72 20 7a 65 72 6f 20 6f 72  kip over zero or
5930: 20 6d 6f 72 65 20 69 6e 69 74 69 61 6c 20 22 2e   more initial ".
5940: 2f 22 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a  /" sequences */.
5950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 2d 31    for(i=0; i<n-1
5960: 20 26 26 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26   && z[i]=='.' &&
5970: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 3b 20 69 2b   z[i+1]=='/'; i+
5980: 3d 32 29 7b 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  =2){}..  /* Begi
5990: 6e 20 63 6f 70 79 69 6e 67 20 66 72 6f 6d 20 7a  n copying from z
59a0: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
59b0: 2e 2e 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30  ... */.  for(j=0
59c0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
59d0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
59e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20  {.      /* Skip 
59f0: 6f 76 65 72 20 69 6e 74 65 72 6e 61 6c 20 22 2f  over internal "/
5a00: 2e 22 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6d  ." directory com
5a10: 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  ponents */.     
5a20: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
5a30: 20 26 26 20 28 69 2b 32 3d 3d 6e 20 7c 7c 20 7a   && (i+2==n || z
5a40: 5b 69 2b 32 5d 3d 3d 27 2f 27 29 20 29 7b 0a 20  [i+2]=='/') ){. 
5a50: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
5a60: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
5a70: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
5a80: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
5a90: 22 2f 2e 2e 22 20 64 69 72 65 63 74 6f 72 79 20  "/.." directory 
5aa0: 63 6f 6d 70 6f 6e 65 6e 74 20 74 68 65 6e 20 62  component then b
5ab0: 61 63 6b 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ack out the.    
5ac0: 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65    ** previous te
5ad0: 72 6d 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  rm of the direct
5ae0: 6f 72 79 20 69 66 20 69 74 20 69 73 20 73 6f 6d  ory if it is som
5af0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
5b00: 6e 20 22 2e 2e 22 0a 20 20 20 20 20 20 2a 2a 20  n "..".      ** 
5b10: 6f 72 20 22 2e 22 0a 20 20 20 20 20 20 2a 2f 0a  or ".".      */.
5b20: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
5b30: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
5b40: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
5b50: 20 28 69 2b 33 3d 3d 6e 20 7c 7c 20 7a 5b 69 2b   (i+3==n || z[i+
5b60: 33 5d 3d 3d 27 2f 27 29 0a 20 20 20 20 20 20 20  3]=='/').       
5b70: 26 26 20 62 61 63 6b 75 70 5f 64 69 72 28 7a 2c  && backup_dir(z,
5b80: 20 26 6a 29 0a 20 20 20 20 20 20 29 7b 0a 20 20   &j).      ){.  
5b90: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
5ba0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5bc0: 20 20 69 66 28 20 6a 3e 3d 30 20 29 20 7a 5b 6a    if( j>=0 ) z[j
5bd0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 6a 2b  ] = z[i];.    j+
5be0: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3d 3d  +;.  }.  if( j==
5bf0: 30 20 29 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 2f 27  0 ) z[j++] = '/'
5c00: 3b 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20  ;.  z[j] = 0;.  
5c10: 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a  return j;.}../*.
5c20: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74  ** COMMAND: test
5c30: 2d 73 69 6d 70 6c 69 66 79 2d 6e 61 6d 65 0a 2a  -simplify-name.*
5c40: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73  *.** Usage: %fos
5c50: 73 69 6c 20 74 65 73 74 2d 73 69 6d 70 6c 69 66  sil test-simplif
5c60: 79 2d 6e 61 6d 65 20 46 49 4c 45 4e 41 4d 45 2e  y-name FILENAME.
5c70: 2e 2e 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  ...**.** Print t
5c80: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 76 65  he simplified ve
5c90: 72 73 69 6f 6e 73 20 6f 66 20 65 61 63 68 20 46  rsions of each F
5ca0: 49 4c 45 4e 41 4d 45 2e 0a 2a 2f 0a 76 6f 69 64  ILENAME..*/.void
5cb0: 20 63 6d 64 5f 74 65 73 74 5f 73 69 6d 70 6c 69   cmd_test_simpli
5cc0: 66 79 5f 6e 61 6d 65 28 76 6f 69 64 29 7b 0a 20  fy_name(void){. 
5cd0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
5ce0: 7a 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  z;.  for(i=2; i<
5cf0: 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  g.argc; i++){.  
5d00: 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25    z = mprintf("%
5d10: 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d 29 3b 0a  s", g.argv[i]);.
5d20: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
5d30: 28 22 5b 25 73 5d 20 2d 3e 20 22 2c 20 7a 29 3b  ("[%s] -> ", z);
5d40: 0a 20 20 20 20 66 69 6c 65 5f 73 69 6d 70 6c 69  .    file_simpli
5d50: 66 79 5f 6e 61 6d 65 28 7a 2c 20 2d 31 2c 20 30  fy_name(z, -1, 0
5d60: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  );.    fossil_pr
5d70: 69 6e 74 28 22 5b 25 73 5d 5c 6e 22 2c 20 7a 29  int("[%s]\n", z)
5d80: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65  ;.    fossil_fre
5d90: 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(z);.  }.}../*.
5da0: 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72 72 65  ** Get the curre
5db0: 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
5dc0: 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 77  tory..**.** On w
5dd0: 69 6e 64 6f 77 73 2c 20 74 68 65 20 6e 61 6d 65  indows, the name
5de0: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 66 72   is converted fr
5df0: 6f 6d 20 75 6e 69 63 6f 64 65 20 74 6f 20 55 54  om unicode to UT
5e00: 46 38 20 61 6e 64 20 61 6c 6c 20 27 5c 5c 27 0a  F8 and all '\\'.
5e10: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 72  ** characters ar
5e20: 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 27  e converted to '
5e30: 2f 27 2e 20 20 4e 6f 20 63 6f 6e 76 65 72 73 69  /'.  No conversi
5e40: 6f 6e 73 20 61 72 65 20 6e 65 65 64 65 64 20 6f  ons are needed o
5e50: 6e 0a 2a 2a 20 75 6e 69 78 2e 0a 2a 2f 0a 76 6f  n.** unix..*/.vo
5e60: 69 64 20 66 69 6c 65 5f 67 65 74 63 77 64 28 63  id file_getcwd(c
5e70: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
5e80: 42 75 66 29 7b 0a 23 69 66 64 65 66 20 5f 57 49  Buf){.#ifdef _WI
5e90: 4e 33 32 0a 20 20 77 69 6e 33 32 5f 67 65 74 63  N32.  win32_getc
5ea0: 77 64 28 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a  wd(zBuf, nBuf);.
5eb0: 23 65 6c 73 65 0a 20 20 69 66 28 20 67 65 74 63  #else.  if( getc
5ec0: 77 64 28 7a 42 75 66 2c 20 6e 42 75 66 2d 31 29  wd(zBuf, nBuf-1)
5ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  ==0 ){.    if( e
5ee0: 72 72 6e 6f 3d 3d 45 52 41 4e 47 45 20 29 7b 0a  rrno==ERANGE ){.
5ef0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
5f00: 61 6c 28 22 70 77 64 20 74 6f 6f 20 62 69 67 3a  al("pwd too big:
5f10: 20 6d 61 78 20 25 64 22 2c 20 6e 42 75 66 2d 31   max %d", nBuf-1
5f20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5f30: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
5f40: 28 22 63 61 6e 6e 6f 74 20 66 69 6e 64 20 63 75  ("cannot find cu
5f50: 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
5f60: 72 65 63 74 6f 72 79 3b 20 25 73 22 2c 0a 20 20  rectory; %s",.  
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29   strerror(errno)
5f90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
5fa0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
5fb0: 75 72 6e 20 74 72 75 65 20 69 66 20 7a 50 61 74  urn true if zPat
5fc0: 68 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65  h is an absolute
5fd0: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
5fe0: 72 6e 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 69  rn false.** if i
5ff0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 2e 0a 2a  t is relative..*
6000: 2f 0a 69 6e 74 20 66 69 6c 65 5f 69 73 5f 61 62  /.int file_is_ab
6010: 73 6f 6c 75 74 65 5f 70 61 74 68 28 63 6f 6e 73  solute_path(cons
6020: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
6030: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 64    if( fossil_isd
6040: 69 72 73 65 70 28 7a 50 61 74 68 5b 30 5d 29 0a  irsep(zPath[0]).
6050: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
6060: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  32) || defined(_
6070: 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 20  _CYGWIN__).     
6080: 20 7c 7c 20 28 66 6f 73 73 69 6c 5f 69 73 61 6c   || (fossil_isal
6090: 70 68 61 28 7a 50 61 74 68 5b 30 5d 29 20 26 26  pha(zPath[0]) &&
60a0: 20 7a 50 61 74 68 5b 31 5d 3d 3d 27 3a 27 0a 20   zPath[1]==':'. 
60b0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6f            && (fo
60c0: 73 73 69 6c 5f 69 73 64 69 72 73 65 70 28 7a 50  ssil_isdirsep(zP
60d0: 61 74 68 5b 32 5d 29 20 7c 7c 20 7a 50 61 74 68  ath[2]) || zPath
60e0: 5b 32 5d 3d 3d 27 5c 30 27 29 29 0a 23 65 6e 64  [2]=='\0')).#end
60f0: 69 66 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  if.  ){.    retu
6100: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
6110: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
6130: 65 20 61 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61  e a canonical pa
6140: 74 68 6e 61 6d 65 20 66 6f 72 20 61 20 66 69 6c  thname for a fil
6150: 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 2e 0a  e or directory..
6160: 2a 2a 20 4d 61 6b 65 20 74 68 65 20 6e 61 6d 65  ** Make the name
6170: 20 61 62 73 6f 6c 75 74 65 20 69 66 20 69 74 20   absolute if it 
6180: 69 73 20 72 65 6c 61 74 69 76 65 2e 0a 2a 2a 20  is relative..** 
6190: 52 65 6d 6f 76 65 20 72 65 64 75 6e 64 61 6e 74  Remove redundant
61a0: 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a   / characters.**
61b0: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 2f 2e 2f 20   Remove all /./ 
61c0: 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  path elements..*
61d0: 2a 20 43 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f  * Convert /A/../
61e0: 20 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 49 66   to just /.** If
61f0: 20 74 68 65 20 73 6c 61 73 68 20 70 61 72 61 6d   the slash param
6200: 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
6210: 2c 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 73  , the trailing s
6220: 6c 61 73 68 2c 20 69 66 20 61 6e 79 2c 0a 2a 2a  lash, if any,.**
6230: 20 69 73 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f   is retained..*/
6240: 0a 76 6f 69 64 20 66 69 6c 65 5f 63 61 6e 6f 6e  .void file_canon
6250: 69 63 61 6c 5f 6e 61 6d 65 28 63 6f 6e 73 74 20  ical_name(const 
6260: 63 68 61 72 20 2a 7a 4f 72 69 67 4e 61 6d 65 2c  char *zOrigName,
6270: 20 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 69 6e 74   Blob *pOut, int
6280: 20 73 6c 61 73 68 29 7b 0a 20 20 62 6c 6f 62 5f   slash){.  blob_
6290: 7a 65 72 6f 28 70 4f 75 74 29 3b 0a 20 20 69 66  zero(pOut);.  if
62a0: 28 20 66 69 6c 65 5f 69 73 5f 61 62 73 6f 6c 75  ( file_is_absolu
62b0: 74 65 5f 70 61 74 68 28 7a 4f 72 69 67 4e 61 6d  te_path(zOrigNam
62c0: 65 29 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  e) ){.    blob_a
62d0: 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 25 2f  ppendf(pOut, "%/
62e0: 22 2c 20 7a 4f 72 69 67 4e 61 6d 65 29 3b 0a 20  ", zOrigName);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 7a 50 77 64 5b 32 30 30 30 5d 3b 0a 20 20 20   zPwd[2000];.   
6310: 20 66 69 6c 65 5f 67 65 74 63 77 64 28 7a 50 77   file_getcwd(zPw
6320: 64 2c 20 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d  d, sizeof(zPwd)-
6330: 73 74 72 6c 65 6e 28 7a 4f 72 69 67 4e 61 6d 65  strlen(zOrigName
6340: 29 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 77 64  ));.    if( zPwd
6350: 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 74 72 6c  [0]=='/' && strl
6360: 65 6e 28 7a 50 77 64 29 3d 3d 31 20 29 7b 0a 20  en(zPwd)==1 ){. 
6370: 20 20 20 20 20 2f 2a 20 77 68 65 6e 20 6f 6e 20       /* when on 
6380: 27 2f 27 2c 20 64 6f 6e 27 74 20 61 64 64 20 61  '/', don't add a
6390: 6e 20 65 78 74 72 61 20 27 2f 27 20 2a 2f 0a 20  n extra '/' */. 
63a0: 20 20 20 20 20 69 66 28 20 7a 4f 72 69 67 4e 61       if( zOrigNa
63b0: 6d 65 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 73 74  me[0]=='.' && st
63c0: 72 6c 65 6e 28 7a 4f 72 69 67 4e 61 6d 65 29 3d  rlen(zOrigName)=
63d0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =1 ){.        /*
63e0: 20 27 2e 27 20 77 68 65 6e 20 6f 6e 20 27 2f 27   '.' when on '/'
63f0: 20 6d 65 61 6e 20 27 2f 27 20 2a 2f 0a 20 20 20   mean '/' */.   
6400: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
6410: 66 28 70 4f 75 74 2c 20 22 25 2f 22 2c 20 7a 50  f(pOut, "%/", zP
6420: 77 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  wd);.      }else
6430: 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61  {.        blob_a
6440: 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 25 2f  ppendf(pOut, "%/
6450: 25 2f 22 2c 20 7a 50 77 64 2c 20 7a 4f 72 69 67  %/", zPwd, zOrig
6460: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
6470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6480: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75  blob_appendf(pOu
6490: 74 2c 20 22 25 2f 2f 25 2f 22 2c 20 7a 50 77 64  t, "%//%/", zPwd
64a0: 2c 20 7a 4f 72 69 67 4e 61 6d 65 29 3b 0a 20 20  , zOrigName);.  
64b0: 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69    }.  }.#if defi
64c0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
64d0: 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
64e0: 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  _).  {.    char 
64f0: 2a 7a 4f 75 74 3b 0a 20 20 20 20 2f 2a 0a 20 20  *zOut;.    /*.  
6500: 20 20 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2f    ** On Windows/
6510: 63 79 67 77 69 6e 2c 20 6e 6f 72 6d 61 6c 69 7a  cygwin, normaliz
6520: 65 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 74  e the drive lett
6530: 65 72 20 74 6f 20 75 70 70 65 72 20 63 61 73 65  er to upper case
6540: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4f 75  ..    */.    zOu
6550: 74 20 3d 20 62 6c 6f 62 5f 73 74 72 28 70 4f 75  t = blob_str(pOu
6560: 74 29 3b 0a 20 20 20 20 69 66 28 20 66 6f 73 73  t);.    if( foss
6570: 69 6c 5f 69 73 6c 6f 77 65 72 28 7a 4f 75 74 5b  il_islower(zOut[
6580: 30 5d 29 20 26 26 20 7a 4f 75 74 5b 31 5d 3d 3d  0]) && zOut[1]==
6590: 27 3a 27 20 26 26 20 7a 4f 75 74 5b 32 5d 3d 3d  ':' && zOut[2]==
65a0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75  '/' ){.      zOu
65b0: 74 5b 30 5d 20 3d 20 66 6f 73 73 69 6c 5f 74 6f  t[0] = fossil_to
65c0: 75 70 70 65 72 28 7a 4f 75 74 5b 30 5d 29 3b 0a  upper(zOut[0]);.
65d0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
65e0: 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70  .  blob_resize(p
65f0: 4f 75 74 2c 20 66 69 6c 65 5f 73 69 6d 70 6c 69  Out, file_simpli
6600: 66 79 5f 6e 61 6d 65 28 62 6c 6f 62 5f 62 75 66  fy_name(blob_buf
6610: 66 65 72 28 70 4f 75 74 29 2c 0a 20 20 20 20 20  fer(pOut),.     
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 62 6c 6f 62 5f 73 69 7a 65 28 70 4f 75 74    blob_size(pOut
6650: 29 2c 20 73 6c 61 73 68 29 29 3b 0a 7d 0a 0a 2f  ), slash));.}../
6660: 2a 0a 2a 2a 20 45 6d 69 74 73 20 74 68 65 20 65  *.** Emits the e
6670: 66 66 65 63 74 69 76 65 20 6f 72 20 72 61 77 20  ffective or raw 
6680: 73 74 61 74 28 29 20 69 6e 66 6f 72 6d 61 74 69  stat() informati
6690: 6f 6e 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  on for the speci
66a0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  fied.** file or 
66b0: 64 69 72 65 63 74 6f 72 79 2c 20 6f 70 74 69 6f  directory, optio
66c0: 6e 61 6c 6c 79 20 70 72 65 73 65 72 76 69 6e 67  nally preserving
66d0: 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 73 6c   the trailing sl
66e0: 61 73 68 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74  ash and.** reset
66f0: 74 69 6e 67 20 74 68 65 20 63 61 63 68 65 64 20  ting the cached 
6700: 73 74 61 74 28 29 20 69 6e 66 6f 72 6d 61 74 69  stat() informati
6710: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
6720: 69 64 20 65 6d 69 74 46 69 6c 65 53 74 61 74 28  id emitFileStat(
6730: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6740: 50 61 74 68 2c 0a 20 20 69 6e 74 20 73 6c 61 73  Path,.  int slas
6750: 68 2c 0a 20 20 69 6e 74 20 72 65 73 65 74 0a 29  h,.  int reset.)
6760: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  {.  char zBuf[20
6770: 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  0];.  char *z;. 
6780: 20 42 6c 6f 62 20 78 3b 0a 20 20 69 6e 74 20 72   Blob x;.  int r
6790: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
67a0: 36 34 20 69 4d 74 69 6d 65 3b 0a 20 20 73 74 72  64 iMtime;.  str
67b0: 75 63 74 20 66 6f 73 73 69 6c 53 74 61 74 20 74  uct fossilStat t
67c0: 65 73 74 46 69 6c 65 53 74 61 74 3b 0a 20 20 6d  estFileStat;.  m
67d0: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 73  emset(zBuf, 0, s
67e0: 69 7a 65 6f 66 28 7a 42 75 66 29 29 3b 0a 20 20  izeof(zBuf));.  
67f0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20  blob_zero(&x);. 
6800: 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f   file_canonical_
6810: 6e 61 6d 65 28 7a 50 61 74 68 2c 20 26 78 2c 20  name(zPath, &x, 
6820: 73 6c 61 73 68 29 3b 0a 20 20 66 6f 73 73 69 6c  slash);.  fossil
6830: 5f 70 72 69 6e 74 28 22 5b 25 73 5d 20 2d 3e 20  _print("[%s] -> 
6840: 5b 25 73 5d 5c 6e 22 2c 20 7a 50 61 74 68 2c 20  [%s]\n", zPath, 
6850: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 29 29  blob_buffer(&x))
6860: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
6870: 78 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65  x);.  memset(&te
6880: 73 74 46 69 6c 65 53 74 61 74 2c 20 30 2c 20 73  stFileStat, 0, s
6890: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 66 6f 73  izeof(struct fos
68a0: 73 69 6c 53 74 61 74 29 29 3b 0a 20 20 72 63 20  silStat));.  rc 
68b0: 3d 20 66 6f 73 73 69 6c 5f 73 74 61 74 28 7a 50  = fossil_stat(zP
68c0: 61 74 68 2c 20 26 74 65 73 74 46 69 6c 65 53 74  ath, &testFileSt
68d0: 61 74 2c 20 30 29 3b 0a 20 20 66 6f 73 73 69 6c  at, 0);.  fossil
68e0: 5f 70 72 69 6e 74 28 22 20 20 73 74 61 74 5f 72  _print("  stat_r
68f0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
6900: 20 3d 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20   = %d\n", rc);. 
6910: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6920: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
6930: 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 74 65  zBuf, "%lld", te
6940: 73 74 46 69 6c 65 53 74 61 74 2e 73 74 5f 73 69  stFileStat.st_si
6950: 7a 65 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72  ze);.  fossil_pr
6960: 69 6e 74 28 22 20 20 73 74 61 74 5f 73 69 7a 65  int("  stat_size
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
6980: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20  %s\n", zBuf);.  
6990: 7a 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  z = db_text(0, "
69a0: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
69b0: 25 6c 6c 64 2c 20 27 75 6e 69 78 65 70 6f 63 68  %lld, 'unixepoch
69c0: 27 29 22 2c 20 74 65 73 74 46 69 6c 65 53 74 61  ')", testFileSta
69d0: 74 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 73  t.st_mtime);.  s
69e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
69f0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
6a00: 75 66 2c 20 22 25 6c 6c 64 20 28 25 73 29 22 2c  uf, "%lld (%s)",
6a10: 20 74 65 73 74 46 69 6c 65 53 74 61 74 2e 73 74   testFileStat.st
6a20: 5f 6d 74 69 6d 65 2c 20 7a 29 3b 0a 20 20 66 6f  _mtime, z);.  fo
6a30: 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ssil_free(z);.  
6a40: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
6a50: 73 74 61 74 5f 6d 74 69 6d 65 20 20 20 20 20 20  stat_mtime      
6a60: 20 20 20 20 20 20 20 3d 20 25 73 5c 6e 22 2c 20         = %s\n", 
6a70: 7a 42 75 66 29 3b 0a 20 20 66 6f 73 73 69 6c 5f  zBuf);.  fossil_
6a80: 70 72 69 6e 74 28 22 20 20 73 74 61 74 5f 6d 6f  print("  stat_mo
6a90: 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
6aa0: 3d 20 30 25 6f 5c 6e 22 2c 20 74 65 73 74 46 69  = 0%o\n", testFi
6ab0: 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 3b  leStat.st_mode);
6ac0: 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 73 74 46  .  memset(&testF
6ad0: 69 6c 65 53 74 61 74 2c 20 30 2c 20 73 69 7a 65  ileStat, 0, size
6ae0: 6f 66 28 73 74 72 75 63 74 20 66 6f 73 73 69 6c  of(struct fossil
6af0: 53 74 61 74 29 29 3b 0a 20 20 72 63 20 3d 20 66  Stat));.  rc = f
6b00: 6f 73 73 69 6c 5f 73 74 61 74 28 7a 50 61 74 68  ossil_stat(zPath
6b10: 2c 20 26 74 65 73 74 46 69 6c 65 53 74 61 74 2c  , &testFileStat,
6b20: 20 31 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72   1);.  fossil_pr
6b30: 69 6e 74 28 22 20 20 6c 5f 73 74 61 74 5f 72 63  int("  l_stat_rc
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
6b50: 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 73 71  %d\n", rc);.  sq
6b60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
6b70: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
6b80: 66 2c 20 22 25 6c 6c 64 22 2c 20 74 65 73 74 46  f, "%lld", testF
6b90: 69 6c 65 53 74 61 74 2e 73 74 5f 73 69 7a 65 29  ileStat.st_size)
6ba0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74  ;.  fossil_print
6bb0: 28 22 20 20 6c 5f 73 74 61 74 5f 73 69 7a 65 20  ("  l_stat_size 
6bc0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 25 73 5c             = %s\
6bd0: 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7a 20 3d  n", zBuf);.  z =
6be0: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
6bf0: 45 43 54 20 64 61 74 65 74 69 6d 65 28 25 6c 6c  ECT datetime(%ll
6c00: 64 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29 22  d, 'unixepoch')"
6c10: 2c 20 74 65 73 74 46 69 6c 65 53 74 61 74 2e 73  , testFileStat.s
6c20: 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 73 71 6c 69  t_mtime);.  sqli
6c30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
6c40: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
6c50: 20 22 25 6c 6c 64 20 28 25 73 29 22 2c 20 74 65   "%lld (%s)", te
6c60: 73 74 46 69 6c 65 53 74 61 74 2e 73 74 5f 6d 74  stFileStat.st_mt
6c70: 69 6d 65 2c 20 7a 29 3b 0a 20 20 66 6f 73 73 69  ime, z);.  fossi
6c80: 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 20 66 6f 73  l_free(z);.  fos
6c90: 73 69 6c 5f 70 72 69 6e 74 28 22 20 20 6c 5f 73  sil_print("  l_s
6ca0: 74 61 74 5f 6d 74 69 6d 65 20 20 20 20 20 20 20  tat_mtime       
6cb0: 20 20 20 20 3d 20 25 73 5c 6e 22 2c 20 7a 42 75      = %s\n", zBu
6cc0: 66 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69  f);.  fossil_pri
6cd0: 6e 74 28 22 20 20 6c 5f 73 74 61 74 5f 6d 6f 64  nt("  l_stat_mod
6ce0: 65 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30  e            = 0
6cf0: 25 6f 5c 6e 22 2c 20 74 65 73 74 46 69 6c 65 53  %o\n", testFileS
6d00: 74 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20  tat.st_mode);.  
6d10: 69 66 28 20 72 65 73 65 74 20 29 20 72 65 73 65  if( reset ) rese
6d20: 74 53 74 61 74 28 29 3b 0a 20 20 73 71 6c 69 74  tStat();.  sqlit
6d30: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
6d40: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
6d50: 22 25 6c 6c 64 22 2c 20 66 69 6c 65 5f 73 69 7a  "%lld", file_siz
6d60: 65 28 7a 50 61 74 68 2c 45 78 74 46 49 4c 45 29  e(zPath,ExtFILE)
6d70: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  );.  fossil_prin
6d80: 74 28 22 20 20 66 69 6c 65 5f 73 69 7a 65 28 45  t("  file_size(E
6d90: 78 74 46 49 4c 45 29 20 20 20 20 20 3d 20 25 73  xtFILE)     = %s
6da0: 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 69 4d  \n", zBuf);.  iM
6db0: 74 69 6d 65 20 3d 20 66 69 6c 65 5f 6d 74 69 6d  time = file_mtim
6dc0: 65 28 7a 50 61 74 68 2c 20 45 78 74 46 49 4c 45  e(zPath, ExtFILE
6dd0: 29 3b 0a 20 20 7a 20 3d 20 64 62 5f 74 65 78 74  );.  z = db_text
6de0: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65  (0, "SELECT date
6df0: 74 69 6d 65 28 25 6c 6c 64 2c 20 27 75 6e 69 78  time(%lld, 'unix
6e00: 65 70 6f 63 68 27 29 22 2c 20 69 4d 74 69 6d 65  epoch')", iMtime
6e10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
6e20: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
6e30: 66 29 2c 20 7a 42 75 66 2c 20 22 25 6c 6c 64 20  f), zBuf, "%lld 
6e40: 28 25 73 29 22 2c 20 69 4d 74 69 6d 65 2c 20 7a  (%s)", iMtime, z
6e50: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
6e60: 28 7a 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72  (z);.  fossil_pr
6e70: 69 6e 74 28 22 20 20 66 69 6c 65 5f 6d 74 69 6d  int("  file_mtim
6e80: 65 28 45 78 74 46 49 4c 45 29 20 20 20 20 3d 20  e(ExtFILE)    = 
6e90: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20  %s\n", zBuf);.  
6ea0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
6eb0: 66 69 6c 65 5f 6d 6f 64 65 28 45 78 74 46 49 4c  file_mode(ExtFIL
6ec0: 45 29 20 20 20 20 20 3d 20 30 25 6f 5c 6e 22 2c  E)     = 0%o\n",
6ed0: 20 66 69 6c 65 5f 6d 6f 64 65 28 7a 50 61 74 68   file_mode(zPath
6ee0: 2c 45 78 74 46 49 4c 45 29 29 3b 0a 20 20 66 6f  ,ExtFILE));.  fo
6ef0: 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20 66 69  ssil_print("  fi
6f00: 6c 65 5f 69 73 66 69 6c 65 28 45 78 74 46 49 4c  le_isfile(ExtFIL
6f10: 45 29 20 20 20 3d 20 25 64 5c 6e 22 2c 20 66 69  E)   = %d\n", fi
6f20: 6c 65 5f 69 73 66 69 6c 65 28 7a 50 61 74 68 2c  le_isfile(zPath,
6f30: 45 78 74 46 49 4c 45 29 29 3b 0a 20 20 66 6f 73  ExtFILE));.  fos
6f40: 73 69 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c  sil_print("  fil
6f50: 65 5f 69 73 64 69 72 28 45 78 74 46 49 4c 45 29  e_isdir(ExtFILE)
6f60: 20 20 20 20 3d 20 25 64 5c 6e 22 2c 20 66 69 6c      = %d\n", fil
6f70: 65 5f 69 73 64 69 72 28 7a 50 61 74 68 2c 45 78  e_isdir(zPath,Ex
6f80: 74 46 49 4c 45 29 29 3b 0a 20 20 69 66 28 20 72  tFILE));.  if( r
6f90: 65 73 65 74 20 29 20 72 65 73 65 74 53 74 61 74  eset ) resetStat
6fa0: 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ();.  sqlite3_sn
6fb0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
6fc0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 6c 6c 64  uf), zBuf, "%lld
6fd0: 22 2c 20 66 69 6c 65 5f 73 69 7a 65 28 7a 50 61  ", file_size(zPa
6fe0: 74 68 2c 52 65 70 6f 46 49 4c 45 29 29 3b 0a 20  th,RepoFILE));. 
6ff0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
7000: 20 66 69 6c 65 5f 73 69 7a 65 28 52 65 70 6f 46   file_size(RepoF
7010: 49 4c 45 29 20 20 20 20 3d 20 25 73 5c 6e 22 2c  ILE)    = %s\n",
7020: 20 7a 42 75 66 29 3b 0a 20 20 69 4d 74 69 6d 65   zBuf);.  iMtime
7030: 20 3d 20 66 69 6c 65 5f 6d 74 69 6d 65 28 7a 50   = file_mtime(zP
7040: 61 74 68 2c 52 65 70 6f 46 49 4c 45 29 3b 0a 20  ath,RepoFILE);. 
7050: 20 7a 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20   z = db_text(0, 
7060: 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65  "SELECT datetime
7070: 28 25 6c 6c 64 2c 20 27 75 6e 69 78 65 70 6f 63  (%lld, 'unixepoc
7080: 68 27 29 22 2c 20 69 4d 74 69 6d 65 29 3b 0a 20  h')", iMtime);. 
7090: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
70a0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
70b0: 7a 42 75 66 2c 20 22 25 6c 6c 64 20 28 25 73 29  zBuf, "%lld (%s)
70c0: 22 2c 20 69 4d 74 69 6d 65 2c 20 7a 29 3b 0a 20  ", iMtime, z);. 
70d0: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29 3b   fossil_free(z);
70e0: 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28  .  fossil_print(
70f0: 22 20 20 66 69 6c 65 5f 6d 74 69 6d 65 28 52 65  "  file_mtime(Re
7100: 70 6f 46 49 4c 45 29 20 20 20 3d 20 25 73 5c 6e  poFILE)   = %s\n
7110: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 66 6f 73 73  ", zBuf);.  foss
7120: 69 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65  il_print("  file
7130: 5f 6d 6f 64 65 28 52 65 70 6f 46 49 4c 45 29 20  _mode(RepoFILE) 
7140: 20 20 20 3d 20 30 25 6f 5c 6e 22 2c 20 66 69 6c     = 0%o\n", fil
7150: 65 5f 6d 6f 64 65 28 7a 50 61 74 68 2c 52 65 70  e_mode(zPath,Rep
7160: 6f 46 49 4c 45 29 29 3b 0a 20 20 66 6f 73 73 69  oFILE));.  fossi
7170: 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f  l_print("  file_
7180: 69 73 66 69 6c 65 28 52 65 70 6f 46 49 4c 45 29  isfile(RepoFILE)
7190: 20 20 3d 20 25 64 5c 6e 22 2c 20 66 69 6c 65 5f    = %d\n", file_
71a0: 69 73 66 69 6c 65 28 7a 50 61 74 68 2c 52 65 70  isfile(zPath,Rep
71b0: 6f 46 49 4c 45 29 29 3b 0a 20 20 66 6f 73 73 69  oFILE));.  fossi
71c0: 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f  l_print("  file_
71d0: 69 73 66 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 20 20  isfile_or_link  
71e0: 20 20 3d 20 25 64 5c 6e 22 2c 20 66 69 6c 65 5f    = %d\n", file_
71f0: 69 73 66 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 28 7a  isfile_or_link(z
7200: 50 61 74 68 29 29 3b 0a 20 20 66 6f 73 73 69 6c  Path));.  fossil
7210: 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 69  _print("  file_i
7220: 73 6c 69 6e 6b 20 20 20 20 20 20 20 20 20 20 20  slink           
7230: 20 3d 20 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 69   = %d\n", file_i
7240: 73 6c 69 6e 6b 28 7a 50 61 74 68 29 29 3b 0a 20  slink(zPath));. 
7250: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
7260: 20 66 69 6c 65 5f 69 73 65 78 65 28 52 65 70 6f   file_isexe(Repo
7270: 46 49 4c 45 29 20 20 20 3d 20 25 64 5c 6e 22 2c  FILE)   = %d\n",
7280: 20 66 69 6c 65 5f 69 73 65 78 65 28 7a 50 61 74   file_isexe(zPat
7290: 68 2c 52 65 70 6f 46 49 4c 45 29 29 3b 0a 20 20  h,RepoFILE));.  
72a0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
72b0: 66 69 6c 65 5f 69 73 64 69 72 28 52 65 70 6f 46  file_isdir(RepoF
72c0: 49 4c 45 29 20 20 20 3d 20 25 64 5c 6e 22 2c 20  ILE)   = %d\n", 
72d0: 66 69 6c 65 5f 69 73 64 69 72 28 7a 50 61 74 68  file_isdir(zPath
72e0: 2c 52 65 70 6f 46 49 4c 45 29 29 3b 0a 20 20 69  ,RepoFILE));.  i
72f0: 66 28 20 72 65 73 65 74 20 29 20 72 65 73 65 74  f( reset ) reset
7300: 53 74 61 74 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Stat();.}../*.**
7310: 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 66   COMMAND: test-f
7320: 69 6c 65 2d 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a  ile-environment.
7330: 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f  **.** Usage: %fo
7340: 73 73 69 6c 20 74 65 73 74 2d 66 69 6c 65 2d 65  ssil test-file-e
7350: 6e 76 69 72 6f 6e 6d 65 6e 74 20 46 49 4c 45 4e  nvironment FILEN
7360: 41 4d 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  AME....**.** Dis
7370: 70 6c 61 79 20 74 68 65 20 65 66 66 65 63 74 69  play the effecti
7380: 76 65 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67  ve file handling
7390: 20 73 75 62 73 79 73 74 65 6d 20 22 73 65 74 74   subsystem "sett
73a0: 69 6e 67 73 22 20 61 6e 64 20 74 68 65 6e 0a 2a  ings" and then.*
73b0: 2a 20 64 69 73 70 6c 61 79 20 66 69 6c 65 20 73  * display file s
73c0: 79 73 74 65 6d 20 69 6e 66 6f 72 6d 61 74 69 6f  ystem informatio
73d0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
73e0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 69 66 20  s specified, if 
73f0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 4f 70 74 69 6f  any..**.** Optio
7400: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2d 2d  ns:.**.**     --
7410: 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 42  allow-symlinks B
7420: 4f 4f 4c 45 41 4e 20 20 20 20 20 54 65 6d 70 6f  OOLEAN     Tempo
7430: 72 61 72 69 6c 79 20 74 75 72 6e 20 61 6c 6c 6f  rarily turn allo
7440: 77 2d 73 79 6d 6c 69 6e 6b 73 20 6f 6e 2f 6f 66  w-symlinks on/of
7450: 66 0a 2a 2a 20 20 20 20 20 2d 2d 6f 70 65 6e 2d  f.**     --open-
7460: 63 6f 6e 66 69 67 20 20 20 20 20 20 20 20 20 20  config          
7470: 20 20 20 20 20 20 4f 70 65 6e 20 74 68 65 20 63        Open the c
7480: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74  onfiguration dat
7490: 61 62 61 73 65 20 66 69 72 73 74 2e 0a 2a 2a 20  abase first..** 
74a0: 20 20 20 20 2d 2d 73 6c 61 73 68 20 20 20 20 20      --slash     
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 54 72 61 69 6c 69 6e 67 20 73 6c 61 73 68 65   Trailing slashe
74d0: 73 2c 20 69 66 20 61 6e 79 2c 20 61 72 65 20 72  s, if any, are r
74e0: 65 74 61 69 6e 65 64 2e 0a 2a 2a 20 20 20 20 20  etained..**     
74f0: 2d 2d 72 65 73 65 74 20 20 20 20 20 20 20 20 20  --reset         
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
7510: 65 74 20 63 61 63 68 65 64 20 73 74 61 74 28 29  et cached stat()
7520: 20 69 6e 66 6f 20 66 6f 72 20 65 61 63 68 20 66   info for each f
7530: 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64  ile..*/.void cmd
7540: 5f 74 65 73 74 5f 66 69 6c 65 5f 65 6e 76 69 72  _test_file_envir
7550: 6f 6e 6d 65 6e 74 28 76 6f 69 64 29 7b 0a 20 20  onment(void){.  
7560: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 73 6c 61  int i;.  int sla
7570: 73 68 46 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70  shFlag = find_op
7580: 74 69 6f 6e 28 22 73 6c 61 73 68 22 2c 30 2c 30  tion("slash",0,0
7590: 29 21 3d 30 3b 0a 20 20 69 6e 74 20 72 65 73 65  )!=0;.  int rese
75a0: 74 46 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74  tFlag = find_opt
75b0: 69 6f 6e 28 22 72 65 73 65 74 22 2c 30 2c 30 29  ion("reset",0,0)
75c0: 21 3d 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  !=0;.  const cha
75d0: 72 20 2a 7a 41 6c 6c 6f 77 20 3d 20 66 69 6e 64  r *zAllow = find
75e0: 5f 6f 70 74 69 6f 6e 28 22 61 6c 6c 6f 77 2d 73  _option("allow-s
75f0: 79 6d 6c 69 6e 6b 73 22 2c 30 2c 31 29 3b 0a 20  ymlinks",0,1);. 
7600: 20 69 66 28 20 66 69 6e 64 5f 6f 70 74 69 6f 6e   if( find_option
7610: 28 22 6f 70 65 6e 2d 63 6f 6e 66 69 67 22 2c 20  ("open-config", 
7620: 30 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  0, 0)!=0 ){.    
7630: 54 68 5f 4f 70 65 6e 43 6f 6e 66 69 67 28 31 29  Th_OpenConfig(1)
7640: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 64 5f  ;.  }.  db_find_
7650: 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74  and_open_reposit
7660: 6f 72 79 28 4f 50 45 4e 5f 41 4e 59 5f 53 43 48  ory(OPEN_ANY_SCH
7670: 45 4d 41 2c 20 30 29 3b 0a 20 20 66 6f 73 73 69  EMA, 0);.  fossi
7680: 6c 5f 70 72 69 6e 74 28 22 66 69 6c 65 6e 61 6d  l_print("filenam
7690: 65 73 5f 61 72 65 5f 63 61 73 65 5f 73 65 6e 73  es_are_case_sens
76a0: 69 74 69 76 65 28 29 20 3d 20 25 64 5c 6e 22 2c  itive() = %d\n",
76b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
76c0: 66 69 6c 65 6e 61 6d 65 73 5f 61 72 65 5f 63 61  filenames_are_ca
76d0: 73 65 5f 73 65 6e 73 69 74 69 76 65 28 29 29 3b  se_sensitive());
76e0: 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28  .  fossil_print(
76f0: 22 64 62 5f 61 6c 6c 6f 77 5f 73 79 6d 6c 69 6e  "db_allow_symlin
7700: 6b 73 5f 62 79 5f 64 65 66 61 75 6c 74 28 29 20  ks_by_default() 
7710: 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %d\n",.       
7720: 20 20 20 20 20 20 20 20 64 62 5f 61 6c 6c 6f 77          db_allow
7730: 5f 73 79 6d 6c 69 6e 6b 73 5f 62 79 5f 64 65 66  _symlinks_by_def
7740: 61 75 6c 74 28 29 29 3b 0a 20 20 69 66 28 20 7a  ault());.  if( z
7750: 41 6c 6c 6f 77 20 29 7b 0a 20 20 20 20 67 2e 61  Allow ){.    g.a
7760: 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 20 3d 20 21  llowSymlinks = !
7770: 69 73 5f 66 61 6c 73 65 28 7a 41 6c 6c 6f 77 29  is_false(zAllow)
7780: 3b 0a 20 20 7d 0a 20 20 66 6f 73 73 69 6c 5f 70  ;.  }.  fossil_p
7790: 72 69 6e 74 28 22 64 62 5f 61 6c 6c 6f 77 5f 73  rint("db_allow_s
77a0: 79 6d 6c 69 6e 6b 73 28 29 20 3d 20 25 64 5c 6e  ymlinks() = %d\n
77b0: 22 2c 20 64 62 5f 61 6c 6c 6f 77 5f 73 79 6d 6c  ", db_allow_syml
77c0: 69 6e 6b 73 28 29 29 3b 0a 20 20 66 6f 72 28 69  inks());.  for(i
77d0: 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b  =2; i<g.argc; i+
77e0: 2b 29 7b 0a 20 20 20 20 65 6d 69 74 46 69 6c 65  +){.    emitFile
77f0: 53 74 61 74 28 67 2e 61 72 67 76 5b 69 5d 2c 20  Stat(g.argv[i], 
7800: 73 6c 61 73 68 46 6c 61 67 2c 20 72 65 73 65 74  slashFlag, reset
7810: 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Flag);.  }.}../*
7820: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73  .** COMMAND: tes
7830: 74 2d 63 61 6e 6f 6e 69 63 61 6c 2d 6e 61 6d 65  t-canonical-name
7840: 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66  .**.** Usage: %f
7850: 6f 73 73 69 6c 20 74 65 73 74 2d 63 61 6e 6f 6e  ossil test-canon
7860: 69 63 61 6c 2d 6e 61 6d 65 20 46 49 4c 45 4e 41  ical-name FILENA
7870: 4d 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  ME....**.** Test
7880: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
7890: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
78a0: 6e 61 6d 65 20 67 65 6e 65 72 61 74 6f 72 2e 0a  name generator..
78b0: 2a 2a 20 41 6c 73 6f 20 74 65 73 74 20 46 6f 73  ** Also test Fos
78c0: 73 69 6c 27 73 20 61 62 69 6c 69 74 79 20 74 6f  sil's ability to
78d0: 20 6d 65 61 73 75 72 65 20 61 74 74 72 69 62 75   measure attribu
78e0: 74 65 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tes of a file..*
78f0: 2f 0a 76 6f 69 64 20 63 6d 64 5f 74 65 73 74 5f  /.void cmd_test_
7900: 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 76  canonical_name(v
7910: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
7920: 20 42 6c 6f 62 20 78 3b 0a 20 20 69 6e 74 20 73   Blob x;.  int s
7930: 6c 61 73 68 46 6c 61 67 20 3d 20 66 69 6e 64 5f  lashFlag = find_
7940: 6f 70 74 69 6f 6e 28 22 73 6c 61 73 68 22 2c 30  option("slash",0
7950: 2c 30 29 21 3d 30 3b 0a 20 20 62 6c 6f 62 5f 7a  ,0)!=0;.  blob_z
7960: 65 72 6f 28 26 78 29 3b 0a 20 20 66 6f 72 28 69  ero(&x);.  for(i
7970: 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b  =2; i<g.argc; i+
7980: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  +){.    char zBu
7990: 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6e 73  f[100];.    cons
79a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
79b0: 67 2e 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 66  g.argv[i];.    f
79c0: 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61  ile_canonical_na
79d0: 6d 65 28 7a 4e 61 6d 65 2c 20 26 78 2c 20 73 6c  me(zName, &x, sl
79e0: 61 73 68 46 6c 61 67 29 3b 0a 20 20 20 20 66 6f  ashFlag);.    fo
79f0: 73 73 69 6c 5f 70 72 69 6e 74 28 22 5b 25 73 5d  ssil_print("[%s]
7a00: 20 2d 3e 20 5b 25 73 5d 5c 6e 22 2c 20 7a 4e 61   -> [%s]\n", zNa
7a10: 6d 65 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28  me, blob_buffer(
7a20: 26 78 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72  &x));.    blob_r
7a30: 65 73 65 74 28 26 78 29 3b 0a 20 20 20 20 73 71  eset(&x);.    sq
7a40: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
7a50: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
7a60: 66 2c 20 22 25 6c 6c 64 22 2c 20 66 69 6c 65 5f  f, "%lld", file_
7a70: 73 69 7a 65 28 7a 4e 61 6d 65 2c 52 65 70 6f 46  size(zName,RepoF
7a80: 49 4c 45 29 29 3b 0a 20 20 20 20 66 6f 73 73 69  ILE));.    fossi
7a90: 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f  l_print("  file_
7aa0: 73 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 3d  size           =
7ab0: 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20   %s\n", zBuf);. 
7ac0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7ad0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
7ae0: 2c 20 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20  , zBuf, "%lld", 
7af0: 66 69 6c 65 5f 6d 74 69 6d 65 28 7a 4e 61 6d 65  file_mtime(zName
7b00: 2c 52 65 70 6f 46 49 4c 45 29 29 3b 0a 20 20 20  ,RepoFILE));.   
7b10: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
7b20: 20 66 69 6c 65 5f 6d 74 69 6d 65 20 20 20 20 20   file_mtime     
7b30: 20 20 20 20 20 3d 20 25 73 5c 6e 22 2c 20 7a 42       = %s\n", zB
7b40: 75 66 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  uf);.    fossil_
7b50: 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 69 73  print("  file_is
7b60: 66 69 6c 65 20 20 20 20 20 20 20 20 20 3d 20 25  file         = %
7b70: 64 5c 6e 22 2c 20 66 69 6c 65 5f 69 73 66 69 6c  d\n", file_isfil
7b80: 65 28 7a 4e 61 6d 65 2c 52 65 70 6f 46 49 4c 45  e(zName,RepoFILE
7b90: 29 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70  ));.    fossil_p
7ba0: 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 69 73 66  rint("  file_isf
7bb0: 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 20 3d 20 25 64  ile_or_link = %d
7bc0: 5c 6e 22 2c 20 66 69 6c 65 5f 69 73 66 69 6c 65  \n", file_isfile
7bd0: 5f 6f 72 5f 6c 69 6e 6b 28 7a 4e 61 6d 65 29 29  _or_link(zName))
7be0: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  ;.    fossil_pri
7bf0: 6e 74 28 22 20 20 66 69 6c 65 5f 69 73 6c 69 6e  nt("  file_islin
7c00: 6b 20 20 20 20 20 20 20 20 20 3d 20 25 64 5c 6e  k         = %d\n
7c10: 22 2c 20 66 69 6c 65 5f 69 73 6c 69 6e 6b 28 7a  ", file_islink(z
7c20: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 66 6f 73 73  Name));.    foss
7c30: 69 6c 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65  il_print("  file
7c40: 5f 69 73 65 78 65 20 20 20 20 20 20 20 20 20 20  _isexe          
7c50: 3d 20 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 69 73  = %d\n", file_is
7c60: 65 78 65 28 7a 4e 61 6d 65 2c 52 65 70 6f 46 49  exe(zName,RepoFI
7c70: 4c 45 29 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c  LE));.    fossil
7c80: 5f 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 69  _print("  file_i
7c90: 73 64 69 72 20 20 20 20 20 20 20 20 20 20 3d 20  sdir          = 
7ca0: 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 69 73 64 69  %d\n", file_isdi
7cb0: 72 28 7a 4e 61 6d 65 2c 52 65 70 6f 46 49 4c 45  r(zName,RepoFILE
7cc0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
7cd0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
7ce0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 6e 61  the given filena
7cf0: 6d 65 20 69 73 20 63 61 6e 6f 6e 69 63 61 6c 2e  me is canonical.
7d00: 0a 2a 2a 0a 2a 2a 20 43 61 6e 6f 6e 69 63 61 6c  .**.** Canonical
7d10: 20 6e 61 6d 65 73 20 61 72 65 20 66 75 6c 6c 20   names are full 
7d20: 70 61 74 68 6e 61 6d 65 73 20 75 73 69 6e 67 20  pathnames using 
7d30: 22 2f 22 20 6e 6f 74 20 22 5c 22 20 61 6e 64 20  "/" not "\" and 
7d40: 77 68 69 63 68 0a 2a 2a 20 63 6f 6e 74 61 69 6e  which.** contain
7d50: 20 6e 6f 20 22 2f 2e 2f 22 20 6f 72 20 22 2f 2e   no "/./" or "/.
7d60: 2e 2f 22 20 74 65 72 6d 73 2e 0a 2a 2f 0a 69 6e  ./" terms..*/.in
7d70: 74 20 66 69 6c 65 5f 69 73 5f 63 61 6e 6f 6e 69  t file_is_canoni
7d80: 63 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  cal(const char *
7d90: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  z){.  int i;.  i
7da0: 66 28 20 7a 5b 30 5d 21 3d 27 2f 27 0a 23 69 66  f( z[0]!='/'.#if
7db0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
7dc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 43 59   || defined(__CY
7dd0: 47 57 49 4e 5f 5f 29 0a 20 20 20 20 26 26 20 28  GWIN__).    && (
7de0: 21 66 6f 73 73 69 6c 5f 69 73 75 70 70 65 72 28  !fossil_isupper(
7df0: 7a 5b 30 5d 29 20 7c 7c 20 7a 5b 31 5d 21 3d 27  z[0]) || z[1]!='
7e00: 3a 27 20 7c 7c 20 7a 5b 32 5d 21 3d 27 2f 27 29  :' || z[2]!='/')
7e10: 0a 23 65 6e 64 69 66 0a 20 20 29 20 72 65 74 75  .#endif.  ) retu
7e20: 72 6e 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  rn 0;..  for(i=0
7e30: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
7e40: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27    if( z[i]=='\\'
7e50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7e60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
7e70: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
7e80: 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  1]=='.' ){.     
7e90: 20 20 20 69 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27     if( z[i+2]=='
7ea0: 2f 27 20 7c 7c 20 7a 5b 69 2b 32 5d 3d 3d 30 20  /' || z[i+2]==0 
7eb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7ec0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 32 5d 3d 3d      if( z[i+2]==
7ed0: 27 2e 27 20 26 26 20 28 7a 5b 69 2b 33 5d 3d 3d  '.' && (z[i+3]==
7ee0: 27 2f 27 20 7c 7c 20 7a 5b 69 2b 33 5d 3d 3d 30  '/' || z[i+3]==0
7ef0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7f00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7f10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
7f20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
7f30: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
7f40: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
7f50: 61 20 70 61 74 68 6e 61 6d 65 20 70 61 73 74 20  a pathname past 
7f60: 74 68 65 0a 2a 2a 20 64 72 69 76 65 20 6c 65 74  the.** drive let
7f70: 74 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ter.  This routi
7f80: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e  ne is a no-op on
7f90: 20 75 6e 69 78 2e 0a 2a 2f 0a 63 68 61 72 20 2a   unix..*/.char *
7fa0: 66 69 6c 65 5f 77 69 74 68 6f 75 74 5f 64 72 69  file_without_dri
7fb0: 76 65 5f 6c 65 74 74 65 72 28 63 68 61 72 20 2a  ve_letter(char *
7fc0: 7a 49 6e 29 7b 0a 23 69 66 64 65 66 20 5f 57 49  zIn){.#ifdef _WI
7fd0: 4e 33 32 0a 20 20 69 66 28 20 66 6f 73 73 69 6c  N32.  if( fossil
7fe0: 5f 69 73 61 6c 70 68 61 28 7a 49 6e 5b 30 5d 29  _isalpha(zIn[0])
7ff0: 20 26 26 20 7a 49 6e 5b 31 5d 3d 3d 27 3a 27 20   && zIn[1]==':' 
8000: 29 20 7a 49 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64  ) zIn += 2;.#end
8010: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 49 6e 3b  if.  return zIn;
8020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
8030: 65 20 61 20 70 61 74 68 6e 61 6d 65 20 66 6f 72  e a pathname for
8040: 20 61 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63   a file or direc
8050: 74 6f 72 79 20 74 68 61 74 20 69 73 20 72 65 6c  tory that is rel
8060: 61 74 69 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20  ative.** to the 
8070: 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72  current director
8080: 79 2e 20 20 49 66 20 74 68 65 20 73 6c 61 73 68  y.  If the slash
8090: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
80a0: 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 20 74  n-zero,.** the t
80b0: 72 61 69 6c 69 6e 67 20 73 6c 61 73 68 2c 20 69  railing slash, i
80c0: 66 20 61 6e 79 2c 20 69 73 20 72 65 74 61 69 6e  f any, is retain
80d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65  ed..*/.void file
80e0: 5f 72 65 6c 61 74 69 76 65 5f 6e 61 6d 65 28 63  _relative_name(c
80f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
8100: 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 4f 75 74  Name, Blob *pOut
8110: 2c 20 69 6e 74 20 73 6c 61 73 68 29 7b 0a 20 20  , int slash){.  
8120: 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 62  char *zPath;.  b
8130: 6c 6f 62 5f 73 65 74 28 70 4f 75 74 2c 20 7a 4f  lob_set(pOut, zO
8140: 72 69 67 4e 61 6d 65 29 3b 0a 20 20 62 6c 6f 62  rigName);.  blob
8150: 5f 72 65 73 69 7a 65 28 70 4f 75 74 2c 20 66 69  _resize(pOut, fi
8160: 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65  le_simplify_name
8170: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 4f 75  (blob_buffer(pOu
8180: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f             blob_
81b0: 73 69 7a 65 28 70 4f 75 74 29 2c 20 73 6c 61 73  size(pOut), slas
81c0: 68 29 29 3b 0a 20 20 7a 50 61 74 68 20 3d 20 66  h));.  zPath = f
81d0: 69 6c 65 5f 77 69 74 68 6f 75 74 5f 64 72 69 76  ile_without_driv
81e0: 65 5f 6c 65 74 74 65 72 28 62 6c 6f 62 5f 62 75  e_letter(blob_bu
81f0: 66 66 65 72 28 70 4f 75 74 29 29 3b 0a 20 20 69  ffer(pOut));.  i
8200: 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27  f( zPath[0]=='/'
8210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
8220: 3b 0a 20 20 20 20 42 6c 6f 62 20 74 6d 70 3b 0a  ;.    Blob tmp;.
8230: 20 20 20 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a      char *zPwd;.
8240: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
8250: 30 30 5d 3b 0a 20 20 20 20 7a 50 77 64 20 3d 20  00];.    zPwd = 
8260: 7a 42 75 66 3b 0a 20 20 20 20 66 69 6c 65 5f 67  zBuf;.    file_g
8270: 65 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a 65  etcwd(zBuf, size
8280: 6f 66 28 7a 42 75 66 29 2d 32 30 29 3b 0a 20 20  of(zBuf)-20);.  
8290: 20 20 7a 50 77 64 20 3d 20 66 69 6c 65 5f 77 69    zPwd = file_wi
82a0: 74 68 6f 75 74 5f 64 72 69 76 65 5f 6c 65 74 74  thout_drive_lett
82b0: 65 72 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 20  er(zBuf);.    i 
82c0: 3d 20 31 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  = 1;.#if defined
82d0: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
82e0: 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
82f0: 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
8300: 5b 69 5d 20 26 26 20 66 6f 73 73 69 6c 5f 74 6f  [i] && fossil_to
8310: 6c 6f 77 65 72 28 7a 50 77 64 5b 69 5d 29 3d 3d  lower(zPwd[i])==
8320: 66 6f 73 73 69 6c 5f 74 6f 6c 6f 77 65 72 28 7a  fossil_tolower(z
8330: 50 61 74 68 5b 69 5d 29 20 29 20 69 2b 2b 3b 0a  Path[i]) ) i++;.
8340: 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
8350: 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 77   zPath[i] && zPw
8360: 64 5b 69 5d 3d 3d 7a 50 61 74 68 5b 69 5d 20 29  d[i]==zPath[i] )
8370: 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20   i++;.#endif.   
8380: 20 69 66 28 20 7a 50 61 74 68 5b 69 5d 3d 3d 30   if( zPath[i]==0
8390: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
83a0: 28 26 74 6d 70 2c 20 70 4f 75 74 2c 20 73 69 7a  (&tmp, pOut, siz
83b0: 65 6f 66 28 74 6d 70 29 29 3b 0a 20 20 20 20 20  eof(tmp));.     
83c0: 20 69 66 28 20 7a 50 77 64 5b 69 5d 3d 3d 30 20   if( zPwd[i]==0 
83d0: 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  ){.        blob_
83e0: 73 65 74 28 70 4f 75 74 2c 20 22 2e 22 29 3b 0a  set(pOut, ".");.
83f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8400: 20 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70 4f       blob_set(pO
8410: 75 74 2c 20 22 2e 2e 22 29 3b 0a 20 20 20 20 20  ut, "..");.     
8420: 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 7a 50     for(j=i+1; zP
8430: 77 64 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  wd[j]; j++){.   
8440: 20 20 20 20 20 20 20 69 66 28 20 7a 50 77 64 5b         if( zPwd[
8450: 6a 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  j]=='/' ){.     
8460: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
8470: 6e 64 28 70 4f 75 74 2c 20 22 2f 2e 2e 22 2c 20  nd(pOut, "/..", 
8480: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  3);.          }.
8490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
84a0: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
84b0: 28 7a 50 77 64 5b 69 5d 21 3d 27 2f 27 29 29 20  (zPwd[i]!='/')) 
84c0: 2d 2d 69 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f  --i;.        blo
84d0: 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 7a  b_append(pOut, z
84e0: 50 61 74 68 2b 69 2c 20 6a 2d 69 29 3b 0a 20 20  Path+i, j-i);.  
84f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8500: 73 6c 61 73 68 20 26 26 20 69 3e 30 20 26 26 20  slash && i>0 && 
8510: 7a 50 61 74 68 5b 73 74 72 6c 65 6e 28 7a 50 61  zPath[strlen(zPa
8520: 74 68 29 2d 31 5d 3d 3d 27 2f 27 29 7b 0a 20 20  th)-1]=='/'){.  
8530: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
8540: 64 28 70 4f 75 74 2c 20 22 2f 22 2c 20 31 29 3b  d(pOut, "/", 1);
8550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
8560: 6c 6f 62 5f 72 65 73 65 74 28 26 74 6d 70 29 3b  lob_reset(&tmp);
8570: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8580: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 50 77     }.    if( zPw
8590: 64 5b 69 5d 3d 3d 30 20 26 26 20 7a 50 61 74 68  d[i]==0 && zPath
85a0: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
85b0: 20 20 6d 65 6d 63 70 79 28 26 74 6d 70 2c 20 70    memcpy(&tmp, p
85c0: 4f 75 74 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29  Out, sizeof(tmp)
85d0: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 73 65  );.      blob_se
85e0: 74 28 70 4f 75 74 2c 20 22 2e 2f 22 29 3b 0a 20  t(pOut, "./");. 
85f0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
8600: 28 70 4f 75 74 2c 20 26 7a 50 61 74 68 5b 69 2b  (pOut, &zPath[i+
8610: 31 5d 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62  1], -1);.      b
8620: 6c 6f 62 5f 72 65 73 65 74 28 26 74 6d 70 29 3b  lob_reset(&tmp);
8630: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8640: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
8650: 7a 50 61 74 68 5b 69 2d 31 5d 21 3d 27 2f 27 20  zPath[i-1]!='/' 
8660: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 69 66  ){ i--; }.    if
8670: 28 20 7a 50 77 64 5b 30 5d 3d 3d 27 2f 27 20 26  ( zPwd[0]=='/' &
8680: 26 20 73 74 72 6c 65 6e 28 7a 50 77 64 29 3d 3d  & strlen(zPwd)==
8690: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
86a0: 20 6f 6e 20 27 2f 27 2c 20 64 6f 6e 27 74 20 67   on '/', don't g
86b0: 6f 20 74 6f 20 68 69 67 68 65 72 20 6c 65 76 65  o to higher leve
86c0: 6c 20 2a 2f 0a 20 20 20 20 20 20 62 6c 6f 62 5f  l */.      blob_
86d0: 7a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20  zero(&tmp);.    
86e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f  }else{.      blo
86f0: 62 5f 73 65 74 28 26 74 6d 70 2c 20 22 2e 2e 2f  b_set(&tmp, "../
8700: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ");.    }.    fo
8710: 72 28 6a 3d 69 3b 20 7a 50 77 64 5b 6a 5d 3b 20  r(j=i; zPwd[j]; 
8720: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
8730: 7a 50 77 64 5b 6a 5d 3d 3d 27 2f 27 20 29 7b 0a  zPwd[j]=='/' ){.
8740: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
8750: 65 6e 64 28 26 74 6d 70 2c 20 22 2e 2e 2f 22 2c  end(&tmp, "../",
8760: 20 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   3);.      }.   
8770: 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65   }.    blob_appe
8780: 6e 64 28 26 74 6d 70 2c 20 26 7a 50 61 74 68 5b  nd(&tmp, &zPath[
8790: 69 5d 2c 20 2d 31 29 3b 0a 20 20 20 20 62 6c 6f  i], -1);.    blo
87a0: 62 5f 72 65 73 65 74 28 70 4f 75 74 29 3b 0a 20  b_reset(pOut);. 
87b0: 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2c 20     memcpy(pOut, 
87c0: 26 74 6d 70 2c 20 73 69 7a 65 6f 66 28 74 6d 70  &tmp, sizeof(tmp
87d0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
87e0: 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 72   COMMAND: test-r
87f0: 65 6c 61 74 69 76 65 2d 6e 61 6d 65 0a 2a 2a 0a  elative-name.**.
8800: 2a 2a 20 54 65 73 74 20 74 68 65 20 6f 70 65 72  ** Test the oper
8810: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 6c  ation of the rel
8820: 61 74 69 76 65 20 6e 61 6d 65 20 67 65 6e 65 72  ative name gener
8830: 61 74 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d  ator..*/.void cm
8840: 64 5f 74 65 73 74 5f 72 65 6c 61 74 69 76 65 5f  d_test_relative_
8850: 6e 61 6d 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  name(void){.  in
8860: 74 20 69 3b 0a 20 20 42 6c 6f 62 20 78 3b 0a 20  t i;.  Blob x;. 
8870: 20 69 6e 74 20 73 6c 61 73 68 46 6c 61 67 20 3d   int slashFlag =
8880: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 73 6c   find_option("sl
8890: 61 73 68 22 2c 30 2c 30 29 21 3d 30 3b 0a 20 20  ash",0,0)!=0;.  
88a0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20  blob_zero(&x);. 
88b0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72   for(i=2; i<g.ar
88c0: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 69  gc; i++){.    fi
88d0: 6c 65 5f 72 65 6c 61 74 69 76 65 5f 6e 61 6d 65  le_relative_name
88e0: 28 67 2e 61 72 67 76 5b 69 5d 2c 20 26 78 2c 20  (g.argv[i], &x, 
88f0: 73 6c 61 73 68 46 6c 61 67 29 3b 0a 20 20 20 20  slashFlag);.    
8900: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 73  fossil_print("%s
8910: 5c 6e 22 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72  \n", blob_buffer
8920: 28 26 78 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  (&x));.    blob_
8930: 72 65 73 65 74 28 26 78 29 3b 0a 20 20 7d 0a 7d  reset(&x);.  }.}
8940: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8950: 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  a full path name
8960: 20 66 6f 72 20 61 20 66 69 6c 65 20 69 6e 20 74   for a file in t
8970: 68 65 20 6c 6f 63 61 6c 20 74 72 65 65 2e 20 20  he local tree.  
8980: 49 66 0a 2a 2a 20 74 68 65 20 61 62 73 6f 6c 75  If.** the absolu
8990: 74 65 20 66 6c 61 67 20 69 73 20 6e 6f 6e 2d 7a  te flag is non-z
89a0: 65 72 6f 2c 20 74 68 65 20 63 6f 6d 70 75 74 65  ero, the compute
89b0: 64 20 70 61 74 68 20 77 69 6c 6c 20 62 65 0a 2a  d path will be.*
89c0: 2a 20 61 62 73 6f 6c 75 74 65 2c 20 73 74 61 72  * absolute, star
89d0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 72 6f  ting with the ro
89e0: 6f 74 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c  ot path of the l
89f0: 6f 63 61 6c 20 74 72 65 65 3b 0a 2a 2a 20 6f 74  ocal tree;.** ot
8a00: 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
8a10: 20 62 65 20 72 65 6c 61 74 69 76 65 20 74 6f 20   be relative to 
8a20: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
8a30: 6c 6f 63 61 6c 0a 2a 2a 20 74 72 65 65 2e 20 20  local.** tree.  
8a40: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74  In both cases, t
8a50: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 6c  he root of the l
8a60: 6f 63 61 6c 20 74 72 65 65 20 69 73 20 64 65 66  ocal tree is def
8a70: 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 67  ined.** by the g
8a80: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 76 61 72 69  .zLocalRoot vari
8a90: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 54 52  able.  Return TR
8aa0: 55 45 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  UE on success.  
8ab0: 4f 6e 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 70  On.** failure, p
8ac0: 72 69 6e 74 20 61 6e 64 20 65 72 72 6f 72 20 6d  rint and error m
8ad0: 65 73 73 61 67 65 20 61 6e 64 20 71 75 69 74 20  essage and quit 
8ae0: 69 66 20 74 68 65 20 65 72 72 46 61 74 61 6c 0a  if the errFatal.
8af0: 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e  ** flag is true.
8b00: 20 20 49 66 20 65 72 72 46 61 74 61 6c 20 69 73    If errFatal is
8b10: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 73 69 6d   false, then sim
8b20: 70 6c 79 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ply return 0..*/
8b30: 0a 69 6e 74 20 66 69 6c 65 5f 74 72 65 65 5f 6e  .int file_tree_n
8b40: 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame(.  const cha
8b50: 72 20 2a 7a 4f 72 69 67 4e 61 6d 65 2c 0a 20 20  r *zOrigName,.  
8b60: 42 6c 6f 62 20 2a 70 4f 75 74 2c 0a 20 20 69 6e  Blob *pOut,.  in
8b70: 74 20 61 62 73 6f 6c 75 74 65 2c 0a 20 20 69 6e  t absolute,.  in
8b80: 74 20 65 72 72 46 61 74 61 6c 0a 29 7b 0a 20 20  t errFatal.){.  
8b90: 42 6c 6f 62 20 6c 6f 63 61 6c 52 6f 6f 74 3b 0a  Blob localRoot;.
8ba0: 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 52 6f 6f 74    int nLocalRoot
8bb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 61 6c  ;.  char *zLocal
8bc0: 52 6f 6f 74 3b 0a 20 20 42 6c 6f 62 20 66 75 6c  Root;.  Blob ful
8bd0: 6c 3b 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 3b 0a  l;.  int nFull;.
8be0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a 20    char *zFull;. 
8bf0: 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 63 6f 6e   int (*xCmp)(con
8c00: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
8c10: 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 20 20 62 6c  har*,int);..  bl
8c20: 6f 62 5f 7a 65 72 6f 28 70 4f 75 74 29 3b 0a 20  ob_zero(pOut);. 
8c30: 20 69 66 28 20 21 67 2e 6c 6f 63 61 6c 4f 70 65   if( !g.localOpe
8c40: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 61 62 73  n ){.    if( abs
8c50: 6f 6c 75 74 65 20 26 26 20 21 66 69 6c 65 5f 69  olute && !file_i
8c60: 73 5f 61 62 73 6f 6c 75 74 65 5f 70 61 74 68 28  s_absolute_path(
8c70: 7a 4f 72 69 67 4e 61 6d 65 29 20 29 7b 0a 20 20  zOrigName) ){.  
8c80: 20 20 20 20 69 66 28 20 65 72 72 46 61 74 61 6c      if( errFatal
8c90: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73   ){.        foss
8ca0: 69 6c 5f 66 61 74 61 6c 28 22 72 65 6c 61 74 69  il_fatal("relati
8cb0: 76 65 20 74 6f 20 61 62 73 6f 6c 75 74 65 20 6e  ve to absolute n
8cc0: 65 65 64 73 20 6f 70 65 6e 20 63 68 65 63 6b 6f  eeds open checko
8cd0: 75 74 20 74 72 65 65 3a 20 25 73 22 2c 0a 20 20  ut tree: %s",.  
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 20 7a 4f 72 69 67 4e 61 6d 65 29 3b 0a 20     zOrigName);. 
8d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
8d10: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
8d20: 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  {.      /*.     
8d30: 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
8d40: 20 70 61 74 68 20 6d 61 79 20 62 65 20 72 65 6c   path may be rel
8d50: 61 74 69 76 65 20 6f 72 20 61 62 73 6f 6c 75 74  ative or absolut
8d60: 65 3b 20 68 6f 77 65 76 65 72 2c 20 77 69 74 68  e; however, with
8d70: 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  out.      ** an 
8d80: 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74 20 74 72  open checkout tr
8d90: 65 65 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ee, the only thi
8da0: 6e 67 73 20 77 65 20 63 61 6e 20 64 6f 20 61 74  ngs we can do at
8db0: 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 20 20   this point.    
8dc0: 20 20 2a 2a 20 69 73 20 72 65 74 75 72 6e 20 69    ** is return i
8dd0: 74 20 76 65 72 62 61 74 69 6d 20 6f 72 20 67 65  t verbatim or ge
8de0: 6e 65 72 61 74 65 20 61 20 66 61 74 61 6c 20 65  nerate a fatal e
8df0: 72 72 6f 72 2e 20 20 54 68 65 20 63 61 6c 6c 65  rror.  The calle
8e00: 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 70 72  r is.      ** pr
8e10: 6f 62 61 62 6c 79 20 65 78 70 65 63 74 69 6e 67  obably expecting
8e20: 20 61 20 74 72 65 65 2d 72 65 6c 61 74 69 76 65   a tree-relative
8e30: 20 70 61 74 68 20 6e 61 6d 65 20 77 69 6c 6c 20   path name will 
8e40: 62 65 20 72 65 74 75 72 6e 65 64 3b 0a 20 20 20  be returned;.   
8e50: 20 20 20 2a 2a 20 68 6f 77 65 76 65 72 2c 20 6d     ** however, m
8e60: 6f 73 74 20 70 6c 61 63 65 73 20 77 68 65 72 65  ost places where
8e70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
8e80: 73 20 63 61 6c 6c 65 64 20 61 6c 72 65 61 64 79  s called already
8e90: 20 63 68 65 63 6b 0a 20 20 20 20 20 20 2a 2a 20   check.      ** 
8ea0: 69 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 68 65  if the local che
8eb0: 63 6b 6f 75 74 20 74 72 65 65 20 69 73 20 6f 70  ckout tree is op
8ec0: 65 6e 2c 20 65 69 74 68 65 72 20 64 69 72 65 63  en, either direc
8ed0: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
8ee0: 79 2c 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63  y,.      ** whic
8ef0: 68 20 77 6f 75 6c 64 20 6d 61 6b 65 20 74 68 69  h would make thi
8f00: 73 20 73 69 74 75 61 74 69 6f 6e 20 69 6d 70 6f  s situation impo
8f10: 73 73 69 62 6c 65 2e 20 20 41 6c 74 65 72 6e 61  ssible.  Alterna
8f20: 74 69 76 65 6c 79 2c 20 74 68 65 79 0a 20 20 20  tively, they.   
8f30: 20 20 20 2a 2a 20 63 6f 75 6c 64 20 63 68 65 63     ** could chec
8f40: 6b 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  k the returned p
8f50: 61 74 68 20 75 73 69 6e 67 20 74 68 65 20 66 69  ath using the fi
8f60: 6c 65 5f 69 73 5f 61 62 73 6f 6c 75 74 65 5f 70  le_is_absolute_p
8f70: 61 74 68 28 29 0a 20 20 20 20 20 20 2a 2a 20 66  ath().      ** f
8f80: 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  unction..      *
8f90: 2f 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  /.      blob_app
8fa0: 65 6e 64 66 28 70 4f 75 74 2c 20 22 25 73 22 2c  endf(pOut, "%s",
8fb0: 20 7a 4f 72 69 67 4e 61 6d 65 29 3b 0a 20 20 20   zOrigName);.   
8fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8fd0: 20 7d 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 61   }.  }.  file_ca
8fe0: 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 67 2e 7a  nonical_name(g.z
8ff0: 4c 6f 63 61 6c 52 6f 6f 74 2c 20 26 6c 6f 63 61  LocalRoot, &loca
9000: 6c 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 6e 4c 6f  lRoot, 1);.  nLo
9010: 63 61 6c 52 6f 6f 74 20 3d 20 62 6c 6f 62 5f 73  calRoot = blob_s
9020: 69 7a 65 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b  ize(&localRoot);
9030: 0a 20 20 7a 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20  .  zLocalRoot = 
9040: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 6c 6f 63  blob_buffer(&loc
9050: 61 6c 52 6f 6f 74 29 3b 0a 20 20 61 73 73 65 72  alRoot);.  asser
9060: 74 28 20 6e 4c 6f 63 61 6c 52 6f 6f 74 3e 30 20  t( nLocalRoot>0 
9070: 26 26 20 7a 4c 6f 63 61 6c 52 6f 6f 74 5b 6e 4c  && zLocalRoot[nL
9080: 6f 63 61 6c 52 6f 6f 74 2d 31 5d 3d 3d 27 2f 27  ocalRoot-1]=='/'
9090: 20 29 3b 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e   );.  file_canon
90a0: 69 63 61 6c 5f 6e 61 6d 65 28 7a 4f 72 69 67 4e  ical_name(zOrigN
90b0: 61 6d 65 2c 20 26 66 75 6c 6c 2c 20 30 29 3b 0a  ame, &full, 0);.
90c0: 20 20 6e 46 75 6c 6c 20 3d 20 62 6c 6f 62 5f 73    nFull = blob_s
90d0: 69 7a 65 28 26 66 75 6c 6c 29 3b 0a 20 20 7a 46  ize(&full);.  zF
90e0: 75 6c 6c 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65  ull = blob_buffe
90f0: 72 28 26 66 75 6c 6c 29 3b 0a 20 20 69 66 28 20  r(&full);.  if( 
9100: 66 69 6c 65 6e 61 6d 65 73 5f 61 72 65 5f 63 61  filenames_are_ca
9110: 73 65 5f 73 65 6e 73 69 74 69 76 65 28 29 20 29  se_sensitive() )
9120: 7b 0a 20 20 20 20 78 43 6d 70 20 3d 20 66 6f 73  {.    xCmp = fos
9130: 73 69 6c 5f 73 74 72 6e 63 6d 70 3b 0a 20 20 7d  sil_strncmp;.  }
9140: 65 6c 73 65 7b 0a 20 20 20 20 78 43 6d 70 20 3d  else{.    xCmp =
9150: 20 66 6f 73 73 69 6c 5f 73 74 72 6e 69 63 6d 70   fossil_strnicmp
9160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
9170: 69 61 6c 20 63 61 73 65 2e 20 20 7a 4f 72 69 67  ial case.  zOrig
9180: 4e 61 6d 65 20 72 65 66 65 72 73 20 74 6f 20 67  Name refers to g
9190: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 64 69 72 65  .zLocalRoot dire
91a0: 63 74 6f 72 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ctory. */.  if( 
91b0: 28 6e 46 75 6c 6c 3d 3d 6e 4c 6f 63 61 6c 52 6f  (nFull==nLocalRo
91c0: 6f 74 2d 31 20 26 26 20 78 43 6d 70 28 7a 4c 6f  ot-1 && xCmp(zLo
91d0: 63 61 6c 52 6f 6f 74 2c 20 7a 46 75 6c 6c 2c 20  calRoot, zFull, 
91e0: 6e 46 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20  nFull)==0).     
91f0: 20 7c 7c 20 28 6e 46 75 6c 6c 3d 3d 31 20 26 26   || (nFull==1 &&
9200: 20 7a 46 75 6c 6c 5b 30 5d 3d 3d 27 2f 27 20 26   zFull[0]=='/' &
9210: 26 20 6e 4c 6f 63 61 6c 52 6f 6f 74 3d 3d 31 20  & nLocalRoot==1 
9220: 26 26 20 7a 4c 6f 63 61 6c 52 6f 6f 74 5b 30 5d  && zLocalRoot[0]
9230: 3d 3d 27 2f 27 29 20 29 7b 0a 20 20 20 20 69 66  =='/') ){.    if
9240: 28 20 61 62 73 6f 6c 75 74 65 20 29 7b 0a 20 20  ( absolute ){.  
9250: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
9260: 70 4f 75 74 2c 20 7a 4c 6f 63 61 6c 52 6f 6f 74  pOut, zLocalRoot
9270: 2c 20 6e 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  , nLocalRoot);. 
9280: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9290: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 74  blob_append(pOut
92a0: 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 7d  , ".", 1);.    }
92b0: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  .    blob_reset(
92c0: 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 20  &localRoot);.   
92d0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 75 6c   blob_reset(&ful
92e0: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  l);.    return 1
92f0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 75  ;.  }..  if( nFu
9300: 6c 6c 3c 3d 6e 4c 6f 63 61 6c 52 6f 6f 74 20 7c  ll<=nLocalRoot |
9310: 7c 20 78 43 6d 70 28 7a 4c 6f 63 61 6c 52 6f 6f  | xCmp(zLocalRoo
9320: 74 2c 20 7a 46 75 6c 6c 2c 20 6e 4c 6f 63 61 6c  t, zFull, nLocal
9330: 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 62 6c 6f  Root) ){.    blo
9340: 62 5f 72 65 73 65 74 28 26 6c 6f 63 61 6c 52 6f  b_reset(&localRo
9350: 6f 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  ot);.    blob_re
9360: 73 65 74 28 26 66 75 6c 6c 29 3b 0a 20 20 20 20  set(&full);.    
9370: 69 66 28 20 65 72 72 46 61 74 61 6c 20 29 7b 0a  if( errFatal ){.
9380: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
9390: 61 6c 28 22 66 69 6c 65 20 6f 75 74 73 69 64 65  al("file outside
93a0: 20 6f 66 20 63 68 65 63 6b 6f 75 74 20 74 72 65   of checkout tre
93b0: 65 3a 20 25 73 22 2c 20 7a 4f 72 69 67 4e 61 6d  e: %s", zOrigNam
93c0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
93d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
93e0: 28 20 61 62 73 6f 6c 75 74 65 20 29 7b 0a 20 20  ( absolute ){.  
93f0: 20 20 69 66 28 20 21 66 69 6c 65 5f 69 73 5f 61    if( !file_is_a
9400: 62 73 6f 6c 75 74 65 5f 70 61 74 68 28 7a 4f 72  bsolute_path(zOr
9410: 69 67 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  igName) ){.     
9420: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75   blob_append(pOu
9430: 74 2c 20 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20 6e  t, zLocalRoot, n
9440: 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 20 20  LocalRoot);.    
9450: 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  }.    blob_appen
9460: 64 28 70 4f 75 74 2c 20 7a 4f 72 69 67 4e 61 6d  d(pOut, zOrigNam
9470: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 62 6c 6f 62  e, -1);.    blob
9480: 5f 72 65 73 69 7a 65 28 70 4f 75 74 2c 20 66 69  _resize(pOut, fi
9490: 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65  le_simplify_name
94a0: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 4f 75  (blob_buffer(pOu
94b0: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
94e0: 62 5f 73 69 7a 65 28 70 4f 75 74 29 2c 20 30 29  b_size(pOut), 0)
94f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9500: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 74  blob_append(pOut
9510: 2c 20 26 7a 46 75 6c 6c 5b 6e 4c 6f 63 61 6c 52  , &zFull[nLocalR
9520: 6f 6f 74 5d 2c 20 6e 46 75 6c 6c 2d 6e 4c 6f 63  oot], nFull-nLoc
9530: 61 6c 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 62  alRoot);.  }.  b
9540: 6c 6f 62 5f 72 65 73 65 74 28 26 6c 6f 63 61 6c  lob_reset(&local
9550: 52 6f 6f 74 29 3b 0a 20 20 62 6c 6f 62 5f 72 65  Root);.  blob_re
9560: 73 65 74 28 26 66 75 6c 6c 29 3b 0a 20 20 72 65  set(&full);.  re
9570: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
9580: 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 74   COMMAND: test-t
9590: 72 65 65 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 54  ree-name.**.** T
95a0: 65 73 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  est the operatio
95b0: 6e 20 6f 66 20 74 68 65 20 74 72 65 65 20 6e 61  n of the tree na
95c0: 6d 65 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a  me generator..**
95d0: 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20  .** Options:.** 
95e0: 20 20 2d 2d 61 62 73 6f 6c 75 74 65 20 20 20 20    --absolute    
95f0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 61 6e         Return an
9600: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 69   absolute path i
9610: 6e 73 74 65 61 64 20 6f 66 20 61 20 72 65 6c 61  nstead of a rela
9620: 74 69 76 65 20 6f 6e 65 2e 0a 2a 2a 20 20 20 2d  tive one..**   -
9630: 2d 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 20  -case-sensitive 
9640: 42 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  B   Enable or di
9650: 73 61 62 6c 65 20 63 61 73 65 2d 73 65 6e 73 69  sable case-sensi
9660: 74 69 76 65 20 66 69 6c 65 6e 61 6d 65 73 2e 20  tive filenames. 
9670: 20 42 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20   B is.**        
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 61 20 62 6f 6f 6c 65 61 6e 3a 20 22 79 65 73 22  a boolean: "yes"
96a0: 2c 20 22 6e 6f 22 2c 20 22 74 72 75 65 22 2c 20  , "no", "true", 
96b0: 22 66 61 6c 73 65 22 2c 20 65 74 63 2e 0a 2a 2f  "false", etc..*/
96c0: 0a 76 6f 69 64 20 63 6d 64 5f 74 65 73 74 5f 74  .void cmd_test_t
96d0: 72 65 65 5f 6e 61 6d 65 28 76 6f 69 64 29 7b 0a  ree_name(void){.
96e0: 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62 20    int i;.  Blob 
96f0: 78 3b 0a 20 20 69 6e 74 20 61 62 73 6f 6c 75 74  x;.  int absolut
9700: 65 46 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74  eFlag = find_opt
9710: 69 6f 6e 28 22 61 62 73 6f 6c 75 74 65 22 2c 30  ion("absolute",0
9720: 2c 30 29 21 3d 30 3b 0a 20 20 64 62 5f 66 69 6e  ,0)!=0;.  db_fin
9730: 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73  d_and_open_repos
9740: 69 74 6f 72 79 28 30 2c 30 29 3b 0a 20 20 62 6c  itory(0,0);.  bl
9750: 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20 20 66  ob_zero(&x);.  f
9760: 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63  or(i=2; i<g.argc
9770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
9780: 66 69 6c 65 5f 74 72 65 65 5f 6e 61 6d 65 28 67  file_tree_name(g
9790: 2e 61 72 67 76 5b 69 5d 2c 20 26 78 2c 20 61 62  .argv[i], &x, ab
97a0: 73 6f 6c 75 74 65 46 6c 61 67 2c 20 31 29 20 29  soluteFlag, 1) )
97b0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
97c0: 72 69 6e 74 28 22 25 73 5c 6e 22 2c 20 62 6c 6f  rint("%s\n", blo
97d0: 62 5f 62 75 66 66 65 72 28 26 78 29 29 3b 0a 20  b_buffer(&x));. 
97e0: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
97f0: 26 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  &x);.    }.  }.}
9800: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
9810: 55 52 49 20 69 6e 74 6f 20 73 63 68 65 6d 65 2c  URI into scheme,
9820: 20 68 6f 73 74 2c 20 70 6f 72 74 2c 20 61 6e 64   host, port, and
9830: 20 70 61 74 68 2e 0a 2a 2f 0a 76 6f 69 64 20 66   path..*/.void f
9840: 69 6c 65 5f 70 61 72 73 65 5f 75 72 69 28 0a 20  ile_parse_uri(. 
9850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
9860: 69 2c 0a 20 20 42 6c 6f 62 20 2a 70 53 63 68 65  i,.  Blob *pSche
9870: 6d 65 2c 0a 20 20 42 6c 6f 62 20 2a 70 48 6f 73  me,.  Blob *pHos
9880: 74 2c 0a 20 20 69 6e 74 20 2a 70 50 6f 72 74 2c  t,.  int *pPort,
9890: 0a 20 20 42 6c 6f 62 20 2a 70 50 61 74 68 0a 29  .  Blob *pPath.)
98a0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  {.  int i, j;.. 
98b0: 20 66 6f 72 28 69 3d 30 3b 20 7a 55 72 69 5b 69   for(i=0; zUri[i
98c0: 5d 20 26 26 20 7a 55 72 69 5b 69 5d 3e 3d 27 61  ] && zUri[i]>='a
98d0: 27 20 26 26 20 7a 55 72 69 5b 69 5d 3c 3d 27 7a  ' && zUri[i]<='z
98e0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; i++){}.  if( 
98f0: 7a 55 72 69 5b 69 5d 21 3d 27 3a 27 20 29 7b 0a  zUri[i]!=':' ){.
9900: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 53      blob_zero(pS
9910: 63 68 65 6d 65 29 3b 0a 20 20 20 20 62 6c 6f 62  cheme);.    blob
9920: 5f 7a 65 72 6f 28 70 48 6f 73 74 29 3b 0a 20 20  _zero(pHost);.  
9930: 20 20 62 6c 6f 62 5f 73 65 74 28 70 50 61 74 68    blob_set(pPath
9940: 2c 20 7a 55 72 69 29 3b 0a 20 20 20 20 72 65 74  , zUri);.    ret
9950: 75 72 6e 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  urn;.  }.  blob_
9960: 69 6e 69 74 28 70 53 63 68 65 6d 65 2c 20 7a 55  init(pScheme, zU
9970: 72 69 2c 20 69 29 3b 0a 20 20 69 2b 2b 3b 0a 20  ri, i);.  i++;. 
9980: 20 69 66 28 20 7a 55 72 69 5b 69 5d 3d 3d 27 2f   if( zUri[i]=='/
9990: 27 20 26 26 20 7a 55 72 69 5b 69 2b 31 5d 3d 3d  ' && zUri[i+1]==
99a0: 27 2f 27 20 29 7b 0a 20 20 20 20 69 20 2b 3d 20  '/' ){.    i += 
99b0: 32 3b 0a 20 20 20 20 6a 20 3d 20 69 3b 0a 20 20  2;.    j = i;.  
99c0: 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 5d    while( zUri[i]
99d0: 20 26 26 20 7a 55 72 69 5b 69 5d 21 3d 27 2f 27   && zUri[i]!='/'
99e0: 20 26 26 20 7a 55 72 69 5b 69 5d 21 3d 27 3a 27   && zUri[i]!=':'
99f0: 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 62   ){ i++; }.    b
9a00: 6c 6f 62 5f 69 6e 69 74 28 70 48 6f 73 74 2c 20  lob_init(pHost, 
9a10: 26 7a 55 72 69 5b 6a 5d 2c 20 69 2d 6a 29 3b 0a  &zUri[j], i-j);.
9a20: 20 20 20 20 69 66 28 20 7a 55 72 69 5b 69 5d 3d      if( zUri[i]=
9a30: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 69 2b  =':' ){.      i+
9a40: 2b 3b 0a 20 20 20 20 20 20 2a 70 50 6f 72 74 20  +;.      *pPort 
9a50: 3d 20 61 74 6f 69 28 26 7a 55 72 69 5b 69 5d 29  = atoi(&zUri[i])
9a60: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
9a70: 55 72 69 5b 69 5d 20 26 26 20 7a 55 72 69 5b 69  Uri[i] && zUri[i
9a80: 5d 21 3d 27 2f 27 20 29 7b 20 69 2b 2b 3b 20 7d  ]!='/' ){ i++; }
9a90: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
9aa0: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 48      blob_zero(pH
9ab0: 6f 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ost);.  }.  if( 
9ac0: 7a 55 72 69 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  zUri[i]=='/' ){.
9ad0: 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70 50 61      blob_set(pPa
9ae0: 74 68 2c 20 26 7a 55 72 69 5b 69 5d 29 3b 0a 20  th, &zUri[i]);. 
9af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62   }else{.    blob
9b00: 5f 73 65 74 28 70 50 61 74 68 2c 20 22 2f 22 29  _set(pPath, "/")
9b10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
9b20: 6f 6e 73 74 72 75 63 74 20 61 20 72 61 6e 64 6f  onstruct a rando
9b30: 6d 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  m temporary file
9b40: 6e 61 6d 65 20 69 6e 74 6f 20 70 42 75 66 20 73  name into pBuf s
9b50: 74 61 72 74 69 6e 67 20 77 69 74 68 20 7a 50 72  tarting with zPr
9b60: 65 66 69 78 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69  efix..*/.void fi
9b70: 6c 65 5f 74 65 6d 70 6e 61 6d 65 28 42 6c 6f 62  le_tempname(Blob
9b80: 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 63 68   *pBuf, const ch
9b90: 61 72 20 2a 7a 50 72 65 66 69 78 29 7b 0a 23 69  ar *zPrefix){.#i
9ba0: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
9bb0: 29 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ).  const char *
9bc0: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
9bd0: 20 20 30 2c 20 2f 2a 20 47 65 74 54 65 6d 70 50    0, /* GetTempP
9be0: 61 74 68 20 2a 2f 0a 20 20 20 20 20 30 2c 20 2f  ath */.     0, /
9bf0: 2a 20 54 45 4d 50 20 2a 2f 0a 20 20 20 20 20 30  * TEMP */.     0
9c00: 2c 20 2f 2a 20 54 4d 50 20 2a 2f 0a 20 20 20 20  , /* TMP */.    
9c10: 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 63 68 61   ".",.  };.  cha
9c20: 72 20 2a 7a 3b 0a 23 65 6c 73 65 0a 20 20 73 74  r *z;.#else.  st
9c30: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9c40: 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
9c50: 20 20 20 30 2c 20 2f 2a 20 54 4d 50 44 49 52 20     0, /* TMPDIR 
9c60: 2a 2f 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  */.     "/var/tm
9c70: 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
9c80: 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
9c90: 2c 0a 20 20 20 20 20 22 2f 74 65 6d 70 22 2c 0a  ,.     "/temp",.
9ca0: 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 23       ".",.  };.#
9cb0: 65 6e 64 69 66 0a 20 20 73 74 61 74 69 63 20 63  endif.  static c
9cc0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9cd0: 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
9ce0: 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
9cf0: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
9d00: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
9d10: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
9d20: 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
9d30: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
9d40: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
9d50: 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20   *zDir = ".";.  
9d60: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63  int cnt = 0;.  c
9d70: 68 61 72 20 7a 52 61 6e 64 5b 31 36 5d 3b 0a 0a  har zRand[16];..
9d80: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
9d90: 33 32 29 0a 20 20 77 63 68 61 72 5f 74 20 7a 54  32).  wchar_t zT
9da0: 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  mpPath[MAX_PATH]
9db0: 3b 0a 0a 20 20 69 66 28 20 47 65 74 54 65 6d 70  ;..  if( GetTemp
9dc0: 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2c 20  PathW(MAX_PATH, 
9dd0: 7a 54 6d 70 50 61 74 68 29 20 29 7b 0a 20 20 20  zTmpPath) ){.   
9de0: 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 66 6f 73   azDirs[0] = fos
9df0: 73 69 6c 5f 70 61 74 68 5f 74 6f 5f 75 74 66 38  sil_path_to_utf8
9e00: 28 7a 54 6d 70 50 61 74 68 29 3b 0a 20 20 20 20  (zTmpPath);.    
9e10: 2f 2a 20 52 65 6d 6f 76 69 6e 67 20 74 72 61 69  /* Removing trai
9e20: 6c 69 6e 67 20 5c 20 66 72 6f 6d 20 74 68 65 20  ling \ from the 
9e30: 74 65 6d 70 20 70 61 74 68 20 2a 2f 0a 20 20 20  temp path */.   
9e40: 20 7a 20 3d 20 28 63 68 61 72 2a 29 61 7a 44 69   z = (char*)azDi
9e50: 72 73 5b 30 5d 3b 0a 20 20 20 20 69 20 3d 20 28  rs[0];.    i = (
9e60: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 2d 31 3b  int)strlen(z)-1;
9e70: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20  .    if( i>0 && 
9e80: 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 20 7a 5b 69  z[i]=='\\' ) z[i
9e90: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 61 7a  ] = 0;.  }..  az
9ea0: 44 69 72 73 5b 31 5d 20 3d 20 66 6f 73 73 69 6c  Dirs[1] = fossil
9eb0: 5f 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b  _getenv("TEMP");
9ec0: 0a 20 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 66  .  azDirs[2] = f
9ed0: 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 54 4d  ossil_getenv("TM
9ee0: 50 22 29 3b 0a 23 65 6c 73 65 0a 20 20 61 7a 44  P");.#else.  azD
9ef0: 69 72 73 5b 30 5d 20 3d 20 66 6f 73 73 69 6c 5f  irs[0] = fossil_
9f00: 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
9f10: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28  ;.#endif..  for(
9f20: 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 7a 44  i=0; i<count(azD
9f30: 69 72 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  irs); i++){.    
9f40: 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30  if( azDirs[i]==0
9f50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9f60: 20 69 66 28 20 21 66 69 6c 65 5f 69 73 64 69 72   if( !file_isdir
9f70: 28 61 7a 44 69 72 73 5b 69 5d 2c 20 45 78 74 46  (azDirs[i], ExtF
9f80: 49 4c 45 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ILE) ) continue;
9f90: 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69  .    zDir = azDi
9fa0: 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b  rs[i];.    break
9fb0: 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
9fc0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 42 75 66 29   blob_zero(pBuf)
9fd0: 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 2b 2b 3e  ;.    if( cnt++>
9fe0: 32 30 20 29 20 66 6f 73 73 69 6c 5f 70 61 6e 69  20 ) fossil_pani
9ff0: 63 28 22 63 61 6e 6e 6f 74 20 67 65 6e 65 72 61  c("cannot genera
a000: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
a010: 69 6c 65 6e 61 6d 65 22 29 3b 0a 20 20 20 20 73  ilename");.    s
a020: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
a030: 73 28 31 35 2c 20 7a 52 61 6e 64 29 3b 0a 20 20  s(15, zRand);.  
a040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
a050: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52 61   i++){.      zRa
a060: 6e 64 5b 69 5d 20 3d 20 28 63 68 61 72 29 7a 43  nd[i] = (char)zC
a070: 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
a080: 20 63 68 61 72 29 7a 52 61 6e 64 5b 69 5d 29 25   char)zRand[i])%
a090: 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
a0a0: 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
a0b0: 7a 52 61 6e 64 5b 31 35 5d 20 3d 20 30 3b 0a 20  zRand[15] = 0;. 
a0c0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
a0d0: 70 42 75 66 2c 20 22 25 73 2f 25 73 2d 25 73 2e  pBuf, "%s/%s-%s.
a0e0: 74 78 74 22 2c 20 7a 44 69 72 2c 20 7a 50 72 65  txt", zDir, zPre
a0f0: 66 69 78 20 3f 20 7a 50 72 65 66 69 78 20 3a 20  fix ? zPrefix : 
a100: 22 22 2c 20 7a 52 61 6e 64 29 3b 0a 20 20 7d 77  "", zRand);.  }w
a110: 68 69 6c 65 28 20 66 69 6c 65 5f 73 69 7a 65 28  hile( file_size(
a120: 62 6c 6f 62 5f 73 74 72 28 70 42 75 66 29 2c 20  blob_str(pBuf), 
a130: 45 78 74 46 49 4c 45 29 3e 3d 30 20 29 3b 0a 0a  ExtFILE)>=0 );..
a140: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
a150: 33 32 29 0a 20 20 66 6f 73 73 69 6c 5f 70 61 74  32).  fossil_pat
a160: 68 5f 66 72 65 65 28 28 63 68 61 72 20 2a 29 61  h_free((char *)a
a170: 7a 44 69 72 73 5b 30 5d 29 3b 0a 20 20 66 6f 73  zDirs[0]);.  fos
a180: 73 69 6c 5f 70 61 74 68 5f 66 72 65 65 28 28 63  sil_path_free((c
a190: 68 61 72 20 2a 29 61 7a 44 69 72 73 5b 31 5d 29  har *)azDirs[1])
a1a0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 61 74 68 5f  ;.  fossil_path_
a1b0: 66 72 65 65 28 28 63 68 61 72 20 2a 29 61 7a 44  free((char *)azD
a1c0: 69 72 73 5b 32 5d 29 3b 0a 20 20 2f 2a 20 43 68  irs[2]);.  /* Ch
a1d0: 61 6e 67 65 20 61 6c 6c 20 5c 20 63 68 61 72 61  ange all \ chara
a1e0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 77 69 6e  cters in the win
a1f0: 64 6f 77 73 20 70 61 74 68 20 69 6e 74 6f 20 2f  dows path into /
a200: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
a210: 6e 0a 20 20 2a 2a 20 62 65 20 73 61 66 65 6c 79  n.  ** be safely
a220: 20 70 61 73 73 65 64 20 74 6f 20 61 20 73 75 62   passed to a sub
a230: 63 6f 6d 6d 61 6e 64 2c 20 73 75 63 68 20 61 73  command, such as
a240: 20 62 79 20 67 64 69 66 66 20 2a 2f 0a 20 20 7a   by gdiff */.  z
a250: 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 70   = blob_buffer(p
a260: 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Buf);.  for(i=0;
a270: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 20 69 66 28 20   z[i]; i++) if( 
a280: 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 20 7a 5b 69  z[i]=='\\' ) z[i
a290: 5d 20 3d 20 27 2f 27 3b 0a 23 65 6c 73 65 0a 20  ] = '/';.#else. 
a2a0: 20 66 6f 73 73 69 6c 5f 70 61 74 68 5f 66 72 65   fossil_path_fre
a2b0: 65 28 28 63 68 61 72 20 2a 29 61 7a 44 69 72 73  e((char *)azDirs
a2c0: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  [0]);.#endif.}..
a2d0: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
a2e0: 74 65 73 74 2d 74 65 6d 70 6e 61 6d 65 0a 2a 2a  test-tempname.**
a2f0: 20 55 73 61 67 65 3a 20 20 66 6f 73 73 69 6c 20   Usage:  fossil 
a300: 74 65 73 74 2d 6e 61 6d 65 20 42 41 53 45 4e 41  test-name BASENA
a310: 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 47 65 6e  ME ....**.** Gen
a320: 65 72 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20  erate temporary 
a330: 66 69 6c 65 6e 61 6d 65 73 20 64 65 72 69 76 65  filenames derive
a340: 64 20 66 72 6f 6d 20 42 41 53 45 4e 41 4d 45 0a  d from BASENAME.
a350: 2a 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 74 65 73  */.void file_tes
a360: 74 5f 74 65 6d 70 6e 61 6d 65 28 76 6f 69 64 29  t_tempname(void)
a370: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f  {.  int i;.  Blo
a380: 62 20 78 20 3d 20 42 4c 4f 42 5f 49 4e 49 54 49  b x = BLOB_INITI
a390: 41 4c 49 5a 45 52 3b 0a 20 20 66 6f 72 28 69 3d  ALIZER;.  for(i=
a3a0: 32 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b  2; i<g.argc; i++
a3b0: 29 7b 0a 20 20 20 20 66 69 6c 65 5f 74 65 6d 70  ){.    file_temp
a3c0: 6e 61 6d 65 28 26 78 2c 20 67 2e 61 72 67 76 5b  name(&x, g.argv[
a3d0: 69 5d 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  i]);.    fossil_
a3e0: 70 72 69 6e 74 28 22 25 73 5c 6e 22 2c 20 62 6c  print("%s\n", bl
a3f0: 6f 62 5f 73 74 72 28 26 78 29 29 3b 0a 20 20 20  ob_str(&x));.   
a400: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 78 29 3b   blob_reset(&x);
a410: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
a420: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 20  eturn true if a 
a430: 66 69 6c 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  file named zName
a440: 20 65 78 69 73 74 73 20 61 6e 64 20 68 61 73 20   exists and has 
a450: 69 64 65 6e 74 69 63 61 6c 20 63 6f 6e 74 65 6e  identical conten
a460: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62  t.** to the blob
a470: 20 70 43 6f 6e 74 65 6e 74 2e 20 20 49 66 20 7a   pContent.  If z
a480: 4e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  Name does not ex
a490: 69 73 74 20 6f 72 20 69 66 20 74 68 65 20 63 6f  ist or if the co
a4a0: 6e 74 65 6e 74 20 69 73 0a 2a 2a 20 64 69 66 66  ntent is.** diff
a4b0: 65 72 65 6e 74 20 69 6e 20 61 6e 79 20 77 61 79  erent in any way
a4c0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 66 61  , then return fa
a4d0: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lse..**.** This 
a4e0: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
a4f0: 52 65 70 6f 46 49 4c 45 0a 2a 2f 0a 69 6e 74 20  RepoFILE.*/.int 
a500: 66 69 6c 65 5f 69 73 5f 74 68 65 5f 73 61 6d 65  file_is_the_same
a510: 28 42 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 2c  (Blob *pContent,
a520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a530: 6d 65 29 7b 0a 20 20 69 36 34 20 69 53 69 7a 65  me){.  i64 iSize
a540: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 6c  ;.  int rc;.  Bl
a550: 6f 62 20 6f 6e 44 69 73 6b 3b 0a 0a 20 20 69 53  ob onDisk;..  iS
a560: 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65 28  ize = file_size(
a570: 7a 4e 61 6d 65 2c 20 52 65 70 6f 46 49 4c 45 29  zName, RepoFILE)
a580: 3b 0a 20 20 69 66 28 20 69 53 69 7a 65 3c 30 20  ;.  if( iSize<0 
a590: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
a5a0: 28 20 69 53 69 7a 65 21 3d 62 6c 6f 62 5f 73 69  ( iSize!=blob_si
a5b0: 7a 65 28 70 43 6f 6e 74 65 6e 74 29 20 29 20 72  ze(pContent) ) r
a5c0: 65 74 75 72 6e 20 30 3b 0a 20 20 62 6c 6f 62 5f  eturn 0;.  blob_
a5d0: 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26  read_from_file(&
a5e0: 6f 6e 44 69 73 6b 2c 20 7a 4e 61 6d 65 2c 20 52  onDisk, zName, R
a5f0: 65 70 6f 46 49 4c 45 29 3b 0a 20 20 72 63 20 3d  epoFILE);.  rc =
a600: 20 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 6f   blob_compare(&o
a610: 6e 44 69 73 6b 2c 20 70 43 6f 6e 74 65 6e 74 29  nDisk, pContent)
a620: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
a630: 6f 6e 44 69 73 6b 29 3b 0a 20 20 72 65 74 75 72  onDisk);.  retur
a640: 6e 20 72 63 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  n rc==0;.}../*.*
a650: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
a660: 75 65 20 6f 66 20 61 6e 20 65 6e 76 69 72 6f 6e  ue of an environ
a670: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 61 73  ment variable as
a680: 20 55 54 46 38 2e 0a 2a 2a 20 55 73 65 20 66 6f   UTF8..** Use fo
a690: 73 73 69 6c 5f 70 61 74 68 5f 66 72 65 65 28 29  ssil_path_free()
a6a0: 20 74 6f 20 72 65 6c 65 61 73 65 20 72 65 73 6f   to release reso
a6b0: 75 72 63 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a  urces..*/.char *
a6c0: 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 63 6f  fossil_getenv(co
a6d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
a6e0: 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  {.#ifdef _WIN32.
a6f0: 20 20 77 63 68 61 72 5f 74 20 2a 75 4e 61 6d 65    wchar_t *uName
a700: 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74   = fossil_utf8_t
a710: 6f 5f 75 6e 69 63 6f 64 65 28 7a 4e 61 6d 65 29  o_unicode(zName)
a720: 3b 0a 20 20 76 6f 69 64 20 2a 7a 56 61 6c 75 65  ;.  void *zValue
a730: 20 3d 20 5f 77 67 65 74 65 6e 76 28 75 4e 61 6d   = _wgetenv(uNam
a740: 65 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 75 6e 69  e);.  fossil_uni
a750: 63 6f 64 65 5f 66 72 65 65 28 75 4e 61 6d 65 29  code_free(uName)
a760: 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20 2a  ;.#else.  char *
a770: 7a 56 61 6c 75 65 20 3d 20 67 65 74 65 6e 76 28  zValue = getenv(
a780: 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
a790: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 20 7a 56   if( zValue ) zV
a7a0: 61 6c 75 65 20 3d 20 66 6f 73 73 69 6c 5f 70 61  alue = fossil_pa
a7b0: 74 68 5f 74 6f 5f 75 74 66 38 28 7a 56 61 6c 75  th_to_utf8(zValu
a7c0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 56 61  e);.  return zVa
a7d0: 6c 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  lue;.}../*.** Se
a7e0: 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ts the value of 
a7f0: 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  an environment v
a800: 61 72 69 61 62 6c 65 20 61 73 20 55 54 46 38 2e  ariable as UTF8.
a810: 0a 2a 2f 0a 69 6e 74 20 66 6f 73 73 69 6c 5f 73  .*/.int fossil_s
a820: 65 74 65 6e 76 28 63 6f 6e 73 74 20 63 68 61 72  etenv(const char
a830: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
a840: 68 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20  har *zValue){.  
a850: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
a860: 7a 53 74 72 69 6e 67 20 3d 20 6d 70 72 69 6e 74  zString = mprint
a870: 66 28 22 25 73 3d 25 73 22 2c 20 7a 4e 61 6d 65  f("%s=%s", zName
a880: 2c 20 7a 56 61 6c 75 65 29 3b 0a 23 69 66 64 65  , zValue);.#ifde
a890: 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72  f _WIN32.  wchar
a8a0: 5f 74 20 2a 75 53 74 72 69 6e 67 20 3d 20 66 6f  _t *uString = fo
a8b0: 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  ssil_utf8_to_uni
a8c0: 63 6f 64 65 28 7a 53 74 72 69 6e 67 29 3b 0a 20  code(zString);. 
a8d0: 20 72 63 20 3d 20 5f 77 70 75 74 65 6e 76 28 75   rc = _wputenv(u
a8e0: 53 74 72 69 6e 67 29 3b 0a 20 20 66 6f 73 73 69  String);.  fossi
a8f0: 6c 5f 75 6e 69 63 6f 64 65 5f 66 72 65 65 28 75  l_unicode_free(u
a900: 53 74 72 69 6e 67 29 3b 0a 20 20 66 6f 73 73 69  String);.  fossi
a910: 6c 5f 66 72 65 65 28 7a 53 74 72 69 6e 67 29 3b  l_free(zString);
a920: 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 70 75  .#else.  rc = pu
a930: 74 65 6e 76 28 7a 53 74 72 69 6e 67 29 3b 0a 20  tenv(zString);. 
a940: 20 2f 2a 20 4e 4f 54 45 3a 20 43 61 6e 6e 6f 74   /* NOTE: Cannot
a950: 20 66 72 65 65 20 74 68 65 20 73 74 72 69 6e 67   free the string
a960: 20 6f 6e 20 50 4f 53 49 58 2e 20 2a 2f 0a 20 20   on POSIX. */.  
a970: 2f 2a 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a  /* fossil_free(z
a980: 53 74 72 69 6e 67 29 3b 20 2a 2f 0a 23 65 6e 64  String); */.#end
a990: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
a9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 66 6f  }../*.** Like fo
a9b0: 70 65 6e 28 29 20 62 75 74 20 61 6c 77 61 79 73  pen() but always
a9c0: 20 74 61 6b 65 73 20 61 20 55 54 46 38 20 61 72   takes a UTF8 ar
a9d0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
a9e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
a9f0: 6d 65 73 20 45 78 74 46 49 4c 45 2e 20 49 6e 20  mes ExtFILE. In 
aa00: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 79 6d  other words, sym
aa10: 62 6f 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2a 20 61  bolic links.** a
aa20: 72 65 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77  re always follow
aa30: 65 64 2e 0a 2a 2f 0a 46 49 4c 45 20 2a 66 6f 73  ed..*/.FILE *fos
aa40: 73 69 6c 5f 66 6f 70 65 6e 28 63 6f 6e 73 74 20  sil_fopen(const 
aa50: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
aa60: 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 29 7b  st char *zMode){
aa70: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
aa80: 20 77 63 68 61 72 5f 74 20 2a 75 4d 6f 64 65 20   wchar_t *uMode 
aa90: 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f  = fossil_utf8_to
aaa0: 5f 75 6e 69 63 6f 64 65 28 7a 4d 6f 64 65 29 3b  _unicode(zMode);
aab0: 0a 20 20 77 63 68 61 72 5f 74 20 2a 75 4e 61 6d  .  wchar_t *uNam
aac0: 65 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f  e = fossil_utf8_
aad0: 74 6f 5f 70 61 74 68 28 7a 4e 61 6d 65 2c 20 30  to_path(zName, 0
aae0: 29 3b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 5f  );.  FILE *f = _
aaf0: 77 66 6f 70 65 6e 28 75 4e 61 6d 65 2c 20 75 4d  wfopen(uName, uM
ab00: 6f 64 65 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70  ode);.  fossil_p
ab10: 61 74 68 5f 66 72 65 65 28 75 4e 61 6d 65 29 3b  ath_free(uName);
ab20: 0a 20 20 66 6f 73 73 69 6c 5f 75 6e 69 63 6f 64  .  fossil_unicod
ab30: 65 5f 66 72 65 65 28 75 4d 6f 64 65 29 3b 0a 23  e_free(uMode);.#
ab40: 65 6c 73 65 0a 20 20 46 49 4c 45 20 2a 66 20 3d  else.  FILE *f =
ab50: 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 7a 4d   fopen(zName, zM
ab60: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ode);.#endif.  r
ab70: 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn f;.}../*.*
ab80: 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 4e 55 4c  * Return non-NUL
ab90: 4c 20 69 66 20 7a 46 69 6c 65 6e 61 6d 65 20 63  L if zFilename c
aba0: 6f 6e 74 61 69 6e 73 20 70 61 74 68 6e 61 6d 65  ontains pathname
abb0: 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 0a 2a   elements that.*
abc0: 2a 20 61 72 65 20 72 65 73 65 72 76 65 64 20 6f  * are reserved o
abd0: 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 20  n Windows.  The 
abe0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
abf0: 69 73 20 74 68 65 20 64 69 73 61 6c 6c 6f 77 65  is the disallowe
ac00: 64 0a 2a 2a 20 70 61 74 68 20 65 6c 65 6d 65 6e  d.** path elemen
ac10: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
ac20: 20 2a 66 69 6c 65 5f 69 73 5f 77 69 6e 5f 72 65   *file_is_win_re
ac30: 73 65 72 76 65 64 28 63 6f 6e 73 74 20 63 68 61  served(const cha
ac40: 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 73 74 61  r *zPath){.  sta
ac50: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
ac60: 61 7a 52 65 73 5b 5d 20 3d 20 7b 20 22 43 4f 4e  azRes[] = { "CON
ac70: 22 2c 20 22 50 52 4e 22 2c 20 22 41 55 58 22 2c  ", "PRN", "AUX",
ac80: 20 22 4e 55 4c 22 2c 20 22 43 4f 4d 22 2c 20 22   "NUL", "COM", "
ac90: 4c 50 54 22 20 7d 3b 0a 20 20 73 74 61 74 69 63  LPT" };.  static
aca0: 20 63 68 61 72 20 7a 52 65 74 75 72 6e 5b 35 5d   char zReturn[5]
acb0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 77 68 69  ;.  int i;.  whi
acc0: 6c 65 28 20 7a 50 61 74 68 5b 30 5d 20 29 7b 0a  le( zPath[0] ){.
acd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
ace0: 6f 75 6e 74 28 61 7a 52 65 73 29 3b 20 69 2b 2b  ount(azRes); i++
acf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
ad00: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 50  ite3_strnicmp(zP
ad10: 61 74 68 2c 20 61 7a 52 65 73 5b 69 5d 2c 20 33  ath, azRes[i], 3
ad20: 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
ad30: 28 69 3e 3d 34 20 26 26 20 66 6f 73 73 69 6c 5f  (i>=4 && fossil_
ad40: 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b 33 5d  isdigit(zPath[3]
ad50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ad60: 20 20 20 26 26 20 28 7a 50 61 74 68 5b 34 5d 3d     && (zPath[4]=
ad70: 3d 27 2f 27 20 7c 7c 20 7a 50 61 74 68 5b 34 5d  ='/' || zPath[4]
ad80: 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74 68 5b 34  =='.' || zPath[4
ad90: 5d 3d 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20  ]==0)).         
ada0: 20 7c 7c 20 28 69 3c 34 20 26 26 20 28 7a 50 61   || (i<4 && (zPa
adb0: 74 68 5b 33 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50  th[3]=='/' || zP
adc0: 61 74 68 5b 33 5d 3d 3d 27 2e 27 20 7c 7c 20 7a  ath[3]=='.' || z
add0: 50 61 74 68 5b 33 5d 3d 3d 30 29 29 29 0a 20 20  Path[3]==0))).  
ade0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
adf0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ae00: 35 2c 7a 52 65 74 75 72 6e 2c 22 25 2e 2a 73 22  5,zReturn,"%.*s"
ae10: 2c 20 69 3e 3d 34 20 3f 20 34 20 3a 20 33 2c 20  , i>=4 ? 4 : 3, 
ae20: 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
ae30: 72 65 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a  return zReturn;.
ae40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ae50: 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 30    while( zPath[0
ae60: 5d 20 26 26 20 7a 50 61 74 68 5b 30 5d 21 3d 27  ] && zPath[0]!='
ae70: 2f 27 20 29 20 7a 50 61 74 68 2b 2b 3b 0a 20 20  /' ) zPath++;.  
ae80: 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 30    while( zPath[0
ae90: 5d 3d 3d 27 2f 27 20 29 20 7a 50 61 74 68 2b 2b  ]=='/' ) zPath++
aea0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
aeb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  ;.}../*.** COMMA
aec0: 4e 44 3a 20 74 65 73 74 2d 76 61 6c 69 64 2d 66  ND: test-valid-f
aed0: 6f 72 2d 77 69 6e 64 6f 77 73 0a 2a 2a 20 55 73  or-windows.** Us
aee0: 61 67 65 3a 20 20 66 6f 73 73 69 6c 20 74 65 73  age:  fossil tes
aef0: 74 2d 76 61 6c 69 64 2d 66 6f 72 2d 77 69 6e 64  t-valid-for-wind
af00: 6f 77 73 20 46 49 4c 45 4e 41 4d 45 20 2e 2e 2e  ows FILENAME ...
af10: 2e 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 77 68 69  ..**.** Show whi
af20: 63 68 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ch filenames are
af30: 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 57   not valid for W
af40: 69 6e 64 6f 77 73 0a 2a 2f 0a 76 6f 69 64 20 66  indows.*/.void f
af50: 69 6c 65 5f 74 65 73 74 5f 76 61 6c 69 64 5f 66  ile_test_valid_f
af60: 6f 72 5f 77 69 6e 64 6f 77 73 28 76 6f 69 64 29  or_windows(void)
af70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
af80: 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b 20  (i=2; i<g.argc; 
af90: 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  i++){.    fossil
afa0: 5f 70 72 69 6e 74 28 22 25 73 20 25 73 5c 6e 22  _print("%s %s\n"
afb0: 2c 20 66 69 6c 65 5f 69 73 5f 77 69 6e 5f 72 65  , file_is_win_re
afc0: 73 65 72 76 65 64 28 67 2e 61 72 67 76 5b 69 5d  served(g.argv[i]
afd0: 29 2c 20 67 2e 61 72 67 76 5b 69 5d 29 3b 0a 20  ), g.argv[i]);. 
afe0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
aff0: 76 65 20 73 75 72 70 6c 75 73 20 22 2f 22 20 63  ve surplus "/" c
b000: 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 74  haracters from t
b010: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
b020: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
b030: 0a 2a 2a 20 45 78 74 72 61 20 6c 65 61 64 69 6e  .** Extra leadin
b040: 67 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 73  g "/" characters
b050: 20 61 72 65 20 62 65 6e 69 67 6e 20 6f 6e 20 75   are benign on u
b060: 6e 69 78 2e 20 20 42 75 74 20 6f 6e 20 57 69 6e  nix.  But on Win
b070: 64 6f 77 73 0a 2a 2a 20 6d 61 63 68 69 6e 65 73  dows.** machines
b080: 2c 20 74 68 65 79 20 6d 75 73 74 20 62 65 20 72  , they must be r
b090: 65 6d 6f 76 65 64 2e 20 20 45 78 61 6d 70 6c 65  emoved.  Example
b0a0: 3a 20 20 43 6f 6e 76 65 72 74 20 22 2f 43 3a 2f  :  Convert "/C:/
b0b0: 66 6f 73 73 69 6c 2f 78 79 78 2e 66 6f 73 73 69  fossil/xyx.fossi
b0c0: 6c 22 0a 2a 2a 20 69 6e 74 6f 20 22 43 3a 2f 66  l".** into "C:/f
b0d0: 6f 73 73 69 6c 2f 78 79 7a 2e 66 6f 73 73 69 6c  ossil/xyz.fossil
b0e0: 22 2e 20 43 79 67 77 69 6e 20 73 68 6f 75 6c 64  ". Cygwin should
b0f0: 20 62 65 68 61 76 65 20 61 73 20 57 69 6e 64 6f   behave as Windo
b100: 77 73 20 68 65 72 65 2e 0a 2a 2f 0a 63 6f 6e 73  ws here..*/.cons
b110: 74 20 63 68 61 72 20 2a 66 69 6c 65 5f 63 6c 65  t char *file_cle
b120: 61 6e 75 70 5f 66 75 6c 6c 70 61 74 68 28 63 6f  anup_fullpath(co
b130: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 23 69  nst char *z){.#i
b140: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
b150: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 43  ) || defined(__C
b160: 59 47 57 49 4e 5f 5f 29 0a 20 20 69 66 28 20 7a  YGWIN__).  if( z
b170: 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 66 6f 73 73  [0]=='/' && foss
b180: 69 6c 5f 69 73 61 6c 70 68 61 28 7a 5b 31 5d 29  il_isalpha(z[1])
b190: 20 26 26 20 7a 5b 32 5d 3d 3d 27 3a 27 20 26 26   && z[2]==':' &&
b1a0: 20 7a 5b 33 5d 3d 3d 27 2f 27 20 29 20 7a 2b 2b   z[3]=='/' ) z++
b1b0: 3b 0a 23 65 6c 73 65 0a 20 20 77 68 69 6c 65 28  ;.#else.  while(
b1c0: 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b   z[0]=='/' && z[
b1d0: 31 5d 3d 3d 27 2f 27 20 29 20 7a 2b 2b 3b 0a 23  1]=='/' ) z++;.#
b1e0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a  endif.  return z
b1f0: 3b 0a 7d 0a                                      ;.}.