1 # Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 from bzrlib.bzrdir import BzrDir
18 from bzrlib.errors import NoSuchRevision
19 from bzrlib.inventory import Inventory
23 from scheme import NoBranchingScheme, TrunkBranchingScheme
24 from tests import TestCaseWithSubversionRepository
25 from transport import SvnRaTransport
27 class TestLogWalker(TestCaseWithSubversionRepository):
29 super(TestLogWalker, self).setUp()
31 logwalker.cache_dir = os.path.join(self.test_dir, "cache-dir")
33 def test_create(self):
34 repos_url = self.make_client("a", "ac")
35 logwalker.LogWalker(NoBranchingScheme(), transport=SvnRaTransport(repos_url))
37 def test_get_branch_log(self):
38 repos_url = self.make_client("a", "dc")
39 self.build_tree({'dc/foo': "data"})
40 self.client_add("dc/foo")
41 self.client_commit("dc", "My Message")
43 walker = logwalker.LogWalker(NoBranchingScheme(),
44 transport=SvnRaTransport(repos_url))
46 self.assertEqual(1, len(list(walker.follow_history("", 1))))
48 def test_get_branch_invalid_revision(self):
49 repos_url = self.make_client("a", "dc")
50 walker = logwalker.LogWalker(NoBranchingScheme(),
51 transport=SvnRaTransport(repos_url))
52 self.assertRaises(NoSuchRevision, list,
53 walker.follow_history("/", 20))
55 def test_invalid_branch_path(self):
56 repos_url = self.make_client("a", "dc")
57 walker = logwalker.LogWalker(NoBranchingScheme(),
58 transport=SvnRaTransport(repos_url))
60 self.assertRaises(logwalker.NotSvnBranchPath, list,
61 walker.follow_history("foobar", 0))
63 def test_branch_log_all(self):
64 repos_url = self.make_client("a", "dc")
65 self.build_tree({'dc/trunk/file': "data", "dc/foo/file":"data"})
66 self.client_add("dc/trunk")
67 self.client_add("dc/foo")
68 self.client_commit("dc", "My Message")
70 walker = logwalker.LogWalker(TrunkBranchingScheme(),
71 transport=SvnRaTransport(repos_url))
73 self.assertEqual(1, len(list(walker.follow_history(None, 1))))
75 def test_branch_log_specific(self):
76 repos_url = self.make_client("a", "dc")
79 'dc/branches/brancha': None,
80 'dc/branches/branchab': None,
81 'dc/branches/brancha/data': "data",
82 "dc/branches/branchab/data":"data"})
83 self.client_add("dc/branches")
84 self.client_commit("dc", "My Message")
86 walker = logwalker.LogWalker(TrunkBranchingScheme(),
87 transport=SvnRaTransport(repos_url))
89 self.assertEqual(1, len(list(walker.follow_history("branches/brancha",
92 def test_find_branches_no(self):
93 repos_url = self.make_client("a", "dc")
95 walker = logwalker.LogWalker(NoBranchingScheme(),
96 transport=SvnRaTransport(repos_url))
98 self.assertEqual([("", 0, True)], list(walker.find_branches(0)))
100 def test_find_latest_none(self):
101 repos_url = self.make_client("a", "dc")
102 self.build_tree({'dc/branches': None})
103 self.client_add("dc/branches")
104 self.client_commit("dc", "My Message")
106 walker = logwalker.LogWalker(TrunkBranchingScheme(),
107 transport=SvnRaTransport(repos_url))
109 self.assertEqual(0, walker.find_latest_change("", 1))
111 def test_find_latest_change(self):
112 repos_url = self.make_client("a", "dc")
113 self.build_tree({'dc/branches': None})
114 self.client_add("dc/branches")
115 self.client_commit("dc", "My Message")
117 walker = logwalker.LogWalker(TrunkBranchingScheme(),
118 transport=SvnRaTransport(repos_url))
120 self.assertEqual(1, walker.find_latest_change("branches", 1))
122 def test_find_latest_change_children(self):
123 repos_url = self.make_client("a", "dc")
124 self.build_tree({'dc/branches': None})
125 self.client_add("dc/branches")
126 self.client_commit("dc", "My Message")
127 self.build_tree({'dc/branches/foo': 'data'})
128 self.client_add("dc/branches/foo")
129 self.client_commit("dc", "My Message2")
131 walker = logwalker.LogWalker(TrunkBranchingScheme(),
132 transport=SvnRaTransport(repos_url))
134 self.assertEqual(1, walker.find_latest_change("branches", 2))
136 def test_find_latest_change_prop(self):
137 repos_url = self.make_client("a", "dc")
138 self.build_tree({'dc/branches': None})
139 self.client_add("dc/branches")
140 self.client_commit("dc", "My Message")
141 self.build_tree({'dc/branches/foo': 'data'})
142 self.client_set_prop("dc/branches", "myprop", "mydata")
143 self.client_commit("dc", "propchange")
144 self.client_add("dc/branches/foo")
145 self.client_commit("dc", "My Message2")
147 walker = logwalker.LogWalker(TrunkBranchingScheme(),
148 transport=SvnRaTransport(repos_url))
150 self.assertEqual(2, walker.find_latest_change("branches", 3))
152 def test_find_latest_change_file(self):
153 repos_url = self.make_client("a", "dc")
154 self.build_tree({'dc/branches': None})
155 self.client_add("dc/branches")
156 self.client_commit("dc", "My Message")
157 self.build_tree({'dc/branches/foo': 'data'})
158 self.client_add("dc/branches/foo")
159 self.client_commit("dc", "propchange")
160 self.build_tree({'dc/branches/foo': 'data4'})
161 self.client_commit("dc", "My Message2")
163 walker = logwalker.LogWalker(TrunkBranchingScheme(),
164 transport=SvnRaTransport(repos_url))
166 self.assertEqual(3, walker.find_latest_change("branches/foo", 3))
168 def test_find_latest_change_newer(self):
169 repos_url = self.make_client("a", "dc")
170 self.build_tree({'dc/branches': None})
171 self.client_add("dc/branches")
172 self.client_commit("dc", "My Message")
173 self.build_tree({'dc/branches/foo': 'data'})
174 self.client_add("dc/branches/foo")
175 self.client_commit("dc", "propchange")
176 self.build_tree({'dc/branches/foo': 'data4'})
177 self.client_commit("dc", "My Message2")
179 walker = logwalker.LogWalker(TrunkBranchingScheme(),
180 transport=SvnRaTransport(repos_url))
182 self.assertEqual(2, walker.find_latest_change("branches/foo", 2))
184 def test_find_branches_no_later(self):
185 repos_url = self.make_client("a", "dc")
187 walker = logwalker.LogWalker(NoBranchingScheme(),
188 transport=SvnRaTransport(repos_url))
190 self.assertEqual([("", 0, True)], list(walker.find_branches(0)))
192 def test_find_branches_trunk_empty(self):
193 repos_url = self.make_client("a", "dc")
195 walker = logwalker.LogWalker(TrunkBranchingScheme(),
196 transport=SvnRaTransport(repos_url))
198 self.assertEqual([], list(walker.find_branches(0)))
200 def test_find_branches_trunk_one(self):
201 repos_url = self.make_client("a", "dc")
203 walker = logwalker.LogWalker(TrunkBranchingScheme(),
204 transport=SvnRaTransport(repos_url))
206 self.build_tree({'dc/trunk/foo': "data"})
207 self.client_add("dc/trunk")
208 self.client_commit("dc", "My Message")
210 self.assertEqual([("trunk", 1, True)], list(walker.find_branches(1)))
212 def test_find_branches_removed(self):
213 repos_url = self.make_client("a", "dc")
215 walker = logwalker.LogWalker(TrunkBranchingScheme(),
216 transport=SvnRaTransport(repos_url))
218 self.build_tree({'dc/trunk/foo': "data"})
219 self.client_add("dc/trunk")
220 self.client_commit("dc", "My Message")
222 self.client_delete("dc/trunk")
223 self.client_commit("dc", "remove")
225 self.assertEqual([("trunk", 1, True)], list(walker.find_branches(1)))
226 self.assertEqual([("trunk", 2, False)], list(walker.find_branches(2)))
228 def test_follow_history(self):
229 repos_url = self.make_client("a", "dc")
230 walker = logwalker.LogWalker(NoBranchingScheme(),
231 transport=SvnRaTransport(repos_url))
233 self.build_tree({'dc/foo': "data"})
234 self.client_add("dc/foo")
235 self.client_commit("dc", "My Message")
237 for (branch, paths, rev) in walker.follow_history("", 1):
238 self.assertEqual(branch, "")
239 self.assertTrue(paths.has_key("foo"))
240 self.assertEqual(rev, 1)
242 def test_follow_history_nohist(self):
243 repos_url = self.make_client("a", "dc")
244 walker = logwalker.LogWalker(NoBranchingScheme(),
245 transport=SvnRaTransport(repos_url))
247 self.assertEqual([], list(walker.follow_history("", 0)))
249 def test_later_update(self):
250 repos_url = self.make_client("a", "dc")
252 walker = logwalker.LogWalker(NoBranchingScheme(),
253 transport=SvnRaTransport(repos_url))
255 self.build_tree({'dc/foo': "data"})
256 self.client_add("dc/foo")
257 self.client_commit("dc", "My Message")
259 for (branch, paths, rev) in walker.follow_history("", 1):
260 self.assertEqual(branch, "")
261 self.assertTrue(paths.has_key("foo"))
262 self.assertEqual(rev, 1)
264 iter = walker.follow_history("", 2)
265 self.assertRaises(NoSuchRevision, list, iter)
267 def test_get_branch_log_follow(self):
268 repos_url = self.make_client("a", "dc")
269 self.build_tree({'dc/trunk/afile': "data", "dc/branches": None})
270 self.client_add("dc/trunk")
271 self.client_add("dc/branches")
272 self.client_commit("dc", "My Message")
274 self.client_copy("dc/trunk", "dc/branches/abranch")
275 self.client_commit("dc", "Create branch")
277 walker = logwalker.LogWalker(TrunkBranchingScheme(),
278 transport=SvnRaTransport(repos_url))
280 items = list(walker.follow_history("branches/abranch", 2))
281 self.assertEqual(2, len(items))
283 def test_touches_path(self):
284 repos_url = self.make_client("a", "dc")
285 self.build_tree({'dc/trunk/afile': "data"})
286 self.client_add("dc/trunk")
287 self.client_commit("dc", "My Message")
289 walker = logwalker.LogWalker(TrunkBranchingScheme(),
290 transport=SvnRaTransport(repos_url))
292 self.assertTrue(walker.touches_path("trunk", 1))
294 def test_touches_path_null(self):
295 repos_url = self.make_client("a", "dc")
296 self.build_tree({'dc/trunk/afile': "data"})
297 self.client_add("dc/trunk")
298 self.client_commit("dc", "My Message")
300 walker = logwalker.LogWalker(TrunkBranchingScheme(),
301 transport=SvnRaTransport(repos_url))
303 self.assertTrue(walker.touches_path("", 0))
305 def test_touches_path_not(self):
306 repos_url = self.make_client("a", "dc")
307 self.build_tree({'dc/trunk/afile': "data"})
308 self.client_add("dc/trunk")
309 self.client_commit("dc", "My Message")
311 walker = logwalker.LogWalker(TrunkBranchingScheme(),
312 transport=SvnRaTransport(repos_url))
314 self.assertFalse(walker.touches_path("", 1))
316 def test_touches_path_child(self):
317 repos_url = self.make_client("a", "dc")
318 self.build_tree({'dc/trunk/afile': "data"})
319 self.client_add("dc/trunk")
320 self.client_commit("dc", "My Message")
321 self.build_tree({'dc/trunk/afile': "data2"})
322 self.client_commit("dc", "My Message")
324 walker = logwalker.LogWalker(TrunkBranchingScheme(),
325 transport=SvnRaTransport(repos_url))
327 self.assertFalse(walker.touches_path("trunk", 2))
329 def test_get_previous_simple(self):
330 repos_url = self.make_client("a", "dc")
331 self.build_tree({'dc/trunk/afile': "data"})
332 self.client_add("dc/trunk")
333 self.client_commit("dc", "My Message")
334 self.build_tree({'dc/trunk/afile': "data2"})
335 self.client_set_prop("dc/trunk", "myprop", "mydata")
336 self.client_commit("dc", "My Message")
338 walker = logwalker.LogWalker(TrunkBranchingScheme(),
339 transport=SvnRaTransport(repos_url))
341 self.assertEqual(("trunk", 1), walker.get_previous("trunk", 2))
343 def test_get_previous_copy(self):
344 repos_url = self.make_client("a", "dc")
345 self.build_tree({'dc/trunk/afile': "data"})
346 self.client_add("dc/trunk")
347 self.client_commit("dc", "My Message")
348 self.client_copy("dc/trunk", "dc/anotherfile")
349 self.client_commit("dc", "My Message")
351 walker = logwalker.LogWalker(TrunkBranchingScheme(),
352 transport=SvnRaTransport(repos_url))
354 self.assertEqual(("trunk", 1), walker.get_previous("anotherfile", 2))
356 def test_get_revision_info(self):
357 repos_url = self.make_client("a", "dc")
358 self.build_tree({'dc/trunk/afile': "data"})
359 self.client_add("dc/trunk")
360 self.client_commit("dc", "My Message")
362 walker = logwalker.LogWalker(TrunkBranchingScheme(),
363 transport=SvnRaTransport(repos_url))
365 info = walker.get_revision_info(1)
367 self.assertEqual("", info[0])
368 self.assertEqual("My Message", info[1])