From 46790229fcdb041c414a27035b72cbc0d2e78af6 Mon Sep 17 00:00:00 2001 From: Josip Sokcevic Date: Thu, 7 Mar 2024 22:18:58 +0000 Subject: sync: Fix sorting for nested projects The current logic to create checkout layers doesn't work in all cases. For example, let's assume there are three projects: "foo", "foo/bar" and "foo-bar". Sorting lexicographical order is incorrect as foo-bar would be placed between foo and foo/bar, breaking layering logic. Instead, we split filepaths based using path delimiter (always /) and then use lexicographical sort. BUG=b:325119758 TEST=./run_tests, manual sync on chromiumos repository Change-Id: I76924c3cc6ba2bb860d7a3e48406a6bba8f58c10 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/412338 Tested-by: Josip Sokcevic Commit-Queue: Josip Sokcevic Reviewed-by: George Engelbrecht --- tests/test_subcmds_sync.py | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) (limited to 'tests/test_subcmds_sync.py') diff --git a/tests/test_subcmds_sync.py b/tests/test_subcmds_sync.py index 13e23e34..8dde687c 100644 --- a/tests/test_subcmds_sync.py +++ b/tests/test_subcmds_sync.py @@ -304,29 +304,54 @@ class LocalSyncState(unittest.TestCase): self.assertEqual(self.state.GetFetchTime(projA), 5) +class FakeProject: + def __init__(self, relpath): + self.relpath = relpath + + def __str__(self): + return f"project: {self.relpath}" + + def __repr__(self): + return str(self) + + class SafeCheckoutOrder(unittest.TestCase): def test_no_nested(self): - p_f = mock.MagicMock(relpath="f") - p_foo = mock.MagicMock(relpath="foo") + p_f = FakeProject("f") + p_foo = FakeProject("foo") out = sync._SafeCheckoutOrder([p_f, p_foo]) self.assertEqual(out, [[p_f, p_foo]]) def test_basic_nested(self): - p_foo = p_foo = mock.MagicMock(relpath="foo") - p_foo_bar = mock.MagicMock(relpath="foo/bar") + p_foo = p_foo = FakeProject("foo") + p_foo_bar = FakeProject("foo/bar") out = sync._SafeCheckoutOrder([p_foo, p_foo_bar]) self.assertEqual(out, [[p_foo], [p_foo_bar]]) def test_complex_nested(self): - p_foo = mock.MagicMock(relpath="foo") - p_foo_bar = mock.MagicMock(relpath="foo/bar") - p_foo_bar_baz_baq = mock.MagicMock(relpath="foo/bar/baz/baq") - p_bar = mock.MagicMock(relpath="bar") + p_foo = FakeProject("foo") + p_foobar = FakeProject("foobar") + p_foo_dash_bar = FakeProject("foo-bar") + p_foo_bar = FakeProject("foo/bar") + p_foo_bar_baz_baq = FakeProject("foo/bar/baz/baq") + p_bar = FakeProject("bar") out = sync._SafeCheckoutOrder( - [p_foo_bar_baz_baq, p_foo, p_foo_bar, p_bar] + [ + p_foo_bar_baz_baq, + p_foo, + p_foobar, + p_foo_dash_bar, + p_foo_bar, + p_bar, + ] ) self.assertEqual( - out, [[p_bar, p_foo], [p_foo_bar], [p_foo_bar_baz_baq]] + out, + [ + [p_bar, p_foo, p_foo_dash_bar, p_foobar], + [p_foo_bar], + [p_foo_bar_baz_baq], + ], ) -- cgit v1.2.3-54-g00ecf