annotate tests/test-up-local-change.out @ 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 4f81068ed8cd
children 0e2be889ccd7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
767
61ed30e82b27 Update tests to match new addremove chattiness.
Bryan O'Sullivan <bos@serpentine.com>
parents: 749
diff changeset
1 adding a
396
8f8bb77d560e Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 388
diff changeset
2 diff -r c19d34741b0a a
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
3 --- a/a
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
4 +++ b/a
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
5 @@ -1,1 +1,1 @@
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
6 -a
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
7 +abc
767
61ed30e82b27 Update tests to match new addremove chattiness.
Bryan O'Sullivan <bos@serpentine.com>
parents: 749
diff changeset
8 adding b
748
c5df1a9c5276 Update test output for status change
mpm@selenic.com
parents: 705
diff changeset
9 M a
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
10 resolving manifests
677
204328d345f1 Fix up test for update flags
Matt Mackall <mpm@selenic.com>
parents: 676
diff changeset
11 force None allow None moddirstate True linear True
374
f07d00fcd281 update tests to reflect new short hash length
mpm@selenic.com
parents: 350
diff changeset
12 ancestor a0c8bcbbb45c local a0c8bcbbb45c remote 1165e8bd193e
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
13 a versions differ, resolve
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
14 remote created b
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
15 getting b
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
16 merging a
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
17 resolving a
374
f07d00fcd281 update tests to reflect new short hash length
mpm@selenic.com
parents: 350
diff changeset
18 file a: other d730145abbf9 ancestor b789fdd96dc2
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
19 resolving manifests
677
204328d345f1 Fix up test for update flags
Matt Mackall <mpm@selenic.com>
parents: 676
diff changeset
20 force None allow 1 moddirstate True linear True
374
f07d00fcd281 update tests to reflect new short hash length
mpm@selenic.com
parents: 350
diff changeset
21 ancestor 1165e8bd193e local 1165e8bd193e remote 1165e8bd193e
784
853bfbf1a312 Fix tests for short changeset hashes and hidden manifest hashes
mpm@selenic.com
parents: 775
diff changeset
22 changeset: 1:1e71731e6fbb
388
398737777644 Fixed tests for displaying tags in hg history and hg parents.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 382
diff changeset
23 tag: tip
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
24 user: test
967
1f3710636b45 [PATCH] Print timezone offset when outputting dates
Samuel Tardieu <sam@rfc1149.net>
parents: 925
diff changeset
25 date: Thu Jan 1 00:00:00 1970 +0000
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
26 summary: 2
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
27
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
28 changeset: 1:1e71731e6fbb5b35fae293120dea6964371c13c6
388
398737777644 Fixed tests for displaying tags in hg history and hg parents.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 382
diff changeset
29 tag: tip
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
30 user: test
967
1f3710636b45 [PATCH] Print timezone offset when outputting dates
Samuel Tardieu <sam@rfc1149.net>
parents: 925
diff changeset
31 date: Thu Jan 1 00:00:00 1970 +0000
494
6020bde714e4 Fixed test for previous change of 'hg -v history'.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 490
diff changeset
32 files: a b
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
33 description:
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
34 2
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
35
546
c8ae964109c1 Add an empty line after description in verbose mode of show_changeset.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 495
diff changeset
36
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
37 changeset: 0:c19d34741b0a4ced8e4ba74bb834597d5193851e
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
38 user: test
967
1f3710636b45 [PATCH] Print timezone offset when outputting dates
Samuel Tardieu <sam@rfc1149.net>
parents: 925
diff changeset
39 date: Thu Jan 1 00:00:00 1970 +0000
494
6020bde714e4 Fixed test for previous change of 'hg -v history'.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 490
diff changeset
40 files: a
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
41 description:
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
42 1
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
43
546
c8ae964109c1 Add an empty line after description in verbose mode of show_changeset.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 495
diff changeset
44
768
20e95c245bc3 Fix local file changes being ignored after non-branch merge
mpm@selenic.com
parents: 767
diff changeset
45 diff -r 1e71731e6fbb a
20e95c245bc3 Fix local file changes being ignored after non-branch merge
mpm@selenic.com
parents: 767
diff changeset
46 --- a/a
20e95c245bc3 Fix local file changes being ignored after non-branch merge
mpm@selenic.com
parents: 767
diff changeset
47 +++ b/a
20e95c245bc3 Fix local file changes being ignored after non-branch merge
mpm@selenic.com
parents: 767
diff changeset
48 @@ -1,1 +1,1 @@
20e95c245bc3 Fix local file changes being ignored after non-branch merge
mpm@selenic.com
parents: 767
diff changeset
49 -a2
20e95c245bc3 Fix local file changes being ignored after non-branch merge
mpm@selenic.com
parents: 767
diff changeset
50 +abc