#2572 closed defect (fixed)
Bug with partial repositories in r2746
| Reported by: | Manuzhai | Owned by: | Christian Boos |
|---|---|---|---|
| Priority: | high | Milestone: | 0.10 |
| Component: | version control | Version: | devel |
| Severity: | normal | Keywords: | |
| Cc: | manuzhai@… | Branch: | |
| Release Notes: | |||
| API Changes: | |||
| Internal Changes: | |||
Description
With r2746, I get the following error when viewing a particular revision. The environment is confined to a part of the repository, this works fine when browing source and viewing the timeline, but when viewing this particular changeset (which is confirmed to only change files within the configured partial repository), I get this exception:
Traceback (most recent call last):
File "/home/manuzhai/dev/trac/trac/web/modpython_frontend.py", line 206, in handler
dispatch_request(mpr.path_info, mpr, env)
File "/home/manuzhai/dev/trac/trac/web/main.py", line 139, in dispatch_request
dispatcher.dispatch(req)
File "/home/manuzhai/dev/trac/trac/web/main.py", line 107, in dispatch
resp = chosen_handler.process_request(req)
File "/home/manuzhai/dev/trac/trac/versioncontrol/web_ui/changeset.py", line 91, in process_request
self._render_html(req, repos, chgset, diff_options)
File "/home/manuzhai/dev/trac/trac/versioncontrol/web_ui/changeset.py", line 155, in _render_html
oldest_rev = repos.oldest_rev
File "/home/manuzhai/dev/trac/trac/versioncontrol/api.py", line 125, in <lambda>
oldest_rev = property(lambda x: x.get_oldest_rev())
File "/home/manuzhai/dev/trac/trac/versioncontrol/cache.py", line 107, in get_oldest_rev
return self.repos.oldest_rev
File "/home/manuzhai/dev/trac/trac/versioncontrol/api.py", line 125, in <lambda>
oldest_rev = property(lambda x: x.get_oldest_rev())
File "/home/manuzhai/dev/trac/trac/versioncontrol/svn_fs.py", line 301, in get_oldest_rev
self.oldest = self.next_rev(0)
File "/home/manuzhai/dev/trac/trac/versioncontrol/svn_fs.py", line 328, in next_rev
for path, next in self._history('', rev+1, next, limit=1):
File "/home/manuzhai/dev/trac/trac/versioncontrol/svn_fs.py", line 58, in _get_history
start, end, 1, pool())
File "/usr/lib/python2.4/site-packages/libsvn/repos.py", line 291, in svn_repos_history2
return apply(_repos.svn_repos_history2, args)
SubversionException: ("File not found: revision 1, path 'hebe/'", 160013)
It seems that line 58 from svn_fs.py explicitly refers to r1, while it should probably refer to some other revision number that is the first revision of the partial repository.
Attachments (0)
Change History (5)
comment:1 by , 20 years ago
| Milestone: | → 0.9.4 |
|---|---|
| Owner: | changed from to |
| Priority: | normal → high |
comment:2 by , 20 years ago
| Milestone: | 0.9.4 → 1.0 |
|---|---|
| Status: | new → assigned |
Fix tested with Subversion 1.2.3 and 1.3.0 on Windows.
Index: tests/svn_fs.py
===================================================================
--- tests/svn_fs.py (revision 2746)
+++ tests/svn_fs.py (working copy)
@@ -544,6 +544,24 @@
changes.next())
self.assertRaises(StopIteration, changes.next)
+
+class RecentPathScopedRepositoryTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.repos = SubversionRepository(REPOS_PATH + '/trunk/dir1', None,
+ logger_factory('test'))
+
+ def tearDown(self):
+ self.repos = None
+
+ def test_rev_navigation(self):
+ self.assertEqual(False, self.repos.has_node('/', 1))
+ self.assertEqual(False, self.repos.has_node('/', 2))
+ self.assertEqual(False, self.repos.has_node('/', 3))
+ self.assertEqual(True, self.repos.has_node('/', 4))
+ self.assertEqual(4, self.repos.oldest_rev)
+
+
def suite():
global has_svn
suite = unittest.TestSuite()
@@ -552,6 +570,8 @@
'test', suiteClass=SubversionRepositoryTestSetup))
suite.addTest(unittest.makeSuite(ScopedSubversionRepositoryTestCase,
'test', suiteClass=SubversionRepositoryTestSetup))
+ suite.addTest(unittest.makeSuite(RecentPathScopedRepositoryTestCase,
+ 'test', suiteClass=SubversionRepositoryTestSetup))
return suite
if __name__ == '__main__':
Index: svn_fs.py
===================================================================
--- svn_fs.py (revision 2746)
+++ svn_fs.py (working copy)
@@ -298,7 +298,7 @@
if self.oldest is None:
self.oldest = 1
if self.scope != '/':
- self.oldest = self.next_rev(0)
+ self.oldest = self.next_rev(0, find_initial_rev=True)
return self.oldest
def get_youngest_rev(self):
@@ -319,7 +319,7 @@
pass
return None
- def next_rev(self, rev):
+ def next_rev(self, rev, find_initial_rev=False):
rev = self.normalize_rev(rev)
next = rev + 1
youngest = self.youngest_rev
@@ -328,8 +328,12 @@
for path, next in self._history('', rev+1, next, limit=1):
return next
next += 1
- except SystemError: # i.e. "null arg to internal routine"
- return next # a 'delete' event is also interesting...
+ except (SystemError, # "null arg to internal routine" in 1.2.x
+ core.SubversionException): # in 1.3.x
+ if not find_initial_rev:
+ return next # a 'delete' event is also interesting...
+ else:
+ next += 1
return None
def rev_older_than(self, rev1, rev2):
The problem doesn't exist for milestone:0.9.3. It was a regression introduced in r2462 (vc-refactoring branch).
comment:4 by , 20 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
Thanks for testing, I committed a slightly simplified fix in r2747.
comment:5 by , 20 years ago
| Milestone: | 1.0 → 0.10 |
|---|



This is because the path corresponding to the partial repository was not existing at rev. 1. That should be a pretty common situation, unfortunately I only tested by restricting to
trunkor similar path that already existed at rev. 1.I'm trying to get a fix.