[PATCH] posix: give the cached symlink a real target

Martijn Pieters mj at zopatista.com
Wed Nov 30 16:51:41 UTC 2016


# HG changeset patch
# User Martijn Pieters <mjpieters at fb.com>
# Date 1480523976 0
#      Wed Nov 30 16:39:36 2016 +0000
# Node ID 4053f60f77657f8f54afc72d00bf629b75d0b4b9
# Parent  9e29d4e4e08b5996adda49cdd0b497d89e2b16ee
posix: give the cached symlink a real target

The NamedTemporaryFile file is cleared up so checklink ends up as a dangling
symlink, causing cp -r in tests to complain on both Solaris and OS X. Use
a permanent file instead when there is a .hg/cache directory.

diff --git a/mercurial/posix.py b/mercurial/posix.py
--- a/mercurial/posix.py
+++ b/mercurial/posix.py
@@ -231,10 +231,18 @@
             cachedir = None
         name = tempfile.mktemp(dir=checkdir, prefix='checklink-')
         try:
-            fd = tempfile.NamedTemporaryFile(dir=checkdir,
-                                             prefix='hg-checklink-')
+            fd = None
+            if cachedir is None:
+                fd = tempfile.NamedTemporaryFile(dir=checkdir,
+                                                 prefix='hg-checklink-')
+                target = os.path.basename(fd.name)
+            else:
+                # create a fixed file to link to; doesn't matter if it
+                # already exists.
+                target = 'checklink-target'
+                open(os.path.join(cachedir, target), 'w')
             try:
-                os.symlink(os.path.basename(fd.name), name)
+                os.symlink(target, name)
                 if cachedir is None:
                     os.unlink(name)
                 else:
@@ -249,7 +257,8 @@
                     continue
                 raise
             finally:
-                fd.close()
+                if fd is not None:
+                    fd.close()
         except AttributeError:
             return False
         except OSError as inst:
diff --git a/tests/test-clone.t b/tests/test-clone.t
--- a/tests/test-clone.t
+++ b/tests/test-clone.t
@@ -33,6 +33,7 @@
   branch2-served
   checkisexec
   checklink
+  checklink-target
   checknoexec
   rbc-names-v1
   rbc-revs-v1
@@ -50,6 +51,7 @@
   branch2-served
   checkisexec
   checklink
+  checklink-target
 
   $ cat a
   a
diff --git a/tests/test-hardlinks.t b/tests/test-hardlinks.t
--- a/tests/test-hardlinks.t
+++ b/tests/test-hardlinks.t
@@ -212,6 +212,8 @@
   2 r4/.hg/branch
   2 r4/.hg/cache/branch2-served
   2 r4/.hg/cache/checkisexec
+  3 r4/.hg/cache/checklink (?)
+  ? r4/.hg/cache/checklink-target (glob)
   2 r4/.hg/cache/checknoexec
   2 r4/.hg/cache/rbc-names-v1
   2 r4/.hg/cache/rbc-revs-v1
@@ -250,6 +252,7 @@
   1 r4/.hg/branch
   2 r4/.hg/cache/branch2-served
   2 r4/.hg/cache/checkisexec
+  2 r4/.hg/cache/checklink-target
   2 r4/.hg/cache/checknoexec
   2 r4/.hg/cache/rbc-names-v1
   2 r4/.hg/cache/rbc-revs-v1
diff --git a/tests/test-tags.t b/tests/test-tags.t
--- a/tests/test-tags.t
+++ b/tests/test-tags.t
@@ -674,6 +674,7 @@
   branch2-served
   checkisexec
   checklink
+  checklink-target
   hgtagsfnodes1
   rbc-names-v1
   rbc-revs-v1
@@ -700,6 +701,7 @@
   branch2-served
   checkisexec
   checklink
+  checklink-target
   hgtagsfnodes1
   rbc-names-v1
   rbc-revs-v1


More information about the Mercurial-devel mailing list