stat_tests.py
来自「linux subdivision ying gai ke yi le ba」· Python 代码 · 共 794 行 · 第 1/2 页
PY
794 行
#!/usr/bin/env python
#
# stat_tests.py: testing the svn stat command
#
# 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, os.path, re, time
# Our testing module
import svntest
# (abbreviation)
Skip = svntest.testcase.Skip
XFail = svntest.testcase.XFail
Item = svntest.wc.StateItem
######################################################################
# Tests
#
# Each test must return on success or raise on failure.
#----------------------------------------------------------------------
def status_unversioned_file_in_current_dir(sbox):
"status on unversioned file in current directory"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
try:
os.chdir(wc_dir)
svntest.main.file_append('foo', 'a new file')
svntest.actions.run_and_verify_svn(None, [ "? foo\n" ], [],
'stat', 'foo')
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
# Regression for issue #590
def status_update_with_nested_adds(sbox):
"run 'status -u' when nested additions are pending"
sbox.build()
wc_dir = sbox.wc_dir
# Make a backup copy of the working copy
wc_backup = sbox.add_wc_path('backup')
svntest.actions.duplicate_dir(wc_dir, wc_backup)
# Create newdir and newfile
newdir_path = os.path.join(wc_dir, 'newdir')
newfile_path = os.path.join(wc_dir, 'newdir', 'newfile')
os.makedirs(newdir_path)
svntest.main.file_append (newfile_path, 'new text')
# Schedule newdir and newfile for addition (note that the add is recursive)
svntest.main.run_svn(None, 'add', newdir_path)
# Created expected output tree for commit
expected_output = svntest.wc.State(wc_dir, {
'newdir' : Item(verb='Adding'),
'newdir/newfile' : Item(verb='Adding'),
})
# Create expected status tree; all local revisions should be at 1,
# but newdir and newfile should be at revision 2.
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.add({
'newdir' : Item(status=' ', wc_rev=2, repos_rev=2),
'newdir/newfile' : Item(status=' ', wc_rev=2, repos_rev=2),
})
# Commit.
svntest.actions.run_and_verify_commit (wc_dir, expected_output,
expected_status, None,
None, None, None, None, wc_dir)
# Now we go to the backup working copy, still at revision 1.
# We will run 'svn st -u', and make sure that newdir/newfile is reported
# as a nonexistent (but pending) path.
# Create expected status tree; all local revisions should be at 1,
# but newdir and newfile should be present with 'blank' attributes.
expected_status = svntest.actions.get_virginal_state(wc_backup, 2)
expected_status.tweak(wc_rev=1)
# Verify status. Notice that we're running status *without* the
# --quiet flag, so the unversioned items will appear.
# Unfortunately, the regexp that we currently use to parse status
# output is unable to parse a line that has no working revision! If
# an error happens, we'll catch it here. So that's a good enough
# regression test for now. Someday, though, it would be nice to
# positively match the mostly-empty lines.
svntest.actions.run_and_verify_unquiet_status(wc_backup,
expected_status)
#----------------------------------------------------------------------
# svn status -vN should include all entries in a directory
def status_shows_all_in_current_dir(sbox):
"status -vN shows all items in current directory"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
try:
output, err = svntest.actions.run_and_verify_svn(None, None, [],
'stat', '-vN')
if (len(output) != len(os.listdir("."))):
raise svntest.Failure
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
def status_missing_file(sbox):
"status with a versioned file missing"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
try:
os.remove('iota')
output, err = svntest.actions.run_and_verify_svn(None, None, [], 'status')
for line in output:
if not re.match("! +iota", line):
raise svntest.Failure
# This invocation is for issue #2127.
output, err = svntest.actions.run_and_verify_svn(None, None, [],
'status', '-u', 'iota')
found_it = 0
for line in output:
if re.match("! +1 +iota", line):
found_it = 1
if not found_it:
raise svntest.Failure
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
def status_type_change(sbox):
"status on versioned items whose type has changed"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
try:
# First replace a versioned dir with a file and a versioned file
# with a versioned dir.
os.rename('iota', 'was_iota')
os.rename('A', 'iota')
os.rename('was_iota', 'A')
output, err = svntest.actions.run_and_verify_svn(None, None, [], 'status')
if len(output) != 2:
raise svntest.Failure
for line in output:
if not re.match("~ +(iota|A)", line):
raise svntest.Failure
# Now change the file that is obstructing the versioned dir into an
# unversioned dir.
os.remove('A')
os.mkdir('A')
output, err = svntest.actions.run_and_verify_svn(None, None, [], 'status')
if len(output) != 2:
raise svntest.Failure
for line in output:
if not re.match("~ +(iota|A)", line):
raise svntest.Failure
# Now change the versioned dir that is obstructing the file into an
# unversioned dir.
svntest.main.safe_rmtree('iota')
os.mkdir('iota')
output, err = svntest.actions.run_and_verify_svn(None, None, [], 'status')
if len(output) != 2:
raise svntest.Failure
for line in output:
if not re.match("~ +(iota|A)", line):
raise svntest.Failure
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
def status_type_change_to_symlink(sbox):
"status on versioned items replaced by symlinks"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
try:
# "broken" symlinks
os.remove('iota')
os.symlink('foo', 'iota')
svntest.main.safe_rmtree('A/D')
os.symlink('bar', 'A/D')
output, err = svntest.actions.run_and_verify_svn(None, None, [], 'status')
if len(output) != 2:
raise svntest.Failure
for line in output:
if not re.match("~ +(iota|A/D)", line):
raise svntest.Failure
# "valid" symlinks
os.remove('iota')
os.remove('A/D')
os.symlink('A/mu', 'iota')
os.symlink('C', 'A/D')
output, err = svntest.actions.run_and_verify_svn(None, None, [], 'status')
if len(output) != 2:
raise svntest.Failure
for line in output:
if not re.match("~ +(iota|A/D)", line):
raise svntest.Failure
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
# Regression test for revision 3686.
def status_with_new_files_pending(sbox):
"status -u with new files in the repository"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
try:
svntest.main.file_append('newfile', 'this is a new file')
svntest.main.run_svn(None, 'add', 'newfile')
svntest.main.run_svn(None, 'ci', '-m', 'logmsg')
svntest.main.run_svn(None, 'up', '-r', '1')
output, err = svntest.actions.run_and_verify_svn(None, None, [],
'status', '-u')
# The bug fixed in revision 3686 was a seg fault. We don't have a
# reliable way to detect a seg fault here, since we haven't dealt
# with the popen2{Popen3,Popen4} mess in Python yet (the latter two
# are classes within the first, which is a module, and the Popen3
# class is not the same as os.popen3(). Got that?) See the Python
# docs for details; in the meantime, no output means there was a
# problem.
for line in output:
if line.find('newfile') != -1:
break
else:
raise svntest.Failure
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
def status_for_unignored_file(sbox):
"status for unignored file and directory"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
try:
svntest.main.file_append('newfile', 'this is a new file')
os.makedirs('newdir')
svntest.main.run_svn(None, 'propset', 'svn:ignore', 'new*', '.')
# status on the directory with --no-ignore
svntest.actions.run_and_verify_svn(None,
['I newdir\n',
'I newfile\n',
' M .\n'],
[],
'status', '--no-ignore', '.')
# status specifying the file explicitly on the command line
svntest.actions.run_and_verify_svn(None,
['I newdir\n',
'I newfile\n'],
[],
'status', 'newdir', 'newfile')
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
def status_for_nonexistent_file(sbox):
"status on missing and unversioned file"
sbox.build()
wc_dir = sbox.wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
try:
output, err = svntest.actions.run_and_verify_svn(None, None, [],
'status',
'nonexistent-file')
# there should *not* be a status line printed for the nonexistent file
for line in output:
if re.match(" +nonexistent-file", line):
raise svntest.Failure
finally:
os.chdir(was_cwd)
#----------------------------------------------------------------------
def status_file_needs_update(sbox):
"status -u indicates out-of-dateness"
# See this thread:
#
# http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=27975
#
# Basically, Andreas was seeing inconsistent results depending on
# whether or not he accompanied 'svn status -u' with '-v':
#
# % svn st -u
# Head revision: 67
# %
#
# ...and yet...
#
# % svn st -u -v
# 56 6 k cron-daily.pl
# * 56 44 k crontab.root
# 56 6 k gmls-lR.pl
# Head revision: 67
# %
#
# The first status should show the asterisk, too. There was never
# any issue for this bug, so this comment and the thread are your
# audit trail :-).
sbox.build()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?