[PATCH] checklink: degrade gracefully on posix when fs is readonly (issue5511)

Augie Fackler raf at durin42.com
Sun May 21 22:39:41 UTC 2017


# HG changeset patch
# User Augie Fackler <augie at google.com>
# Date 1495406188 14400
#      Sun May 21 18:36:28 2017 -0400
# Branch stable
# Node ID 3bb12473b0f69a5f23c384ef45b6d995d6a1c662
# Parent  99515353c72a4c54e4aac1a2ad4f8f724c7fdc9c
checklink: degrade gracefully on posix when fs is readonly (issue5511)

In the unlucky case, checklink tries to make a new file for the
symlink test to target. If the filesystem is readonly (perhaps due to
permissions in a repo owned by someone else) we just report the
filesystem as not supporting symlinks, since the user probably can't
write anyway.

diff --git a/mercurial/posix.py b/mercurial/posix.py
--- a/mercurial/posix.py
+++ b/mercurial/posix.py
@@ -244,7 +244,17 @@ def checklink(path):
                 # create a fixed file to link to; doesn't matter if it
                 # already exists.
                 target = 'checklink-target'
-                open(os.path.join(cachedir, target), 'w').close()
+                try:
+                    open(os.path.join(cachedir, target), 'w').close()
+                except IOError as inst:
+                    if inst[0] == errno.EACCES:
+                        # If we can't write to cachedir, just pretend
+                        # that the fs is readonly and by association
+                        # that the fs won't support symlinks. This
+                        # seems like the least dangerous way to avoid
+                        # data loss.
+                        return False
+                    raise
             try:
                 os.symlink(target, name)
                 if cachedir is None:


More information about the Mercurial-devel mailing list