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 2016/10/20 23:34:26 UTC

svn commit: r1765903 - in /subversion/trunk/tools/dist: backport/merger.py detect-conflicting-backports.py merge-approved-backports.py

Author: danielsh
Date: Thu Oct 20 23:34:26 2016
New Revision: 1765903

URL: http://svn.apache.org/viewvc?rev=1765903&view=rev
Log:
backport.py: Fix a race condition involving concurrent commits to STATUS
(see r1764633).

The fix is to run 'update' at the top of the outermost loop, rather than
immediately before calling 'svn merge'.

* tools/dist/backport/merger.py
  (merge): Don't run revert+update; instead, expect the caller to have done so.

* tools/dist/merge-approved-backports.py:
    Run 'update' and re-parse STATUS before each merge.

* tools/dist/detect-conflicting-backports.py:
    Track API change of merge().

Modified:
    subversion/trunk/tools/dist/backport/merger.py
    subversion/trunk/tools/dist/detect-conflicting-backports.py
    subversion/trunk/tools/dist/merge-approved-backports.py

Modified: subversion/trunk/tools/dist/backport/merger.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/backport/merger.py?rev=1765903&r1=1765902&r2=1765903&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport/merger.py (original)
+++ subversion/trunk/tools/dist/backport/merger.py Thu Oct 20 23:34:26 2016
@@ -195,11 +195,8 @@ def merge(entry, expected_stderr=None, *
     mergeargs.extend(['--', sf.trunk_url()])
   logmsg += entry.raw
 
-  # TODO(interactive mode): exclude STATUS from reverts
-  # TODO(interactive mode): save local mods to disk, as backport.pl does
-  run_revert()
+  no_local_mods('.')
 
-  run_svn_quiet(['update'])
   # TODO: use select() to restore interweaving of stdout/stderr
   _, stdout, stderr = run_svn_quiet(['merge'] + mergeargs, expected_stderr)
   sys.stdout.write(stdout)

Modified: subversion/trunk/tools/dist/detect-conflicting-backports.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/detect-conflicting-backports.py?rev=1765903&r1=1765902&r2=1765903&view=diff
==============================================================================
--- subversion/trunk/tools/dist/detect-conflicting-backports.py (original)
+++ subversion/trunk/tools/dist/detect-conflicting-backports.py Thu Oct 20 23:34:26 2016
@@ -77,6 +77,7 @@ ERRORS = collections.defaultdict(list)
 for entry_para in sf.entries_paras():
     entry = entry_para.entry()
     # SVN_ERR_WC_FOUND_CONFLICT = 155015
+    backport.merger.run_svn_quiet(['update']) # TODO: what to do if this pulls in a STATUS mod?
     backport.merger.merge(entry, 'svn: E155015' if entry.depends else None)
 
     _, output, _ = backport.merger.run_svn(['status'])

Modified: subversion/trunk/tools/dist/merge-approved-backports.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/merge-approved-backports.py?rev=1765903&r1=1765902&r2=1765903&view=diff
==============================================================================
--- subversion/trunk/tools/dist/merge-approved-backports.py (original)
+++ subversion/trunk/tools/dist/merge-approved-backports.py Thu Oct 20 23:34:26 2016
@@ -40,11 +40,14 @@ if sys.argv[1:]:
   sys.exit(0)
 
 backport.merger.no_local_mods('./STATUS')
-sf = backport.status.StatusFile(open('./STATUS', encoding="UTF-8"))
 
-# Duplicate sf.paragraphs, since merge() will be removing elements from it.
-entries_paras = list(sf.entries_paras())
-for entry_para in entries_paras:
-  if entry_para.approved():
-    entry = entry_para.entry()
-    backport.merger.merge(entry, commit=True)
+while True:
+    backport.merger.run_svn_quiet(['update'])
+    sf = backport.status.StatusFile(open('./STATUS', encoding="UTF-8"))
+    for entry_para in sf.entries_paras():
+        if entry_para.approved():
+            entry = entry_para.entry()
+            backport.merger.merge(entry, commit=True)
+            break # 'continue' the outer loop
+    else:
+        break