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