فهرست منبع

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.
Marian Beermann 8 سال پیش
والد
کامیت
4cb3355d90
2فایلهای تغییر یافته به همراه15 افزوده شده و 2 حذف شده
  1. 7 2
      borg/archiver.py
  2. 8 0
      borg/testsuite/archiver.py

+ 7 - 2
borg/archiver.py

@@ -306,8 +306,13 @@ class Archiver:
                 if not read_special:
                 if not read_special:
                     status = archive.process_symlink(path, st)
                     status = archive.process_symlink(path, st)
                 else:
                 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)
                         status = archive.process_file(path, st_target, cache)
                     else:
                     else:
                         status = archive.process_symlink(path, st)
                         status = archive.process_symlink(path, st)

+ 8 - 0
borg/testsuite/archiver.py

@@ -901,6 +901,14 @@ class ArchiverTestCase(ArchiverTestCaseBase):
         output = self.cmd('create', '-v', '--list', '--filter=AM', self.repository_location + '::test3', 'input')
         output = self.cmd('create', '-v', '--list', '--filter=AM', self.repository_location + '::test3', 'input')
         self.assert_in('file1', output)
         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):
     # def test_cmdline_compatibility(self):
     #    self.create_regular_file('file1', size=1024 * 80)
     #    self.create_regular_file('file1', size=1024 * 80)
     #    self.cmd('init', self.repository_location)
     #    self.cmd('init', self.repository_location)