瀏覽代碼

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 年之前
父節點
當前提交
93ef06eafc
共有 1 個文件被更改,包括 7 次插入1 次删除
  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: