[py-svn] r51978 - in py/branch/guido-svn-auth/py/path/svn: . testing
guido at codespeak.net
guido at codespeak.net
Sat Mar 1 11:00:07 CET 2008
Author: guido
Date: Sat Mar 1 11:00:07 2008
New Revision: 51978
Modified:
py/branch/guido-svn-auth/py/path/svn/testing/test_auth.py
py/branch/guido-svn-auth/py/path/svn/wccommand.py
Log:
Refactored the tests a bit to avoid redundancy, made that the svnwc api is
similar to the svnurl one (so both now have a property 'auth' that allows
overriding auth on a per-object basis, rather than having to pass the SvnAuth
instance as an argument to all methods that hit the server).
Modified: py/branch/guido-svn-auth/py/path/svn/testing/test_auth.py
==============================================================================
--- py/branch/guido-svn-auth/py/path/svn/testing/test_auth.py (original)
+++ py/branch/guido-svn-auth/py/path/svn/testing/test_auth.py Sat Mar 1 11:00:07 2008
@@ -93,34 +93,32 @@
self.commands.append(args)
class TestSvnWCAuth(object):
+ def setup_method(self, meth):
+ self.auth = SvnAuth('user', 'pass', cache_auth=False)
+
def test_checkout(self):
- wc = svnwc_no_svn('foo')
- auth = SvnAuth('user', 'pass')
- wc.checkout('url', auth=auth)
- assert wc.commands == [('co', 'url',
- '--username="user" --password="pass"')]
+ wc = svnwc_no_svn('foo', auth=self.auth)
+ wc.checkout('url')
+ assert wc.commands[0][-1] == ('--username="user" --password="pass" '
+ '--no-auth-cache')
def test_commit(self):
- wc = svnwc_no_svn('foo')
- auth = SvnAuth('user', 'pass')
- wc.commit('msg', auth=auth)
- assert wc.commands == [('commit -m "msg" --force-log',
- '--username="user" --password="pass"')]
+ wc = svnwc_no_svn('foo', auth=self.auth)
+ wc.commit('msg')
+ assert wc.commands[0][-1] == ('--username="user" --password="pass" '
+ '--no-auth-cache')
def test_checkout_no_cache_auth(self):
- wc = svnwc_no_svn('foo')
- auth = SvnAuth('user', 'pass', cache_auth=False)
- wc.checkout('url', auth=auth)
- assert wc.commands == [('co', 'url',
- ('--username="user" --password="pass" '
- '--no-auth-cache'))]
+ wc = svnwc_no_svn('foo', auth=self.auth)
+ wc.checkout('url')
+ assert wc.commands[0][-1] == ('--username="user" --password="pass" '
+ '--no-auth-cache')
def test_checkout_auth_from_constructor(self):
- auth = SvnAuth('user', 'pass')
- wc = svnwc_no_svn('foo', auth=auth)
+ wc = svnwc_no_svn('foo', auth=self.auth)
wc.checkout('url')
- assert wc.commands == [('co', 'url',
- '--username="user" --password="pass"')]
+ assert wc.commands[0][-1] == ('--username="user" --password="pass" '
+ '--no-auth-cache')
class svnurl_no_svn(py.path.svnurl):
cmdexec_output = 'test'
@@ -137,44 +135,40 @@
class TestSvnURLAuth(object):
def setup_method(self, meth):
svnurl_no_svn.commands = []
+ self.auth = SvnAuth('foo', 'bar')
def test_init(self):
u = svnurl_no_svn('http://foo.bar/svn')
assert u.auth is None
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
- assert u.auth is auth
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
+ assert u.auth is self.auth
def test_new(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn/foo', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn/foo', auth=self.auth)
new = u.new(basename='bar')
- assert new.auth is auth
+ assert new.auth is self.auth
assert new.url == 'http://foo.bar/svn/bar'
def test_join(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
new = u.join('foo')
- assert new.auth is auth
+ assert new.auth is self.auth
assert new.url == 'http://foo.bar/svn/foo'
def test_listdir(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
u.cmdexec_output = '''\
1717 johnny 1529 Nov 04 14:32 LICENSE.txt
1716 johnny 5352 Nov 04 14:28 README.txt
'''
paths = u.listdir()
- assert paths[0].auth is auth
- assert paths[1].auth is auth
+ assert paths[0].auth is self.auth
+ assert paths[1].auth is self.auth
assert paths[0].basename == 'LICENSE.txt'
def test_info(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn/LICENSE.txt', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn/LICENSE.txt', auth=self.auth)
def dirpath(self):
return self
u.cmdexec_output = '''\
@@ -190,67 +184,47 @@
assert info.size == 1529
def test_open(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
foo = u.join('foo')
foo.check = lambda *args, **kwargs: True
ret = foo.open()
assert ret == 'test'
- assert foo.commands[0].endswith('svn cat "http://foo.bar/svn/foo" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in foo.commands[0]
def test_dirpath(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn/foo', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn/foo', auth=self.auth)
parent = u.dirpath()
- assert parent.auth is auth
+ assert parent.auth is self.auth
def test_mkdir(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
u.mkdir('foo', msg='created dir foo')
- assert u.commands[0].endswith('svn mkdir "-m" "created dir foo" '
- '"http://foo.bar/svn/foo" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in u.commands[0]
def test_copy(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
u2 = svnurl_no_svn('http://foo.bar/svn2')
u.copy(u2, 'copied dir')
- assert u.commands[0].endswith('svn copy -m "copied dir" '
- '"http://foo.bar/svn" '
- '"http://foo.bar/svn2" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in u.commands[0]
def test_rename(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn/foo', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn/foo', auth=self.auth)
u.rename('http://foo.bar/svn/bar', 'moved foo to bar')
- assert u.commands[0].endswith('svn move -m "moved foo to bar" --force '
- '"http://foo.bar/svn/foo" '
- '"http://foo.bar/svn/bar" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in u.commands[0]
def test_remove(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn/foo', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn/foo', auth=self.auth)
u.remove(msg='removing foo')
- assert u.commands[0].endswith('svn rm -m "removing foo" '
- '"http://foo.bar/svn/foo" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in u.commands[0]
def test_export(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
target = py.path.local('/foo')
u.export(target)
- assert u.commands[0].endswith('svn export "http://foo.bar/svn" "/foo" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in u.commands[0]
def test_log(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn/foo', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn/foo', auth=self.auth)
u.popen_output = py.std.StringIO.StringIO('''\
<?xml version="1.0"?>
<log>
@@ -264,20 +238,15 @@
''')
u.check = lambda *args, **kwargs: True
ret = u.log(10, 20, verbose=True)
- assert u.commands[0].endswith('svn log --xml -r 10:20 -v '
- '"http://foo.bar/svn/foo" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in u.commands[0]
assert len(ret) == 1
assert int(ret[0].rev) == 51381
assert ret[0].author == 'guido'
def test_propget(self):
- auth = SvnAuth('foo', 'bar')
- u = svnurl_no_svn('http://foo.bar/svn', auth=auth)
+ u = svnurl_no_svn('http://foo.bar/svn', auth=self.auth)
u.propget('foo')
- assert u.commands[0].endswith('svn propget "foo" '
- '"http://foo.bar/svn" '
- '--username="foo" --password="bar"')
+ assert '--username="foo" --password="bar"' in u.commands[0]
class SvnAuthFunctionalTestBase(object):
def setup_class(cls):
@@ -292,6 +261,8 @@
self.repopath = py.path.local(str(self.repo)[7:])
self.temppath = py.test.ensuretemp('TestSvnAuthFunctional.%s' % (
func_name))
+ self.auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False,
+ interactive=False)
def _start_svnserve(self):
make_repo_auth(self.repopath, {'johnny': ('foo', 'rw')})
@@ -304,8 +275,7 @@
def test_checkout_constructor_arg(self):
port, pid = self._start_svnserve()
try:
- auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False)
- wc = py.path.svnwc(self.temppath, auth=auth)
+ wc = py.path.svnwc(self.temppath, auth=self.auth)
wc.checkout(
'svn://localhost:%s/%s' % (port, self.repopath.basename))
assert wc.join('.svn').check()
@@ -317,11 +287,9 @@
def test_checkout_function_arg(self):
port, pid = self._start_svnserve()
try:
- auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False)
- wc = py.path.svnwc(self.temppath)
+ wc = py.path.svnwc(self.temppath, auth=self.auth)
wc.checkout(
- 'svn://localhost:%s/%s' % (port, self.repopath.basename),
- auth=auth)
+ 'svn://localhost:%s/%s' % (port, self.repopath.basename))
assert wc.join('.svn').check()
finally:
killproc(pid)
@@ -341,14 +309,12 @@
def test_log(self):
port, pid = self._start_svnserve()
try:
- auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
- wc = py.path.svnwc(self.temppath, auth)
+ wc = py.path.svnwc(self.temppath, self.auth)
wc.checkout(
'svn://localhost:%s/%s' % (port, self.repopath.basename))
foo = wc.ensure('foo.txt')
wc.commit('added foo.txt')
- log = foo.log(auth=auth)
+ log = foo.log()
assert len(log) == 1
assert log[0].msg == 'added foo.txt'
finally:
@@ -357,9 +323,7 @@
def test_switch(self):
port, pid = self._start_svnserve()
try:
- auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
- wc = py.path.svnwc(self.temppath, auth=auth)
+ wc = py.path.svnwc(self.temppath, auth=self.auth)
svnurl = 'svn://localhost:%s/%s' % (port, self.repopath.basename)
wc.checkout(svnurl)
wc.ensure('foo', dir=True).ensure('foo.txt').write('foo')
@@ -367,7 +331,7 @@
wc.ensure('bar', dir=True)
wc.commit('added bar dir')
bar = wc.join('bar')
- bar.switch(svnurl + '/foo', auth=auth)
+ bar.switch(svnurl + '/foo')
assert bar.join('foo.txt')
finally:
killproc(pid)
@@ -375,12 +339,10 @@
def test_update(self):
port, pid = self._start_svnserve()
try:
- auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
wc1 = py.path.svnwc(self.temppath.ensure('wc1', dir=True),
- auth=auth)
+ auth=self.auth)
wc2 = py.path.svnwc(self.temppath.ensure('wc2', dir=True),
- auth=auth)
+ auth=self.auth)
wc1.checkout(
'svn://localhost:%s/%s' % (port, self.repopath.basename))
wc2.checkout(
@@ -391,40 +353,38 @@
assert wc2.join('foo').check()
auth = py.path.SvnAuth('unknown', 'unknown', interactive=False)
- py.test.raises(Exception, 'wc2.update(auth=auth)')
+ wc2.auth = auth
+ py.test.raises(Exception, 'wc2.update()')
finally:
killproc(pid)
def test_lock_unlock_status(self):
port, pid = self._start_svnserve()
try:
- auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
- wc = py.path.svnwc(self.temppath, auth=auth)
+ wc = py.path.svnwc(self.temppath, auth=self.auth)
wc.checkout(
'svn://localhost:%s/%s' % (port, self.repopath.basename,))
wc.ensure('foo', file=True)
wc.commit('added foo file')
foo = wc.join('foo')
- foo.lock(auth=auth)
- status = foo.status(auth=auth)
+ foo.lock()
+ status = foo.status()
assert status.locked
- foo.unlock(auth=auth)
- status = foo.status(auth=auth)
+ foo.unlock()
+ status = foo.status()
assert not status.locked
auth = py.path.SvnAuth('unknown', 'unknown', interactive=False)
- py.test.raises(Exception, 'foo.lock(auth=auth)')
- py.test.raises(Exception, 'foo.unlock(auth=auth)')
+ foo.auth = auth
+ py.test.raises(Exception, 'foo.lock()')
+ py.test.raises(Exception, 'foo.unlock()')
finally:
killproc(pid)
def test_diff(self):
port, pid = self._start_svnserve()
try:
- auth = py.path.SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
- wc = py.path.svnwc(self.temppath, auth=auth)
+ wc = py.path.svnwc(self.temppath, auth=self.auth)
wc.checkout(
'svn://localhost:%s/%s' % (port, self.repopath.basename,))
wc.ensure('foo', file=True)
@@ -435,14 +395,15 @@
foo.write('bar')
diff = foo.diff()
assert '\n+bar\n' in diff
- foo.commit('added some content', auth=auth)
+ foo.commit('added some content')
diff = foo.diff()
assert not diff
- diff = foo.diff(rev=rev, auth=auth)
+ diff = foo.diff(rev=rev)
assert '\n+bar\n' in diff
auth = py.path.SvnAuth('unknown', 'unknown', interactive=False)
- py.test.raises(Exception, 'foo.diff(rev=rev, auth=auth)')
+ foo.auth = auth
+ py.test.raises(Exception, 'foo.diff(rev=rev)')
finally:
killproc(pid)
@@ -450,15 +411,13 @@
def test_listdir(self):
port, pid = self._start_svnserve()
try:
- auth = SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
u = py.path.svnurl(
'svn://localhost:%s/%s' % (port, self.repopath.basename),
- auth=auth)
+ auth=self.auth)
u.ensure('foo')
paths = u.listdir()
assert len(paths) == 1
- assert paths[0].auth is auth
+ assert paths[0].auth is self.auth
auth = SvnAuth('foo', 'bar', interactive=False)
u = py.path.svnurl(
@@ -471,16 +430,14 @@
def test_copy(self):
port, pid = self._start_svnserve()
try:
- auth = SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
u = py.path.svnurl(
'svn://localhost:%s/%s' % (port, self.repopath.basename),
- auth=auth)
+ auth=self.auth)
foo = u.ensure('foo')
bar = u.join('bar')
foo.copy(bar)
assert bar.check()
- assert bar.auth is auth
+ assert bar.auth is self.auth
auth = SvnAuth('foo', 'bar', interactive=False)
u = py.path.svnurl(
@@ -495,11 +452,9 @@
def test_write_read(self):
port, pid = self._start_svnserve()
try:
- auth = SvnAuth('johnny', 'foo', cache_auth=False,
- interactive=False)
u = py.path.svnurl(
'svn://localhost:%s/%s' % (port, self.repopath.basename),
- auth=auth)
+ auth=self.auth)
foo = u.ensure('foo')
fp = foo.open()
try:
Modified: py/branch/guido-svn-auth/py/path/svn/wccommand.py
==============================================================================
--- py/branch/guido-svn-auth/py/path/svn/wccommand.py (original)
+++ py/branch/guido-svn-auth/py/path/svn/wccommand.py Sat Mar 1 11:00:07 2008
@@ -35,7 +35,7 @@
svncommon.ALLOWED_CHARS):
raise ValueError("bad char in wcpath %s" % (wcpath, ))
self.localpath = py.path.local(wcpath)
- self._auth = auth
+ self.auth = auth
return self
strpath = property(lambda x: str(x.localpath), None, None, "string path")
@@ -64,24 +64,21 @@
info = self.info()
return py.path.svnurl(info.url)
-
def __repr__(self):
return "svnwc(%r)" % (self.strpath) # , self._url)
def __str__(self):
return str(self.localpath)
- def _makeauthoptions(self, auth):
- if auth is None:
- auth = self._auth
- if auth is None:
+ def _makeauthoptions(self):
+ if self.auth is None:
return ''
- return auth.makecmdoptions()
+ return self.auth.makecmdoptions()
- def _authsvn(self, cmd, args=None, auth=None):
- args = args and list(args) or []
- args.append(self._makeauthoptions(auth))
- return self._svn(cmd, *args)
+ def _authsvn(self, cmd, args=None):
+ args = args and list(args) or []
+ args.append(self._makeauthoptions())
+ return self._svn(cmd, *args)
def _svn(self, cmd, *args):
l = ['svn %s' % cmd]
@@ -114,11 +111,11 @@
raise
return out
- def switch(self, url, auth=None):
+ def switch(self, url):
""" switch to given URL. """
- self._authsvn('switch', [url], auth=auth)
+ self._authsvn('switch', [url])
- def checkout(self, url=None, rev=None, auth=None):
+ def checkout(self, url=None, rev=None):
""" checkout from url to local wcpath. """
args = []
if url is None:
@@ -133,11 +130,11 @@
else:
args.append('-r' + str(rev))
args.append(url)
- self._authsvn('co', args, auth=auth)
+ self._authsvn('co', args)
- def update(self, rev = 'HEAD', auth=None):
+ def update(self, rev = 'HEAD'):
""" update working copy item to given revision. (None -> HEAD). """
- self._authsvn('up', ['-r', rev], auth=auth)
+ self._authsvn('up', ['-r', rev])
def write(self, content, mode='wb'):
""" write content into local filesystem wc. """
@@ -145,7 +142,7 @@
def dirpath(self, *args):
""" return the directory Path of the current Path. """
- return self.__class__(self.localpath.dirpath(*args))
+ return self.__class__(self.localpath.dirpath(*args), auth=self.auth)
def _ensuredirs(self):
parent = self.dirpath()
@@ -213,16 +210,16 @@
_rex_status = re.compile(r'\s+(\d+|-)\s+(\S+)\s+(\S+)\s+(.*)')
- def lock(self, auth=None):
+ def lock(self):
""" set a lock (exclusive) on the resource """
- out = self._authsvn('lock', auth=auth).strip()
+ out = self._authsvn('lock').strip()
if not out:
# warning or error, raise exception
raise Exception(out[4:])
- def unlock(self, auth=None):
+ def unlock(self):
""" unset a previously set lock """
- out = self._authsvn('unlock', auth=auth).strip()
+ out = self._authsvn('unlock').strip()
if out.startswith('svn:'):
# warning or error, raise exception
raise Exception(out[4:])
@@ -235,7 +232,7 @@
except:
pass
- def status(self, updates=0, rec=0, externals=0, auth=None):
+ def status(self, updates=0, rec=0, externals=0):
""" return (collective) Status object for this file. """
# http://svnbook.red-bean.com/book.html#svn-ch-3-sect-4.3.1
# 2201 2192 jum test
@@ -263,7 +260,7 @@
update_rev = None
cmd = 'status -v %s %s %s' % (updates, rec, externals)
- out = self._authsvn(cmd, auth=auth)
+ out = self._authsvn(cmd)
rootstatus = WCStatus(self)
for line in out.split('\n'):
if not line.strip():
@@ -281,7 +278,8 @@
wcpath = self.join(fn, abs=1)
rootstatus.unknown.append(wcpath)
elif c0 == 'X':
- wcpath = self.__class__(self.localpath.join(fn, abs=1))
+ wcpath = self.__class__(self.localpath.join(fn, abs=1),
+ auth=self.auth)
rootstatus.external.append(wcpath)
elif c0 == 'I':
wcpath = self.join(fn, abs=1)
@@ -345,14 +343,14 @@
continue
return rootstatus
- def diff(self, rev=None, auth=None):
+ def diff(self, rev=None):
""" return a diff of the current path against revision rev (defaulting
to the last one).
"""
args = []
if rev is not None:
args.append("-r %d" % rev)
- out = self._authsvn('diff', args, auth=auth)
+ out = self._authsvn('diff', args)
return out
def blame(self):
@@ -373,14 +371,14 @@
return result
_rex_commit = re.compile(r'.*Committed revision (\d+)\.$', re.DOTALL)
- def commit(self, msg='', rec=1, auth=None):
+ def commit(self, msg='', rec=1):
""" commit with support for non-recursive commits """
from py.__.path.svn import cache
# XXX i guess escaping should be done better here?!?
cmd = 'commit -m "%s" --force-log' % (msg.replace('"', '\\"'),)
if not rec:
cmd += ' -N'
- out = self._authsvn(cmd, auth=auth)
+ out = self._authsvn(cmd)
try:
del cache.info[self]
except KeyError:
@@ -446,7 +444,7 @@
localpath = self.localpath.new(**kw)
else:
localpath = self.localpath
- return self.__class__(localpath)
+ return self.__class__(localpath, auth=self.auth)
def join(self, *args, **kwargs):
""" return a new Path (with the same revision) which is composed
@@ -455,7 +453,7 @@
if not args:
return self
localpath = self.localpath.join(*args, **kwargs)
- return self.__class__(localpath)
+ return self.__class__(localpath, auth=self.auth)
def info(self, usecache=1):
""" return an Info structure with svn-provided information. """
@@ -498,7 +496,7 @@
paths = []
for localpath in self.localpath.listdir(notsvn):
- p = self.__class__(localpath)
+ p = self.__class__(localpath, auth=self.auth)
paths.append(p)
if fil or sort:
@@ -533,7 +531,7 @@
else:
return True
- def log(self, rev_start=None, rev_end=1, verbose=False, auth=None):
+ def log(self, rev_start=None, rev_end=1, verbose=False):
""" return a list of LogEntry instances for this path.
rev_start is the starting revision (defaulting to the first one).
rev_end is the last revision (defaulting to HEAD).
@@ -551,7 +549,7 @@
verbose_opt = verbose and "-v" or ""
locale_env = svncommon.fixlocale()
# some blather on stderr
- auth_opt = self._makeauthoptions(auth)
+ auth_opt = self._makeauthoptions()
stdin, stdout, stderr = os.popen3(locale_env +
'svn log --xml %s %s %s "%s"' % (
rev_opt, verbose_opt, auth_opt,
@@ -579,7 +577,7 @@
return self.info().mtime
def __hash__(self):
- return hash((self.strpath, self.__class__))
+ return hash((self.strpath, self.__class__, self.auth))
class WCStatus:
More information about the py-svn
mailing list