📄 commit_tests.py
字号:
# Testing part 1 of the "Greg Hudson" problem -- variation 2. In this
# test, we make sure that a file that is BOTH `deleted' and scheduled
# for addition can be correctly committed & merged.
def hudson_part_1_variation_2(sbox):
"hudson prob 1.2: delete, commit, re-add, commit"
sbox.build()
wc_dir = sbox.wc_dir
# Remove gamma from the working copy.
gamma_path = os.path.join(wc_dir, 'A', 'D', 'gamma')
svntest.main.run_svn(None, 'rm', gamma_path)
# Create expected commit output.
expected_output = svntest.wc.State(wc_dir, {
'A/D/gamma' : Item(verb='Deleting'),
})
# After committing, status should show no sign of gamma.
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.remove('A/D/gamma')
# Commit the deletion of gamma and verify.
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
# Now gamma should be marked as `deleted' under the hood.
# Go ahead and re-add gamma, so that is *also* scheduled for addition.
svntest.main.file_append(gamma_path, "added gamma")
svntest.main.run_svn(None, 'add', gamma_path)
# For sanity, examine status: it should show a revision 2 tree with
# gamma scheduled for addition.
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.tweak('A/D/gamma', wc_rev=0, status='A ')
svntest.actions.run_and_verify_status(wc_dir, expected_status)
# Create expected commit output.
expected_output = svntest.wc.State(wc_dir, {
'A/D/gamma' : Item(verb='Adding'),
})
# After committing, status should show only gamma at revision 3.
expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
expected_status.tweak(wc_rev=1)
expected_status.tweak('A/D/gamma', wc_rev=3)
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
#----------------------------------------------------------------------
# Testing part 2 of the "Greg Hudson" problem.
#
# In this test, we make sure that we're UNABLE to commit a propchange
# on an out-of-date directory.
def hudson_part_2(sbox):
"hudson prob 2.0: prop commit on old dir fails"
sbox.build()
wc_dir = sbox.wc_dir
# Remove gamma from the working copy.
D_path = os.path.join(wc_dir, 'A', 'D')
gamma_path = os.path.join(wc_dir, 'A', 'D', 'gamma')
svntest.main.run_svn(None, 'rm', gamma_path)
# Create expected commit output.
expected_output = svntest.wc.State(wc_dir, {
'A/D/gamma' : Item(verb='Deleting'),
})
# After committing, status should show no sign of gamma.
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.remove('A/D/gamma')
# Commit the deletion of gamma and verify.
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
# Now gamma should be marked as `deleted' under the hood, at
# revision 2. Meanwhile, A/D is still lagging at revision 1.
# Make a propchange on A/D
svntest.main.run_svn(None, 'ps', 'foo', 'bar', D_path)
# Commit and *expect* a repository Merge failure:
svntest.actions.run_and_verify_commit (wc_dir,
None,
None,
"[Oo]ut.of.date",
None, None,
None, None,
wc_dir)
#----------------------------------------------------------------------
# Test a possible regression in our 'deleted' post-commit handling.
#
# This test moves files from one subdir to another, commits, then
# updates the empty directory. Nothing should be printed, assuming
# all the moved files are properly marked as 'deleted' and reported to
# the server.
def hudson_part_2_1(sbox):
"hudson prob 2.1: move files, update empty dir"
sbox.build()
wc_dir = sbox.wc_dir
# Move all the files in H to G
H_path = os.path.join(wc_dir, 'A', 'D', 'H')
G_path = os.path.join(wc_dir, 'A', 'D', 'G')
chi_path = os.path.join(H_path, 'chi')
psi_path = os.path.join(H_path, 'psi')
omega_path = os.path.join(H_path, 'omega')
svntest.main.run_svn(None, 'mv', chi_path, G_path)
svntest.main.run_svn(None, 'mv', psi_path, G_path)
svntest.main.run_svn(None, 'mv', omega_path, G_path)
# Create expected commit output.
expected_output = svntest.wc.State(wc_dir, {
'A/D/H/chi' : Item(verb='Deleting'),
'A/D/H/omega' : Item(verb='Deleting'),
'A/D/H/psi' : Item(verb='Deleting'),
'A/D/G/chi' : Item(verb='Adding'),
'A/D/G/omega' : Item(verb='Adding'),
'A/D/G/psi' : Item(verb='Adding'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.remove('A/D/H/chi')
expected_status.remove('A/D/H/omega')
expected_status.remove('A/D/H/psi')
expected_status.add({ 'A/D/G/chi' :
Item(wc_rev=2, repos_rev=2, status=' ') })
expected_status.add({ 'A/D/G/omega' :
Item(wc_rev=2, repos_rev=2, status=' ') })
expected_status.add({ 'A/D/G/psi' :
Item(wc_rev=2, repos_rev=2, status=' ') })
svntest.actions.run_and_verify_commit(wc_dir,
expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
# Now, assuming all three files in H are marked as 'deleted', an
# update of H should print absolutely nothing.
expected_output = svntest.wc.State(wc_dir, { })
# Reuse expected_status
expected_status.tweak(wc_rev=2)
expected_disk = svntest.main.greek_state.copy()
expected_disk.remove('A/D/H/chi', 'A/D/H/omega', 'A/D/H/psi')
expected_disk.add({
'A/D/G/chi' : Item("This is the file 'chi'."),
})
expected_disk.add({
'A/D/G/omega' : Item("This is the file 'omega'."),
})
expected_disk.add({
'A/D/G/psi' : Item("This is the file 'psi'."),
})
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
expected_status)
#----------------------------------------------------------------------
def hook_test(sbox):
"hook testing"
sbox.build()
# Get paths to the working copy and repository
wc_dir = sbox.wc_dir
repo_dir = sbox.repo_dir
# Setup the hook configs to echo data back
start_commit_hook = svntest.main.get_start_commit_hook_path (repo_dir)
svntest.main.file_append (start_commit_hook,
"""#!/bin/sh
echo $1""")
os.chmod (start_commit_hook, 0755)
pre_commit_hook = svntest.main.get_pre_commit_hook_path (repo_dir)
svntest.main.file_append (pre_commit_hook,
"""#!/bin/sh
echo $1 $2 """)
os.chmod (pre_commit_hook, 0755)
post_commit_hook = svntest.main.get_post_commit_hook_path (repo_dir)
svntest.main.file_append (post_commit_hook,
"""#!/bin/sh
echo $1 $2 """)
os.chmod (post_commit_hook, 0755)
# Modify iota just so there is something to commit.
iota_path = os.path.join (wc_dir, "iota")
svntest.main.file_append (iota_path, "More stuff in iota")
# Now, commit and examine the output (we happen to know that the
# filesystem will report an absolute path because that's the way the
# filesystem is created by this test suite.
abs_repo_dir = os.path.abspath (repo_dir)
expected_output = [abs_repo_dir + "\n",
abs_repo_dir + " 1\n",
abs_repo_dir + " 2\n"]
svntest.actions.run_and_verify_svn (None, expected_output, None,
'ci', '--quiet',
'-m', 'log msg', wc_dir)
#----------------------------------------------------------------------
# Regression test for bug #469, whereby merge() was once reporting
# erroneous conflicts due to Ancestor < Target < Source, in terms of
# node-rev-id parentage.
def merge_mixed_revisions(sbox):
"commit mixed-rev wc (no erroneous merge error)"
sbox.build()
wc_dir = sbox.wc_dir
# Make some convenient paths.
iota_path = os.path.join(wc_dir, 'iota')
H_path = os.path.join(wc_dir, 'A', 'D', 'H')
chi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'chi')
omega_path = os.path.join(wc_dir, 'A', 'D', 'H', 'omega')
psi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'psi')
# Here's the reproduction formula, in 5 parts.
# Hoo, what a buildup of state!
# 1. echo "moo" >> iota; echo "moo" >> A/D/H/chi; svn ci
svntest.main.file_append(iota_path, "moo")
svntest.main.file_append(chi_path, "moo")
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Sending'),
'A/D/H/chi' : Item(verb='Sending'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.tweak('iota', 'A/D/H/chi', wc_rev=2)
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
# 2. svn up A/D/H
expected_status = svntest.wc.State(wc_dir, {
'A/D/H' : Item(status=' ', wc_rev=2, repos_rev=2),
'A/D/H/chi' : Item(status=' ', wc_rev=2, repos_rev=2),
'A/D/H/omega' : Item(status=' ', wc_rev=2, repos_rev=2),
'A/D/H/psi' : Item(status=' ', wc_rev=2, repos_rev=2),
})
expected_disk = svntest.wc.State('', {
'omega' : Item("This is the file 'omega'."),
'chi' : Item("This is the file 'chi'.moo"),
'psi' : Item("This is the file 'psi'."),
})
expected_output = svntest.wc.State(wc_dir, { })
svntest.actions.run_and_verify_update (H_path,
expected_output,
expected_disk,
expected_status)
# 3. echo "moo" >> iota; svn ci iota
svntest.main.file_append(iota_path, "moo2")
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Sending'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 3)
expected_status.tweak(wc_rev=1)
expected_status.tweak('A/D/H', 'A/D/H/omega', 'A/D/H/chi', 'A/D/H/psi',
wc_rev=2)
expected_status.tweak('iota', wc_rev=3)
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
# 4. echo "moo" >> A/D/H/chi; svn ci A/D/H/chi
svntest.main.file_append(chi_path, "moo3")
expected_output = svntest.wc.State(wc_dir, {
'A/D/H/chi' : Item(verb='Sending'),
})
expected_status = svntest.actions.get_virginal_state(wc_dir, 4)
expected_status.tweak(wc_rev=1)
expected_status.tweak('A/D/H/chi', wc_rev=4)
expected_status.tweak('A/D/H', 'A/D/H/omega', 'A/D/H/psi', wc_rev=2)
expected_status.tweak('iota', wc_rev=3)
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None, None, None, None, None,
wc_dir)
# 5. echo "moo" >> iota; svn ci iota
svntest.main.file_append(iota_path, "moomoo")
expected_output = svntest.wc.State(wc_dir, {
'iota' : Item(verb='Sending'),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -