You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2013/02/13 07:37:56 UTC
svn commit: r1445479 [11/11] - in /subversion/branches/fsfs-format7: ./
build/generator/ build/generator/swig/ build/generator/templates/
notes/api-errata/1.7/ packages/ subversion/bindings/swig/include/
subversion/bindings/swig/perl/libsvn_swig_perl/ ...
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/verify.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/verify.py?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/verify.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/verify.py Wed Feb 13 06:37:54 2013
@@ -96,130 +96,72 @@ def createExpectedOutput(expected, outpu
raise SVNIncorrectDatatype("Unexpected type for '%s' data" % output_type)
return expected
-class ExpectedOutput:
- """Contains expected output, and performs comparisons."""
+class ExpectedOutput(object):
+ """Matches an ordered list of lines.
- is_regex = False
- is_unordered = False
+ If MATCH_ALL is True, the expected lines must match all the actual
+ lines, one-to-one, in the same order. If MATCH_ALL is False, the
+ expected lines must match a subset of the actual lines, one-to-one,
+ in the same order, ignoring any other actual lines among the
+ matching ones.
+ """
- def __init__(self, output, match_all=True):
- """Initialize the expected output to OUTPUT which is a string, or a list
- of strings, or None meaning an empty list. If MATCH_ALL is True, the
- expected strings will be matched with the actual strings, one-to-one, in
- the same order. If False, they will be matched with a subset of the
- actual strings, one-to-one, in the same order, ignoring any other actual
- strings among the matching ones."""
- self.output = output
+ def __init__(self, expected, match_all=True):
+ """Initialize the expected output to EXPECTED which is a string, or
+ a list of strings.
+ """
+ assert expected is not None
+ self.expected = expected
self.match_all = match_all
def __str__(self):
- return str(self.output)
+ return str(self.expected)
def __cmp__(self, other):
- raise Exception('badness')
-
- def matches(self, other, except_re=None):
- """Return whether SELF.output matches OTHER (which may be a list
- of newline-terminated lines, or a single string). Either value
- may be None."""
- if self.output is None:
- expected = []
- else:
- expected = self.output
- if other is None:
- actual = []
- else:
- actual = other
+ raise TypeError("ExpectedOutput does not implement direct comparison; "
+ "see the 'matches()' method")
- if not isinstance(actual, list):
- actual = [actual]
+ def matches(self, actual):
+ """Return whether SELF matches ACTUAL (which may be a list
+ of newline-terminated lines, or a single string).
+ """
+ assert actual is not None
+ expected = self.expected
if not isinstance(expected, list):
expected = [expected]
+ if not isinstance(actual, list):
+ actual = [actual]
- if except_re:
- return self.matches_except(expected, actual, except_re)
- else:
- return self.is_equivalent_list(expected, actual)
-
- def matches_except(self, expected, actual, except_re):
- "Return whether EXPECTED and ACTUAL match except for except_re."
- if not self.is_regex:
- i_expected = 0
- i_actual = 0
- while i_expected < len(expected) and i_actual < len(actual):
- if re.match(except_re, actual[i_actual]):
- i_actual += 1
- elif re.match(except_re, expected[i_expected]):
- i_expected += 1
- elif expected[i_expected] == actual[i_actual]:
- i_expected += 1
- i_actual += 1
- else:
- return False
- if i_expected == len(expected) and i_actual == len(actual):
- return True
- return False
- else:
- raise Exception("is_regex and except_re are mutually exclusive")
-
- def is_equivalent_list(self, expected, actual):
- "Return whether EXPECTED and ACTUAL are equivalent."
- if not self.is_regex:
- if self.match_all:
- # The EXPECTED lines must match the ACTUAL lines, one-to-one, in
- # the same order.
- return expected == actual
-
- # The EXPECTED lines must match a subset of the ACTUAL lines,
- # one-to-one, in the same order, with zero or more other ACTUAL
- # lines interspersed among the matching ACTUAL lines.
- i_expected = 0
- for actual_line in actual:
- if expected[i_expected] == actual_line:
- i_expected += 1
- if i_expected == len(expected):
- return True
- return False
-
- expected_re = expected[0]
- # If we want to check that every line matches the regexp
- # assume they all match and look for any that don't. If
- # only one line matching the regexp is enough, assume none
- # match and look for even one that does.
if self.match_all:
- all_lines_match_re = True
- else:
- all_lines_match_re = False
-
- # If a regex was provided assume that we actually require
- # some output. Fail if we don't have any.
- if len(actual) == 0:
- return False
+ return expected == actual
+ i_expected = 0
for actual_line in actual:
- if self.match_all:
- if not re.match(expected_re, actual_line):
- return False
- else:
- # As soon an actual_line matches something, then we're good.
- if re.match(expected_re, actual_line):
+ if expected[i_expected] == actual_line:
+ i_expected += 1
+ if i_expected == len(expected):
return True
-
- return all_lines_match_re
+ return False
def display_differences(self, message, label, actual):
- """Delegate to the display_lines() routine with the appropriate
- args. MESSAGE is ignored if None."""
- display_lines(message, label, self.output, actual,
- self.is_regex, self.is_unordered)
+ """Show the differences between the expected and ACTUAL lines. Print
+ MESSAGE unless it is None, the expected lines, the ACTUAL lines,
+ and a diff, all labeled with LABEL.
+ """
+ display_lines(message, self.expected, actual, label, label)
+ display_lines_diff(self.expected, actual, label, label)
class AnyOutput(ExpectedOutput):
- """Matches any non-empty output."""
+ """Matches any non-empty output.
+ """
+
def __init__(self):
- ExpectedOutput.__init__(self, None, False)
+ ExpectedOutput.__init__(self, [], False)
+
+ def matches(self, actual):
+ assert actual is not None
- def is_equivalent_list(self, ignored, actual):
if len(actual) == 0:
# No actual output. No match.
return False
@@ -238,60 +180,139 @@ class AnyOutput(ExpectedOutput):
class RegexOutput(ExpectedOutput):
- is_regex = True
+ """Matches a single regular expression.
+ If MATCH_ALL is true, every actual line must match the RE. If
+ MATCH_ALL is false, at least one actual line must match the RE. In
+ any case, there must be at least one line of actual output.
+ """
-class UnorderedOutput(ExpectedOutput):
- """Marks unordered output, and performs comparisons."""
+ def __init__(self, expected, match_all=True):
+ "EXPECTED is a regular expression string."
+ assert isinstance(expected, str)
+ ExpectedOutput.__init__(self, expected, match_all)
+ self.expected_re = re.compile(expected)
- is_unordered = True
+ def matches(self, actual):
+ assert actual is not None
- def __cmp__(self, other):
- raise Exception('badness')
+ if not isinstance(actual, list):
+ actual = [actual]
+
+ # If a regex was provided assume that we require some actual output.
+ # Fail if we don't have any.
+ if len(actual) == 0:
+ return False
- def matches_except(self, expected, actual, except_re):
- assert type(actual) == type([]) # ### if this trips: fix it!
- return self.is_equivalent_list([l for l in expected if not except_re.match(l)],
- [l for l in actual if not except_re.match(l)])
+ if self.match_all:
+ return all(self.expected_re.match(line) for line in actual)
+ else:
+ return any(self.expected_re.match(line) for line in actual)
+
+ def display_differences(self, message, label, actual):
+ display_lines(message, self.expected, actual, label + ' (regexp)', label)
+
+
+class RegexListOutput(ExpectedOutput):
+ """Matches an ordered list of regular expressions.
- def is_equivalent_list(self, expected, actual):
- "Disregard the order of ACTUAL lines during comparison."
+ If MATCH_ALL is True, the expressions must match all the actual
+ lines, one-to-one, in the same order. If MATCH_ALL is False, the
+ expressions must match a subset of the actual lines, one-to-one, in
+ the same order, ignoring any other actual lines among the matching
+ ones.
- e_set = set(expected)
- a_set = set(actual)
+ In any case, there must be at least one line of actual output.
+ """
+
+ def __init__(self, expected, match_all=True):
+ "EXPECTED is a list of regular expression strings."
+ assert isinstance(expected, list) and expected != []
+ ExpectedOutput.__init__(self, expected, match_all)
+ self.expected_res = [re.compile(e) for e in expected]
+
+ def matches(self, actual):
+ assert actual is not None
+ if not isinstance(actual, list):
+ actual = [actual]
if self.match_all:
- if len(e_set) != len(a_set):
- return False
- if self.is_regex:
- for expect_re in e_set:
- for actual_line in a_set:
- if re.match(expect_re, actual_line):
- a_set.remove(actual_line)
- break
- else:
- # One of the regexes was not found
- return False
- return True
+ return (len(self.expected_res) == len(actual) and
+ all(e.match(a) for e, a in zip(self.expected_res, actual)))
- # All expected lines must be in the output.
- return e_set == a_set
+ i_expected = 0
+ for actual_line in actual:
+ if self.expected_res[i_expected].match(actual_line):
+ i_expected += 1
+ if i_expected == len(self.expected_res):
+ return True
+ return False
- if self.is_regex:
- # If any of the expected regexes are in the output, then we match.
- for expect_re in e_set:
- for actual_line in a_set:
- if re.match(expect_re, actual_line):
- return True
- return False
+ def display_differences(self, message, label, actual):
+ display_lines(message, self.expected, actual, label + ' (regexp)', label)
+
+
+class UnorderedOutput(ExpectedOutput):
+ """Matches an unordered list of lines.
+
+ The expected lines must match all the actual lines, one-to-one, in
+ any order.
+ """
+
+ def __init__(self, expected):
+ assert isinstance(expected, list)
+ ExpectedOutput.__init__(self, expected)
+
+ def matches(self, actual):
+ if not isinstance(actual, list):
+ actual = [actual]
+
+ return sorted(self.expected) == sorted(actual)
+
+ def display_differences(self, message, label, actual):
+ display_lines(message, self.expected, actual, label + ' (unordered)', label)
+ display_lines_diff(self.expected, actual, label + ' (unordered)', label)
+
+
+class UnorderedRegexListOutput(ExpectedOutput):
+ """Matches an unordered list of regular expressions.
+
+ The expressions must match all the actual lines, one-to-one, in any
+ order.
+
+ Note: This can give a false negative result (no match) when there is
+ an actual line that matches multiple expressions and a different
+ actual line that matches some but not all of those same
+ expressions. The implementation matches each expression in turn to
+ the first unmatched actual line that it can match, and does not try
+ all the permutations when there are multiple possible matches.
+ """
- # If any of the expected lines are in the output, then we match.
- return len(e_set.intersection(a_set)) > 0
+ def __init__(self, expected):
+ assert isinstance(expected, list)
+ ExpectedOutput.__init__(self, expected)
+ def matches(self, actual):
+ assert actual is not None
+ if not isinstance(actual, list):
+ actual = [actual]
-class UnorderedRegexOutput(UnorderedOutput, RegexOutput):
- is_regex = True
- is_unordered = True
+ if len(self.expected) != len(actual):
+ return False
+ for e in self.expected:
+ expect_re = re.compile(e)
+ for actual_line in actual:
+ if expect_re.match(actual_line):
+ actual.remove(actual_line)
+ break
+ else:
+ # One of the regexes was not found
+ return False
+ return True
+
+ def display_differences(self, message, label, actual):
+ display_lines(message, self.expected, actual,
+ label + ' (regexp) (unordered)', label)
######################################################################
@@ -309,55 +330,55 @@ def display_trees(message, label, expect
svntest.tree.dump_tree(actual)
-def display_lines(message, label, expected, actual, expected_is_regexp=None,
- expected_is_unordered=None):
+def display_lines_diff(expected, actual, expected_label, actual_label):
+ """Print a unified diff between EXPECTED (labeled with EXPECTED_LABEL)
+ and ACTUAL (labeled with ACTUAL_LABEL).
+ Each of EXPECTED and ACTUAL is a string or a list of strings.
+ """
+ logger.warn('DIFF ' + expected_label + ':')
+ for x in unified_diff(expected, actual,
+ fromfile='EXPECTED ' + expected_label,
+ tofile='ACTUAL ' + actual_label):
+ logger.warn('| ' + x.rstrip())
+
+def display_lines(message, expected, actual,
+ expected_label, actual_label=None):
"""Print MESSAGE, unless it is None, then print EXPECTED (labeled
- with LABEL) followed by ACTUAL (also labeled with LABEL).
- Both EXPECTED and ACTUAL may be strings or lists of strings."""
+ with EXPECTED_LABEL) followed by ACTUAL (labeled with ACTUAL_LABEL).
+ Each of EXPECTED and ACTUAL is a string or a list of strings.
+ """
if message is not None:
logger.warn(message)
+
+ if type(expected) is str:
+ expected = [expected]
+ if type(actual) is str:
+ actual = [actual]
+ if actual_label is None:
+ actual_label = expected_label
if expected is not None:
- output = 'EXPECTED %s' % label
- if expected_is_regexp:
- output += ' (regexp)'
- expected = [expected + '\n']
- if expected_is_unordered:
- output += ' (unordered)'
- output += ':'
- logger.warn(output)
+ logger.warn('EXPECTED %s:', expected_label)
for x in expected:
- sys.stdout.write(x)
+ logger.warn('| ' + x.rstrip())
if actual is not None:
- logger.warn('ACTUAL %s:', label)
+ logger.warn('ACTUAL %s:', actual_label)
for x in actual:
- sys.stdout.write(x)
-
- # Additionally print unified diff
- if not expected_is_regexp:
- logger.warn('DIFF ' + ' '.join(output.split(' ')[1:]))
-
- if type(expected) is str:
- expected = [expected]
-
- if type(actual) is str:
- actual = [actual]
-
- for x in unified_diff(expected, actual,
- fromfile="EXPECTED %s" % label,
- tofile="ACTUAL %s" % label):
- sys.stdout.write(x)
+ logger.warn('| ' + x.rstrip())
def compare_and_display_lines(message, label, expected, actual,
- raisable=None, except_re=None):
+ raisable=None):
"""Compare two sets of output lines, and print them if they differ,
preceded by MESSAGE iff not None. EXPECTED may be an instance of
- ExpectedOutput (and if not, it is wrapped as such). RAISABLE is an
+ ExpectedOutput (and if not, it is wrapped as such). ACTUAL may be a
+ list of newline-terminated lines, or a single string. RAISABLE is an
exception class, an instance of which is thrown if ACTUAL doesn't
match EXPECTED."""
if raisable is None:
raisable = svntest.main.SVNLineUnequal
### It'd be nicer to use createExpectedOutput() here, but its
### semantics don't match all current consumers of this function.
+ assert expected is not None
+ assert actual is not None
if not isinstance(expected, ExpectedOutput):
expected = ExpectedOutput(expected)
@@ -365,7 +386,7 @@ def compare_and_display_lines(message, l
actual = [actual]
actual = svntest.main.filter_dbg(actual)
- if not expected.matches(actual, except_re):
+ if not expected.matches(actual):
expected.display_differences(message, label, actual)
raise raisable
@@ -403,8 +424,7 @@ def verify_exit_code(message, actual, ex
not None) and raise an exception."""
if expected != actual:
- display_lines(message, "Exit Code",
- str(expected) + '\n', str(actual) + '\n')
+ display_lines(message, str(expected), str(actual), "Exit Code")
raise raisable
# A simple dump file parser. While sufficient for the current
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/wc.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/wc.py?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/wc.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/wc.py Wed Feb 13 06:37:54 2013
@@ -261,11 +261,22 @@ class State:
base = to_relpath(os.path.normpath(self.wc_dir))
- # TODO: We should probably normalize the paths in moved_from and moved_to.
-
desc = dict([(repos_join(base, path), item)
for path, item in self.desc.items()])
+ for path, item in desc.copy().items():
+ if item.moved_from or item.moved_to:
+ i = item.copy()
+
+ if i.moved_from:
+ i.moved_from = to_relpath(os.path.normpath(
+ repos_join(base, i.moved_from)))
+ if i.moved_to:
+ i.moved_to = to_relpath(os.path.normpath(
+ repos_join(base, i.moved_to)))
+
+ desc[path] = i
+
return State('', desc)
def compare(self, other):
@@ -423,7 +434,7 @@ class State:
return not self.__eq__(other)
@classmethod
- def from_status(cls, lines, wc_dir_name=None):
+ def from_status(cls, lines):
"""Create a State object from 'svn status' output."""
def not_space(value):
@@ -445,21 +456,12 @@ class State:
if ex_match:
if ex_match.group('moved_from'):
path = ex_match.group('moved_from')
- if wc_dir_name and path.startswith(wc_dir_name + os.path.sep):
- path = path[len(wc_dir_name) + 1:]
-
last.tweak(moved_from = to_relpath(path))
elif ex_match.group('moved_to'):
path = ex_match.group('moved_to')
- if wc_dir_name and path.startswith(wc_dir_name + os.path.sep):
- path = path[len(wc_dir_name) + 1:]
-
last.tweak(moved_to = to_relpath(path))
elif ex_match.group('swapped_with'):
path = ex_match.group('swapped_with')
- if wc_dir_name and path.startswith(wc_dir_name + os.path.sep):
- path = path[len(wc_dir_name) + 1:]
-
last.tweak(moved_to = to_relpath(path))
last.tweak(moved_from = to_relpath(path))
@@ -472,6 +474,8 @@ class State:
prev_treeconflict = None
path = to_relpath(match.group('path'))
+ if path == '.':
+ path = ''
if path in desc:
prev_status = desc[path].status
prev_treeconflict = desc[path].treeconflict
@@ -790,15 +794,14 @@ class StateItem:
if not isinstance(other, StateItem):
return False
v_self = dict([(k, v) for k, v in vars(self).items()
- if not k.startswith('_')])
+ if not k.startswith('_') and not k.startswith('entry_')])
v_other = dict([(k, v) for k, v in vars(other).items()
- if not k.startswith('_')])
- if self.treeconflict is None:
- v_other = v_other.copy()
- v_other['treeconflict'] = None
- if other.treeconflict is None:
- v_self = v_self.copy()
- v_self['treeconflict'] = None
+ if not k.startswith('_') and not k.startswith('entry_')])
+
+ if self.wc_rev == '0' and self.status == 'A ':
+ v_self['wc_rev'] = '-'
+ if other.wc_rev == '0' and other.status == 'A ':
+ v_other['wc_rev'] = '-'
return v_self == v_other
def __ne__(self, other):
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/switch_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/switch_tests.py?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/switch_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/switch_tests.py Wed Feb 13 06:37:54 2013
@@ -29,7 +29,7 @@ import shutil, re, os
# Our testing module
import svntest
-from svntest import verify, actions, main
+from svntest import verify, actions, main, deeptrees
# (abbreviation)
Skip = svntest.testcase.Skip_deco
@@ -2283,25 +2283,25 @@ def tolerate_local_mods(sbox):
# parent directory.
# convenience definitions
-leaf_edit = svntest.actions.deep_trees_leaf_edit
-tree_del = svntest.actions.deep_trees_tree_del
-leaf_del = svntest.actions.deep_trees_leaf_del
+leaf_edit = svntest.deeptrees.deep_trees_leaf_edit
+tree_del = svntest.deeptrees.deep_trees_tree_del
+leaf_del = svntest.deeptrees.deep_trees_leaf_del
-disk_after_leaf_edit = svntest.actions.deep_trees_after_leaf_edit
-disk_after_leaf_del = svntest.actions.deep_trees_after_leaf_del
-disk_after_tree_del = svntest.actions.deep_trees_after_tree_del
+disk_after_leaf_edit = svntest.deeptrees.deep_trees_after_leaf_edit
+disk_after_leaf_del = svntest.deeptrees.deep_trees_after_leaf_del
+disk_after_tree_del = svntest.deeptrees.deep_trees_after_tree_del
-disk_empty_dirs = svntest.actions.deep_trees_empty_dirs
+disk_empty_dirs = svntest.deeptrees.deep_trees_empty_dirs
-deep_trees_conflict_output = svntest.actions.deep_trees_conflict_output
+deep_trees_conflict_output = svntest.deeptrees.deep_trees_conflict_output
deep_trees_conflict_output_skipped = \
- svntest.actions.deep_trees_conflict_output_skipped
+ svntest.deeptrees.deep_trees_conflict_output_skipped
deep_trees_status_local_tree_del = \
- svntest.actions.deep_trees_status_local_tree_del
+ svntest.deeptrees.deep_trees_status_local_tree_del
deep_trees_status_local_leaf_edit = \
- svntest.actions.deep_trees_status_local_leaf_edit
+ svntest.deeptrees.deep_trees_status_local_leaf_edit
-DeepTreesTestCase = svntest.actions.DeepTreesTestCase
+DeepTreesTestCase = svntest.deeptrees.DeepTreesTestCase
j = os.path.join
@@ -2385,7 +2385,7 @@ def tree_conflicts_on_switch_1_1(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_switch(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_switch(sbox,
[ DeepTreesTestCase("local_tree_del_incoming_leaf_edit",
tree_del,
leaf_edit,
@@ -2483,7 +2483,7 @@ def tree_conflicts_on_switch_1_2(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_switch(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_switch(sbox,
[ DeepTreesTestCase("local_tree_del_incoming_leaf_del",
tree_del,
leaf_del,
@@ -2571,7 +2571,7 @@ def tree_conflicts_on_switch_2_1(sbox):
### local-copy from its original revision. however, right now, we cannot
### denote that delta is a local-add rather than a child of that D/D1 copy.
### thus, it appears in the status output as a (M)odified child.
- svntest.actions.deep_trees_run_tests_scheme_for_switch(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_switch(sbox,
[ DeepTreesTestCase("local_leaf_edit_incoming_tree_del",
leaf_edit,
tree_del,
@@ -2593,7 +2593,7 @@ def tree_conflicts_on_switch_2_2(sbox):
expected_disk = disk_empty_dirs.copy()
- expected_status = svntest.actions.deep_trees_virginal_state.copy()
+ expected_status = svntest.deeptrees.deep_trees_virginal_state.copy()
expected_status.add({'' : Item(),
'F/alpha' : Item()})
expected_status.tweak(contents=None, status=' ', wc_rev=3)
@@ -2665,7 +2665,7 @@ def tree_conflicts_on_switch_2_2(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_switch(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_switch(sbox,
[ DeepTreesTestCase("local_leaf_del_incoming_tree_del",
leaf_del,
tree_del,
@@ -2754,7 +2754,7 @@ def tree_conflicts_on_switch_3(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_switch(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_switch(sbox,
[ DeepTreesTestCase("local_tree_del_incoming_tree_del",
tree_del,
tree_del,
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/tree_conflict_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/tree_conflict_tests.py?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/tree_conflict_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/tree_conflict_tests.py Wed Feb 13 06:37:54 2013
@@ -689,7 +689,6 @@ def merge_dir_mod_onto_not_dir(sbox):
test_tc_merge(sbox2, d_mods, wc_scen = d_dels + d_moves)
# Test for issue #3150 'tree conflicts with directories as victims'.
-@XFail()
@Issue(3150)
def merge_dir_del_onto_not_same(sbox):
"merge dir: del/rpl/mv onto not-same"
@@ -1376,9 +1375,7 @@ def actual_only_node_behaviour(sbox):
# update (up)
expected_stdout = [
"Skipped '%s' -- Node remains in conflict\n" % sbox.ospath('A/foo'),
- "Summary of conflicts:\n",
- " Skipped paths: 1\n",
- ]
+ ] + svntest.main.summary_of_conflicts(skipped_paths=1)
expected_stderr = []
run_and_verify_svn(None, expected_stdout, expected_stderr,
"update", foo_path)
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/update_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/update_tests.py?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/update_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/update_tests.py Wed Feb 13 06:37:54 2013
@@ -33,7 +33,7 @@ logger = logging.getLogger()
# Our testing module
import svntest
-from svntest import wc, actions, verify
+from svntest import wc, actions, verify, deeptrees
from merge_tests import expected_merge_output
from merge_tests import set_up_branch
@@ -3694,6 +3694,35 @@ def update_copied_and_deleted_prop(sbox)
#----------------------------------------------------------------------
+def update_output_with_conflicts(rev, target, paths=None):
+ """Return the expected output for an update of TARGET to revision REV, in
+ which all of the PATHS are updated and conflicting.
+
+ If PATHS is None, it means [TARGET]. The output is a list of lines.
+ """
+ if paths is None:
+ paths = [target]
+
+ lines = ["Updating '%s':\n" % target]
+ for path in paths:
+ lines += ['C %s\n' % path]
+ lines += ['Updated to revision %d.\n' % rev]
+ lines += svntest.main.summary_of_conflicts(text_conflicts=len(paths))
+ return lines
+
+def update_output_with_conflicts_resolved(rev, target, paths=None):
+ """Like update_output_with_conflicts(), but where all of the conflicts are
+ resolved within the update.
+ """
+ if paths is None:
+ paths = [target]
+
+ lines = update_output_with_conflicts(rev, target, paths)
+ for path in paths:
+ lines += ["Resolved conflicted state of '%s'\n" % path]
+ return lines
+
+#----------------------------------------------------------------------
def update_accept_conflicts(sbox):
"update --accept automatic conflict resolution"
@@ -3778,22 +3807,16 @@ def update_accept_conflicts(sbox):
# Just leave the conflicts alone, since run_and_verify_svn already uses
# the --non-interactive option.
svntest.actions.run_and_verify_svn(None,
- ["Updating '%s':\n" % (iota_path_backup),
- 'C %s\n' % (iota_path_backup,),
- 'Updated to revision 2.\n',
- 'Summary of conflicts:\n',
- ' Text conflicts: 1\n'],
+ update_output_with_conflicts(
+ 2, iota_path_backup),
[],
'update', iota_path_backup)
# lambda: --accept=postpone
# Just leave the conflicts alone.
svntest.actions.run_and_verify_svn(None,
- ["Updating '%s':\n" % (lambda_path_backup),
- 'C %s\n' % (lambda_path_backup,),
- 'Updated to revision 2.\n',
- 'Summary of conflicts:\n',
- ' Text conflicts: 1\n'],
+ update_output_with_conflicts(
+ 2, lambda_path_backup),
[],
'update', '--accept=postpone',
lambda_path_backup)
@@ -3801,13 +3824,8 @@ def update_accept_conflicts(sbox):
# mu: --accept=base
# Accept the pre-update base file.
svntest.actions.run_and_verify_svn(None,
- ["Updating '%s':\n" % (mu_path_backup),
- 'C %s\n' % (mu_path_backup,),
- 'Updated to revision 2.\n',
- 'Summary of conflicts:\n',
- ' Text conflicts: 1\n',
- "Resolved conflicted state of '%s'\n"
- % (mu_path_backup)],
+ update_output_with_conflicts_resolved(
+ 2, mu_path_backup),
[],
'update', '--accept=base',
mu_path_backup)
@@ -3815,13 +3833,8 @@ def update_accept_conflicts(sbox):
# alpha: --accept=mine
# Accept the user's working file.
svntest.actions.run_and_verify_svn(None,
- ["Updating '%s':\n" % (alpha_path_backup),
- 'C %s\n' % (alpha_path_backup,),
- 'Updated to revision 2.\n',
- 'Summary of conflicts:\n',
- ' Text conflicts: 1\n',
- "Resolved conflicted state of '%s'\n"
- % (alpha_path_backup)],
+ update_output_with_conflicts_resolved(
+ 2, alpha_path_backup),
[],
'update', '--accept=mine-full',
alpha_path_backup)
@@ -3829,13 +3842,8 @@ def update_accept_conflicts(sbox):
# beta: --accept=theirs
# Accept their file.
svntest.actions.run_and_verify_svn(None,
- ["Updating '%s':\n" % (beta_path_backup),
- 'C %s\n' % (beta_path_backup,),
- 'Updated to revision 2.\n',
- 'Summary of conflicts:\n',
- ' Text conflicts: 1\n',
- "Resolved conflicted state of '%s'\n"
- % (beta_path_backup)],
+ update_output_with_conflicts_resolved(
+ 2, beta_path_backup),
[],
'update', '--accept=theirs-full',
beta_path_backup)
@@ -3845,13 +3853,8 @@ def update_accept_conflicts(sbox):
# conflicts in place, so expect a message on stderr, but expect
# svn to exit with an exit code of 0.
svntest.actions.run_and_verify_svn2(None,
- ["Updating '%s':\n" % (pi_path_backup),
- 'C %s\n' % (pi_path_backup,),
- 'Updated to revision 2.\n',
- 'Summary of conflicts:\n',
- ' Text conflicts: 1\n',
- "Resolved conflicted state of '%s'\n"
- % (pi_path_backup)],
+ update_output_with_conflicts_resolved(
+ 2, pi_path_backup),
"system(.*) returned.*", 0,
'update', '--accept=edit',
'--force-interactive',
@@ -3860,11 +3863,8 @@ def update_accept_conflicts(sbox):
# rho: --accept=launch
# Run the external merge tool, it should leave conflict markers in place.
svntest.actions.run_and_verify_svn(None,
- ["Updating '%s':\n" % (rho_path_backup),
- 'C %s\n' % (rho_path_backup,),
- 'Updated to revision 2.\n',
- 'Summary of conflicts:\n',
- ' Text conflicts: 1\n'],
+ update_output_with_conflicts(
+ 2, rho_path_backup),
[],
'update', '--accept=launch',
'--force-interactive',
@@ -4181,25 +4181,25 @@ def restarted_update_should_delete_dir_p
# See use cases 1-3 in notes/tree-conflicts/use-cases.txt for background.
# convenience definitions
-leaf_edit = svntest.actions.deep_trees_leaf_edit
-tree_del = svntest.actions.deep_trees_tree_del
-leaf_del = svntest.actions.deep_trees_leaf_del
+leaf_edit = svntest.deeptrees.deep_trees_leaf_edit
+tree_del = svntest.deeptrees.deep_trees_tree_del
+leaf_del = svntest.deeptrees.deep_trees_leaf_del
-disk_after_leaf_edit = svntest.actions.deep_trees_after_leaf_edit
-disk_after_leaf_del = svntest.actions.deep_trees_after_leaf_del
-disk_after_tree_del = svntest.actions.deep_trees_after_tree_del
+disk_after_leaf_edit = svntest.deeptrees.deep_trees_after_leaf_edit
+disk_after_leaf_del = svntest.deeptrees.deep_trees_after_leaf_del
+disk_after_tree_del = svntest.deeptrees.deep_trees_after_tree_del
-disk_empty_dirs = svntest.actions.deep_trees_empty_dirs
+disk_empty_dirs = svntest.deeptrees.deep_trees_empty_dirs
-deep_trees_conflict_output = svntest.actions.deep_trees_conflict_output
+deep_trees_conflict_output = svntest.deeptrees.deep_trees_conflict_output
deep_trees_conflict_output_skipped = \
- svntest.actions.deep_trees_conflict_output_skipped
+ svntest.deeptrees.deep_trees_conflict_output_skipped
deep_trees_status_local_tree_del = \
- svntest.actions.deep_trees_status_local_tree_del
+ svntest.deeptrees.deep_trees_status_local_tree_del
deep_trees_status_local_leaf_edit = \
- svntest.actions.deep_trees_status_local_leaf_edit
+ svntest.deeptrees.deep_trees_status_local_leaf_edit
-DeepTreesTestCase = svntest.actions.DeepTreesTestCase
+DeepTreesTestCase = svntest.deeptrees.DeepTreesTestCase
def tree_conflicts_on_update_1_1(sbox):
@@ -4280,7 +4280,7 @@ def tree_conflicts_on_update_1_1(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_update(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_update(sbox,
[ DeepTreesTestCase("local_tree_del_incoming_leaf_edit",
tree_del,
leaf_edit,
@@ -4377,7 +4377,7 @@ def tree_conflicts_on_update_1_2(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_update(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_update(sbox,
[ DeepTreesTestCase("local_tree_del_incoming_leaf_del",
tree_del,
leaf_del,
@@ -4465,7 +4465,7 @@ def tree_conflicts_on_update_2_1(sbox):
### local-copy from its original revision. however, right now, we cannot
### denote that delta is a local-add rather than a child of that D/D1 copy.
### thus, it appears in the status output as a (M)odified child.
- svntest.actions.deep_trees_run_tests_scheme_for_update(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_update(sbox,
[ DeepTreesTestCase("local_leaf_edit_incoming_tree_del",
leaf_edit,
tree_del,
@@ -4488,7 +4488,7 @@ def tree_conflicts_on_update_2_2(sbox):
expected_disk = disk_empty_dirs.copy()
- expected_status = svntest.actions.deep_trees_virginal_state.copy()
+ expected_status = svntest.deeptrees.deep_trees_virginal_state.copy()
expected_status.add({'' : Item()})
expected_status.tweak(contents=None, status=' ', wc_rev=3)
# Tree conflicts.
@@ -4568,7 +4568,7 @@ def tree_conflicts_on_update_2_2(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_update(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_update(sbox,
[ DeepTreesTestCase("local_leaf_del_incoming_tree_del",
leaf_del,
tree_del,
@@ -4640,7 +4640,7 @@ def tree_conflicts_on_update_2_3(sbox):
# tree-conflict on DDD/D1. ('D/D1', '') likewise, as tree-conflict
# information is stored in the parent of a victim directory.
- svntest.actions.deep_trees_skipping_on_update(sbox,
+ svntest.deeptrees.deep_trees_skipping_on_update(sbox,
DeepTreesTestCase("local_leaf_edit_incoming_tree_del_skipping",
leaf_edit,
tree_del,
@@ -4730,7 +4730,7 @@ def tree_conflicts_on_update_3(sbox):
},
}
- svntest.actions.deep_trees_run_tests_scheme_for_update(sbox,
+ svntest.deeptrees.deep_trees_run_tests_scheme_for_update(sbox,
[ DeepTreesTestCase("local_tree_del_incoming_tree_del",
tree_del,
tree_del,
@@ -6120,14 +6120,11 @@ def break_moved_dir_edited_leaf_del(sbox
# Now resolve the conflict, using --accept=theirs-conflict.
# This should break the move of A/B/E to A/B/E2, leaving A/B/E2
- # as a copy. The deletion of A/B/E is reverted (unless it has been
- # replaced by a new A/B/E, which is a different test case).
- # XFAIL: Currently the move is still recorded after 'svn resolve'.
+ # as a copy. The deletion of A/B/E is not reverted.
svntest.actions.run_and_verify_svn("resolve failed", None, [],
'resolve', '--recursive',
'--accept=theirs-conflict', wc_dir)
- expected_status.tweak('A/B/E', status=' ', treeconflict=None, moved_to=None)
- expected_status.tweak('A/B/E/beta', status=' ')
+ expected_status.tweak('A/B/E', treeconflict=None, moved_to=None)
expected_status.tweak('A/B/E2', moved_from=None)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
@@ -6187,8 +6184,7 @@ def break_moved_replaced_dir(sbox):
# Now resolve the conflict, using --accept=theirs-conflict.
# This should break the move of A/B/E to A/B/E2, leaving A/B/E2
- # as a copy. A/B/E is not reverted since it has been replaced
- # by a new A/B/E.
+ # as a copy. A/B/E is not reverted.
svntest.actions.run_and_verify_svn("resolve failed", None, [],
'resolve', '--recursive',
'--accept=theirs-conflict', wc_dir)
@@ -6569,6 +6565,29 @@ def move_update_props(sbox):
svntest.actions.verify_disk(wc_dir, expected_disk, True,
svntest.tree.detect_conflict_files, extra_files)
+@Issues(3288)
+@SkipUnless(svntest.main.is_os_windows)
+@XFail(svntest.main.is_ra_type_dav)
+def windows_update_backslash(sbox):
+ "test filename with backslashes inside"
+
+ sbox.build()
+
+ wc_dir = sbox.wc_dir
+
+ svntest.actions.run_and_verify_svnmucc(None, None, [],
+ '-U', sbox.repo_url,
+ '-m', '',
+ 'mkdir', 'A/completely\\unusable\\dir')
+
+ # No error and a proper skip + recording in the working copy would also
+ # be a good result. This just verifies current behavior.
+
+ expected_error = 'svn: E155000: .* is not valid.*'
+ svntest.actions.run_and_verify_svn(wc_dir, None, expected_error, 'up',
+ wc_dir)
+
+
#######################################################################
# Run the tests
@@ -6651,6 +6670,7 @@ test_list = [ None,
incomplete_overcomplete,
update_swapped_depth_dirs,
move_update_props,
+ windows_update_backslash,
]
if __name__ == '__main__':
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/auth-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/auth-test.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/auth-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/auth-test.c Wed Feb 13 06:37:54 2013
@@ -22,9 +22,11 @@
*/
#include "svn_auth.h"
+#include "svn_dirent_uri.h"
#include "svn_private_config.h"
#include "../svn_test.h"
+#include "private/svn_auth_private.h"
static svn_error_t *
test_platform_specific_auth_providers(apr_pool_t *pool)
@@ -206,6 +208,108 @@ test_platform_specific_auth_providers(ap
return SVN_NO_ERROR;
}
+/* Helper for test_auth_clear(). Implements svn_auth_cleanup_callback */
+static svn_error_t *
+cleanup_callback(svn_boolean_t *delete_cred,
+ void *cleanup_baton,
+ const char *cred_kind,
+ const char *realmstring,
+ const char *provider,
+ apr_pool_t *scratch_pool)
+{
+ if (!strcmp(provider, SVN_AUTH__SIMPLE_PASSWORD_TYPE))
+ return SVN_NO_ERROR;
+
+ SVN_TEST_ASSERT(! strcmp(cred_kind, SVN_AUTH_CRED_SIMPLE));
+ SVN_TEST_ASSERT(! strcmp(realmstring, "<http://my.host> My realm"));
+
+ *delete_cred = TRUE;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_auth_clear(apr_pool_t *pool)
+{
+ const char *auth_dir;
+ svn_auth_provider_object_t *provider;
+ svn_auth_baton_t *baton;
+ apr_array_header_t *providers;
+ void *credentials;
+ svn_auth_cred_simple_t *creds;
+ svn_auth_iterstate_t *state;
+
+ SVN_ERR(svn_dirent_get_absolute(&auth_dir, "", pool));
+ auth_dir = svn_dirent_join(auth_dir, "auth-clear", pool);
+
+ svn_test_add_dir_cleanup(auth_dir);
+
+ SVN_ERR(svn_io_remove_dir2(auth_dir, TRUE, NULL, NULL, pool));
+ SVN_ERR(svn_io_dir_make(auth_dir, APR_OS_DEFAULT, pool));
+
+ svn_auth_get_simple_provider2(&provider, NULL, NULL, pool);
+
+ providers = apr_array_make(pool, 1, sizeof(svn_auth_provider_object_t *));
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
+
+ svn_auth_open(&baton, providers, pool);
+
+ svn_auth_set_parameter(baton, SVN_AUTH_PARAM_DEFAULT_USERNAME, "jrandom");
+ svn_auth_set_parameter(baton, SVN_AUTH_PARAM_DEFAULT_PASSWORD, "rayjandom");
+ svn_auth_set_parameter(baton, SVN_AUTH_PARAM_CONFIG_DIR, auth_dir);
+
+ /* Create the auth subdirs. Without these we can't store passwords */
+ SVN_ERR(svn_config_ensure(auth_dir, pool));
+
+ /* Obtain the default credentials just passed */
+ SVN_ERR(svn_auth_first_credentials(&credentials,
+ &state,
+ SVN_AUTH_CRED_SIMPLE,
+ "<http://my.host> My realm",
+ baton,
+ pool));
+
+ creds = credentials;
+ SVN_TEST_ASSERT(! strcmp(creds->username, "jrandom"));
+ SVN_TEST_ASSERT(creds->may_save);
+
+ /* And tell that they are ok and can be saved */
+ SVN_ERR(svn_auth_save_credentials(state, pool));
+
+ /* Ok, and now we try to remove the credentials */
+ svn_auth_set_parameter(baton, SVN_AUTH_PARAM_DEFAULT_USERNAME, NULL);
+ svn_auth_set_parameter(baton, SVN_AUTH_PARAM_DEFAULT_PASSWORD, NULL);
+
+ /* Are they still in the baton? */
+ SVN_ERR(svn_auth_first_credentials(&credentials,
+ &state,
+ SVN_AUTH_CRED_SIMPLE,
+ "<http://my.host> My realm",
+ baton,
+ pool));
+
+ SVN_TEST_ASSERT(credentials);
+ creds = credentials;
+ SVN_TEST_ASSERT(! strcmp(creds->username, "jrandom"));
+ SVN_TEST_ASSERT(creds->may_save);
+
+
+ SVN_ERR(svn_auth_cleanup_walk(baton,
+ cleanup_callback, NULL,
+ pool));
+
+ SVN_ERR(svn_auth_first_credentials(&credentials,
+ &state,
+ SVN_AUTH_CRED_SIMPLE,
+ "<http://my.host> My realm",
+ baton,
+ pool));
+
+ SVN_TEST_ASSERT(! credentials);
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
@@ -214,5 +318,13 @@ struct svn_test_descriptor_t test_funcs[
SVN_TEST_NULL,
SVN_TEST_PASS2(test_platform_specific_auth_providers,
"test retrieving platform-specific auth providers"),
+#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
+ SVN_TEST_PASS2(test_auth_clear,
+ "test svn_auth_clear()"),
+#else
+ SVN_TEST_WIMP(test_auth_clear,
+ "test svn_auth_clear()",
+ "Needs testing with SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE"),
+#endif
SVN_TEST_NULL
};
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/dirent_uri-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/dirent_uri-test.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/dirent_uri-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_subr/dirent_uri-test.c Wed Feb 13 06:37:54 2013
@@ -618,6 +618,11 @@ test_uri_dirname(apr_pool_t *pool)
{ "http://server", "http://server" },
{ "file:///a/b", "file:///a" },
{ "file:///a", "file://" },
+ { "file://", "file://" },
+#ifdef WIN32
+ { "file:///A:/dir", "file:///A:" },
+ { "file:///A:", "file://" },
+#endif
};
for (i = 0; i < COUNT_OF(tests); i++)
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/conflict-data-test.c Wed Feb 13 06:37:54 2013
@@ -229,9 +229,9 @@ test_read_write_tree_conflicts(const svn
/* Write */
SVN_ERR(svn_wc__add_tree_conflict(sbox.wc_ctx, /*child1_abspath,*/
- conflict1, NULL, pool));
+ conflict1, pool));
SVN_ERR(svn_wc__add_tree_conflict(sbox.wc_ctx, /*child2_abspath,*/
- conflict2, NULL, pool));
+ conflict2, pool));
/* Query (conflict1 through WC-DB API, conflict2 through WC API) */
{
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/entries-compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/entries-compat.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/entries-compat.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/entries-compat.c Wed Feb 13 06:37:54 2013
@@ -601,12 +601,14 @@ test_access_baton_like_locking(apr_pool_
{
const char *url, *repos_root_url, *repos_uuid;
const char *subdir = svn_dirent_join(local_abspath, "sub-wc", pool);
+ const char *repos_relpath;
svn_boolean_t is_root;
- SVN_ERR(svn_wc__node_get_url(&url, wc_ctx, local_abspath, pool, pool));
- SVN_ERR(svn_wc__node_get_repos_info(&repos_root_url, &repos_uuid,
+ SVN_ERR(svn_wc__node_get_repos_info(NULL, &repos_relpath,
+ &repos_root_url, &repos_uuid,
wc_ctx, local_abspath,
pool, pool));
+ url = svn_path_url_add_component2(repos_root_url, repos_relpath, pool);
SVN_ERR(svn_io_make_dir_recursively(subdir, pool));
SVN_ERR(svn_wc_ensure_adm3(subdir, repos_uuid,
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/op-depth-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/op-depth-test.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/op-depth-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/op-depth-test.c Wed Feb 13 06:37:54 2013
@@ -4139,6 +4139,41 @@ revert_nested_move(const svn_test_opts_t
{3, "A2/B2/C2", "normal", 1, "A/B/C", MOVED_HERE},
{0}
};
+ nodes_row_t nodes_AB_moved_C_copied[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 1, "A/B"},
+ {0, "A/B/C", "normal", 1, "A/B/C"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "A2"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A2", "normal", 1, "A", MOVED_HERE},
+ {1, "A2/B", "normal", 1, "A/B", MOVED_HERE},
+ {1, "A2/B/C", "normal", 1, "A/B/C", MOVED_HERE},
+ {2, "A2/B", "base-deleted", NO_COPY_FROM, "A2/B2"},
+ {2, "A2/B/C", "base-deleted", NO_COPY_FROM},
+ {2, "A2/B2", "normal", 1, "A/B", MOVED_HERE},
+ {2, "A2/B2/C", "normal", 1, "A/B/C", MOVED_HERE},
+ {3, "A2/B2/C2", "normal", 1, "A/B/C"},
+ {0}
+ };
+ nodes_row_t nodes_AC_moved_B_copied[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 1, "A/B"},
+ {0, "A/B/C", "normal", 1, "A/B/C"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "A2"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A2", "normal", 1, "A", MOVED_HERE},
+ {1, "A2/B", "normal", 1, "A/B", MOVED_HERE},
+ {1, "A2/B/C", "normal", 1, "A/B/C", MOVED_HERE},
+ {2, "A2/B2", "normal", 1, "A/B"},
+ {2, "A2/B2/C", "normal", 1, "A/B/C"},
+ {3, "A2/B2/C", "base-deleted", NO_COPY_FROM, "A2/B2/C2"},
+ {3, "A2/B2/C2", "normal", 1, "A/B/C", MOVED_HERE},
+ {0}
+ };
SVN_ERR(svn_test__sandbox_create(&b, "revert_nested_move", opts, pool));
@@ -4165,7 +4200,16 @@ revert_nested_move(const svn_test_opts_t
SVN_ERR(sbox_wc_move(&b, "A2/B2/C", "A2/B2/C2"));
SVN_ERR(check_db_rows(&b, "", nodes_ABC_moved));
+ SVN_ERR(sbox_wc_revert(&b, "A2/B2/C", svn_depth_empty));
+ SVN_ERR(check_db_rows(&b, "", nodes_AB_moved_C_copied));
+ SVN_ERR(sbox_wc_revert(&b, "A2/B2/C2", svn_depth_infinity));
+ SVN_ERR(check_db_rows(&b, "", nodes_AB_moved));
+
+ SVN_ERR(sbox_wc_move(&b, "A2/B2/C", "A2/B2/C2"));
+ SVN_ERR(check_db_rows(&b, "", nodes_ABC_moved));
+
SVN_ERR(sbox_wc_revert(&b, "A2/B2/C", svn_depth_infinity));
+ SVN_ERR(check_db_rows(&b, "", nodes_AB_moved_C_copied));
SVN_ERR(sbox_wc_revert(&b, "A2/B2/C2", svn_depth_infinity));
SVN_ERR(check_db_rows(&b, "", nodes_AB_moved));
@@ -4180,6 +4224,9 @@ revert_nested_move(const svn_test_opts_t
SVN_ERR(sbox_wc_move(&b, "A", "A2"));
SVN_ERR(check_db_rows(&b, "", nodes_ABC_moved));
+ SVN_ERR(sbox_wc_revert(&b, "A2/B", svn_depth_infinity));
+ SVN_ERR(check_db_rows(&b, "", nodes_AC_moved_B_copied));
+
return SVN_NO_ERROR;
}
@@ -4419,7 +4466,8 @@ move_update(const svn_test_opts_t *opts,
}
/* Resolve should update the move. */
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -4462,7 +4510,8 @@ move_update(const svn_test_opts_t *opts,
SVN_ERR(check_db_rows(&b, "", nodes));
}
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 3, ""},
@@ -4508,7 +4557,8 @@ move_update(const svn_test_opts_t *opts,
}
SVN_ERR(sbox_wc_update(&b, "", 2));
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -4563,7 +4613,8 @@ move_update(const svn_test_opts_t *opts,
}
SVN_ERR(sbox_wc_update(&b, "", 4));
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 4, ""},
@@ -4593,7 +4644,8 @@ move_update(const svn_test_opts_t *opts,
}
SVN_ERR(sbox_wc_update(&b, "", 5));
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 5, ""},
@@ -5124,7 +5176,8 @@ update_prop_mod_into_moved(const svn_tes
}
/* Resolve should update the move. */
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -5203,8 +5256,10 @@ nested_move_update(const svn_test_opts_t
/* Following the A->A2 move should raise a tree-conflict on A2/B/C,
resolving that may require an explicit resolve. */
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
- SVN_ERR(sbox_wc_resolve(&b, "A2/B/C", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A2/B/C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -5382,8 +5437,7 @@ nested_move_commit(const svn_test_opts_t
{3, "A2/B/C", "base-deleted", NO_COPY_FROM, "C2"},
{3, "A2/B/C/f", "base-deleted", NO_COPY_FROM},
- /* Currently these are recorded as a move but still
- have the copy history from ^/A/B/C@1 */
+ /* These need to have their copyfrom information updated */
{1, "C2", "normal", 2, "A2/B/C", MOVED_HERE},
{1, "C2/f", "normal", 2, "A2/B/C/f", MOVED_HERE},
{0}
@@ -5586,7 +5640,8 @@ move_update_conflicts(const svn_test_opt
SVN_ERR(sbox_wc_update(&b, "A", 2));
SVN_ERR(check_tree_conflict_repos_path(&b, "A", "X/A", "X/A"));
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 1, "X"},
@@ -5669,7 +5724,8 @@ move_update_delete_mods(const svn_test_o
}
SVN_ERR(sbox_wc_update(&b, "A", 2));
- SVN_ERR(sbox_wc_resolve(&b, "A/B", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A/B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 1, ""},
@@ -5817,8 +5873,10 @@ move_in_delete(const svn_test_opts_t *op
}
SVN_ERR(sbox_wc_update(&b, "", 2));
- SVN_ERR(sbox_wc_resolve(&b, "A/B", svn_wc_conflict_choose_merged));
- SVN_ERR(sbox_wc_resolve(&b, "A/B/C", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "A/B", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "A/B/C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -5836,6 +5894,48 @@ move_in_delete(const svn_test_opts_t *op
SVN_ERR(check_db_rows(&b, "", nodes));
}
+ SVN_ERR(sbox_wc_update(&b, "", 3));
+ SVN_ERR(sbox_wc_revert(&b, "A/B", svn_depth_empty));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 3, ""},
+ {0, "A", "normal", 3, "A"},
+ {0, "A/B", "normal", 3, "A/B"},
+ {0, "A/B/C", "normal", 3, "A/B/C"},
+ {0, "A/B/C/D", "normal", 3, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 3, "A/B/C/D/E"},
+ {3, "A/B/C", "base-deleted", NO_COPY_FROM, "C2"},
+ {3, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {3, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C2", "normal", 2, "A/B/C", MOVED_HERE},
+ {1, "C2/D", "normal", 2, "A/B/C/D", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ /* Revert should have left a tree-conflict (or broken the move). */
+ SVN_ERR(sbox_wc_resolve(&b, "A/B/C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 3, ""},
+ {0, "A", "normal", 3, "A"},
+ {0, "A/B", "normal", 3, "A/B"},
+ {0, "A/B/C", "normal", 3, "A/B/C"},
+ {0, "A/B/C/D", "normal", 3, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 3, "A/B/C/D/E"},
+ {3, "A/B/C", "base-deleted", NO_COPY_FROM, "C2"},
+ {3, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {3, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C2", "normal", 3, "A/B/C", MOVED_HERE},
+ {1, "C2/D", "normal", 3, "A/B/C/D", MOVED_HERE},
+ {1, "C2/D/E", "normal", 3, "A/B/C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
return SVN_NO_ERROR;
}
@@ -5908,7 +6008,8 @@ switch_move(const svn_test_opts_t *opts,
}
/* Conflicts from switch are resolved just like those from update. */
- SVN_ERR(sbox_wc_resolve(&b, "B/D", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "B/D", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 3, "X"},
@@ -5933,7 +6034,8 @@ switch_move(const svn_test_opts_t *opts,
SVN_ERR(check_db_rows(&b, "", nodes));
}
- SVN_ERR(sbox_wc_resolve(&b, "D2/E", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "D2/E", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 3, "X"},
@@ -6006,7 +6108,8 @@ move_replace(const svn_test_opts_t *opts
SVN_ERR(check_db_rows(&b, "", nodes));
}
- SVN_ERR(sbox_wc_resolve(&b, "B", svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "B", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
{
nodes_row_t nodes[] = {
{0, "", "normal", 2, ""},
@@ -6029,84 +6132,418 @@ static svn_error_t *
layered_moved_to(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
+ svn_error_t *err;
SVN_ERR(svn_test__sandbox_create(&b, "layered_moved_to", opts, pool));
SVN_ERR(sbox_wc_mkdir(&b, "A"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
- SVN_ERR(sbox_wc_mkdir(&b, "B"));
- SVN_ERR(sbox_wc_mkdir(&b, "B/C"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/D"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/D/E"));
+ SVN_ERR(sbox_wc_mkdir(&b, "C"));
+ SVN_ERR(sbox_wc_mkdir(&b, "C/D"));
+ SVN_ERR(sbox_wc_mkdir(&b, "C/D/E"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "property", "value", "A/B/C/D/E"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "property", "value", "C/D/E"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_mkdir(&b, "P"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "property2", "value", "A/B/C/D/E"));
+ SVN_ERR(sbox_wc_propset(&b, "property2", "value", "C/D/E"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_update(&b, "", 1));
+
+ SVN_ERR(sbox_wc_move(&b, "A", "X"));
+ SVN_ERR(sbox_wc_move(&b, "X/B/C/D/E", "E2"));
+ SVN_ERR(sbox_wc_delete(&b, "X/B/C"));
+ SVN_ERR(sbox_wc_move(&b, "C", "X/B/C"));
+ SVN_ERR(sbox_wc_move(&b, "X/B/C/D/E", "E3"));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 1, "A/B"},
+ {0, "A/B/C", "normal", 1, "A/B/C"},
+ {0, "A/B/C/D", "normal", 1, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 1, "A/B/C/D/E"},
+ {0, "C", "normal", 1, "C"},
+ {0, "C/D", "normal", 1, "C/D"},
+ {0, "C/D/E", "normal", 1, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 1, "A", MOVED_HERE},
+ {1, "X/B", "normal", 1, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 1, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 1, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 1, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 1, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 1, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 1, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 1, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 1, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(sbox_wc_update(&b, "A", 2));
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "X/B/C", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+ SVN_ERR(sbox_wc_resolve(&b, "X/B/C/D/E", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {0, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 2, "A/B/C/D/E"},
+ {0, "C", "normal", 1, "C"},
+ {0, "C/D", "normal", 1, "C/D"},
+ {0, "C/D/E", "normal", 1, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 2, "A", MOVED_HERE},
+ {1, "X/B", "normal", 2, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 2, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 2, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 2, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 1, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 1, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 1, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 2, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 1, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ SVN_ERR(sbox_wc_update(&b, "C", 3));
+ SVN_ERR(sbox_wc_resolve(&b, "C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "X/B/C/D/E", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 2, "A"},
+ {0, "A/B", "normal", 2, "A/B"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {0, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 2, "A/B/C/D/E"},
+ {0, "C", "normal", 3, "C"},
+ {0, "C/D", "normal", 3, "C/D"},
+ {0, "C/D/E", "normal", 3, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 2, "A", MOVED_HERE},
+ {1, "X/B", "normal", 2, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 2, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 2, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 2, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 3, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 3, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 3, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 2, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 3, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ /* An update with no text/property/tree changes in A, just a revision bump. */
+ SVN_ERR(sbox_wc_update(&b, "A", 4));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 1, ""},
+ {0, "A", "normal", 4, "A"},
+ {0, "A/B", "normal", 4, "A/B"},
+ {0, "A/B/C", "normal", 4, "A/B/C"},
+ {0, "A/B/C/D", "normal", 4, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 4, "A/B/C/D/E"},
+ {0, "C", "normal", 3, "C"},
+ {0, "C/D", "normal", 3, "C/D"},
+ {0, "C/D/E", "normal", 3, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 4, "A", MOVED_HERE},
+ {1, "X/B", "normal", 4, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 4, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 4, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 4, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 3, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 3, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 3, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 4, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 3, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ /* Update for conflicts on A and C */
+ SVN_ERR(sbox_wc_update(&b, "", 5));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, ""},
+ {0, "A", "normal", 5, "A"},
+ {0, "A/B", "normal", 5, "A/B"},
+ {0, "A/B/C", "normal", 5, "A/B/C"},
+ {0, "A/B/C/D", "normal", 5, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 5, "A/B/C/D/E"},
+ {0, "P", "normal", 5, "P"},
+ {0, "C", "normal", 5, "C"},
+ {0, "C/D", "normal", 5, "C/D"},
+ {0, "C/D/E", "normal", 5, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 4, "A", MOVED_HERE},
+ {1, "X/B", "normal", 4, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 4, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 4, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 4, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 3, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 3, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 3, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 4, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 3, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ /* Partially resolve A */
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "X/B/C", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+
+ /* Cannot resolve C */
+ err = sbox_wc_resolve(&b, "C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict);
+ SVN_ERR_ASSERT(err && err->apr_err == SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE);
+ svn_error_clear(err);
+
+ /* Complete resolving A and then resolve C */
+ SVN_ERR(sbox_wc_resolve(&b, "X/B/C/D/E", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, ""},
+ {0, "A", "normal", 5, "A"},
+ {0, "A/B", "normal", 5, "A/B"},
+ {0, "A/B/C", "normal", 5, "A/B/C"},
+ {0, "A/B/C/D", "normal", 5, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 5, "A/B/C/D/E"},
+ {0, "P", "normal", 5, "P"},
+ {0, "C", "normal", 5, "C"},
+ {0, "C/D", "normal", 5, "C/D"},
+ {0, "C/D/E", "normal", 5, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 5, "A", MOVED_HERE},
+ {1, "X/B", "normal", 5, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 5, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 5, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 5, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 5, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 5, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 5, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 5, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 3, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+update_within_move(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+ svn_error_t *err;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "update_within_move", opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
SVN_ERR(sbox_wc_commit(&b, ""));
- SVN_ERR(sbox_wc_propset(&b, "property", "value", "A/B/C"));
- SVN_ERR(sbox_wc_propset(&b, "property", "value", "B/C"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/B/C/D"));
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_update(&b, "", 1));
SVN_ERR(sbox_wc_move(&b, "A", "X"));
- SVN_ERR(sbox_wc_move(&b, "X/B/C", "C2"));
- SVN_ERR(sbox_wc_delete(&b, "X/B"));
- SVN_ERR(sbox_wc_move(&b, "B", "X/B"));
- SVN_ERR(sbox_wc_move(&b, "X/B/C", "C3"));
+ SVN_ERR(sbox_wc_update(&b, "A/B/C", 2));
{
nodes_row_t nodes[] = {
{0, "", "normal", 1, ""},
{0, "A", "normal", 1, "A"},
{0, "A/B", "normal", 1, "A/B"},
- {0, "A/B/C", "normal", 1, "A/B/C"},
- {0, "B", "normal", 1, "B"},
- {0, "B/C", "normal", 1, "B/C"},
+ {0, "A/B/C", "normal", 2, "A/B/C"},
+ {0, "A/B/C/D", "normal", 2, "A/B/C/D"},
{1, "A", "base-deleted", NO_COPY_FROM, "X"},
{1, "A/B", "base-deleted", NO_COPY_FROM},
{1, "A/B/C", "base-deleted", NO_COPY_FROM},
- {1, "B", "base-deleted", NO_COPY_FROM, "X/B"},
- {1, "B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
{1, "X", "normal", 1, "A", MOVED_HERE},
{1, "X/B", "normal", 1, "A/B", MOVED_HERE},
{1, "X/B/C", "normal", 1, "A/B/C", MOVED_HERE},
- {2, "X/B", "normal", 1, "B", MOVED_HERE},
- {2, "X/B/C", "normal", 1, "B/C", FALSE, "C2", TRUE},
- {3, "X/B/C", "base-deleted", NO_COPY_FROM, "C3"},
- {1, "C2", "normal", 1, "A/B/C", MOVED_HERE},
- {1, "C3", "normal", 1, "B/C", MOVED_HERE},
{0}
};
SVN_ERR(check_db_rows(&b, "", nodes));
}
- SVN_ERR(sbox_wc_update(&b, "A", 2));
- SVN_ERR(sbox_wc_resolve(&b, "A", svn_wc_conflict_choose_mine_conflict));
- SVN_ERR(sbox_wc_resolve(&b, "X/B", svn_wc_conflict_choose_merged));
- SVN_ERR(sbox_wc_resolve(&b, "X/B/C", svn_wc_conflict_choose_mine_conflict));
+ /* Can't resolve mixed-revision source to mine-conflict. */
+ err = sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict);
+ SVN_ERR_ASSERT(err && err->apr_err == SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE);
+ svn_error_clear(err);
+
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
{
nodes_row_t nodes[] = {
{0, "", "normal", 1, ""},
- {0, "A", "normal", 2, "A"},
- {0, "A/B", "normal", 2, "A/B"},
+ {0, "A", "normal", 1, "A"},
+ {0, "A/B", "normal", 1, "A/B"},
{0, "A/B/C", "normal", 2, "A/B/C"},
- {0, "B", "normal", 1, "B"},
- {0, "B/C", "normal", 1, "B/C"},
- {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {0, "A/B/C/D", "normal", 2, "A/B/C/D"},
+ {1, "A", "base-deleted", NO_COPY_FROM},
{1, "A/B", "base-deleted", NO_COPY_FROM},
{1, "A/B/C", "base-deleted", NO_COPY_FROM},
- {1, "B", "base-deleted", NO_COPY_FROM, "X/B"},
- {1, "B/C", "base-deleted", NO_COPY_FROM},
- {1, "X", "normal", 2, "A", MOVED_HERE},
- {1, "X/B", "normal", 2, "A/B", MOVED_HERE},
- {1, "X/B/C", "normal", 2, "A/B/C", MOVED_HERE},
- {2, "X/B", "normal", 1, "B", MOVED_HERE},
- {2, "X/B/C", "normal", 1, "B/C", FALSE, "C2", TRUE},
- {3, "X/B/C", "base-deleted", NO_COPY_FROM, "C3"},
- {1, "C2", "normal", 2, "A/B/C", MOVED_HERE},
- {1, "C3", "normal", 1, "B/C", MOVED_HERE},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 1, "A"},
+ {1, "X/B", "normal", 1, "A/B"},
+ {1, "X/B/C", "normal", 1, "A/B/C"},
{0}
};
SVN_ERR(check_db_rows(&b, "", nodes));
}
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+commit_moved_descendant(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+ SVN_ERR(svn_test__sandbox_create(&b, "commit_moved_descendant", opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A/A/A/A"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_copy(&b, "A", "A_copied"));
+ SVN_ERR(sbox_wc_move(&b, "A/A/A", "AAA_moved"));
+ SVN_ERR(sbox_wc_delete(&b, "A/A"));
+ SVN_ERR(sbox_wc_copy(&b, "A_copied/A", "A/A"));
+
+ /* And now I want to commit AAA_moved (the entire move), but not
+ the replacement of A/A */
+
+ /* For now, just start committing directly */
+ /* ### This fails, because A/A/A is not collected by the commit
+ harvester (it doesn't need committing, but our move filter
+ blocks on it) */
+ SVN_ERR(sbox_wc_commit(&b, ""));
+
+ /* It would be nicer if we could just do a: */
+ /* SVN_ERR(sbox_wc_commit(&b, "AAA_moved")); */
+ /* Which then includes the delete half of the move, when it is
+ shadowed, like in this case. The commit processing doesn't
+ support this yet though*/
+
return SVN_NO_ERROR;
}
+static svn_error_t *
+commit_moved_away_descendant(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+ SVN_ERR(svn_test__sandbox_create(&b, "commit_moved_away_descendant",
+ opts, pool));
+
+ SVN_ERR(sbox_wc_mkdir(&b, "A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A/A/A"));
+ SVN_ERR(sbox_wc_mkdir(&b, "A/A/A/A/A/A"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_copy(&b, "A", "A_copied"));
+ SVN_ERR(sbox_wc_move(&b, "A/A/A", "AAA_moved"));
+ SVN_ERR(sbox_wc_delete(&b, "A/A"));
+ SVN_ERR(sbox_wc_copy(&b, "A_copied/A", "A/A"));
+
+ /* And now I want to make sure that I can't commit A, without also
+ committing AAA_moved, as that would break the move*/
+ SVN_ERR(sbox_wc_commit(&b, "A"));
+
+ return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
+ "The commit should have failed");
+
+ /*return SVN_NO_ERROR;*/
+}
+
+
/* ---------------------------------------------------------------------- */
/* The list of test functions */
@@ -6207,7 +6644,7 @@ struct svn_test_descriptor_t test_funcs[
"update_prop_mod_into_moved"),
SVN_TEST_OPTS_PASS(nested_move_update,
"nested_move_update"),
- SVN_TEST_OPTS_XFAIL(nested_move_commit,
+ SVN_TEST_OPTS_PASS(nested_move_commit,
"nested_move_commit"),
SVN_TEST_OPTS_PASS(nested_move_update2,
"nested_move_update2"),
@@ -6223,7 +6660,13 @@ struct svn_test_descriptor_t test_funcs[
"switch_move"),
SVN_TEST_OPTS_PASS(move_replace,
"move_replace"),
- SVN_TEST_OPTS_XFAIL(layered_moved_to,
+ SVN_TEST_OPTS_PASS(layered_moved_to,
"layered_moved_to"),
+ SVN_TEST_OPTS_PASS(update_within_move,
+ "update_within_move"),
+ SVN_TEST_OPTS_XFAIL(commit_moved_descendant,
+ "commit_moved_descendant"),
+ SVN_TEST_OPTS_XFAIL(commit_moved_away_descendant,
+ "commit_moved_away_descendant"),
SVN_TEST_NULL
};
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.c Wed Feb 13 06:37:54 2013
@@ -355,15 +355,16 @@ sbox_wc_switch(svn_test__sandbox_t *b, c
svn_error_t *
sbox_wc_resolved(svn_test__sandbox_t *b, const char *path)
{
- return sbox_wc_resolve(b, path, svn_wc_conflict_choose_merged);
+ return sbox_wc_resolve(b, path, svn_depth_infinity,
+ svn_wc_conflict_choose_merged);
}
svn_error_t *
-sbox_wc_resolve(svn_test__sandbox_t *b, const char *path,
+sbox_wc_resolve(svn_test__sandbox_t *b, const char *path, svn_depth_t depth,
svn_wc_conflict_choice_t conflict_choice)
{
SVN_ERR(svn_wc__resolve_conflicts(b->wc_ctx, sbox_wc_path(b, path),
- svn_depth_infinity,
+ depth,
TRUE /* resolve_text */,
"" /* resolve_prop (ALL props) */,
TRUE /* resolve_tree */,
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.h?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.h (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/utils.h Wed Feb 13 06:37:54 2013
@@ -139,7 +139,7 @@ sbox_wc_resolved(svn_test__sandbox_t *b,
/* */
svn_error_t *
-sbox_wc_resolve(svn_test__sandbox_t *b, const char *path,
+sbox_wc_resolve(svn_test__sandbox_t *b, const char *path, svn_depth_t depth,
svn_wc_conflict_choice_t conflict_choice);
/* */
Modified: subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/wc-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/wc-test.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/wc-test.c (original)
+++ subversion/branches/fsfs-format7/subversion/tests/libsvn_wc/wc-test.c Wed Feb 13 06:37:54 2013
@@ -135,6 +135,7 @@ test_node_get_base(const svn_test_opts_t
SVN_ERR(svn_wc__node_get_base(&revision, &repos_relpath,
&repos_root_url, &repos_uuid,
+ NULL,
b->wc_ctx, local_abspath,
b->pool, b->pool));
SVN_TEST_ASSERT(revision == subtest->base_rev);
Modified: subversion/branches/fsfs-format7/tools/dev/gen-py-errors.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/tools/dev/gen-py-errors.py?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/tools/dev/gen-py-errors.py (original)
+++ subversion/branches/fsfs-format7/tools/dev/gen-py-errors.py Wed Feb 13 06:37:54 2013
@@ -33,7 +33,7 @@ import os
import re
HEADER = '''#!/usr/bin/env python
-### This file automatically generated by tools/dev/gen-py-error.py,
+### This file automatically generated by tools/dev/gen-py-errors.py,
### which see for more information
###
### It is versioned for convenience.
Modified: subversion/branches/fsfs-format7/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c?rev=1445479&r1=1445478&r2=1445479&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c (original)
+++ subversion/branches/fsfs-format7/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c Wed Feb 13 06:37:54 2013
@@ -229,7 +229,7 @@ raise_tree_conflict(int argc, const char
/* Raise the conflict */
SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, pool, pool));
- SVN_ERR(svn_wc__add_tree_conflict(wc_ctx, c, NULL, pool));
+ SVN_ERR(svn_wc__add_tree_conflict(wc_ctx, c, pool));
return SVN_NO_ERROR;
}
Propchange: subversion/branches/fsfs-format7/tools/dist/make-deps-tarball.sh
------------------------------------------------------------------------------
Merged /subversion/trunk/tools/dist/make-deps-tarball.sh:r1442090-1445080