📄 prop_tests.py
字号:
#!/usr/bin/env python## prop_tests.py: testing versioned properties## 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 modulesimport string, sys, re, os.path, shutil# Our testing moduleimport svntest# (abbreviation)Skip = svntest.testcase.SkipXFail = svntest.testcase.XFailItem = svntest.wc.StateItem# Helper functionsdef check_prop(name, path, exp_out): """Verify that property NAME on PATH has a value of EXP_OUT""" # Not using run_svn because binary_mode must be set out, err = svntest.main.run_command(svntest.main.svn_binary, None, 1, 'pg', '--strict', name, path, '--config-dir', svntest.main.config_dir) if out != exp_out: print "svn pg --strict", name, "output does not match expected." print "Expected standard output: ", exp_out, "\n" print "Actual standard output: ", out, "\n" raise svntest.Failure####################################################################### Tests#----------------------------------------------------------------------def make_local_props(sbox): "write/read props in wc only (ps, pl, pdel)" # Bootstrap sbox.build() wc_dir = sbox.wc_dir # Add properties to one file and one directory svntest.main.run_svn(None, 'propset', 'blue', 'azul', os.path.join(wc_dir, 'A', 'mu')) svntest.main.run_svn(None, 'propset', 'green', 'verde', os.path.join(wc_dir, 'A', 'mu')) svntest.main.run_svn(None, 'propset', 'red', 'rojo', os.path.join(wc_dir, 'A', 'D', 'G')) svntest.main.run_svn(None, 'propset', 'yellow', 'amarillo', os.path.join(wc_dir, 'A', 'D', 'G')) # Make sure they show up as local mods in status expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('A/mu', status=' M') expected_status.tweak('A/D/G', status=' M') svntest.actions.run_and_verify_status(wc_dir, expected_status) # Remove one property svntest.main.run_svn(None, 'propdel', 'yellow', os.path.join(wc_dir, 'A', 'D', 'G')) # What we expect the disk tree to look like: expected_disk = svntest.main.greek_state.copy() expected_disk.tweak('A/mu', props={'blue' : 'azul', 'green' : 'verde'}) expected_disk.tweak('A/D/G', props={'red' : 'rojo'}) # Read the real disk tree. Notice we are passing the (normally # disabled) "load props" flag to this routine. This will run 'svn # proplist' on every item in the working copy! actual_disk_tree = svntest.tree.build_tree_from_wc(wc_dir, 1) # Compare actual vs. expected disk trees. svntest.tree.compare_trees(actual_disk_tree, expected_disk.old_tree())#----------------------------------------------------------------------def commit_props(sbox): "commit properties" # Bootstrap sbox.build() wc_dir = sbox.wc_dir # Add a property to a file and a directory mu_path = os.path.join(wc_dir, 'A', 'mu') H_path = os.path.join(wc_dir, 'A', 'D', 'H') svntest.main.run_svn(None, 'propset', 'blue', 'azul', mu_path) svntest.main.run_svn(None, 'propset', 'red', 'rojo', H_path) # Create expected output tree. expected_output = svntest.wc.State(wc_dir, { 'A/mu' : Item(verb='Sending'), 'A/D/H' : Item(verb='Sending'), }) # Created expected status tree. expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('A/mu', 'A/D/H', 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, wc_dir) #----------------------------------------------------------------------def update_props(sbox): "receive properties via update" # Bootstrap 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) # Add a property to a file and a directory mu_path = os.path.join(wc_dir, 'A', 'mu') H_path = os.path.join(wc_dir, 'A', 'D', 'H') svntest.main.run_svn(None, 'propset', 'blue', 'azul', mu_path) svntest.main.run_svn(None, 'propset', 'red', 'rojo', H_path) # Create expected output tree. expected_output = svntest.wc.State(wc_dir, { 'A/mu' : Item(verb='Sending'), 'A/D/H' : Item(verb='Sending'), }) # Created expected status tree. expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('A/mu', 'A/D/H', 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, wc_dir) # Overwrite mu_path and H_path to refer to the backup copies from # here on out. mu_path = os.path.join(wc_backup, 'A', 'mu') H_path = os.path.join(wc_backup, 'A', 'D', 'H') # Create expected output tree for an update of the wc_backup. expected_output = svntest.wc.State(wc_backup, { 'A/mu' : Item(status=' U'), 'A/D/H' : Item(status=' U'), }) # Create expected disk tree for the update. expected_disk = svntest.main.greek_state.copy() expected_disk.tweak('A/mu', props={'blue' : 'azul'}) expected_disk.tweak('A/D/H', props={'red' : 'rojo'}) # Create expected status tree for the update. expected_status = svntest.actions.get_virginal_state(wc_backup, 2) expected_status.tweak('A/mu', 'A/D/H', status=' ') # Do the update and check the results in three ways... INCLUDING PROPS svntest.actions.run_and_verify_update(wc_backup, expected_output, expected_disk, expected_status, None, None, None, None, None, 1)#----------------------------------------------------------------------def downdate_props(sbox): "receive property changes as part of a downdate" # Bootstrap sbox.build() wc_dir = sbox.wc_dir iota_path = os.path.join(wc_dir, 'iota') mu_path = os.path.join(wc_dir, 'A', 'mu') # Add a property to a file svntest.main.run_svn(None, 'propset', 'cash-sound', 'cha-ching!', iota_path) # Create expected output tree. expected_output = svntest.wc.State(wc_dir, { 'iota' : Item(verb='Sending'), }) # Created expected status tree. expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('iota', 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, wc_dir) # Make some mod (something to commit) svntest.main.file_append (mu_path, "some mod") # Create expected output tree. expected_output = svntest.wc.State(wc_dir, { 'A/mu' : Item(verb='Sending'), }) # Created expected status tree. expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('iota', wc_rev=2, status=' ') expected_status.tweak('A/mu', wc_rev=3, status=' ') # Commit the one file. svntest.actions.run_and_verify_commit (wc_dir, expected_output, expected_status, None, None, None, None, None, wc_dir) # Create expected output tree for an update. expected_output = svntest.wc.State(wc_dir, { 'iota' : Item(status=' U'), 'A/mu' : Item(status='U '), }) # Create expected disk tree for the update. expected_disk = svntest.main.greek_state # Create expected status tree for the update. expected_status = svntest.actions.get_virginal_state(wc_dir, 1) # Do the update and check the results in three ways... INCLUDING PROPS svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, None, None, None, None, 1, '-r', '1', wc_dir)#----------------------------------------------------------------------def remove_props(sbox): "commit the removal of props" # Bootstrap sbox.build() wc_dir = sbox.wc_dir # Add a property to a file iota_path = os.path.join(wc_dir, 'iota') svntest.main.run_svn(None, 'propset', 'cash-sound', 'cha-ching!', iota_path) # Commit the file svntest.main.run_svn(None, 'ci', '-m', 'logmsg', iota_path) # Now, remove the property svntest.main.run_svn(None, 'propdel', 'cash-sound', iota_path) # Create expected output tree. expected_output = svntest.wc.State(wc_dir, { 'iota' : Item(verb='Sending'), }) # Created expected status tree. expected_status = svntest.actions.get_virginal_state(wc_dir, 1) expected_status.tweak('iota', wc_rev=3, status=' ') # Commit the one file. svntest.actions.run_and_verify_commit (wc_dir, expected_output, expected_status, None, None, None, None, None, wc_dir)#----------------------------------------------------------------------# Helper for update_conflict_props() test -- a custom singleton handler.def detect_conflict_files(node, extra_files): """NODE has been discovered an extra file on disk. Verify that it matches one of the regular expressions in the EXTRA_FILES list. If it matches, remove the match from the list. If it doesn't match, raise an exception.""" for pattern in extra_files: mo = re.match(pattern, node.name) if mo: extra_files.pop(extra_files.index(pattern)) # delete pattern from list break else: print "Found unexpected disk object:", node.name raise svntest.tree.SVNTreeUnequaldef update_conflict_props(sbox): "update with conflicting props" # Bootstrap sbox.build() wc_dir = sbox.wc_dir # Add a property to a file and a directory mu_path = os.path.join(wc_dir, 'A', 'mu') svntest.main.run_svn(None, 'propset', 'cash-sound', 'cha-ching!', mu_path) A_path = os.path.join(wc_dir, 'A') svntest.main.run_svn(None, 'propset', 'foo', 'bar', A_path) # Commit the file and directory svntest.main.run_svn(None, 'ci', '-m', 'logmsg', wc_dir) # Update to rev 1 svntest.main.run_svn(None, 'up', '-r', '1', wc_dir) # Add conflicting properties svntest.main.run_svn(None, 'propset', 'cash-sound', 'beep!', mu_path) svntest.main.run_svn(None, 'propset', 'foo', 'baz', A_path) # Create expected output tree for an update of the wc_backup. expected_output = svntest.wc.State(wc_dir, { 'A/mu' : Item(status=' C'), 'A' : Item(status=' C'), }) # Create expected disk tree for the update. expected_disk = svntest.main.greek_state.copy() expected_disk.tweak('A/mu', props={'cash-sound' : 'beep!'}) expected_disk.tweak('A', props={'foo' : 'baz'}) # Create expected status tree for the update. expected_status = svntest.actions.get_virginal_state(wc_dir, 2) expected_status.tweak('A/mu', 'A', status=' C') extra_files = ['mu.*\.prej', 'dir_conflicts.*\.prej'] # Do the update and check the results in three ways... INCLUDING PROPS svntest.actions.run_and_verify_update(wc_dir, expected_output, expected_disk, expected_status, None, detect_conflict_files, extra_files, None, None, 1) if len(extra_files) != 0: print "didn't get expected conflict files" raise svntest.actions.SVNUnexpectedOutput # Resolve the conflicts svntest.main.run_svn(None, 'resolved', mu_path) svntest.main.run_svn(None, 'resolved', A_path) expected_status = svntest.actions.get_virginal_state(wc_dir, 2) expected_status.tweak('A/mu', 'A', status=' M') 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -