Skip to content

Commit

Permalink
Merge pull request #6536 from bket/master_fix_#2055
Browse files Browse the repository at this point in the history
Fix OpenBSD symlink mode test failure (#2055)
  • Loading branch information
ThomasWaldmann committed Apr 4, 2022
2 parents 6d55324 + e86fde5 commit 6c38bf3
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/borg/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
from .remote import cache_if_remote
from .repository import Repository, LIST_SCAN_LIMIT

has_lchmod = hasattr(os, 'lchmod')
has_link = hasattr(os, 'link')


Expand Down Expand Up @@ -877,10 +876,18 @@ def restore_attrs(self, path, item, symlink=False, fd=None):
pass
if fd:
os.fchmod(fd, item.mode)
elif not symlink:
os.chmod(path, item.mode)
elif has_lchmod: # Not available on Linux
os.lchmod(path, item.mode)
else:
# To check whether a particular function in the os module accepts False for its
# follow_symlinks parameter, the in operator on supports_follow_symlinks should be
# used. However, os.chmod is special as some platforms without a working lchmod() do
# have fchmodat(), which has a flag that makes it behave like lchmod(). fchmodat()
# is ignored when deciding whether or not os.chmod should be set in
# os.supports_follow_symlinks. Work around this by using try/except.
try:
os.chmod(path, item.mode, follow_symlinks=False)
except NotImplementedError:
if not symlink:
os.chmod(path, item.mode)
mtime = item.mtime
if 'atime' in item:
atime = item.atime
Expand Down

0 comments on commit 6c38bf3

Please sign in to comment.