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)