Patchwork [3,of,4,V2] util: enable hardlink for copyfile

login
register
mail settings
Submitter Jun Wu
Date March 22, 2017, 2 a.m.
Message ID <e960baabf0da65e84e99.1490148055@localhost.localdomain>
Download mbox | patch
Permalink /patch/19541/
State Accepted
Headers show

Comments

Jun Wu - March 22, 2017, 2 a.m.
# HG changeset patch
# User Jun Wu <quark@fb.com>
# Date 1489309403 28800
#      Sun Mar 12 01:03:23 2017 -0800
# Node ID e960baabf0da65e84e99466d4be9acaa4b9b91b2
# Parent  fef923fbdbaece1d3ea237f96088e5086ee6367c
# Available At https://bitbucket.org/quark-zju/hg-draft
#              hg pull https://bitbucket.org/quark-zju/hg-draft -r e960baabf0da
util: enable hardlink for copyfile

This patch removes the global variable "allowhardlinks" that disables
hardlink in all cases, so hardlink gets enabled if the filesystem type is
whitelisted.

Third party extensions wanting to enable hardlink support unconditionally
can replace "_hardlinkfswhitelist.__contains__".
Yuya Nishihara - March 23, 2017, 2:54 p.m.
On Tue, 21 Mar 2017 19:00:55 -0700, Jun Wu wrote:
> # HG changeset patch
> # User Jun Wu <quark@fb.com>
> # Date 1489309403 28800
> #      Sun Mar 12 01:03:23 2017 -0800
> # Node ID e960baabf0da65e84e99466d4be9acaa4b9b91b2
> # Parent  fef923fbdbaece1d3ea237f96088e5086ee6367c
> # Available At https://bitbucket.org/quark-zju/hg-draft
> #              hg pull https://bitbucket.org/quark-zju/hg-draft -r e960baabf0da
> util: enable hardlink for copyfile

> diff --git a/tests/test-hardlinks.t b/tests/test-hardlinks-whitelisted.t
> copy from tests/test-hardlinks.t
> copy to tests/test-hardlinks-whitelisted.t

test-check-commit.t complains about double empty line, but that's probably
because of the copy source, test-hardlinks.t. So I've pushed this with no
modification.

Patch

diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -1057,9 +1057,4 @@  def checksignature(func):
     return check
 
-# Hardlinks are problematic on CIFS, do not allow hardlinks
-# until we find a way to work around it cleanly (issue4546).
-# This is a variable so extensions can opt-in to using them.
-allowhardlinks = False
-
 # a whilelist of known filesystems where hardlink works reliably
 _hardlinkfswhitelist = set([
@@ -1097,5 +1092,5 @@  def copyfile(src, dest, hardlink=False, 
         if fstype not in _hardlinkfswhitelist:
             hardlink = False
-    if allowhardlinks and hardlink:
+    if hardlink:
         try:
             oslink(src, dest)
diff --git a/tests/test-hardlinks.t b/tests/test-hardlinks-whitelisted.t
copy from tests/test-hardlinks.t
copy to tests/test-hardlinks-whitelisted.t
--- a/tests/test-hardlinks.t
+++ b/tests/test-hardlinks-whitelisted.t
@@ -1,3 +1,9 @@ 
 #require hardlink
+#require hardlink-whitelisted
+
+This test is similar to test-hardlinks.t, but will only run on some filesystems
+that we are sure to have known good hardlink supports (see issue4546 for an
+example where the filesystem claims hardlink support but is actually
+problematic).
 
   $ cat > nlinks.py <<EOF
@@ -167,5 +173,5 @@  Push to repo r1 should break up most har
   1 r2/.hg/store/data/d1/f2.i
   2 r2/.hg/store/data/f1.i
-  1 r2/.hg/store/fncache
+  2 r2/.hg/store/fncache
 
   $ hg -R r2 verify
@@ -192,5 +198,5 @@  Committing a change to f1 in r1 must bre
   1 r2/.hg/store/data/d1/f2.i
   1 r2/.hg/store/data/f1.i
-  1 r2/.hg/store/fncache
+  2 r2/.hg/store/fncache
 
 
@@ -234,9 +240,9 @@  r4 has hardlinks in the working dir (not
   2 r4/.hg/store/undo.backupfiles
   2 r4/.hg/store/undo.phaseroots
-  2 r4/.hg/undo.backup.dirstate
+  4 r4/.hg/undo.backup.dirstate
   2 r4/.hg/undo.bookmarks
   2 r4/.hg/undo.branch
   2 r4/.hg/undo.desc
-  2 r4/.hg/undo.dirstate
+  4 r4/.hg/undo.dirstate
   2 r4/d1/data1
   2 r4/d1/f2
@@ -273,9 +279,9 @@  Update back to revision 11 in r4 should 
   2 r4/.hg/store/undo.backupfiles
   2 r4/.hg/store/undo.phaseroots
-  2 r4/.hg/undo.backup.dirstate
+  4 r4/.hg/undo.backup.dirstate
   2 r4/.hg/undo.bookmarks
   2 r4/.hg/undo.branch
   2 r4/.hg/undo.desc
-  2 r4/.hg/undo.dirstate
+  4 r4/.hg/undo.dirstate
   2 r4/d1/data1
   2 r4/d1/f2
diff --git a/tests/test-hardlinks.t b/tests/test-hardlinks.t
--- a/tests/test-hardlinks.t
+++ b/tests/test-hardlinks.t
@@ -167,5 +167,5 @@  Push to repo r1 should break up most har
   1 r2/.hg/store/data/d1/f2.i
   2 r2/.hg/store/data/f1.i
-  1 r2/.hg/store/fncache
+  [12] r2/\.hg/store/fncache (re)
 
   $ hg -R r2 verify
@@ -192,5 +192,5 @@  Committing a change to f1 in r1 must bre
   1 r2/.hg/store/data/d1/f2.i
   1 r2/.hg/store/data/f1.i
-  1 r2/.hg/store/fncache
+  [12] r2/\.hg/store/fncache (re)
 
 
@@ -234,9 +234,9 @@  r4 has hardlinks in the working dir (not
   2 r4/.hg/store/undo.backupfiles
   2 r4/.hg/store/undo.phaseroots
-  2 r4/.hg/undo.backup.dirstate
+  [24] r4/\.hg/undo\.backup\.dirstate (re)
   2 r4/.hg/undo.bookmarks
   2 r4/.hg/undo.branch
   2 r4/.hg/undo.desc
-  2 r4/.hg/undo.dirstate
+  [24] r4/\.hg/undo\.dirstate (re)
   2 r4/d1/data1
   2 r4/d1/f2
@@ -273,9 +273,9 @@  Update back to revision 11 in r4 should 
   2 r4/.hg/store/undo.backupfiles
   2 r4/.hg/store/undo.phaseroots
-  2 r4/.hg/undo.backup.dirstate
+  [24] r4/\.hg/undo\.backup\.dirstate (re)
   2 r4/.hg/undo.bookmarks
   2 r4/.hg/undo.branch
   2 r4/.hg/undo.desc
-  2 r4/.hg/undo.dirstate
+  [24] r4/\.hg/undo\.dirstate (re)
   2 r4/d1/data1
   2 r4/d1/f2