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 2019/01/03 20:03:25 UTC

svn commit: r1850261 - in /subversion/site/tools: escape.py upcoming.py

Author: danielsh
Date: Thu Jan  3 20:03:24 2019
New Revision: 1850261

URL: http://svn.apache.org/viewvc?rev=1850261&view=rev
Log:
* tools/escape.py,
* tools/upcoming.py: New scripts, to be used in generating 'svn log' filtered
    to show merges only.  See dev@ thread:
    .
        https://svn.haxx.se/dev/archive-2019-01/0010.shtml
        Subject: Display outstanding backported fixes for each release?

Added:
    subversion/site/tools/escape.py   (with props)
    subversion/site/tools/upcoming.py   (with props)

Added: subversion/site/tools/escape.py
URL: http://svn.apache.org/viewvc/subversion/site/tools/escape.py?rev=1850261&view=auto
==============================================================================
--- subversion/site/tools/escape.py (added)
+++ subversion/site/tools/escape.py Thu Jan  3 20:03:24 2019
@@ -0,0 +1,16 @@
+#!/usr/bin/env python3
+
+"""HTML-escape and linkify"""
+
+import fileinput
+import html
+import re
+
+revision_numbers = re.compile(r'r(\d+)')
+issue_references = re.compile(r'((?:SVN-|issue [#]?)(\d+))')
+
+for line in fileinput.input():
+    line = html.escape(line)
+    line = revision_numbers.sub(r'<a href="https://svn.apache.org/r\1">r\1</a>', line)
+    line = issue_references.sub(r'<a href="/issue-\2">\1</a>', line)
+    print(line, end='')

Propchange: subversion/site/tools/escape.py
------------------------------------------------------------------------------
    svn:executable = *

Added: subversion/site/tools/upcoming.py
URL: http://svn.apache.org/viewvc/subversion/site/tools/upcoming.py?rev=1850261&view=auto
==============================================================================
--- subversion/site/tools/upcoming.py (added)
+++ subversion/site/tools/upcoming.py Thu Jan  3 20:03:24 2019
@@ -0,0 +1,64 @@
+#! /usr/bin/env python3
+
+"""
+WIP - INCOMPLETE
+
+Generate 'svn log' output since the last tag to HEAD of the release branch,
+filtering all but merge commits.
+"""
+
+import datetime
+import os
+import re
+import subprocess
+import sys
+import tempfile
+
+import xml.etree.ElementTree as ET
+
+SINCE = '1.11.0'
+SVN = os.getenv('SVN', 'svn')
+LOG_SEPARATOR_LINE = ('-' * 72) + '\n'
+
+def get_copyfrom_revision_of_tag(version_number):
+    """Given a version number, return the copyfrom revision of that release's tag."""
+    assert version_number == SINCE
+    # TODO: parse and return `svn log -r0:HEAD --limit=1 --stop-on-copy ^/subversion/tags/1.11.0 -vq`
+    return 1845131
+
+def get_merges_for_range(start, end):
+    """Return an array of revision numbers in the range -r START:END that are
+    merges.  START must be an integer; END need not be."""
+
+    cache = []
+    revisions = \
+        subprocess.check_output(
+            [SVN, 'log', '--xml', '-v', '-r', str(start) + ":" + str(end)],
+        ).decode()
+    log_xml = ET.fromstring(revisions)
+
+    relative_url = subprocess.check_output([SVN, 'info', '--show-item', 'relative-url']).decode().rstrip('\n')
+
+    for logentry in log_xml.findall('./logentry'):
+        is_merge = relative_url[1:] in (path.text for path in logentry.findall('.//path'))
+        if is_merge:
+            yield logentry
+
+def main():
+    for logentry in get_merges_for_range(get_copyfrom_revision_of_tag(SINCE) + 1, "HEAD") :
+        f = lambda s: logentry.findall('./' + s)[0].text
+        f.__doc__ = """Get the contents of the first child tag whose name is given as an argument."""
+        print(LOG_SEPARATOR_LINE, end='')
+        print("r%(revision)s | %(author)s | %(date)s | %(linecount)s lines" % dict(
+            revision  = logentry.attrib['revision'],
+            author    = f('author'),
+            date      = datetime.datetime.strptime(f('date'), '%Y-%m-%dT%H:%M:%S.%fZ').strftime('%Y-%m-%d %H:%M:%S +0000 (%a, %d %b %Y)'),
+            linecount = 1+len(f('msg').splitlines()), # increment because of the empty line printed next
+        ))
+        print()
+        print(f('msg'))
+
+    print(LOG_SEPARATOR_LINE)
+
+if __name__ == '__main__':
+    main()

Propchange: subversion/site/tools/upcoming.py
------------------------------------------------------------------------------
    svn:executable = *