annotate tests/fish-merge @ 1241:3b4f05ff3130

Add support for cloning with hardlinks on windows. In order to use hardlinks, the win32file module is needed, and this is present in ActivePython. If it isn't present, or hardlinks are not supported on the underlying filesystem, a regular copy is used. When using hardlinks the biggest benefit is probably the saving in space, but cloning can be much quicker. For example cloning the Xen tree (non trivial) without an update goes from about 95s to 15s. Unix-like platforms should be unaffected, although should be more tolerant on filesystems that don't support hard links. (tweaked by mpm to deal with new copyfiles function) --- hg.orig/mercurial/commands.py 2005-09-13 19:32:53.000000000 -0500 +++ hg/mercurial/commands.py 2005-09-14 12:11:34.000000000 -0500 @@ -620,10 +620,6 @@ def clone(ui, source, dest=None, **opts) if other.dev() != -1: abspath = os.path.abspath(source) - copyfile = (os.stat(dest).st_dev == other.dev() - and getattr(os, 'link', None) or shutil.copy2) - if copyfile is not shutil.copy2: - ui.note("cloning by hardlink\n") # we use a lock here because if we race with commit, we can # end up with extra data in the cloned revlogs that's not @@ -638,7 +634,7 @@ def clone(ui, source, dest=None, **opts) for f in files.split(): src = os.path.join(source, ".hg", f) dst = os.path.join(dest, ".hg", f) - util.copyfiles(src, dst, copyfile) + util.copyfiles(src, dst) repo = hg.repository(ui, dest) Index: hg/mercurial/util.py =================================================================== --- hg.orig/mercurial/util.py 2005-09-08 00:15:25.000000000 -0500 +++ hg/mercurial/util.py 2005-09-14 12:16:49.000000000 -0500 @@ -12,7 +12,7 @@ platform-specific details from the core. import os, errno from demandload import * -demandload(globals(), "re cStringIO") +demandload(globals(), "re cStringIO shutil") def binary(s): """return true if a string is binary data using diff's heuristic""" @@ -217,17 +217,28 @@ def rename(src, dst): os.unlink(dst) os.rename(src, dst) -def copyfiles(src, dst, copyfile): - """Copy a directory tree, files are copied using 'copyfile'.""" +def copyfiles(src, dst, hardlink=None): + """Copy a directory tree using hardlinks if possible""" + + if hardlink is None: + hardlink = (os.stat(src).st_dev == + os.stat(os.path.dirname(dst)).st_dev) if os.path.isdir(src): os.mkdir(dst) for name in os.listdir(src): srcname = os.path.join(src, name) dstname = os.path.join(dst, name) - copyfiles(srcname, dstname, copyfile) + copyfiles(srcname, dstname, hardlink) else: - copyfile(src, dst) + if hardlink: + try: + os_link(src, dst) + except: + hardlink = False + shutil.copy2(src, dst) + else: + shutil.copy2(src, dst) def opener(base): """ @@ -244,13 +255,13 @@ def opener(base): if mode[0] != "r": try: - s = os.stat(f) + nlink = nlinks(f) except OSError: d = os.path.dirname(f) if not os.path.isdir(d): os.makedirs(d) else: - if s.st_nlink > 1: + if nlink > 1: file(f + ".tmp", "wb").write(file(f, "rb").read()) rename(f+".tmp", f) @@ -266,10 +277,41 @@ def _makelock_file(info, pathname): def _readlock_file(pathname): return file(pathname).read() +def nlinks(pathname): + """Return number of hardlinks for the given file.""" + return os.stat(pathname).st_nlink + +if hasattr(os, 'link'): + os_link = os.link +else: + def os_link(src, dst): + raise OSError(0, "Hardlinks not supported") + # Platform specific variants if os.name == 'nt': nulldev = 'NUL:' + try: # ActivePython can create hard links using win32file module + import win32file + + def os_link(src, dst): # NB will only succeed on NTFS + win32file.CreateHardLink(dst, src) + + def nlinks(pathname): + """Return number of hardlinks for the given file.""" + try: + fh = win32file.CreateFile(pathname, + win32file.GENERIC_READ, win32file.FILE_SHARE_READ, + None, win32file.OPEN_EXISTING, 0, None) + res = win32file.GetFileInformationByHandle(fh) + fh.Close() + return res[7] + except: + return os.stat(pathname).st_nlink + + except ImportError: + pass + def is_exec(f, last): return last
author Stephen Darnell
date Wed, 14 Sep 2005 12:22:20 -0500
parents 0902ffece4b4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
544
3d4d5f2aba9a Remove bashisms and use /bin/sh instead of /bin/bash.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 28
diff changeset
1 #!/bin/sh
3d4d5f2aba9a Remove bashisms and use /bin/sh instead of /bin/bash.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 28
diff changeset
2
28
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
3 set -e
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
4 set -x
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
5
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
6 # skip commit logs
797
95c258ee5264 Remove "export FOO=bar" bashism.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
7 HGMERGE=tkmerge; export HGMERGE
95c258ee5264 Remove "export FOO=bar" bashism.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 547
diff changeset
8 EDITOR=true; export EDITOR
28
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
9
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
10 rm -rf m m1 m2
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
11 mkdir m
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
12 cd m
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
13
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
14 echo "m this that"
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
15 echo "this" > a
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
16 echo "that" > b
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
17 hg init
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
18 hg addremove
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
19 hg commit
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
20 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
21 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
22
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
23 cd ..
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
24 echo "m2 this that "
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
25 mkdir m2
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
26 cd m2
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
27 hg branch ../m
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
28 hg checkout
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
29 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
30 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
31
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
32 cd ../m
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
33 echo "m this1 that "
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
34 echo "this1" > a
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
35 hg commit
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
36 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
37 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
38
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
39 cd ..
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
40 echo "m1 this1 that "
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
41 mkdir m1
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
42 cd m1
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
43 hg branch ../m
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
44 hg checkout
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
45 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
46 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
47
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
48 cd ../m1
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
49 echo "m1 this1 that1"
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
50 echo "that1" > b
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
51 hg commit
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
52 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
53 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
54
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
55 cd ../m2
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
56 echo "m2 this that2"
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
57 echo "that2" > b
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
58 hg commit
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
59 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
60 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
61
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
62 cd ../m1
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
63 echo "m1:m2 this1 that1 that2"
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
64 hg merge ../m2 # b should conflict, a should be fine
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
65 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
66 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
67
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
68 cd ../m2
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
69 echo "m2 this2 that2"
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
70 echo "this2" > a
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
71 hg commit
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
72 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
73 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
74
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
75 cd ../m2
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
76 echo "m2:m this12 that2"
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
77 hg merge ../m # a should conflict, b should be fine
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
78 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
79 echo
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
80
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
81 # now here's the interesting bit
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
82 # if we choose ancestor by file, no conflicts
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
83 # otherwise we've got two equally close ancestors, each with a conflict
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
84 # if we go back to the root, we'll have both conflicts again
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
85 echo "m2:m1 this12 that12"
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
86 hg merge ../m1 # should be clean
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
87 echo "a:" `hg dump a` "b:" `hg dump b`
9f64ee817199 Add some tests to the repo
mpm@selenic.com
parents:
diff changeset
88 echo