# HG changeset patch # User Augie Fackler # Date 2017-05-21 22:36:28 # Node ID 38a2b9d901312aeb917f19fea313dd428b6c5b25 # Parent d47b62368f3a87b65406062507fafc1606f77ea3 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: