summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--subcmds/sync.py2
-rw-r--r--tests/test_subcmds_sync.py38
2 files changed, 39 insertions, 1 deletions
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 02c1d3ae..b7236629 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -2011,7 +2011,7 @@ class LocalSyncState:
2011 delete = set() 2011 delete = set()
2012 for path in self._state: 2012 for path in self._state:
2013 gitdir = os.path.join(self._manifest.topdir, path, ".git") 2013 gitdir = os.path.join(self._manifest.topdir, path, ".git")
2014 if not os.path.exists(gitdir): 2014 if not os.path.exists(gitdir) or os.path.islink(gitdir):
2015 delete.add(path) 2015 delete.add(path)
2016 if not delete: 2016 if not delete:
2017 return 2017 return
diff --git a/tests/test_subcmds_sync.py b/tests/test_subcmds_sync.py
index 71e40489..af6bbef7 100644
--- a/tests/test_subcmds_sync.py
+++ b/tests/test_subcmds_sync.py
@@ -265,6 +265,44 @@ class LocalSyncState(unittest.TestCase):
265 self.assertIsNone(self.state.GetFetchTime(projA)) 265 self.assertIsNone(self.state.GetFetchTime(projA))
266 self.assertEqual(self.state.GetFetchTime(projB), 7) 266 self.assertEqual(self.state.GetFetchTime(projB), 7)
267 267
268 def test_prune_removed_and_symlinked_projects(self):
269 """Removed projects that still exists on disk as symlink are pruned."""
270 with open(self.state._path, "w") as f:
271 f.write(
272 """
273 {
274 "projA": {
275 "last_fetch": 5
276 },
277 "projB": {
278 "last_fetch": 7
279 }
280 }
281 """
282 )
283
284 def mock_exists(path):
285 return True
286
287 def mock_islink(path):
288 if "projB" in path:
289 return True
290 return False
291
292 projA = mock.MagicMock(relpath="projA")
293 projB = mock.MagicMock(relpath="projB")
294 self.state = self._new_state()
295 self.assertEqual(self.state.GetFetchTime(projA), 5)
296 self.assertEqual(self.state.GetFetchTime(projB), 7)
297 with mock.patch("os.path.exists", side_effect=mock_exists):
298 with mock.patch("os.path.islink", side_effect=mock_islink):
299 self.state.PruneRemovedProjects()
300 self.assertIsNone(self.state.GetFetchTime(projB))
301
302 self.state = self._new_state()
303 self.assertIsNone(self.state.GetFetchTime(projB))
304 self.assertEqual(self.state.GetFetchTime(projA), 5)
305
268 306
269class GetPreciousObjectsState(unittest.TestCase): 307class GetPreciousObjectsState(unittest.TestCase):
270 """Tests for _GetPreciousObjectsState.""" 308 """Tests for _GetPreciousObjectsState."""