Prechádzať zdrojové kódy

Support broken symlinks when cleaning obsolete paths

When there's a symlink to a directory, os.walk still lists the symlink
in dirs, even if it isn't configured to follow symlinks. This will fail
the listdirs check if the symlink is broken (either before or during the
cleanup). So instead, check for directory symlinks and remove them using
os.remove.

Bug: Issue 231
Change-Id: I0ec45a26be566613a4a39bf694a3d9c6328481c2
Dan Willemsen 9 rokov pred
rodič
commit
93ef06eafc
1 zmenil súbory, kde vykonal 7 pridanie a 1 odobranie
  1. 7 1
      subcmds/sync.py

+ 7 - 1
subcmds/sync.py

@@ -487,7 +487,13 @@ later is required to fix a server side protocol bug.
       dirs_to_remove += [os.path.join(root, d) for d in dirs
                          if os.path.join(root, d) not in dirs_to_remove]
     for d in reversed(dirs_to_remove):
-      if len(os.listdir(d)) == 0:
+      if os.path.islink(d):
+        try:
+          os.remove(d)
+        except OSError:
+          print('Failed to remove %s' % os.path.join(root, d), file=sys.stderr)
+          failed = True
+      elif len(os.listdir(d)) == 0:
         try:
           os.rmdir(d)
         except OSError: