📄 commit_tests.py
字号:
#!/usr/bin/env python
#
# commit_tests.py: testing fancy commit cases.
#
# 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, re
# Our testing module
import svntest
from svntest import SVNAnyOutput
# (abbreviation)
Skip = svntest.testcase.Skip
XFail = svntest.testcase.XFail
Item = svntest.wc.StateItem
######################################################################
# Utilities
#
def get_standard_state(wc_dir):
"""Return a status list reflecting the local mods made by
make_standard_slew_of_changes()."""
state = svntest.actions.get_virginal_state(wc_dir, 1)
state.tweak('', status=' M')
state.tweak('A/B/lambda', status='M ')
state.tweak('A/B/E', 'A/D/H/chi', status='R ')
state.tweak('A/B/E/alpha', 'A/B/E/beta', 'A/C', 'A/D/gamma',
'A/D/G/rho', status='D ')
state.tweak('A/D', 'A/D/G/pi', status=' M')
state.tweak('A/D/H/omega', status='MM')
# New things
state.add({
'Q' : Item(status='A ', wc_rev=0, repos_rev=1),
'Q/floo' : Item(status='A ', wc_rev=0, repos_rev=1),
'A/D/H/gloo' : Item(status='A ', wc_rev=0, repos_rev=1),
'A/B/E/bloo' : Item(status='A ', wc_rev=0, repos_rev=1),
})
return state
def make_standard_slew_of_changes(wc_dir):
"""Make a specific set of local mods to WC_DIR. These will be used
by every commit-test. Verify the 'svn status' output, return on
success."""
# Cache current working directory, move into wc_dir
was_cwd = os.getcwd()
os.chdir(wc_dir)
# Add a directory
os.mkdir('Q')
svntest.main.run_svn(None, 'add', 'Q')
# Remove two directories
svntest.main.run_svn(None, 'rm', os.path.join('A', 'B', 'E'))
svntest.main.run_svn(None, 'rm', os.path.join('A', 'C'))
# Replace one of the removed directories
svntest.main.run_svn(None, 'add', os.path.join('A', 'B', 'E'))
# Make property mods to two directories
svntest.main.run_svn(None, 'propset', 'foo', 'bar', os.curdir)
svntest.main.run_svn(None, 'propset', 'foo2', 'bar2', os.path.join('A', 'D'))
# Add three files
svntest.main.file_append(os.path.join('A', 'B', 'E', 'bloo'), "hi")
svntest.main.file_append(os.path.join('A', 'D', 'H', 'gloo'), "hello")
svntest.main.file_append(os.path.join('Q', 'floo'), "yo")
svntest.main.run_svn(None, 'add', os.path.join('A', 'B', 'E', 'bloo'))
svntest.main.run_svn(None, 'add', os.path.join('A', 'D', 'H', 'gloo'))
svntest.main.run_svn(None, 'add', os.path.join('Q', 'floo'))
# Remove three files
svntest.main.run_svn(None, 'rm', os.path.join('A', 'D', 'G', 'rho'))
svntest.main.run_svn(None, 'rm', os.path.join('A', 'D', 'H', 'chi'))
svntest.main.run_svn(None, 'rm', os.path.join('A', 'D', 'gamma'))
# Replace one of the removed files
svntest.main.file_append(os.path.join('A', 'D', 'H', 'chi'), "chi")
svntest.main.run_svn(None, 'add', os.path.join('A', 'D', 'H', 'chi'))
# Make textual mods to two files
svntest.main.file_append(os.path.join('A', 'B', 'lambda'), "new ltext")
svntest.main.file_append(os.path.join('A', 'D', 'H', 'omega'), "new otext")
# Make property mods to three files
svntest.main.run_svn(None, 'propset', 'blue', 'azul',
os.path.join('A', 'D', 'H', 'omega'))
svntest.main.run_svn(None, 'propset', 'green', 'verde',
os.path.join('Q', 'floo'))
svntest.main.run_svn(None, 'propset', 'red', 'rojo',
os.path.join('A', 'D', 'G', 'pi'))
# Restore the CWD.
os.chdir(was_cwd)
# Build an expected status tree.
expected_status = get_standard_state(wc_dir)
# Verify status -- all local mods should be present.
svntest.actions.run_and_verify_status(wc_dir, expected_status)
######################################################################
# Tests
#
# Each test must return on success or raise on failure.
#----------------------------------------------------------------------
def commit_one_file(sbox):
"commit one file"
sbox.build()
wc_dir = sbox.wc_dir
# Make standard slew of changes to working copy.
make_standard_slew_of_changes(wc_dir)
omega_path = os.path.join(wc_dir, 'A', 'D', 'H', 'omega')
# Create expected output tree.
expected_output = svntest.wc.State(wc_dir, {
'A/D/H/omega' : Item(verb='Sending'),
})
# Created expected status tree.
expected_status = get_standard_state(wc_dir) # pre-commit status
expected_status.tweak(repos_rev=2) # post-commit status
expected_status.tweak('A/D/H/omega', wc_rev=2, status=' ')
# Commit the one file.
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None,
None, None,
None, None,
omega_path)
#----------------------------------------------------------------------
def commit_one_new_file(sbox):
"commit one newly added file"
sbox.build()
wc_dir = sbox.wc_dir
# Make standard slew of changes to working copy.
make_standard_slew_of_changes(wc_dir)
gloo_path = os.path.join(wc_dir, 'A', 'D', 'H', 'gloo')
# Create expected output tree.
expected_output = svntest.wc.State(wc_dir, {
'A/D/H/gloo' : Item(verb='Adding'),
})
# Created expected status tree.
expected_status = get_standard_state(wc_dir) # pre-commit status
expected_status.tweak(repos_rev=2) # post-commit status
expected_status.tweak('A/D/H/gloo', wc_rev=2, status=' ')
# Commit the one file.
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None,
None, None,
None, None,
gloo_path)
#----------------------------------------------------------------------
def commit_one_new_binary_file(sbox):
"commit one newly added binary file"
sbox.build()
wc_dir = sbox.wc_dir
# Make standard slew of changes to working copy.
make_standard_slew_of_changes(wc_dir)
gloo_path = os.path.join(wc_dir, 'A', 'D', 'H', 'gloo')
svntest.main.run_svn(None, 'propset', 'svn:mime-type',
'application/octet-stream', gloo_path)
# Create expected output tree.
expected_output = svntest.wc.State(wc_dir, {
'A/D/H/gloo' : Item(verb='Adding (bin)'),
})
# Created expected status tree.
expected_status = get_standard_state(wc_dir) # pre-commit status
expected_status.tweak(repos_rev=2) # post-commit status
expected_status.tweak('A/D/H/gloo', wc_rev=2, status=' ')
# Commit the one file.
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None,
None, None,
None, None,
gloo_path)
#----------------------------------------------------------------------
def commit_multiple_targets(sbox):
"commit multiple targets"
sbox.build()
wc_dir = sbox.wc_dir
# This test will commit three targets: psi, B, and pi. In that order.
# Make local mods to many files.
AB_path = os.path.join(wc_dir, 'A', 'B')
lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
pi_path = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
omega_path = os.path.join(wc_dir, 'A', 'D', 'H', 'omega')
psi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'psi')
svntest.main.file_append (lambda_path, 'new appended text for lambda')
svntest.main.file_append (rho_path, 'new appended text for rho')
svntest.main.file_append (pi_path, 'new appended text for pi')
svntest.main.file_append (omega_path, 'new appended text for omega')
svntest.main.file_append (psi_path, 'new appended text for psi')
# Just for kicks, add a property to A/D/G as well. We'll make sure
# that it *doesn't* get committed.
ADG_path = os.path.join(wc_dir, 'A', 'D', 'G')
svntest.main.run_svn(None, 'propset', 'foo', 'bar', ADG_path)
# Created expected output tree for 'svn ci'. We should see changes
# only on these three targets, no others.
expected_output = svntest.wc.State(wc_dir, {
'A/D/H/psi' : Item(verb='Sending'),
'A/B/lambda' : Item(verb='Sending'),
'A/D/G/pi' : Item(verb='Sending'),
})
# Create expected status tree; all local revisions should be at 1,
# but our three targets should be at 2.
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.tweak('A/D/H/psi', 'A/B/lambda', 'A/D/G/pi', wc_rev=2)
# rho and omega should still display as locally modified:
expected_status.tweak('A/D/G/rho', 'A/D/H/omega', status='M ')
# A/D/G should still have a local property set, too.
expected_status.tweak('A/D/G', status=' M')
svntest.actions.run_and_verify_commit (wc_dir,
expected_output,
expected_status,
None,
None, None,
None, None,
psi_path, AB_path, pi_path)
#----------------------------------------------------------------------
def commit_multiple_targets_2(sbox):
"commit multiple targets, 2nd variation"
sbox.build()
wc_dir = sbox.wc_dir
# This test will commit three targets: psi, B, omega and pi. In that order.
# Make local mods to many files.
AB_path = os.path.join(wc_dir, 'A', 'B')
lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
pi_path = os.path.join(wc_dir, 'A', 'D', 'G', 'pi')
omega_path = os.path.join(wc_dir, 'A', 'D', 'H', 'omega')
psi_path = os.path.join(wc_dir, 'A', 'D', 'H', 'psi')
svntest.main.file_append (lambda_path, 'new appended text for lambda')
svntest.main.file_append (rho_path, 'new appended text for rho')
svntest.main.file_append (pi_path, 'new appended text for pi')
svntest.main.file_append (omega_path, 'new appended text for omega')
svntest.main.file_append (psi_path, 'new appended text for psi')
# Just for kicks, add a property to A/D/G as well. We'll make sure
# that it *doesn't* get committed.
ADG_path = os.path.join(wc_dir, 'A', 'D', 'G')
svntest.main.run_svn(None, 'propset', 'foo', 'bar', ADG_path)
# Created expected output tree for 'svn ci'. We should see changes
# only on these three targets, no others.
expected_output = svntest.wc.State(wc_dir, {
'A/D/H/psi' : Item(verb='Sending'),
'A/B/lambda' : Item(verb='Sending'),
'A/D/H/omega' : Item(verb='Sending'),
'A/D/G/pi' : Item(verb='Sending'),
})
# Create expected status tree; all local revisions should be at 1,
# but our four targets should be at 2.
expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
expected_status.tweak(wc_rev=1)
expected_status.tweak('A/D/H/psi', 'A/B/lambda', 'A/D/G/pi', 'A/D/H/omega',
wc_rev=2)
# rho should still display as locally modified:
expected_status.tweak('A/D/G/rho', status='M ')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -