You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2015/03/29 09:15:17 UTC

svn commit: r1669863 - in /subversion/trunk/tools/dist: backport.pl backport/merger.py backport_tests.py

Author: danielsh
Date: Sun Mar 29 07:15:17 2015
New Revision: 1669863

URL: http://svn.apache.org/r1669863
Log:
backport: Fix an svn:mergeinfo validation.

* tools/dist/backport.pl
  (merge): Fix the validation added in r1471467.

* tools/dist/backport_tests.py
  (backport_otherproject_change): New regression test.

* tools/dist/backport/merger.py
  (_includes_only_svn_mergeinfo_changes): New helper.
  (merge): Add the validation here, too.

Modified:
    subversion/trunk/tools/dist/backport.pl
    subversion/trunk/tools/dist/backport/merger.py
    subversion/trunk/tools/dist/backport_tests.py

Modified: subversion/trunk/tools/dist/backport.pl
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/backport.pl?rev=1669863&r1=1669862&r2=1669863&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport.pl (original)
+++ subversion/trunk/tools/dist/backport.pl Sun Mar 29 07:15:17 2015
@@ -431,7 +431,7 @@ fi
 $SVNq up
 $SVNq merge @mergeargs
 if [ "`$SVN status -q | wc -l`" -eq 1 ]; then
-  if [ -n "`$SVN diff | perl -lne 'print if s/^(Added|Deleted|Modified): //' | grep -vx svn:mergeinfo`" ]; then
+  if [ -z "`$SVN diff | perl -lne 'print if s/^(Added|Deleted|Modified): //' | grep -vx svn:mergeinfo`" ]; then
     # This check detects STATUS entries that name non-^/subversion/ revnums.
     # ### Q: What if we actually commit a mergeinfo fix to trunk and then want
     # ###    to backport it?

Modified: subversion/trunk/tools/dist/backport/merger.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/backport/merger.py?rev=1669863&r1=1669862&r2=1669863&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport/merger.py (original)
+++ subversion/trunk/tools/dist/backport/merger.py Sun Mar 29 07:15:17 2015
@@ -121,6 +121,24 @@ def last_changed_revision(path_or_url):
     else:
       raise Exception("'svn info' did not print last changed revision")
 
+def _includes_only_svn_mergeinfo_changes(status_output):
+  """Return TRUE iff there is exactly one local mod, and it is an svn:mergeinfo
+  change.  Use the provided `status -q` output."""
+
+  if len(status_output.splitlines()) != 1:
+    return False
+
+  _, diff_output, _ = run_svn(['diff'])
+
+  pattern = re.compile(r'^(Added|Modified|Deleted): ')
+  targets = (line.split(':', 1)[1].strip()
+             for line in diff_output.splitlines()
+               if pattern.match(line))
+  if set(targets) == {'svn:mergeinfo'}:
+    return True
+
+  return False
+
 
 def merge(entry, expected_stderr=None, *, commit=False, sf=None):
   """Merges ENTRY into the working copy at cwd.
@@ -173,7 +191,11 @@ def merge(entry, expected_stderr=None, *
   _, stdout, stderr = run_svn_quiet(['merge'] + mergeargs, expected_stderr)
   sys.stdout.write(stdout)
   sys.stderr.write(stderr)
-  run_svn(['status', '-q'])
+
+  _, stdout, _ = run_svn(['status', '-q'])
+  if _includes_only_svn_mergeinfo_changes(stdout):
+    raise UnableToMergeException("Entry %s includes only svn:mergeinfo changes"
+                                 % entry)
 
   if commit:
     sf.remove(entry)
@@ -187,7 +209,6 @@ def merge(entry, expected_stderr=None, *
 
     run_svn_quiet(['commit', '-m', logmsg])
 
-  # TODO: add the 'only mergeinfo changes' check (and regression test it)
   # TODO(interactive mode): add the 'svn status' display
 
   if entry.branch:

Modified: subversion/trunk/tools/dist/backport_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/backport_tests.py?rev=1669863&r1=1669862&r2=1669863&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport_tests.py (original)
+++ subversion/trunk/tools/dist/backport_tests.py Sun Mar 29 07:15:17 2015
@@ -592,6 +592,38 @@ def backport_branch_with_original_revisi
 
 
 #----------------------------------------------------------------------
+@BackportTest(None)
+def backport_otherproject_change(sbox):
+  "inoperative revision"
+
+  # r6: a change outside ^/subversion
+  sbox.simple_mkdir('elsewhere')
+  sbox.simple_commit()
+
+  # r7: Nominate r6 by mistake
+  approved_entries = [
+    make_entry([6])
+  ]
+  sbox.simple_append(STATUS, serialize_STATUS(approved_entries))
+  sbox.simple_commit(message='Nominate r6 by mistake')
+
+  # Run it.
+  exit_code, output, errput = run_backport(sbox, error_expected=True)
+
+  # Verify no commit occurred.
+  svntest.actions.run_and_verify_svnlook(["7\n"], [],
+                                         'youngest', sbox.repo_dir)
+
+  # Verify the failure mode.
+  expected_stdout = None
+  expected_stderr = ".*only svn:mergeinfo changes.*"
+  if exit_code == 0:
+    # Can't use verify_exit_code() since the exact code used varies.
+    raise svntest.Failure("exit_code should be non-zero")
+  svntest.verify.verify_outputs(None, output, errput,
+                                expected_stdout, expected_stderr)
+
+#----------------------------------------------------------------------
 
 ########################################################################
 # Run the tests
@@ -607,6 +639,7 @@ test_list = [ None,
               backport_branch_contains,
               backport_double_conflict,
               backport_branch_with_original_revision,
+              backport_otherproject_change,
               # When adding a new test, include the test number in the last
               # 6 bytes of the UUID.
              ]