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/30 20:29:03 UTC

svn commit: r1670167 - in /subversion/trunk/tools/dist: backport/merger.py backport/status.py merge-approved-backports.py

Author: danielsh
Date: Mon Mar 30 18:29:03 2015
New Revision: 1670167

URL: http://svn.apache.org/r1670167
Log:
backport.py: Make StatusFile know its repository and StatusEntry know its
StatusFile.  No new functionality.

* tools/dist/backport/merger.py
  (TRUNK, BRANCHES): Moved away from here.
  (merge): Remove keyword argument 'sf', now implied by 'entry'.
    Track rename.
  (validate_branch_contains_named_revisions): Track rename.

* tools/dist/backport/status.py
  (StatusFile.TRUNK, StatusFile.BRANCHES): Moved here.
  (__init__, _parse): Rename 'status_file' to 'status_fp', since 'status_file'
    is now conventionally reserved for StatusFile instances.
  (_parse): Pass 'status_file' argument to StatusEntry() constructor.
  (Test_StatusFile.test_parse_unparse): Test StatusEntry.status_file.
  (StatusEntry.__init__): Add 'status_file' optional argument.

* tools/dist/merge-approved-backports.py,
    Track API change of merge().

Modified:
    subversion/trunk/tools/dist/backport/merger.py
    subversion/trunk/tools/dist/backport/status.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=1670167&r1=1670166&r2=1670167&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport/merger.py (original)
+++ subversion/trunk/tools/dist/backport/merger.py Mon Mar 30 18:29:03 2015
@@ -38,10 +38,6 @@ logger = logging.getLogger(__name__)
 SVN = os.getenv('SVN', 'svn')
 # TODO: maybe run 'svn info' to check if it works / fail early?
 
-# ### Hardcode these here.
-TRUNK = '^/subversion/trunk'
-BRANCHES = '^/subversion/branches'
-
 
 class UnableToMergeException(Exception):
   pass
@@ -145,18 +141,19 @@ def _includes_only_svn_mergeinfo_changes
   return False
 
 
-def merge(entry, expected_stderr=None, *, commit=False, sf=None):
+def merge(entry, expected_stderr=None, *, commit=False):
   """Merges ENTRY into the working copy at cwd.
 
   Do not commit the result, unless COMMIT is true.  When committing,
-  use parameter SF, a StatusFile instance, to remove ENTRY from the STATUS file
-  prior to committing.
+  remove ENTRY from its STATUS file prior to committing.
   
   EXPECTED_STDERR will be passed to run_svn() for the actual 'merge' command."""
 
-  assert (commit == False) or isinstance(sf, backport.status.StatusFile)
   assert isinstance(entry, backport.status.StatusEntry)
   assert entry.valid()
+  assert entry.status_file
+
+  sf = entry.status_file
 
   # TODO(interactive mode): catch the exception
   validate_branch_contains_named_revisions(entry)
@@ -164,7 +161,7 @@ def merge(entry, expected_stderr=None, *
   # Prepare mergeargs and logmsg.
   logmsg = ""
   if entry.branch:
-    branch_url = "%s/%s" % (BRANCHES, entry.branch)
+    branch_url = "%s/%s" % (sf.BRANCHES, entry.branch)
     if svn_version() >= (1, 8):
       mergeargs = ['--', branch_url]
       logmsg = "Merge {}:\n".format(entry.noun())
@@ -184,7 +181,7 @@ def merge(entry, expected_stderr=None, *
       logmsg += "Merge {} from trunk:\n".format(entry.noun())
     logmsg += "\n"
     mergeargs.extend('-c' + str(revision) for revision in entry.revisions)
-    mergeargs.extend(['--', TRUNK])
+    mergeargs.extend(['--', sf.TRUNK])
   logmsg += entry.raw
 
   # TODO(interactive mode): exclude STATUS from reverts
@@ -239,10 +236,13 @@ def validate_branch_contains_named_revis
   if svn_version() < (1,5): # doesn't have 'svn mergeinfo' subcommand
     return # skip check
 
-  branch_url = "%s/%s" % (BRANCHES, entry.branch)
-  present_str = \
-    run_svn(['mergeinfo', '--show-revs=merged', '--', TRUNK, branch_url])[1] + \
+  sf = entry.status_file
+  branch_url = "%s/%s" % (sf.BRANCHES, entry.branch)
+  present_str = (
+    run_svn(['mergeinfo', '--show-revs=merged', '--', sf.TRUNK, branch_url])[1]
+    +
     run_svn(['mergeinfo', '--show-revs=eligible', '--', branch_url])[1]
+  )
 
   present = map(int, re.compile(r'(\d+)').findall(present_str))
 

Modified: subversion/trunk/tools/dist/backport/status.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/backport/status.py?rev=1670167&r1=1670166&r2=1670167&view=diff
==============================================================================
--- subversion/trunk/tools/dist/backport/status.py (original)
+++ subversion/trunk/tools/dist/backport/status.py Mon Mar 30 18:29:03 2015
@@ -157,17 +157,20 @@ class Paragraph:
 class StatusFile:
   "Encapsulates the STATUS file."
 
-  def __init__(self, status_file):
-    "Constructor.  STATUS_FILE is an open file-like object to parse."
-    self._parse(status_file)
+  TRUNK = '^/subversion/trunk'
+  BRANCHES = '^/subversion/branches'
+
+  def __init__(self, status_fp):
+    "Constructor.  STATUS_FP is an open file-like object to parse."
+    self._parse(status_fp)
     self.validate_unique_entry_ids() # Use-case for making this optional?
 
-  def _parse(self, status_file):
-    "Parse self.status_file into self.paragraphs."
+  def _parse(self, status_fp):
+    "Parse self.status_fp into self.paragraphs."
 
     self.paragraphs = []
     last_header = None
-    for para_text in _ParagraphsIterator(status_file):
+    for para_text in _ParagraphsIterator(status_fp):
       kind = None
       entry = None
       header = Paragraph.is_header(para_text)
@@ -178,12 +181,12 @@ class StatusFile:
         last_header = header
       elif last_header is not None:
         try:
-          entry = StatusEntry(para_text)
+          entry = StatusEntry(para_text, status_file=self)
           kind = Kind.nomination
         except ParseException:
           kind = Kind.unknown
           logger.warning("Failed to parse entry {!r} in {!r}".format(
-                          para_text, status_file))
+                          para_text, status_fp))
       else:
         kind = Kind.preamble
 
@@ -276,6 +279,8 @@ class Test_StatusFile(unittest.TestCase)
     self.assertTrue(sf.paragraphs[3].approved()) # header
     self.assertTrue(sf.paragraphs[4].approved()) # unknown
 
+    self.assertIs(sf.paragraphs[2].entry().status_file, sf)
+
     output_file = io.StringIO()
     sf.unparse(output_file)
     self.assertEqual(s, output_file.getvalue())
@@ -316,15 +321,19 @@ class StatusEntry:
   votes_str - everything after the "Votes:" subheader.  An unparsed string.
   """
 
-  def __init__(self, para_text):
+  def __init__(self, para_text, status_file=None):
     """Parse an entry from PARA_TEXT, and add it to SELF.  PARA_TEXT must
-    contain exactly one entry, as a single multiline string."""
+    contain exactly one entry, as a single multiline string.
+    
+    STATUS_FILE is the StatusFile object containing this entry, if any.
+    """
     self.branch = None
     self.revisions = []
     self.logsummary = []
     self.depends = False
     self.accept = None
     self.votes_str = None
+    self.status_file = status_file
 
     self.raw = para_text
 

Modified: subversion/trunk/tools/dist/merge-approved-backports.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/merge-approved-backports.py?rev=1670167&r1=1670166&r2=1670167&view=diff
==============================================================================
--- subversion/trunk/tools/dist/merge-approved-backports.py (original)
+++ subversion/trunk/tools/dist/merge-approved-backports.py Mon Mar 30 18:29:03 2015
@@ -47,4 +47,4 @@ 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, sf=sf)
+    backport.merger.merge(entry, commit=True)