stat_tests.py
来自「linux subdivision ying gai ke yi le ba」· Python 代码 · 共 794 行 · 第 1/2 页
PY
794 行
wc_dir = sbox.wc_dir
other_wc = sbox.add_wc_path('other')
svntest.actions.duplicate_dir(wc_dir, other_wc)
was_cwd = os.getcwd()
os.chdir(wc_dir)
svntest.main.file_append('crontab.root', 'New file crontab.root.\n')
svntest.main.run_svn(None, 'add', 'crontab.root')
svntest.main.run_svn(None, 'ci', '-m', 'log msg')
os.chdir(was_cwd)
os.chdir(other_wc)
svntest.main.run_svn(None, 'up')
os.chdir(was_cwd)
os.chdir(wc_dir)
svntest.main.file_append('crontab.root', 'New line in crontab.root.\n')
svntest.main.run_svn(None, 'ci', '-m', 'log msg')
# The `svntest.actions.run_and_verify_*_status' routines all pass
# the -v flag, which we don't want, as this bug never appeared when
# -v was passed. So we run status by hand:
os.chdir(was_cwd)
out, err = svntest.actions.run_and_verify_svn(None, None, [],
'status', '-u', other_wc)
for line in out:
if re.match("\\s+\\*.*crontab\\.root$", line):
break
else:
raise svntest.Failure
#----------------------------------------------------------------------
def status_uninvited_parent_directory(sbox):
"status -u on outdated, added file shows only that"
# To reproduce, check out working copies wc1 and wc2, then do:
#
# $ cd wc1
# $ echo "new file" >> newfile
# $ svn add newfile
# $ svn ci -m 'log msg'
#
# $ cd ../wc2
# $ echo "new file" >> newfile
# $ svn add newfile
#
# $ cd ..
# $ svn st wc2/newfile
#
# You *should* get one line of status output, for newfile. The bug
# is that you get two instead, one for newfile, and one for its
# parent directory, wc2/.
#
# This bug was originally discovered during investigations into
# issue #1042, "fixed" in revision 4181, then later the fix was
# reverted because it caused other status problems (see the test
# status_file_needs_update(), which fails when 4181 is present).
sbox.build()
wc_dir = sbox.wc_dir
other_wc = sbox.add_wc_path('other')
svntest.actions.duplicate_dir(wc_dir, other_wc)
was_cwd = os.getcwd()
os.chdir(wc_dir)
svntest.main.file_append('newfile', 'New file.\n')
svntest.main.run_svn(None, 'add', 'newfile')
svntest.main.run_svn(None, 'ci', '-m', 'log msg')
os.chdir(was_cwd)
os.chdir(other_wc)
svntest.main.file_append('newfile', 'New file.\n')
svntest.main.run_svn(None, 'add', 'newfile')
os.chdir(was_cwd)
# We don't want a full status tree here, just one line (or two, if
# the bug is present). So run status by hand:
os.chdir(was_cwd)
out, err = svntest.actions.run_and_verify_svn(
None, None, [],
'status', '-u', os.path.join(other_wc, 'newfile'))
for line in out:
# The "/?" is just to allow for an optional trailing slash.
if re.match("\\s+\\*.*\.other/?$", line):
raise svntest.Failure
def status_on_forward_deletion(sbox):
"status -u on working copy deleted in HEAD"
# See issue #1289.
sbox.build()
wc_dir = sbox.wc_dir
top_url = svntest.main.current_repo_url
A_url = top_url + '/A'
svntest.main.run_svn(None, 'rm', '-m', 'Remove A.', A_url)
svntest.main.safe_rmtree(wc_dir)
os.mkdir(wc_dir)
saved_cwd = os.getcwd()
os.chdir(wc_dir)
try:
svntest.main.run_svn(None, 'co', '-r1', top_url, 'wc')
# If the bug is present, this will error with
#
# subversion/libsvn_wc/lock.c:513: (apr_err=155005)
# svn: Working copy not locked
# svn: directory '' not locked
#
svntest.actions.run_and_verify_svn(None, None, [], 'st', '-u', 'wc')
# Try again another way; the error would look like this:
#
# subversion/libsvn_repos/delta.c:207: (apr_err=160005)
# svn: Invalid filesystem path syntax
# svn: svn_repos_dir_delta: invalid editor anchoring; at least \
# one of the input paths is not a directory and there was \
# no source entry.
#
# (Dang! Hope a user never has to see that :-) ).
#
svntest.main.safe_rmtree('wc')
svntest.main.run_svn(None, 'co', '-r1', A_url, 'wc')
svntest.actions.run_and_verify_svn(None, None, [], 'st', '-u', 'wc')
finally:
os.chdir(saved_cwd)
#----------------------------------------------------------------------
# Helper for timestamp_behaviour test
def get_prop_timestamp(path):
"get the prop-time for path using svn info"
out, err = svntest.actions.run_and_verify_svn(None, None, [], 'info', path)
for line in out:
if re.match("^Properties Last Updated", line):
return line
print "Didn't find prop-time for " + path
raise svntest.Failure
# Helper for timestamp_behaviour test
def get_text_timestamp(path):
"get the text-time for path using svn info"
out, err = svntest.actions.run_and_verify_svn(None, None, [], 'info', path)
for line in out:
if re.match("^Text Last Updated", line):
return line
print "Didn't find text-time for " + path
raise svntest.Failure
# Helper for timestamp_behaviour test
def prop_time_behaviour(wc_dir, wc_path, status_path, expected_status):
"prop-time behaviour"
# Pristine prop-time
pre_prop_time = get_prop_timestamp(wc_path)
# Modifying the property does not affect the prop-time
svntest.actions.run_and_verify_svn(None, None, [],
'propset', 'name', 'xxx', wc_path)
expected_status.tweak(status_path, status=' M')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
prop_time = get_prop_timestamp(wc_path)
if prop_time != pre_prop_time:
raise svntest.Failure
# Manually reverting the property does not affect the prop-time
svntest.actions.run_and_verify_svn(None, None, [],
'propset', 'name', 'value', wc_path)
expected_status.tweak(status_path, status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
prop_time = get_prop_timestamp(wc_path)
if prop_time != pre_prop_time:
raise svntest.Failure
# svn revert changes the prop-time even though the properties don't change
svntest.actions.run_and_verify_svn(None, None, [], 'revert', wc_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
prop_time = get_prop_timestamp(wc_path)
if prop_time == pre_prop_time:
raise svntest.Failure
# Is this really a status test? I'm not sure, but I don't know where
# else to put it.
def timestamp_behaviour(sbox):
"timestamp behaviour"
sbox.build()
wc_dir = sbox.wc_dir
# Setup a file and directory with properties
A_path = os.path.join(wc_dir, 'A')
iota_path = os.path.join(wc_dir, 'iota')
svntest.actions.run_and_verify_svn(None, None, [],
'propset', 'name', 'value',
A_path, iota_path)
svntest.actions.run_and_verify_svn(None, None, [], 'commit',
'--username', svntest.main.wc_author,
'--password', svntest.main.wc_passwd,
'--message', 'log message',
wc_dir)
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.tweak('iota', 'A', wc_rev=2)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Sleep to ensure timestamps change
time.sleep(2)
# Check behaviour of prop-time
prop_time_behaviour(wc_dir, iota_path, 'iota', expected_status)
prop_time_behaviour(wc_dir, A_path, 'A', expected_status)
# Check behaviour of text-time
# Pristine text and text-time
fp = open(iota_path, 'r')
pre_text = fp.readlines()
pre_text_time = get_text_timestamp(iota_path)
# Modifying the text does not affect text-time
svntest.main.file_append (iota_path, "some mod")
expected_status.tweak('iota', status='M ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
text_time = get_text_timestamp(iota_path)
if text_time != pre_text_time:
raise svntest.Failure
# Manually reverting the text does not affect the text-time
fp = open(iota_path, 'w')
fp.writelines(pre_text)
fp.close()
expected_status.tweak('iota', status=' ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
text_time = get_text_timestamp(iota_path)
if text_time != pre_text_time:
raise svntest.Failure
# svn revert changes the text-time even though the text doesn't change
svntest.actions.run_and_verify_svn(None, None, [], 'revert', iota_path)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
text_time = get_text_timestamp(iota_path)
if text_time == pre_text_time:
raise svntest.Failure
#----------------------------------------------------------------------
def status_on_unversioned_dotdot(sbox):
"status on '..' where '..' is not versioned"
# See issue #1617.
sbox.build()
wc_dir = sbox.wc_dir
new_dir = os.path.join(wc_dir, 'new_dir')
new_subdir = os.path.join(new_dir, 'new_subdir')
os.mkdir(new_dir)
os.mkdir(new_subdir)
saved_cwd = os.getcwd()
os.chdir(new_subdir)
try:
out, err = svntest.main.run_svn(1, 'st', '..')
matched = 0
for line in err:
if re.match(".*which is unsupported for this operation", line):
matched = 1
break
if not matched:
raise svntest.Failure
finally:
os.chdir(saved_cwd)
#----------------------------------------------------------------------
def status_on_partially_nonrecursive_wc(sbox):
"status -u in partially non-recursive wc"
# Based on issue #2122.
#
# $ svn co -N -r 213 svn://svn.debian.org/pkg-kde .
# A README
# Checked out revision 213.
#
# $ svn up -r 213 scripts www
# [ List of scripts/* files.]
# Updated to revision 213.
# [ List of www/* files.]
# Updated to revision 213.
#
# $ svn st -u
# * 213 www/IGNORE-ME
# * 213 www
# svn: subversion/libsvn_wc/status.c:910: tweak_statushash: \
# Assertion `repos_text_status == svn_wc_status_added' failed. \
# Aborted (core dumped)
#
# You might think that the intermediate "svn up -r 213 scripts www"
# step is unnecessary, but when I tried eliminating it, I got
#
# $ svn st -u
# subversion/libsvn_wc/lock.c:642: (apr_err=155005)
# svn: Working copy 'www' not locked
# $
#
# instead of the assertion error.
sbox.build()
wc_dir = sbox.wc_dir
top_url = svntest.main.current_repo_url
A_url = top_url + '/A'
D_url = top_url + '/A/D'
G_url = top_url + '/A/D/G'
H_url = top_url + '/A/D/H'
rho = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
# Commit a change to A/D/G/rho. This will be our equivalent of
# whatever change it was that happened between r213 and HEAD in the
# reproduction recipe. For us, it's r2.
svntest.main.file_append(rho, 'Whan that Aprille with his shoores soote\n')
svntest.main.run_svn(None, 'ci', '-m', 'log msg', rho)
# Make the working copy weird in the right way, then try status -u.
D_wc = sbox.add_wc_path('D')
svntest.main.run_svn(None, 'co', '-r1', '-N', D_url, D_wc)
saved_cwd = os.getcwd()
try:
os.chdir(D_wc)
svntest.main.run_svn(None, 'up', '-r1', 'H')
svntest.main.run_svn(None, 'st', '-u')
finally:
os.chdir(saved_cwd)
def missing_dir_in_anchor(sbox):
"a missing dir in the anchor"
sbox.build()
wc_dir = sbox.wc_dir
foo_path = os.path.join(wc_dir, 'foo')
svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', foo_path)
expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
expected_status.add({
'foo' : Item(status='A ', wc_rev=0, repos_rev=1),
})
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# At one point this caused a "foo not locked" error
svntest.main.safe_rmtree(foo_path)
expected_status.remove('foo')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
#----------------------------------------------------------------------
########################################################################
# Run the tests
# list all tests here, starting with None:
test_list = [ None,
status_unversioned_file_in_current_dir,
status_update_with_nested_adds,
status_shows_all_in_current_dir,
status_missing_file,
status_type_change,
Skip(status_type_change_to_symlink, (os.name != 'posix')),
status_with_new_files_pending,
status_for_unignored_file,
status_for_nonexistent_file,
status_file_needs_update,
status_uninvited_parent_directory,
status_on_forward_deletion,
timestamp_behaviour,
status_on_unversioned_dotdot,
missing_dir_in_anchor,
]
if __name__ == '__main__':
svntest.main.run_tests(test_list)
# NOTREACHED
### End of file.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?