diff options
-rw-r--r-- | subcmds/sync.py | 2 | ||||
-rw-r--r-- | tests/test_subcmds_sync.py | 38 |
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 | ||
269 | class GetPreciousObjectsState(unittest.TestCase): | 307 | class GetPreciousObjectsState(unittest.TestCase): |
270 | """Tests for _GetPreciousObjectsState.""" | 308 | """Tests for _GetPreciousObjectsState.""" |