create --read-special fix crash on broken symlink

also correctly processes broken symlinks. before this regressed to a crash
(5b45385) a broken symlink would've been skipped.
This commit is contained in:
Marian Beermann 2016-09-08 16:39:44 +02:00
parent b1d3a39a63
commit 4cb3355d90
2 changed files with 15 additions and 2 deletions

View File

@ -306,8 +306,13 @@ class Archiver:
if not read_special:
status = archive.process_symlink(path, st)
else:
st_target = os.stat(path)
if is_special(st_target.st_mode):
try:
st_target = os.stat(path)
except OSError:
special = False
else:
special = is_special(st_target.st_mode)
if special:
status = archive.process_file(path, st_target, cache)
else:
status = archive.process_symlink(path, st)

View File

@ -901,6 +901,14 @@ class ArchiverTestCase(ArchiverTestCaseBase):
output = self.cmd('create', '-v', '--list', '--filter=AM', self.repository_location + '::test3', 'input')
self.assert_in('file1', output)
def test_create_read_special_broken_symlink(self):
os.symlink('somewhere doesnt exist', os.path.join(self.input_path, 'link'))
self.cmd('init', self.repository_location)
archive = self.repository_location + '::test'
self.cmd('create', '--read-special', archive, 'input')
output = self.cmd('list', archive)
assert 'input/link -> somewhere doesnt exist' in output
# def test_cmdline_compatibility(self):
# self.create_regular_file('file1', size=1024 * 80)
# self.cmd('init', self.repository_location)