* lib/vclib/svn/__init__.py
Bump version requirement to Subversion 1.3.1. Also, remove unnecessary pools from the entirety of the module. * lib/vclib/svn_ra/__init__.py Bump version requirement to Subversion 1.3.1. * INSTALL Bump Subversion version requirement to Subversion 1.3.1. git-svn-id: http://viewvc.tigris.org/svn/viewvc/trunk@1475 8cb11bc2-c004-0410-86c3-e597b4017df7remotes/options-overhaul
parent
d83ff39472
commit
fa035c8ae7
2
INSTALL
2
INSTALL
|
@ -31,7 +31,7 @@ Congratulations on getting this far. :-)
|
|||
|
||||
* Python 2.0 or later
|
||||
(http://www.python.org/)
|
||||
* Subversion, Version Control System, 1.2.0 or later
|
||||
* Subversion, Version Control System, 1.3.1 or later
|
||||
(binary installation and Python bindings)
|
||||
(http://subversion.tigris.org/)
|
||||
|
||||
|
|
|
@ -25,9 +25,9 @@ import re
|
|||
from svn import fs, repos, core, delta
|
||||
|
||||
|
||||
### Require Subversion 1.2.0 or better.
|
||||
if (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_PATCH) < (1, 2, 0):
|
||||
raise Exception, "Version requirement not met (needs 1.2.0 or better)"
|
||||
### Require Subversion 1.3.1 or better.
|
||||
if (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_PATCH) < (1, 3, 1):
|
||||
raise Exception, "Version requirement not met (needs 1.3.1 or better)"
|
||||
|
||||
|
||||
def _allow_all(root, path, pool):
|
||||
|
@ -84,32 +84,28 @@ def _compare_paths(path1, path2):
|
|||
return cmp(char1, char2)
|
||||
|
||||
|
||||
def _datestr_to_date(datestr, pool):
|
||||
if datestr is None:
|
||||
return None
|
||||
return core.svn_time_from_cstring(datestr, pool) / 1000000
|
||||
def _datestr_to_date(datestr):
|
||||
return datestr and core.svn_time_from_cstring(datestr) / 1000000 or None
|
||||
|
||||
|
||||
def _fs_rev_props(fsptr, rev, pool):
|
||||
author = fs.revision_prop(fsptr, rev, core.SVN_PROP_REVISION_AUTHOR, pool)
|
||||
msg = fs.revision_prop(fsptr, rev, core.SVN_PROP_REVISION_LOG, pool)
|
||||
date = fs.revision_prop(fsptr, rev, core.SVN_PROP_REVISION_DATE, pool)
|
||||
def _fs_rev_props(fsptr, rev):
|
||||
author = fs.revision_prop(fsptr, rev, core.SVN_PROP_REVISION_AUTHOR)
|
||||
msg = fs.revision_prop(fsptr, rev, core.SVN_PROP_REVISION_LOG)
|
||||
date = fs.revision_prop(fsptr, rev, core.SVN_PROP_REVISION_DATE)
|
||||
return date, author, msg
|
||||
|
||||
|
||||
def date_from_rev(svnrepos, rev):
|
||||
if (rev < 0) or (rev > svnrepos.youngest):
|
||||
raise vclib.InvalidRevision(rev)
|
||||
datestr = fs.revision_prop(svnrepos.fs_ptr, rev,
|
||||
core.SVN_PROP_REVISION_DATE, svnrepos.pool)
|
||||
return _datestr_to_date(datestr, svnrepos.pool)
|
||||
return _datestr_to_date(fs.revision_prop(svnrepos.fs_ptr, rev,
|
||||
core.SVN_PROP_REVISION_DATE))
|
||||
|
||||
|
||||
def get_location(svnrepos, path, rev, old_rev):
|
||||
try:
|
||||
results = repos.svn_repos_trace_node_locations(svnrepos.fs_ptr, path,
|
||||
rev, [old_rev],
|
||||
_allow_all, svnrepos.pool)
|
||||
rev, [old_rev], _allow_all)
|
||||
except core.SubversionException, e:
|
||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||
raise vclib.ItemNotFound(path)
|
||||
|
@ -145,23 +141,19 @@ def last_rev(svnrepos, path, peg_revision, limit_revision=None):
|
|||
return peg_revision, path
|
||||
elif peg_revision > limit_revision:
|
||||
fsroot = svnrepos._getroot(peg_revision)
|
||||
history = fs.node_history(fsroot, path, svnrepos.scratch_pool)
|
||||
history = fs.node_history(fsroot, path)
|
||||
while history:
|
||||
path, peg_revision = fs.history_location(history,
|
||||
svnrepos.scratch_pool);
|
||||
path, peg_revision = fs.history_location(history)
|
||||
if peg_revision <= limit_revision:
|
||||
return max(peg_revision, limit_revision), _cleanup_path(path)
|
||||
history = fs.history_prev(history, 1, svnrepos.scratch_pool)
|
||||
history = fs.history_prev(history, 1)
|
||||
return peg_revision, _cleanup_path(path)
|
||||
else:
|
||||
### Warning: this is *not* an example of good pool usage.
|
||||
orig_id = fs.node_id(svnrepos._getroot(peg_revision), path,
|
||||
svnrepos.scratch_pool)
|
||||
orig_id = fs.node_id(svnrepos._getroot(peg_revision), path)
|
||||
while peg_revision != limit_revision:
|
||||
mid = (peg_revision + 1 + limit_revision) / 2
|
||||
try:
|
||||
mid_id = fs.node_id(svnrepos._getroot(mid), path,
|
||||
svnrepos.scratch_pool)
|
||||
mid_id = fs.node_id(svnrepos._getroot(mid), path)
|
||||
except core.SubversionException, e:
|
||||
if e.apr_err == core.SVN_ERR_FS_NOT_FOUND:
|
||||
cmp = -1
|
||||
|
@ -179,12 +171,11 @@ def last_rev(svnrepos, path, peg_revision, limit_revision=None):
|
|||
|
||||
return peg_revision, path
|
||||
finally:
|
||||
svnrepos._scratch_clear()
|
||||
pass
|
||||
|
||||
|
||||
def created_rev(svnrepos, full_name, rev):
|
||||
fsroot = svnrepos._getroot(rev)
|
||||
return fs.node_created_rev(fsroot, full_name, svnrepos.pool)
|
||||
return fs.node_created_rev(svnrepos._getroot(rev), full_name)
|
||||
|
||||
|
||||
class Revision(vclib.Revision):
|
||||
|
@ -210,27 +201,23 @@ class NodeHistory:
|
|||
# was copied). This is useful for omitting bubble-up directory
|
||||
# changes.
|
||||
if not self.show_all_logs:
|
||||
rev_root = fs.revision_root(self.fs_ptr, revision, pool)
|
||||
changed_paths = fs.paths_changed(rev_root, pool)
|
||||
rev_root = fs.revision_root(self.fs_ptr, revision)
|
||||
changed_paths = fs.paths_changed(rev_root)
|
||||
paths = changed_paths.keys()
|
||||
if path not in paths:
|
||||
# Look for a copied parent
|
||||
test_path = path
|
||||
found = 0
|
||||
subpool = core.svn_pool_create(pool)
|
||||
while 1:
|
||||
core.svn_pool_clear(subpool)
|
||||
off = string.rfind(test_path, '/')
|
||||
if off < 0:
|
||||
break
|
||||
test_path = test_path[0:off]
|
||||
if test_path in paths:
|
||||
copyfrom_rev, copyfrom_path = \
|
||||
fs.copied_from(rev_root, test_path, subpool)
|
||||
copyfrom_rev, copyfrom_path = fs.copied_from(rev_root, test_path)
|
||||
if copyfrom_rev >= 0 and copyfrom_path:
|
||||
found = 1
|
||||
break
|
||||
core.svn_pool_destroy(subpool)
|
||||
if not found:
|
||||
return
|
||||
self.histories[revision] = _cleanup_path(path)
|
||||
|
@ -241,7 +228,7 @@ def _get_history(svnrepos, full_name, rev, options={}):
|
|||
show_all_logs = options.get('svn_show_all_dir_logs', 0)
|
||||
if not show_all_logs:
|
||||
# See if the path is a file or directory.
|
||||
kind = fs.check_path(fsroot, full_name, svnrepos.pool)
|
||||
kind = fs.check_path(fsroot, full_name)
|
||||
if kind is core.svn_node_file:
|
||||
show_all_logs = 1
|
||||
|
||||
|
@ -253,7 +240,7 @@ def _get_history(svnrepos, full_name, rev, options={}):
|
|||
|
||||
# Get the history items for PATH.
|
||||
repos.svn_repos_history(svnrepos.fs_ptr, full_name, history.add_history,
|
||||
1, rev, cross_copies, svnrepos.pool)
|
||||
1, rev, cross_copies)
|
||||
return history.histories
|
||||
|
||||
|
||||
|
@ -274,9 +261,9 @@ def get_revision_info(svnrepos, rev):
|
|||
fsroot = svnrepos._getroot(rev)
|
||||
|
||||
# Get the changes for the revision
|
||||
editor = repos.ChangeCollector(svnrepos.fs_ptr, fsroot, svnrepos.pool)
|
||||
e_ptr, e_baton = delta.make_editor(editor, svnrepos.pool)
|
||||
repos.svn_repos_replay(fsroot, e_ptr, e_baton, svnrepos.pool)
|
||||
editor = repos.ChangeCollector(svnrepos.fs_ptr, fsroot)
|
||||
e_ptr, e_baton = delta.make_editor(editor)
|
||||
repos.svn_repos_replay(fsroot, e_ptr, e_baton)
|
||||
changes = editor.get_changes()
|
||||
changedpaths = {}
|
||||
|
||||
|
@ -330,23 +317,23 @@ def get_revision_info(svnrepos, rev):
|
|||
|
||||
# Now get the revision property info. Would use
|
||||
# editor.get_root_props(), but something is broken there...
|
||||
datestr, author, msg = _fs_rev_props(svnrepos.fs_ptr, rev, svnrepos.pool)
|
||||
date = _datestr_to_date(datestr, svnrepos.pool)
|
||||
datestr, author, msg = _fs_rev_props(svnrepos.fs_ptr, rev)
|
||||
date = _datestr_to_date(datestr)
|
||||
|
||||
return date, author, msg, change_items
|
||||
|
||||
|
||||
def _log_helper(svnrepos, rev, path, pool):
|
||||
rev_root = fs.revision_root(svnrepos.fs_ptr, rev, pool)
|
||||
def _log_helper(svnrepos, rev, path):
|
||||
rev_root = fs.revision_root(svnrepos.fs_ptr, rev)
|
||||
|
||||
# Was this path@rev the target of a copy?
|
||||
copyfrom_rev, copyfrom_path = fs.copied_from(rev_root, path, pool)
|
||||
copyfrom_rev, copyfrom_path = fs.copied_from(rev_root, path)
|
||||
|
||||
# Assemble our LogEntry
|
||||
datestr, author, msg = _fs_rev_props(svnrepos.fs_ptr, rev, pool)
|
||||
date = _datestr_to_date(datestr, pool)
|
||||
if fs.is_file(rev_root, path, pool):
|
||||
size = fs.file_length(rev_root, path, pool)
|
||||
datestr, author, msg = _fs_rev_props(svnrepos.fs_ptr, rev)
|
||||
date = _datestr_to_date(datestr)
|
||||
if fs.is_file(rev_root, path):
|
||||
size = fs.file_length(rev_root, path)
|
||||
else:
|
||||
size = None
|
||||
entry = Revision(rev, date, author, msg, size, path,
|
||||
|
@ -355,11 +342,11 @@ def _log_helper(svnrepos, rev, path, pool):
|
|||
return entry
|
||||
|
||||
|
||||
def _fetch_log(svnrepos, full_name, which_rev, options, pool):
|
||||
def _fetch_log(svnrepos, full_name, which_rev, options):
|
||||
revs = []
|
||||
|
||||
if options.get('svn_latest_log', 0):
|
||||
rev = _log_helper(svnrepos, which_rev, full_name, pool)
|
||||
rev = _log_helper(svnrepos, which_rev, full_name)
|
||||
if rev:
|
||||
revs.append(rev)
|
||||
else:
|
||||
|
@ -367,52 +354,45 @@ def _fetch_log(svnrepos, full_name, which_rev, options, pool):
|
|||
history_revs = history_set.keys()
|
||||
history_revs.sort()
|
||||
history_revs.reverse()
|
||||
subpool = core.svn_pool_create(pool)
|
||||
for history_rev in history_revs:
|
||||
core.svn_pool_clear(subpool)
|
||||
rev = _log_helper(svnrepos, history_rev, history_set[history_rev],
|
||||
subpool)
|
||||
rev = _log_helper(svnrepos, history_rev, history_set[history_rev])
|
||||
if rev:
|
||||
revs.append(rev)
|
||||
core.svn_pool_destroy(subpool)
|
||||
return revs
|
||||
|
||||
|
||||
def _get_last_history_rev(fsroot, path, pool):
|
||||
history = fs.node_history(fsroot, path, pool)
|
||||
history = fs.history_prev(history, 0, pool)
|
||||
history_path, history_rev = fs.history_location(history, pool);
|
||||
def _get_last_history_rev(fsroot, path):
|
||||
history = fs.node_history(fsroot, path)
|
||||
history = fs.history_prev(history, 0)
|
||||
history_path, history_rev = fs.history_location(history)
|
||||
return history_rev
|
||||
|
||||
|
||||
def get_logs(svnrepos, full_name, rev, files):
|
||||
fsroot = svnrepos._getroot(rev)
|
||||
subpool = core.svn_pool_create(svnrepos.pool)
|
||||
for file in files:
|
||||
core.svn_pool_clear(subpool)
|
||||
path = _fs_path_join(full_name, file.name)
|
||||
rev = _get_last_history_rev(fsroot, path, subpool)
|
||||
datestr, author, msg = _fs_rev_props(svnrepos.fs_ptr, rev, subpool)
|
||||
date = _datestr_to_date(datestr, subpool)
|
||||
rev = _get_last_history_rev(fsroot, path)
|
||||
datestr, author, msg = _fs_rev_props(svnrepos.fs_ptr, rev)
|
||||
date = _datestr_to_date(datestr)
|
||||
file.rev = str(rev)
|
||||
file.date = date
|
||||
file.author = author
|
||||
file.log = msg
|
||||
if file.kind == vclib.FILE:
|
||||
file.size = fs.file_length(fsroot, path, subpool)
|
||||
core.svn_pool_destroy(subpool)
|
||||
file.size = fs.file_length(fsroot, path)
|
||||
|
||||
|
||||
def get_youngest_revision(svnrepos):
|
||||
return svnrepos.youngest
|
||||
|
||||
def temp_checkout(svnrepos, path, rev, pool):
|
||||
def temp_checkout(svnrepos, path, rev):
|
||||
"""Check out file revision to temporary file"""
|
||||
temp = tempfile.mktemp()
|
||||
fp = open(temp, 'wb')
|
||||
try:
|
||||
root = svnrepos._getroot(rev)
|
||||
stream = fs.file_contents(root, path, pool)
|
||||
stream = fs.file_contents(root, path)
|
||||
try:
|
||||
while 1:
|
||||
chunk = core.svn_stream_read(stream, core.SVN_STREAM_CHUNK_SIZE)
|
||||
|
@ -426,14 +406,10 @@ def temp_checkout(svnrepos, path, rev, pool):
|
|||
return temp
|
||||
|
||||
class FileContentsPipe:
|
||||
def __init__(self, root, path, pool):
|
||||
self._pool = core.svn_pool_create(pool)
|
||||
self._stream = fs.file_contents(root, path, self._pool)
|
||||
def __init__(self, root, path):
|
||||
self._stream = fs.file_contents(root, path)
|
||||
self._eof = 0
|
||||
|
||||
def __del__(self):
|
||||
core.svn_pool_destroy(self._pool)
|
||||
|
||||
def read(self, len=None):
|
||||
chunk = None
|
||||
if not self._eof:
|
||||
|
@ -458,8 +434,7 @@ class FileContentsPipe:
|
|||
def readline(self):
|
||||
chunk = None
|
||||
if not self._eof:
|
||||
chunk, self._eof = core.svn_stream_readline(self._stream, '\n',
|
||||
self._pool)
|
||||
chunk, self._eof = core.svn_stream_readline(self._stream, '\n')
|
||||
if not self._eof:
|
||||
chunk = chunk + '\n'
|
||||
if not chunk:
|
||||
|
@ -540,8 +515,6 @@ class SubversionRepository(vclib.Repository):
|
|||
raise vclib.ReposNotFound(name)
|
||||
|
||||
# Initialize some stuff.
|
||||
self.pool = None
|
||||
self.apr_init = 0
|
||||
self.rootpath = rootpath
|
||||
self.name = name
|
||||
self.svn_client_path = utilities.svn or 'svn'
|
||||
|
@ -564,37 +537,16 @@ class SubversionRepository(vclib.Repository):
|
|||
# isn't the main one. We'll just not care.
|
||||
pass
|
||||
|
||||
# Initialize APR and get our top-level pool.
|
||||
core.apr_initialize()
|
||||
self.apr_init = 1
|
||||
self.pool = core.svn_pool_create(None)
|
||||
self.scratch_pool = core.svn_pool_create(self.pool)
|
||||
|
||||
# Open the repository and init some other variables.
|
||||
self.repos = repos.svn_repos_open(rootpath, self.pool)
|
||||
self.repos = repos.svn_repos_open(rootpath)
|
||||
self.fs_ptr = repos.svn_repos_fs(self.repos)
|
||||
self.youngest = fs.youngest_rev(self.fs_ptr, self.pool)
|
||||
self.youngest = fs.youngest_rev(self.fs_ptr)
|
||||
self._fsroots = {}
|
||||
|
||||
def __del__(self):
|
||||
self._close()
|
||||
|
||||
def _close(self):
|
||||
if self.pool:
|
||||
core.svn_pool_destroy(self.pool)
|
||||
self.pool = None
|
||||
if self.apr_init:
|
||||
core.apr_terminate()
|
||||
self.apr_init = 0
|
||||
|
||||
def _scratch_clear(self):
|
||||
core.svn_pool_clear(self.scratch_pool)
|
||||
|
||||
def itemtype(self, path_parts, rev):
|
||||
rev = self._getrev(rev)
|
||||
basepath = self._getpath(path_parts)
|
||||
kind = fs.check_path(self._getroot(rev), basepath, self.scratch_pool)
|
||||
self._scratch_clear()
|
||||
kind = fs.check_path(self._getroot(rev), basepath)
|
||||
if kind == core.svn_node_dir:
|
||||
return vclib.DIR
|
||||
if kind == core.svn_node_file:
|
||||
|
@ -605,9 +557,8 @@ class SubversionRepository(vclib.Repository):
|
|||
path = self._getpath(path_parts)
|
||||
rev = self._getrev(rev)
|
||||
fsroot = self._getroot(rev)
|
||||
revision = str(_get_last_history_rev(fsroot, path, self.scratch_pool))
|
||||
self._scratch_clear()
|
||||
fp = FileContentsPipe(fsroot, path, self.pool)
|
||||
revision = str(_get_last_history_rev(fsroot, path))
|
||||
fp = FileContentsPipe(fsroot, path)
|
||||
return fp, revision
|
||||
|
||||
def listdir(self, path_parts, rev, options):
|
||||
|
@ -617,7 +568,7 @@ class SubversionRepository(vclib.Repository):
|
|||
|
||||
rev = self._getrev(rev)
|
||||
fsroot = self._getroot(rev)
|
||||
dirents = fs.dir_entries(fsroot, basepath, self.scratch_pool)
|
||||
dirents = fs.dir_entries(fsroot, basepath)
|
||||
entries = [ ]
|
||||
for entry in dirents.values():
|
||||
if entry.kind == core.svn_node_dir:
|
||||
|
@ -625,7 +576,6 @@ class SubversionRepository(vclib.Repository):
|
|||
elif entry.kind == core.svn_node_file:
|
||||
kind = vclib.FILE
|
||||
entries.append(vclib.DirEntry(entry.name, kind))
|
||||
self._scratch_clear()
|
||||
return entries
|
||||
|
||||
def dirlogs(self, path_parts, rev, entries, options):
|
||||
|
@ -651,15 +601,12 @@ class SubversionRepository(vclib.Repository):
|
|||
path = self._getpath(path_parts)
|
||||
rev = self._getrev(rev)
|
||||
|
||||
revs = _fetch_log(self, path, rev, options, self.scratch_pool)
|
||||
self._scratch_clear()
|
||||
|
||||
revs = _fetch_log(self, path, rev, options)
|
||||
revs.sort()
|
||||
prev = None
|
||||
for rev in revs:
|
||||
rev.prev = prev
|
||||
prev = rev
|
||||
|
||||
return revs
|
||||
|
||||
def annotate(self, path_parts, rev):
|
||||
|
@ -684,8 +631,8 @@ class SubversionRepository(vclib.Repository):
|
|||
args = vclib._diff_args(type, options)
|
||||
|
||||
try:
|
||||
temp1 = temp_checkout(self, p1, r1, self.pool)
|
||||
temp2 = temp_checkout(self, p2, r2, self.pool)
|
||||
temp1 = temp_checkout(self, p1, r1)
|
||||
temp2 = temp_checkout(self, p2, r2)
|
||||
info1 = p1, date_from_rev(self, r1), r1
|
||||
info2 = p2, date_from_rev(self, r2), r2
|
||||
return vclib._diff_fp(temp1, temp2, info1, info2, self.diff_cmd, args)
|
||||
|
@ -712,5 +659,5 @@ class SubversionRepository(vclib.Repository):
|
|||
try:
|
||||
return self._fsroots[rev]
|
||||
except KeyError:
|
||||
r = self._fsroots[rev] = fs.revision_root(self.fs_ptr, rev, self.pool)
|
||||
r = self._fsroots[rev] = fs.revision_root(self.fs_ptr, rev)
|
||||
return r
|
||||
|
|
|
@ -24,9 +24,9 @@ from vclib.svn import Revision, ChangedPath, _datestr_to_date, _compare_paths, _
|
|||
from svn import core, delta, client, wc, ra
|
||||
|
||||
|
||||
### Require Subversion 1.3.0 or better. (for svn_ra_get_locations support)
|
||||
if (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_PATCH) < (1, 3, 0):
|
||||
raise Exception, "Version requirement not met (needs 1.3.0 or better)"
|
||||
### Require Subversion 1.3.1 or better. (for svn_ra_get_locations support)
|
||||
if (core.SVN_VER_MAJOR, core.SVN_VER_MINOR, core.SVN_VER_PATCH) < (1, 3, 1):
|
||||
raise Exception, "Version requirement not met (needs 1.3.1 or better)"
|
||||
|
||||
|
||||
def _rev2optrev(rev):
|
||||
|
|
Loading…
Reference in New Issue