📄 prop_tests.py
字号:
svntest.actions.run_and_verify_status(wc_dir, expected_status)
#----------------------------------------------------------------------
# Issue #742: we used to screw up when committing a file replacement
# that also had properties. It was fixed by teaching
# svn_wc_props_modified_p and svn_wc_transmit_prop_deltas to *ignore*
# leftover base-props when a file is scheduled for replacement. (When
# we svn_wc_add a file, it starts life with no working props.)
def commit_replacement_props(sbox):
"props work when committing a replacement"
# Bootstrap
sbox.build()
wc_dir = sbox.wc_dir
# Add a property to two files
iota_path = os.path.join(wc_dir, 'iota')
lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
svntest.main.run_svn(None, 'propset', 'cash-sound', 'cha-ching!', iota_path)
svntest.main.run_svn(None, 'propset', 'boson', 'W', lambda_path)
# Commit (### someday use run_and_verify_commit for better coverage)
svntest.actions.run_and_verify_svn("Error in property commit",
None, [], 'ci', '-m', 'logmsg', wc_dir)
# Schedule both files for deletion
svntest.main.run_svn(None, 'rm', iota_path, lambda_path)
# Now recreate the files, and schedule them for addition.
# Poof, the 'new' files don't have any properties at birth.
svntest.main.file_append (iota_path, 'iota TNG')
svntest.main.file_append (lambda_path, 'lambda TNG')
svntest.main.run_svn(None, 'add', iota_path, lambda_path)
# Sanity check: the two files should be scheduled for (R)eplacement.
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak(repos_rev=2)
expected_status.tweak('iota', wc_rev=2, status='R ')
expected_status.tweak('A/B/lambda', wc_rev=2, status='R ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Now add a property to lambda. Iota still doesn't have any.
svntest.main.run_svn(None, 'propset', 'capacitor', 'flux', lambda_path)
# Commit, with careful output checking. We're actually going to
# scan the working copy for props after the commit.
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Replacing'),
'A/B/lambda' : Item(verb='Replacing'),
})
# Expected status tree: lambda has one prop, iota doesn't.
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak(repos_rev=3)
expected_status.tweak('iota', wc_rev=3)
expected_status.tweak('A/B/lambda', wc_rev=3, status=' ')
svntest.actions.run_and_verify_commit (wc_dir, expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
#----------------------------------------------------------------------
def revert_replacement_props(sbox):
"props work when reverting a replacement"
# Bootstrap
sbox.build()
wc_dir = sbox.wc_dir
# Add a property to two files
iota_path = os.path.join(wc_dir, 'iota')
lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
svntest.main.run_svn(None, 'propset', 'cash-sound', 'cha-ching!', iota_path)
svntest.main.run_svn(None, 'propset', 'boson', 'W', lambda_path)
# Commit rev 2. (### someday use run_and_verify_commit for better coverage)
svntest.actions.run_and_verify_svn("Error in property commit", None, [],
'ci', '-m', 'logmsg', wc_dir)
# Schedule both files for deletion
svntest.main.run_svn(None, 'rm', iota_path, lambda_path)
# Now recreate the files, and schedule them for addition.
# Poof, the 'new' files don't have any properties at birth.
svntest.main.file_append (iota_path, 'iota TNG')
svntest.main.file_append (lambda_path, 'lambda TNG')
svntest.main.run_svn(None, 'add', iota_path, lambda_path)
# Sanity check: the two files should be scheduled for (R)eplacement.
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.tweak(repos_rev=2)
expected_status.tweak('iota', wc_rev=2, status='R ')
expected_status.tweak('A/B/lambda', wc_rev=2, status='R ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Now add a property to lambda. Iota still doesn't have any.
svntest.main.run_svn(None, 'propset', 'capacitor', 'flux', lambda_path)
# Now revert both files.
svntest.main.run_svn(None, 'revert', iota_path, lambda_path)
# Do an update; even though the update is really a no-op,
# run_and_verify_update has the nice feature of scanning disk as
# well as running status. We want to verify that we truly have a
# *pristine* revision 2 tree, with the original rev 2 props, and no
# local mods at all.
expected_output = svntest.wc.State(wc_dir, {
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak('iota', status=' ')
expected_status.tweak('A/B/lambda', status=' ')
expected_disk = svntest.main.greek_state.copy()
expected_disk.tweak('iota', props={'cash-sound' : 'cha-ching!'})
expected_disk.tweak('A/B/lambda', props={'boson' : 'W'})
# scan disk for props too.
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
expected_status,
None, None, None, None, None,
1)
#----------------------------------------------------------------------
def inappropriate_props(sbox):
"try to set inappropriate props"
# Bootstrap
sbox.build()
wc_dir = sbox.wc_dir
A_path = os.path.join(wc_dir, 'A')
E_path = os.path.join(wc_dir, 'A', 'B', 'E')
iota_path = os.path.join(wc_dir, 'iota')
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# These should produce an error
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:executable', 'on', A_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:keywords', 'LastChangedDate',
A_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:eol-style', 'native', A_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:mime-type', 'image/png', A_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:ignore', '*.o', iota_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:externals',
'foo http://host.com/repos', iota_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:author', 'socrates', iota_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:log', 'log message', iota_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:date',
'Tue Jan 19 04:14:07 2038',
iota_path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput, 'propset',
'svn:original-date',
'Thu Jan 1 01:00:00 1970',
iota_path)
# Status unchanged
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Recursive setting of inappropriate dir prop should work on files
svntest.actions.run_and_verify_svn(None, None, [], 'propset', '-R',
'svn:executable', 'on', E_path)
expected_status.tweak('A/B/E/alpha', 'A/B/E/beta', status=' M')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Issue #920. Don't allow setting of svn:eol-style on binary files or files
# with inconsistent eol types.
path = os.path.join(wc_dir, 'binary')
svntest.main.file_append(path, "binary")
svntest.main.run_svn(None, 'add', path)
svntest.main.run_svn(None, 'propset', 'svn:mime-type',
'application/octet-stream', path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput,
'propset', 'svn:eol-style',
'CRLF', path)
path = os.path.join(wc_dir, 'multi-eol')
svntest.main.file_append(path, "line1\rline2\n")
svntest.main.run_svn(None, 'add', path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput,
'propset', 'svn:eol-style',
'LF', path)
path = os.path.join(wc_dir, 'backwards-eol')
svntest.main.file_append(path, "line1\n\r")
svntest.main.run_svn(None, 'add', path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput,
'propset', 'svn:eol-style',
'native', path)
path = os.path.join(wc_dir, 'incomplete-eol')
svntest.main.file_append(path, "line1\r\n\r")
svntest.main.run_svn(None, 'add', path)
svntest.actions.run_and_verify_svn('Illegal target', None,
svntest.SVNAnyOutput,
'propset', 'svn:eol-style',
'CR', path)
#----------------------------------------------------------------------
# Issue #976. When copying a file, do not determine svn:executable
# and svn:mime-type values as though the file is brand new, instead
# use the copied file's property values.
def copy_inherits_special_props(sbox):
"file copies inherit (not re-derive) special props"
# Bootstrap
sbox.build()
wc_dir = sbox.wc_dir
orig_mime_type = 'image/fake_image'
# Create two paths
new_path1 = os.path.join(wc_dir, 'new_file1.bin')
new_path2 = os.path.join(wc_dir, 'new_file2.bin')
# Create the first path as a binary file. To have svn treat the
# file as binary, have a 0x00 in the file.
svntest.main.file_append(new_path1, "binary file\000")
svntest.main.run_svn(None, 'add', new_path1)
# Add initial svn:mime-type to the file
svntest.main.run_svn(None, 'propset', 'svn:mime-type', orig_mime_type,
new_path1)
# Set the svn:executable property on the file if this is a system
# that can handle chmod, in which case svn will turn on the
# executable bits on the file. Then remove the executable bits
# manually on the file and see the value of svn:executable in the
# copied file.
if os.name == 'posix':
svntest.main.run_svn(None, 'propset', 'svn:executable', 'on', new_path1)
os.chmod(new_path1, 0644)
# Commit the file
svntest.main.run_svn(None, 'ci', '-m', 'create file and set svn:mime-type',
wc_dir)
# Copy the file
svntest.main.run_svn(None, 'cp', new_path1, new_path2)
# Check the svn:mime-type
actual_stdout, actual_stderr = svntest.main.run_svn(None,
'pg',
'svn:mime-type',
new_path2)
expected_stdout = [orig_mime_type + '\n']
if actual_stdout != expected_stdout:
print "svn pg svn:mime-type output does not match expected."
print "Expected standard output: ", expected_stdout, "\n"
print "Actual standard output: ", actual_stdout, "\n"
raise svntest.actions.SVNUnexpectedOutput
# Check the svn:executable value.
# The value of the svn:executable property is now always forced to '*'
if os.name == 'posix':
actual_stdout, actual_stderr = svntest.main.run_svn(None,
'pg',
'svn:executable',
new_path2)
expected_stdout = ['*\n']
if actual_stdout != expected_stdout:
print "svn pg svn:executable output does not match expected."
print "Expected standard output: ", expected_stdout, "\n"
print "Actual standard output: ", actual_stdout, "\n"
raise svntest.actions.SVNUnexpectedOutput
#----------------------------------------------------------------------
def revprop_change(sbox):
"set, get, and delete a revprop change"
sbox.build()
hook = os.path.join(svntest.main.current_repo_dir,
'hooks', 'pre-revprop-change')
svntest.main.file_append(hook, "#!/bin/sh\n\nexit 0\n")
os.chmod(hook, 0755)
svntest.actions.run_and_verify_svn(None, None, [],
'propset', '--revprop', '-r', '0',
'cash-sound', 'cha-ching!', sbox.wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'propget', '--revprop', '-r', '0',
'cash-sound', sbox.wc_dir)
svntest.actions.run_and_verify_svn(None, None, [],
'propdel', '--revprop', '-r', '0',
'cash-sound', sbox.wc_dir)
actual_stdout, actual_stderr = svntest.main.run_svn(None,
'pg', '--revprop',
'-r', '0',
'cash-sound',
sbox.wc_dir)
# The property should have been deleted.
regex = 'cha-ching'
for line in actual_stdout:
if re.match(regex, line):
raise svntest.Failure
#----------------------------------------------------------------------
def prop_value_conversions(sbox):
"some svn: properties should be converted"
# Bootstrap
sbox.build()
wc_dir = sbox.wc_dir
A_path = os.path.join(wc_dir, 'A')
B_path = os.path.join(wc_dir, 'A', 'B')
iota_path = os.path.join(wc_dir, 'iota')
lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
mu_path = os.path.join(wc_dir, 'A', 'mu')
# We'll use a file to set the prop values, so that weird characters
# in the props don't confuse the shell.
propval_path = os.path.join(wc_dir, 'propval.tmp')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -