--- a/mercurial/subrepo.py Fri Apr 29 03:05:48 2011 -0500
+++ b/mercurial/subrepo.py Fri Mar 04 14:00:49 2011 +0100
@@ -10,6 +10,7 @@
from i18n import _
import config, util, node, error, cmdutil
hg = None
+propertycache = util.propertycache
nullstate = ('', '', 'empty')
@@ -521,7 +522,6 @@
self._ui = ctx._repo.ui
def _svncommand(self, commands, filename=''):
- path = os.path.join(self._ctx._repo.origroot, self._path, filename)
cmd = ['svn']
# Starting in svn 1.5 --non-interactive is a global flag
# instead of being per-command, but we need to support 1.4 so
@@ -531,7 +531,9 @@
commands[0] in ('update', 'checkout', 'commit')):
cmd.append('--non-interactive')
cmd.extend(commands)
- cmd.append(path)
+ if filename is not None:
+ path = os.path.join(self._ctx._repo.origroot, self._path, filename)
+ cmd.append(path)
env = dict(os.environ)
# Avoid localized output, preserve current locale for everything else.
env['LC_MESSAGES'] = 'C'
@@ -544,6 +546,14 @@
raise util.Abort(stderr)
return stdout
+ @propertycache
+ def _svnversion(self):
+ output = self._svncommand(['--version'], filename=None)
+ m = re.search(r'^svn,\s+version\s+(\d+)\.(\d+)', output)
+ if not m:
+ raise util.Abort(_('cannot retrieve svn tool version'))
+ return (int(m.group(1)), int(m.group(2)))
+
def _wcrevs(self):
# Get the working directory revision as well as the last
# commit revision so we can compare the subrepo state with
@@ -638,7 +648,11 @@
def get(self, state, overwrite=False):
if overwrite:
self._svncommand(['revert', '--recursive'])
- status = self._svncommand(['checkout', state[0], '--revision', state[1]])
+ args = ['checkout']
+ if self._svnversion >= (1, 5):
+ args.append('--force')
+ args.extend([state[0], '--revision', state[1]])
+ status = self._svncommand(args)
if not re.search('Checked out revision [0-9]+.', status):
raise util.Abort(status.splitlines()[-1])
self._ui.status(status)