#!/usr/bin/env python
#
# svnlook_tests.py: testing the 'svnlook' tool.
#
# Subversion is a tool for revision control.
# See http://subversion.tigris.org for more information.
#
# ====================================================================
# Copyright (c) 2000-2004 CollabNet. All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://subversion.tigris.org/license-1.html.
# If newer versions of this license are posted there, you may use a
# newer version instead, at your option.
#
######################################################################
# General modules
import string, sys, re, os.path
# Our testing module
import svntest
# (abbreviation)
Skip = svntest.testcase.Skip
XFail = svntest.testcase.XFail
Item = svntest.wc.StateItem
#----------------------------------------------------------------------
# Convenience functions to make writing more tests easier
def run_svnlook(*varargs):
output, dummy_errput = svntest.main.run_command(svntest.main.svnlook_binary,
0, 0, *varargs)
return output
def expect(tag, expected, got):
if expected != got:
print "When testing: %s" % tag
print "Expected: %s" % expected
print " Got: %s" % got
raise svntest.Failure
# Tests
def test_misc(sbox):
"test miscellaneous svnlook features"
sbox.build()
wc_dir = sbox.wc_dir
repo_dir = sbox.repo_dir
# Make a couple of local mods to files
mu_path = os.path.join(wc_dir, 'A', 'mu')
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
svntest.main.file_append (mu_path, 'appended mu text')
svntest.main.file_append (rho_path, 'new appended text for rho')
# Created expected output tree for 'svn ci'
expected_output = svntest.wc.State(wc_dir, {
'A/mu' : Item(verb='Sending'),
'A/D/G/rho' : Item(verb='Sending'),
})
# Create expected status tree; all local revisions should be at 1,
# but mu and rho should be at revision 2.
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.tweak('A/mu', 'A/D/G/rho', wc_rev=2)
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None,
None, None,
None, None,
wc_dir)
# give the repo a new UUID
uuid = "01234567-89ab-cdef-89ab-cdef01234567"
svntest.main.run_command_stdin(svntest.main.svnadmin_binary, None, 1,
["SVN-fs-dump-format-version: 2\n",
"\n",
"UUID: ", uuid, "\n",
],
'load', '--force-uuid', repo_dir)
expect('youngest', [ '2\n' ], run_svnlook('youngest', repo_dir))
expect('uuid', [ uuid + '\n' ], run_svnlook('uuid', repo_dir))
# it would be nice to test the author too, but the current test framework
# does not pull a username when testing over ra_dav or ra_svn,
# so the commits have an empty author.
expect('log', [ 'log msg\n' ], run_svnlook('log', repo_dir))
# check if the 'svnlook tree' output can be expanded to
# the 'svnlook tree --full-paths' output if demanding the whole repository
treelist = run_svnlook('tree', repo_dir)
treelistfull = run_svnlook('tree', '--full-paths', repo_dir)
path = ''
n = 0
for entry in treelist:
len1 = len(entry)
len2 = len(entry.lstrip())
path = path[0:2*(len1-len2)-1] + entry.strip()
test = treelistfull[n].rstrip()
if n != 0:
test = "/" + test
if not path == test:
print "Unexpected result from tree with --full-paths:"
print " entry : %s" % entry.rstrip()
print " with --full-paths: %s" % treelistfull[n].rstrip()
raise svntest.Failure
n = n + 1
# check if the 'svnlook tree' output is the ending of
# the 'svnlook tree --full-paths' output if demanding
# any part of the repository
n = 0
treelist = run_svnlook('tree', repo_dir, '/A/B')
treelistfull = run_svnlook('tree', '--full-paths', repo_dir, '/A/B')
for entry in treelist:
if not treelistfull[n].endswith(entry.lstrip()):
print "Unexpected result from tree with --full-paths:"
print " entry : %s" % entry.rstrip()
print " with --full-paths: %s" % treelistfull[n].rstrip()
raise svntest.Failure
n = n + 1
treelist = run_svnlook('tree', repo_dir, '/')
if treelist[0] != '/\n':
raise svntest.Failure
expect('propget svn:log', [ 'log msg' ],
run_svnlook('propget', '--revprop', repo_dir, 'svn:log'))
proplist = run_svnlook('proplist', '--revprop', repo_dir)
proplist = [prop.strip() for prop in proplist]
proplist.sort()
# We cannot rely on svn:author's presence. ra_svn doesn't set it.
if not (proplist == [ 'svn:author', 'svn:date', 'svn:log' ]
or proplist == [ 'svn:date', 'svn:log' ]):
print "Unexpected result from proplist: %s" % proplist
raise svntest.Failure
output, errput = svntest.main.run_svnlook('propget', '--revprop', repo_dir,
'foo:bar-baz-quux')
rm = re.compile("Property.*not found")
for line in errput:
match = rm.search(line)
if match:
break
else:
raise svntest.main.SVNUnmatchedError
#----------------------------------------------------------------------
# Issue 1089
def delete_file_in_moved_dir(sbox):
"delete file in moved dir"
sbox.build()
wc_dir = sbox.wc_dir
repo_dir = sbox.repo_dir
# move E to E2 and delete E2/alpha
E_path = os.path.join(wc_dir, 'A', 'B', 'E')
E2_path = os.path.join(wc_dir, 'A', 'B', 'E2')
svntest.actions.run_and_verify_svn(None, None, [], 'mv', E_path, E2_path)
alpha_path = os.path.join(E2_path, 'alpha')
svntest.actions.run_and_verify_svn(None, None, [], 'rm', alpha_path)
# commit
expected_output = svntest.wc.State(wc_dir, {
'A/B/E' : Item(verb='Deleting'),
'A/B/E2' : Item(verb='Adding'),
'A/B/E2/alpha' : Item(verb='Deleting'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta')
expected_status.add({
'A/B/E2' : Item(status=' ', wc_rev=2),
'A/B/E2/beta' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None,
None, None,
None, None,
wc_dir)
output, errput = svntest.main.run_svnlook("dirs-changed", repo_dir)
if errput:
raise svntest.Failure
# Okay. No failure, but did we get the right output?
if len(output) != 2:
raise svntest.Failure
if not ((string.strip(output[0]) == 'A/B/')
and (string.strip(output[1]) == 'A/B/E2/')):
raise svntest.Failure
#----------------------------------------------------------------------
# Issue 1241
def test_print_property_diffs(sbox):
"test the printing of property diffs"
sbox.build()
wc_dir = sbox.wc_dir
repo_dir = sbox.repo_dir
# Add a bogus property to iota
iota_path = os.path.join(wc_dir, 'iota')
svntest.actions.run_and_verify_svn(None, None, [], 'propset',
'bogus_prop', 'bogus_val', iota_path)
# commit the change
svntest.actions.run_and_verify_svn(None, None, [],
'ci', '-m', 'log msg', iota_path)
# Grab the diff
expected_output, err = svntest.actions.run_and_verify_svn(None, None, [],
'diff',
'-r', 'PREV',
iota_path)
output, errput = svntest.main.run_svnlook("diff", repo_dir)
if errput:
raise svntest.Failure
# Okay. No failure, but did we get the right output?
if len(output) != len(expected_output):
raise svntest.Failure
# replace wcdir/iota with iota in expected_output
for i in xrange(len(expected_output)):
expected_output[i] = string.replace(expected_output[i], iota_path, 'iota')
svntest.actions.compare_and_display_lines('', '', expected_output, output)
#----------------------------------------------------------------------
# Check that svnlook info repairs allows inconsistent line endings in logs.
def info_bad_newlines(sbox):
"svnlook info must allow inconsistent newlines"
dump_str = """SVN-fs-dump-format-version: 2
UUID: dc40867b-38f6-0310-9f5f-f81aa277e06e
Revision-number: 0
Prop-content-length: 56
Content-length: 56
K 8
svn:date
V 27
2005-05-03T19:09:41.129900Z
PROPS-END
Revision-number: 1
Prop-content-length: 99
Content-length: 99
K 7
svn:log
V 3
\n\r\n
K 10
svn:author
V 2
pl
K 8
svn:date
V 27
2005-05-03T19:10:19.975578Z
PROPS-END
Node-path: file
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 5
Text-content-md5: e1cbb0c3879af8347246f12c559a86b5
Content-length: 15
PROPS-END
text
"""
# Create virgin repos and working copy
svntest.main.safe_rmtree(sbox.repo_dir, 1)
svntest.main.create_repos(sbox.repo_dir)
svntest.main.set_repos_paths(sbox.repo_dir)
# load dumpfile with inconsistent newlines into repos.
output, errput = \
svntest.main.run_command_stdin(
"%s load --quiet %s" % (svntest.main.svnadmin_binary, sbox.repo_dir),
None, 1, dump_str)
output, errput = svntest.main.run_svnlook("info", sbox.repo_dir, "-r1")
if errput:
raise svntest.Failure
def changed_copy_info(sbox):
"test --copy-info flag on the changed command"
sbox.build()
wc_dir = sbox.wc_dir
repo_dir = sbox.repo_dir
# Copy alpha to /A/alpha2.
E_path = os.path.join(wc_dir, 'A', 'B', 'E')
alpha_path = os.path.join(wc_dir, 'A', 'B', 'E', 'alpha')
alpha2_path = os.path.join(wc_dir, 'A', 'alpha2')
svntest.actions.run_and_verify_svn(None, None, [], 'cp', alpha_path,
alpha2_path)
# commit
expected_output = svntest.wc.State(wc_dir, {
'A/alpha2' : Item(verb='Adding'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.add({
'A/alpha2' : Item(status=' ', wc_rev=2),
})
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None,
None, None,
None, None,
wc_dir)
output, errput = svntest.main.run_svnlook("changed", repo_dir)
if errput:
raise svntest.Failure
expect("changed without --copy-info", ["A A/alpha2\n"], output)
output, errput = svntest.main.run_svnlook("changed", repo_dir, "--copy-info")
if errput:
raise svntest.Failure
expect("changed with --copy-info",
["A + A/alpha2\n",
" (from A/B/E/alpha:r1)\n"],
output)
########################################################################
# Run the tests
# list all tests here, starting with None:
test_list = [ None,
test_misc,
delete_file_in_moved_dir,
test_print_property_diffs,
info_bad_newlines,
changed_copy_info,
]
if __name__ == '__main__':
svntest.main.run_tests(test_list)
# NOTREACHED
### End of file.
syntax highlighted by Code2HTML, v. 0.9.1