You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by jr...@apache.org on 2015/10/28 15:46:30 UTC

svn commit: r1711024 - in /qpid/site: ./ python/ python/qpid_site/ scripts/

Author: jross
Date: Wed Oct 28 14:46:29 2015
New Revision: 1711024

URL: http://svn.apache.org/viewvc?rev=1711024&view=rev
Log:
QPID-6773: Update release scripts

 - Allow overrides for jira and source repo release keys
   - Now can you can specify ISSUES_RELEASE and SOURCE_RELEASE
     in addition to RELEASE in the generate invocation
 - Use updated scripting functions

Added:
    qpid/site/python/generate.py
    qpid/site/python/plano.py
Removed:
    qpid/site/python/qpid_site/
Modified:
    qpid/site/Makefile
    qpid/site/README
    qpid/site/scripts/gen-cpp-release-api-doc
    qpid/site/scripts/gen-cpp-release-books
    qpid/site/scripts/gen-cpp-release-examples
    qpid/site/scripts/gen-cpp-release-notes
    qpid/site/scripts/gen-cpp-release-page
    qpid/site/scripts/gen-dispatch-release-api-doc
    qpid/site/scripts/gen-dispatch-release-books
    qpid/site/scripts/gen-dispatch-release-notes
    qpid/site/scripts/gen-dispatch-release-page
    qpid/site/scripts/gen-java-release-books
    qpid/site/scripts/gen-java-release-examples
    qpid/site/scripts/gen-java-release-notes
    qpid/site/scripts/gen-java-release-page
    qpid/site/scripts/gen-jms-release-docs
    qpid/site/scripts/gen-jms-release-notes
    qpid/site/scripts/gen-jms-release-page
    qpid/site/scripts/gen-proton-release-api-doc
    qpid/site/scripts/gen-proton-release-examples
    qpid/site/scripts/gen-proton-release-notes
    qpid/site/scripts/gen-proton-release-page

Modified: qpid/site/Makefile
URL: http://svn.apache.org/viewvc/qpid/site/Makefile?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/Makefile (original)
+++ qpid/site/Makefile Wed Oct 28 14:46:29 2015
@@ -7,6 +7,16 @@ endif
 OUTPUT_DIR := output
 SITE_URL := file://$(shell readlink -f ${OUTPUT_DIR})
 
+ifdef RELEASE
+    ifndef ISSUES_RELEASE
+        ISSUES_RELEASE := ${RELEASE}
+    endif
+
+    ifndef SOURCE_RELEASE
+        SOURCE_RELEASE := ${RELEASE}
+    endif
+endif
+
 default: render
 
 help:
@@ -53,39 +63,38 @@ clean:
 	rm -rf ${OUTPUT_DIR}
 	find python -name \*.pyc -delete
 
+gen-amqp-type-reference:
+	scripts/gen-amqp-type-reference misc/amqp > input/amqp/type-reference.html.in
+
 gen-proton-release: gen-proton-release-page gen-proton-release-notes gen-proton-release-api-doc gen-proton-release-examples
 
 gen-dispatch-release: gen-dispatch-release-page gen-dispatch-release-notes gen-dispatch-release-books
 
-gen-jms-release: gen-jms-release-page gen-jms-release-notes gen-jms-release-docs
-
 gen-java-release: gen-java-release-page gen-java-release-notes gen-java-release-books gen-java-release-examples
 
-gen-cpp-release: gen-cpp-release-page gen-cpp-release-notes gen-cpp-release-api-doc gen-cpp-release-examples gen-cpp-release-books
+gen-jms-release: gen-jms-release-page gen-jms-release-notes gen-jms-release-docs
 
-gen-release-%: RELEASE_DIR := input/releases/qpid-${RELEASE}
-gen-release-%:
-	scripts/gen-release-$* ${RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
+gen-cpp-release: gen-cpp-release-page gen-cpp-release-notes gen-cpp-release-api-doc gen-cpp-release-examples gen-cpp-release-books
 
 gen-proton-release-%: RELEASE_DIR := input/releases/qpid-proton-${RELEASE}
-gen-proton-release-%:
-	scripts/gen-proton-release-$* ${RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
+gen-proton-release-%: 
+	scripts/gen-proton-release-$* ${RELEASE} ${ISSUES_RELEASE} ${SOURCE_RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
 
 gen-dispatch-release-%: RELEASE_DIR := input/releases/qpid-dispatch-${RELEASE}
 gen-dispatch-release-%:
-	scripts/gen-dispatch-release-$* ${RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
+	scripts/gen-dispatch-release-$* ${RELEASE} ${ISSUES_RELEASE} ${SOURCE_RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
 
 gen-java-release-%: RELEASE_DIR := input/releases/qpid-java-${RELEASE}
 gen-java-release-%:
-	scripts/gen-java-release-$* ${RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
+	scripts/gen-java-release-$* ${RELEASE} ${ISSUES_RELEASE} ${SOURCE_RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
 
 gen-jms-release-%: RELEASE_DIR := input/releases/qpid-jms-${RELEASE}
 gen-jms-release-%:
-	scripts/gen-jms-release-$* ${RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
+	scripts/gen-jms-release-$* ${RELEASE} ${ISSUES_RELEASE} ${SOURCE_RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
 
 gen-cpp-release-%: RELEASE_DIR := input/releases/qpid-cpp-${RELEASE}
 gen-cpp-release-%:
-	scripts/gen-cpp-release-$* ${RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
+	scripts/gen-cpp-release-$* ${RELEASE} ${ISSUES_RELEASE} ${SOURCE_RELEASE} ${RELEASE_DIR} ${CHECKOUT_DIR}
 
-gen-amqp-type-reference:
-	scripts/gen-amqp-type-reference misc/amqp > input/amqp/type-reference.html.in
+update-plano:
+	curl "https://raw.githubusercontent.com/ssorj/plano/master/python/plano.py" -o python/plano.py

Modified: qpid/site/README
URL: http://svn.apache.org/viewvc/qpid/site/README?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/README (original)
+++ qpid/site/README Wed Oct 28 14:46:29 2015
@@ -137,10 +137,15 @@ These will produce a new tree of release
 books.  Once generated, you can make any edits you'd like and check it
 in.
 
+In addition to specifying `RELEASE`, you can override the particular
+release identifier used for querying issues and exporting source using
+`ISSUES_RELEASE` and `SOURCE_RELEASE` respectively.  If not set,
+`ISSUES_RELEASE` and `SOURCE_RELEASE` take the value of `RELEASE`.
+
 By default, the scripts will fetch the source for you based on the
-release.  By setting the optional `CHECKOUT_DIR` parameter to the
-location of a local Subversion checkout, the scripts will instead use
-the provided content.
+release script inputs.  By setting the optional `CHECKOUT_DIR`
+parameter to the location of a local Subversion checkout, the scripts
+will instead use the provided content.
 
 When you add release content, you should also update the following
 files:

Added: qpid/site/python/generate.py
URL: http://svn.apache.org/viewvc/qpid/site/python/generate.py?rev=1711024&view=auto
==============================================================================
--- qpid/site/python/generate.py (added)
+++ qpid/site/python/generate.py Wed Oct 28 14:46:29 2015
@@ -0,0 +1,440 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import re
+import urllib
+import yaml
+
+from pprint import pformat
+from pygments import highlight as pygments_highlight
+from pygments.lexers import get_lexer_by_name
+from pygments.formatters import HtmlFormatter
+from xml.sax.saxutils import escape as escape_html
+
+from plano import *
+
+## General ##
+
+def setup_release_script():
+    if len(ARGS) not in (5, 6):
+        exit("Usage: script RELEASE ISSUES_RELEASE SOURCE_RELEASE RELEASE-DIR [CHECKOUT-DIR]")
+
+    notice("Setting up script '{}'", ARGS[0])
+
+    release = ARGS[1]
+    issues_release = ARGS[2]
+    source_release = ARGS[3]
+    release_dir = ARGS[4]
+
+    try:
+        checkout_dir = ARGS[5]
+    except IndexError:
+        checkout_dir = None
+
+    assert release != ""
+    assert issues_release != ""
+    assert source_release != ""
+    assert release_dir != ""
+    assert checkout_dir is None or checkout_dir != ""
+
+    call("cmake --version > /dev/null")
+    call("dot -V > /dev/null")
+    call("doxygen --version > /dev/null")
+    call("epydoc --version > /dev/null")
+    call("fop -version > /dev/null")
+    call("gcc --version > /dev/null")
+    call("make --version > /dev/null")
+    call("rdoc --version > /dev/null")
+    call("sphinx-build --version > /dev/null")
+    call("svn --version > /dev/null")
+    call("which javadoc > /dev/null")
+    call("xsltproc --version > /dev/null")
+
+    notice("Release script inputs:")
+    notice("  release:         {}", pformat(release))
+    notice("  issues_release:  {}", pformat(issues_release))
+    notice("  source_release:  {}", pformat(source_release))
+    notice("  release_dir:     {}", pformat(release_dir))
+    notice("  checkout_dir:    {}", pformat(checkout_dir))
+
+    make_dir(release_dir)
+
+    return (release, issues_release, source_release, release_dir, checkout_dir)
+
+def get_release_branch_url(module, release):
+    project_url = "http://svn.apache.org/repos/asf/qpid"
+
+    if module == "main":
+        path = "branches/{}/qpid".format(release)
+
+        if release == "trunk":
+            path = "trunk/qpid"
+
+        return "{}/{}".format(project_url, path)
+    elif module == "cpp":
+        path = "branches/qpid-cpp-{}-rc/qpid".format(release)
+
+        if release == "trunk":
+            path = "trunk/qpid"
+        
+        return "{}/{}".format(project_url, path)
+
+    path = "{}/branches/{}".format(module, release)
+
+    if release == "trunk":
+        path = "{}/trunk".format(module, release)
+
+    return "{}/{}".format(project_url, path)
+
+def get_git_release_branch_url(module, release, path=""):
+    """
+    Get a URL to file path in GitHub
+
+    If called without PATH it returns a URL that you can append paths
+    to.
+    """
+    modules = {
+        "proton": "https://github.com/apache/qpid-proton/tree"
+    }
+
+    if release == "trunk":
+        release = "master"
+
+    return "{}/{}/{}".format(modules[module], release, path.lstrip("/"))
+
+def export_release(module, release, checkout_dir):
+    temp_dir = make_user_temp_dir()
+    dir_name = "qpid-{}-{}".format(module, release)
+    export_dir = join(temp_dir, "transom", dir_name)
+
+    if is_dir(export_dir):
+        debug("Export already exists")
+        return export_dir
+
+    remove(export_dir)
+    make_dir(split(export_dir)[0])
+
+    uri = get_release_branch_url(module, release)
+
+    if checkout_dir is not None:
+        uri = checkout_dir
+
+    call("svn export {} {}", uri, export_dir)
+
+    return export_dir
+
+def export_release_from_git(module, release):
+    work_dir = make_temp_dir()
+    user_temp_dir = make_user_temp_dir()
+    dir_name = "qpid-{}-{}".format(module, release)
+    export_dir = join(user_temp_dir, "transom", dir_name)
+    url = "http://git-wip-us.apache.org/repos/asf/qpid-{}.git".format(module)
+
+    if is_dir(export_dir):
+        debug("Export already exists")
+        return export_dir
+
+    make_dir(export_dir)
+
+    with working_dir(work_dir):
+        call("git clone --bare --branch '{}' '{}' .", release, url)
+        call("git archive '{}' | tar -xf - -C '{}'", release, export_dir)
+
+    return export_dir
+
+## API reference ##
+
+_doxygen_conf_template = u"""
+DISABLE_INDEX = yes
+EXTRACT_ALL = yes
+GENERATE_HTML = yes
+GENERATE_LATEX = no
+GENERATE_TREEVIEW = yes
+HAVE_DOT = no
+PROJECT_NUMBER = {release}
+QUIET = yes
+RECURSIVE = yes
+INPUT = {input_paths}
+PROJECT_NAME = "{title}"
+STRIP_FROM_PATH = {strip_paths}
+HTML_OUTPUT = {output_dir}
+"""
+
+def gen_doxygen(release, title, input_paths, strip_paths, output_dir):
+    input_paths = " ".join(input_paths)
+    strip_paths = " ".join(strip_paths)
+
+    make_dir(output_dir)
+
+    conf = _doxygen_conf_template.format(**locals())
+    path = write_temp("conf", conf)
+
+    call("doxygen {}", path)
+
+    touch(join(output_dir, "_transom_ignore_pages"))
+
+def gen_epydoc(release, title, input_paths, input_namespaces, output_dir):
+    input_paths = ":".join(input_paths)
+    input_namespaces = " ".join(input_namespaces)
+
+    make_dir(output_dir)
+
+    options = list()
+    options.append("--graph all")
+    options.append("--html")
+    options.append("--name \"{}\"".format(title))
+    options.append("--no-private")
+    options.append("--output {}".format(output_dir))
+    options.append("--quiet")
+    options.append("--url \"http://qpid.apache.org/index.html\"")
+    options = " ".join(options)
+
+    call("PYTHONPATH={} epydoc {} {}", input_paths, options, input_namespaces)
+
+    touch(join(output_dir, "_transom_ignore_pages"))
+
+def gen_javadoc(release, title, input_paths, input_namespaces, output_dir):
+    input_paths = ":".join(input_paths)
+    input_namespaces = ":".join(input_namespaces)
+
+    make_dir(output_dir)
+
+    options = list()
+    options.append("-windowtitle \"{}\"".format(title))
+    options.append("-doctitle \"{}\"".format(title))
+    options.append("-sourcepath {}".format(input_paths))
+    options.append("-subpackages {}".format(input_namespaces))
+    options.append("-d {}".format(output_dir))
+    options.append("-notimestamp")
+    options = " ".join(options)
+
+    call("javadoc {}", options)
+
+    touch(join(output_dir, "_transom_ignore_pages"))
+
+def gen_rdoc(release, title, base_input_path, input_paths, output_dir):
+    output_dir = absolute_path(output_dir)
+
+    # rdoc really wants to make the last dir
+    make_dir(parent_dir(output_dir))
+
+    options = list()
+    options.append("--fmt html")
+    options.append("--op {}".format(output_dir))
+    options.append("--quiet")
+    options.append("--title \"{}\"".format(title))
+    options = " ".join(options)
+
+    input_paths = " ".join(input_paths)
+
+    call("cd {} && rdoc {} {}", base_input_path, options, input_paths)
+    
+    touch(join(output_dir, "_transom_ignore_pages"))
+
+## Examples ##
+
+def gen_examples(release, title, lang, input_dir, input_names, output_dir,
+                 readme_url=None, source_url=None):
+    remove(output_dir)
+
+    notice("Generating {}", title)
+
+    for name in input_names:
+        gen_example_page(release=release,
+                         input_dir=input_dir,
+                         input_name=name,
+                         output_dir=output_dir,
+                         lang=lang)
+
+    gen_examples_index(release=release,
+                       input_names=input_names,
+                       output_dir=output_dir,
+                       title=title,
+                       readme_url=readme_url,
+                       source_url=source_url)
+
+_example_page_template = u"""
+<h1>{title}</h1>
+{content}
+<p><a href="{input_name}">Download this file</a></p>
+"""
+
+def gen_example_page(release, input_dir, input_name, output_dir, lang):
+    input_path = join(input_dir, input_name)
+    output_path = join(output_dir, input_name)
+    html_output_path = join(output_dir, "{}.html.in".format(input_name))
+
+    content = read(input_path)
+    content = strip_license_header(content, lang)
+    content = content.strip()
+    content = highlight(content, lang)
+
+    title = input_name
+    html = _example_page_template.format(**locals())
+
+    copy(input_path, output_path)
+    write(html_output_path, html)
+
+_formatter = HtmlFormatter(linenos=False)
+
+def highlight(string, lang):
+    lexer = get_lexer_by_name(lang)
+    return pygments_highlight(string, lexer, _formatter)
+
+_license_header_regexes = {
+    "c": re.compile(r"/\*.*?\*/", re.DOTALL),
+    "cpp": re.compile(r"/\*.*?\*/", re.DOTALL),
+    "csharp": re.compile(r"/\*.*?\*/", re.DOTALL),
+    "java": re.compile(r"/\*.*?\*/", re.DOTALL),
+    "php": re.compile(r"/\*.*?\*/", re.DOTALL),
+    }
+
+def strip_license_header(string, lang):
+    if lang in _license_header_regexes:
+        regex = _license_header_regexes[lang]
+        return re.sub(regex, "", string)
+    elif lang in ("perl", "python", "ruby", "ini"):
+        input_lines = string.split(LINE_SEP)
+        output_lines = list()
+
+        for i, line in enumerate(input_lines):
+            if not line.startswith("#") and line != "":
+                output_lines.extend(input_lines[i:])
+                break
+
+        return LINE_SEP.join(output_lines)
+    else:
+        return string
+
+_examples_index_template = """
+# {title}
+
+## Example files
+
+{example_links}
+
+## More information
+
+{info_links}
+"""
+
+def gen_examples_index(release, input_names, output_dir, title,
+                       readme_url=None, source_url=None):
+    output_path = join(output_dir, "index.md")
+    example_links = list()
+    info_links = list()
+
+    for name in input_names:
+        example_links.append(" - [{}]({}.html)".format(name, name))
+
+    if readme_url:
+        info_links.append(" - [README]({})".format(readme_url))
+
+    if source_url:
+        info_links.append(" - [Source location]({})".format(source_url))
+
+    example_links = LINE_SEP.join(example_links)
+    info_links = LINE_SEP.join(info_links)
+    
+    index = _examples_index_template.format(**locals())
+
+    write(output_path, index)
+
+## Release notes ##
+
+def render_release_notes(project, release):
+    issues = _fetch_issues(project, release)
+    lines = list()
+
+    improvements = _render_issues(issues, "New Feature", "Improvement")
+    bugs = _render_issues(issues, "Bug")
+    tasks = _render_issues(issues, "Task")
+
+    if improvements is not None:
+        lines.append("\n## New features and improvements\n")
+        lines.append(improvements)
+
+    if bugs is not None:
+        lines.append("\n## Bugs fixed\n")
+        lines.append(bugs)
+
+    if tasks is not None:
+        lines.append("\n## Tasks\n")
+        lines.append(tasks)
+
+    return "\n".join(lines)
+
+def _fetch_issues(project, release):
+    query = list()
+
+    if project in ("qpid-cpp", "qpid-java"):
+        project = "qpid"
+
+    query.append("project = '{}'".format(project))
+    query.append("fixVersion = '{}'".format(release))
+    query.append("resolution = 'fixed'")
+
+    query = " and ".join(query)
+    query = "{} order by key asc".format(query)
+
+    page_size = 100
+
+    params = {
+        "jql": query,
+        "fields": "summary,issuetype",
+        "maxResults": page_size,
+        }
+
+    issues = list()
+    
+    for i in range(100):
+        params["startAt"] = i * page_size
+
+        url = "https://issues.apache.org/jira/rest/api/2/search?{}".format \
+            (urllib.urlencode(params))
+
+        filename, headers = urllib.urlretrieve(url)
+
+        with open(filename) as f:
+            data = yaml.load(f)
+
+        issues.extend(data["issues"])
+
+        if len(issues) >= int(data["total"]):
+            break
+
+    return issues
+
+def _render_issues(issues, *types):
+    filtered_issues = [x for x in issues
+                       if x["fields"]["issuetype"]["name"] in types]
+
+    if not filtered_issues:
+        return None
+
+    lines = list()
+
+    for issue in filtered_issues:
+        key = escape_html(issue["key"])
+        url = "https://issues.apache.org/jira/browse/{}".format(key)
+        summary = escape_html(issue["fields"]["summary"])
+
+        lines.append(" - [{}]({}) - {}".format(key, url, summary))
+
+    return "\n".join(lines)

Added: qpid/site/python/plano.py
URL: http://svn.apache.org/viewvc/qpid/site/python/plano.py?rev=1711024&view=auto
==============================================================================
--- qpid/site/python/plano.py (added)
+++ qpid/site/python/plano.py Wed Oct 28 14:46:29 2015
@@ -0,0 +1,515 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from __future__ import print_function
+
+import atexit as _atexit
+import codecs as _codecs
+import fnmatch as _fnmatch
+import getpass as _getpass
+import os as _os
+import random as _random
+import re as _re
+import shutil as _shutil
+import subprocess as _subprocess
+import sys as _sys
+import tarfile as _tarfile
+import tempfile as _tempfile
+import traceback as _traceback
+
+# See documentation at http://www.ssorj.net/projects/plano.html
+
+def fail(message, *args):
+    error(message, *args)
+
+    if isinstance(message, BaseException):
+        raise message
+
+    raise Exception(message)
+
+def error(message, *args):
+    _traceback.print_exc()
+    _print_message("Error", message, args, _sys.stderr)
+
+def warn(message, *args):
+    _print_message("Warn", message, args, _sys.stderr)
+
+def notice(message, *args):
+    _print_message(None, message, args, _sys.stdout)
+
+def debug(message, *args):
+    _print_message("Debug", message, args, _sys.stdout)
+
+def exit(message=None, *args):
+    if message is None:
+        _sys.exit()
+
+    _print_message("Error", message, args, _sys.stderr)
+
+    _sys.exit(1)
+
+def _print_message(category, message, args, file):
+    message = _format_message(category, message, args)
+
+    print(message, file=file)
+    file.flush()
+
+def _format_message(category, message, args):
+    if isinstance(message, BaseException):
+        message = str(message)
+
+        if message == "":
+            message = message.__class__.__name__
+
+    if category:
+        message = "{}: {}".format(category, message)
+
+    if args:
+        message = message.format(*args)
+
+    script = split(_sys.argv[0])[1]
+    message = "{}: {}".format(script, message)
+
+    return message
+
+absolute_path = _os.path.abspath
+normalize_path = _os.path.normpath
+exists = _os.path.exists
+is_absolute = _os.path.isabs
+is_dir = _os.path.isdir
+is_file = _os.path.isfile
+is_link = _os.path.islink
+
+join = _os.path.join
+split = _os.path.split
+split_extension = _os.path.splitext
+
+LINE_SEP = _os.linesep
+PATH_SEP = _os.sep
+ENV = _os.environ
+ARGS = _sys.argv
+
+current_dir = _os.getcwd
+
+def home_dir(user=""):
+    return _os.path.expanduser("~{}".format(user))
+
+def parent_dir(path):
+    path = normalize_path(path)
+    parent, child = split(path)
+
+    return parent
+
+def file_name(file):
+    file = normalize_path(file)
+    dir, name = split(file)
+
+    return name
+
+def name_stem(file):
+    name = file_name(file)
+
+    if name.endswith(".tar.gz"):
+        name = name[:-3]
+
+    stem, ext = split_extension(name)
+
+    return stem
+
+def name_extension(file):
+    name = file_name(file)
+    stem, ext = split_extension(name)
+    
+    return ext
+
+def read(file):
+    with _codecs.open(file, encoding="utf-8", mode="r") as f:
+        return f.read()
+
+def write(file, string):
+    with _codecs.open(file, encoding="utf-8", mode="w") as f:
+        f.write(string)
+
+    return file
+
+def append(file, string):
+    with _codecs.open(file, encoding="utf-8", mode="a") as f:
+        f.write(string)
+
+    return file
+
+def prepend(file, string):
+    orig = read(file)
+    prepended = string + orig
+
+    return write(file, prepended)
+
+def touch(file):
+    return append(file, "")
+
+def read_lines(file):
+    with _codecs.open(file, encoding="utf-8", mode="r") as f:
+        return f.readlines()
+
+def write_lines(file, lines):
+    with _codecs.open(file, encoding="utf-8", mode="r") as f:
+        f.writelines(lines)
+
+    return file
+
+def append_lines(file, lines):
+    with _codecs.open(file, encoding="utf-8", mode="a") as f:
+        f.writelines(string)
+
+    return file
+
+def prepend_lines(file, lines):
+    orig_lines = read_lines(file)
+
+    with _codecs.open(file, encoding="utf-8", mode="w") as f:
+        f.writelines(lines)
+        f.writelines(orig_lines)
+
+    return file
+
+_temp_dir = _tempfile.mkdtemp(prefix="plano.")
+
+def _get_temp_file(key):
+    assert not key.startswith("_")
+
+    return join(_temp_dir, "_file_{}".format(key))
+
+def _remove_temp_dir():
+    _shutil.rmtree(_temp_dir, ignore_errors=True)
+
+_atexit.register(_remove_temp_dir)
+
+def read_temp(key):
+    file = _get_temp_file(key)
+    return read(file)
+
+def write_temp(key, string):
+    file = _get_temp_file(key)
+    return write(file, string)
+
+def append_temp(key, string):
+    file = _get_temp_file(key)
+    return append(file, string)
+
+def prepend_temp(key, string):
+    file = _get_temp_file(key)
+    return prepend(file, string)
+
+def make_temp(key):
+    return append_temp(key, "")
+
+def open_temp(key, mode="r"):
+    file = _get_temp_file(key)
+    return _codecs.open(file, encoding="utf-8", mode=mode)
+
+# This one is deleted on process exit
+def make_temp_dir():
+    return _tempfile.mkdtemp(prefix="_dir_", dir=_temp_dir)
+
+# This one sticks around
+def make_user_temp_dir():
+    temp_dir = _tempfile.gettempdir()
+    user = _getpass.getuser()
+    user_temp_dir = join(temp_dir, user)
+
+    return make_dir(user_temp_dir)
+
+def copy(from_path, to_path):
+    notice("Copying '{}' to '{}'", from_path, to_path)
+
+    to_dir = parent_dir(to_path)
+
+    if to_dir:
+        make_dir(to_dir)
+
+    if is_dir(from_path):
+        _copytree(from_path, to_path, symlinks=True)
+    else:
+        _shutil.copy(from_path, to_path)
+
+    return to_path
+
+def move(from_path, to_path):
+    notice("Moving '{}' to '{}'", from_path, to_path)
+
+    _shutil.move(from_path, to_path)
+
+    return to_path
+
+def rename(path, expr, replacement):
+    path = normalize_path(path)
+    parent_dir, name = split(path)
+    to_name = string_replace(name, expr, replacement)
+    to_path = join(parent_dir, to_name)
+
+    notice("Renaming '{}' to '{}'", path, to_path)
+
+    move(path, to_path)
+
+    return to_path
+
+def remove(path):
+    notice("Removing '{}'", path)
+
+    if not exists(path):
+        return
+
+    if is_dir(path):
+        _shutil.rmtree(path, ignore_errors=True)
+    else:
+        _os.remove(path)
+
+    return path
+
+def make_link(source_path, link_file):
+    if exists(link_file):
+        assert read_link(link_file) == source_path
+        return
+
+    _os.symlink(source_path, link_file)
+
+    return link_file
+
+def read_link(file):
+    return _os.readlink(file)
+
+def find(dir, *patterns):
+    matched_paths = set()
+
+    if not patterns:
+        patterns = ("*",)
+
+    for root, dirs, files in _os.walk(dir):
+        for pattern in patterns:
+            matched_dirs = _fnmatch.filter(dirs, pattern)
+            matched_files = _fnmatch.filter(files, pattern)
+
+            matched_paths.update([join(root, x) for x in matched_dirs])
+            matched_paths.update([join(root, x) for x in matched_files])
+
+    return sorted(matched_paths)
+
+def find_any_one(dir, *patterns):
+    paths = find(dir, *patterns)
+
+    if len(paths) == 0:
+        return
+    
+    return paths[0]
+
+def find_only_one(dir, *patterns):
+    paths = find(dir, *patterns)
+
+    if len(paths) == 0:
+        return
+    
+    assert len(paths) == 1
+
+    return paths[0]
+
+# find_via_expr?
+
+def string_replace(string, expr, replacement, count=0):
+    return _re.sub(expr, replacement, string, count)
+
+def make_dir(dir):
+    if not exists(dir):
+        _os.makedirs(dir)
+
+    return dir
+
+# Returns the current working directory so you can change it back
+def change_dir(dir):
+    notice("Changing directory to '{}'", dir)
+
+    cwd = current_dir()
+    _os.chdir(dir)
+    return cwd
+
+def list_dir(dir, *patterns):
+    assert is_dir(dir)
+
+    names = _os.listdir(dir)
+
+    if not patterns:
+        return sorted(names)
+
+    matched_names = set()
+
+    for pattern in patterns:
+        matched_names.update(_fnmatch.filter(names, pattern))
+
+    return sorted(matched_names)
+
+class working_dir(object):
+    def __init__(self, dir):
+        self.dir = dir
+        self.prev_dir = None
+
+    def __enter__(self):
+        self.prev_dir = change_dir(self.dir)
+        return self.dir
+
+    def __exit__(self, type, value, traceback):
+        change_dir(self.prev_dir)
+
+def _init_call(command, args, kwargs):
+    if args:
+        command = command.format(*args)
+
+    if "shell" not in kwargs:
+        kwargs["shell"] = True
+
+    notice("Calling '{}'", command)
+
+    return command, kwargs
+
+def call(command, *args, **kwargs):
+    command, args = _init_call(command, args, kwargs)
+    _subprocess.check_call(command, **kwargs)
+
+def call_for_output(command, *args, **kwargs):
+    command, args = _init_call(command, args, kwargs)
+    return _subprocess.check_output(command, **kwargs)
+
+def make_archive(input_dir, output_dir, archive_stem):
+    temp_dir = make_temp_dir()
+    temp_input_dir = join(temp_dir, archive_stem)
+
+    copy(input_dir, temp_input_dir)
+    make_dir(output_dir)
+
+    output_file = "{}.tar.gz".format(join(output_dir, archive_stem))
+    output_file = absolute_path(output_file)
+
+    with working_dir(temp_dir):
+        call("tar -czf {} {}", output_file, archive_stem)
+
+    return output_file
+
+def extract_archive(archive_file, output_dir):
+    assert is_file(archive_file)
+
+    if not exists(output_dir):
+        make_dir(output_dir)
+
+    archive_file = absolute_path(archive_file)
+
+    with working_dir(output_dir):
+        call("tar -xf {}", archive_file)
+
+    return output_dir
+
+def rename_archive(archive_file, new_archive_stem):
+    assert is_file(archive_file)
+
+    if name_stem(archive_file) == new_archive_stem:
+        return
+
+    temp_dir = make_temp_dir()
+
+    extract_archive(archive_file, temp_dir)
+
+    input_name = list_dir(temp_dir)[0]
+    input_dir = join(temp_dir, input_name)
+    output_file = make_archive(input_dir, temp_dir, new_archive_stem)
+    output_name = file_name(output_file)
+    archive_dir = parent_dir(archive_file)
+    new_archive_file = join(archive_dir, output_name)
+
+    move(output_file, new_archive_file)
+    remove(archive_file)
+
+    return new_archive_file
+
+def random_port(min=49152, max=65535):
+    return _random.randint(min, max)
+
+# Modified copytree impl that allows for already existing destination
+# dirs
+def _copytree(src, dst, symlinks=False, ignore=None):
+    """Recursively copy a directory tree using copy2().
+
+    If exception(s) occur, an Error is raised with a list of reasons.
+
+    If the optional symlinks flag is true, symbolic links in the
+    source tree result in symbolic links in the destination tree; if
+    it is false, the contents of the files pointed to by symbolic
+    links are copied.
+
+    The optional ignore argument is a callable. If given, it
+    is called with the `src` parameter, which is the directory
+    being visited by copytree(), and `names` which is the list of
+    `src` contents, as returned by os.listdir():
+
+        callable(src, names) -> ignored_names
+
+    Since copytree() is called recursively, the callable will be
+    called once for each directory that is copied. It returns a
+    list of names relative to the `src` directory that should
+    not be copied.
+
+    XXX Consider this example code rather than the ultimate tool.
+
+    """
+    names = _os.listdir(src)
+    if ignore is not None:
+        ignored_names = ignore(src, names)
+    else:
+        ignored_names = set()
+
+    if not exists(dst):
+        _os.makedirs(dst)
+    errors = []
+    for name in names:
+        if name in ignored_names:
+            continue
+        srcname = _os.path.join(src, name)
+        dstname = _os.path.join(dst, name)
+        try:
+            if symlinks and _os.path.islink(srcname):
+                linkto = _os.readlink(srcname)
+                _os.symlink(linkto, dstname)
+            elif _os.path.isdir(srcname):
+                _copytree(srcname, dstname, symlinks, ignore)
+            else:
+                # Will raise a SpecialFileError for unsupported file types
+                _shutil.copy2(srcname, dstname)
+        # catch the Error from the recursive copytree so that we can
+        # continue with other files
+        except _shutil.Error as err:
+            errors.extend(err.args[0])
+        except EnvironmentError as why:
+            errors.append((srcname, dstname, str(why)))
+    try:
+        _shutil.copystat(src, dst)
+    except OSError as why:
+        if _shutil.WindowsError is not None and isinstance \
+               (why, _shutil.WindowsError):
+            # Copying file access times may fail on Windows
+            pass
+        else:
+            errors.append((src, dst, str(why)))
+    if errors:
+        raise _shutil.Error(errors)

Modified: qpid/site/scripts/gen-cpp-release-api-doc
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-cpp-release-api-doc?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-cpp-release-api-doc (original)
+++ qpid/site/scripts/gen-cpp-release-api-doc Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 def gen_messaging_api(release, source_dir, release_dir):
     component_dir = join(release_dir, "messaging-api")
@@ -82,8 +82,8 @@ def gen_ruby_messaging_api(release, sour
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release("cpp", release, checkout_dir)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release("cpp", source_release, checkout_dir)
 
 gen_messaging_api(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-cpp-release-books
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-cpp-release-books?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-cpp-release-books (original)
+++ qpid/site/scripts/gen-cpp-release-books Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 import uuid
 from xml.etree import ElementTree
@@ -84,8 +84,8 @@ def remove_namespace(doc, namespace):
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release("cpp", release, checkout_dir)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release("cpp", source_release, checkout_dir)
 
 gen_books(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-cpp-release-examples
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-cpp-release-examples?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-cpp-release-examples (original)
+++ qpid/site/scripts/gen-cpp-release-examples Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 ## Messaging API ##
 
@@ -119,8 +119,8 @@ def gen_ruby_messaging_api(release, sour
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release("cpp", release, checkout_dir)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release("cpp", source_release, checkout_dir)
 
 gen_messaging_api(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-cpp-release-notes
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-cpp-release-notes?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-cpp-release-notes (original)
+++ qpid/site/scripts/gen-cpp-release-notes Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 template = \
 """
@@ -53,22 +53,22 @@ documentation, see the [release overview
 {release_notes}
 """
 
-def gen_release_notes(release, release_dir):
+def gen_release_notes(release, issues_release, release_dir):
     output_path = join(release_dir, "release-notes.md")
 
-    release_notes = render_release_notes("qpid-cpp", release)
+    release_notes = render_release_notes("qpid-cpp", issues_release)
 
     output = template.format(**locals())
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "trunk":
     notice("Skipping generation for trunk")
-    sys.exit()
+    exit()
 
-gen_release_notes(release, release_dir)
+gen_release_notes(release, issues_release, release_dir)
 
 notice("Release notes generated")

Modified: qpid/site/scripts/gen-cpp-release-page
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-cpp-release-page?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-cpp-release-page (original)
+++ qpid/site/scripts/gen-cpp-release-page Wed Oct 28 14:46:29 2015
@@ -18,8 +18,9 @@
 # under the License.
 #
 
+from generate import *
+
 from datetime import datetime
-from qpid_site.generate import *
 
 source_artefact_records = (
     ("qpid-cpp-{}.tar.gz", "C++ broker, Qpid Messaging API (C++, bindings)"),
@@ -113,7 +114,7 @@ files you download.
 </script>
 """
 
-def gen_release_page(release, release_dir):
+def gen_release_page(release, issues_release, source_release, release_dir):
     output_path = join(release_dir, "index.md")
 
     components = list()
@@ -141,7 +142,7 @@ def gen_release_page(release, release_di
     source_artefacts = "\n".join(source_artefacts)
     components = "\n".join(components)
 
-    jql = "project = QPID AND fixVersion = 'qpid-cpp-{}' ORDER BY priority DESC".format(release)
+    jql = "project = QPID AND fixVersion = 'qpid-cpp-{}' ORDER BY priority DESC".format(issues_release)
     issues_url = "https://issues.apache.org/jira/issues/?jql={}".format(urllib.quote_plus(jql))
 
     vars = locals()
@@ -214,11 +215,11 @@ def gen_trunk_release_page(release_dir):
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "trunk":
     gen_trunk_release_page(release_dir)
 else:
-    gen_release_page(release, release_dir)
+    gen_release_page(release, issues_release, source_release, release_dir)
 
 notice("Release page generated")

Modified: qpid/site/scripts/gen-dispatch-release-api-doc
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-dispatch-release-api-doc?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-dispatch-release-api-doc (original)
+++ qpid/site/scripts/gen-dispatch-release-api-doc Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 def gen_dispatch_api_doc(release, source_dir, component_dir):
     include_dir = join(source_dir, "include")
@@ -33,8 +33,8 @@ def gen_dispatch_api_doc(release, source
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release_from_git("dispatch", release)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release_from_git("dispatch", source_release)
 
 gen_dispatch_api_doc(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-dispatch-release-books
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-dispatch-release-books?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-dispatch-release-books (original)
+++ qpid/site/scripts/gen-dispatch-release-books Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 def copy_html_to_in(from_dir, to_dir):
     html = list_dir(from_dir, "*.html")
@@ -27,7 +27,7 @@ def copy_html_to_in(from_dir, to_dir):
 
 def gen_books_and_man(release, source_dir, output_dir):
     build_dir = join(source_dir, "build")
-    make_dirs(build_dir)
+    make_dir(build_dir)
     with working_dir(build_dir):
         call("cmake ..")
         call("make")
@@ -38,8 +38,8 @@ def gen_books_and_man(release, source_di
     copy_html_to_in(join(build_dir, "doc", "html", "man"), join(output_dir, "man"))
 
 ## Now do stuff ##
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release_from_git("dispatch", release)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release_from_git("dispatch", source_release)
 
 gen_books_and_man(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-dispatch-release-notes
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-dispatch-release-notes?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-dispatch-release-notes (original)
+++ qpid/site/scripts/gen-dispatch-release-notes Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 template = \
 """
@@ -53,22 +53,22 @@ documentation, see the [release overview
 {release_notes}
 """
 
-def gen_release_notes(release, release_dir):
+def gen_release_notes(release, issues_release, release_dir):
     output_path = join(release_dir, "release-notes.md")
 
-    release_notes = render_release_notes("dispatch", release)
+    release_notes = render_release_notes("dispatch", issues_release)
 
     output = template.format(**locals())
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "master":
     notice("Skipping generation for master branch")
-    sys.exit()
+    exit()
 
-gen_release_notes(release, release_dir)
+gen_release_notes(release, issues_release, release_dir)
 
 notice("Release notes generated")

Modified: qpid/site/scripts/gen-dispatch-release-page
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-dispatch-release-page?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-dispatch-release-page (original)
+++ qpid/site/scripts/gen-dispatch-release-page Wed Oct 28 14:46:29 2015
@@ -18,8 +18,9 @@
 # under the License.
 #
 
+from generate import *
+
 from datetime import datetime
-from qpid_site.generate import *
 
 download_records = (
     ("qpid-dispatch-{}.tar.gz", "Dispatch router"),
@@ -33,7 +34,7 @@ documentation = \
 """
 <div class="two-column" markdown="1">
 
- - [Installing Qpid Dispatch](https://git-wip-us.apache.org/repos/asf?p=qpid-dispatch.git;a=blob_plain;f=README;hb={release})
+ - [Installing Qpid Dispatch](https://git-wip-us.apache.org/repos/asf?p=qpid-dispatch.git;a=blob_plain;f=README;hb={source_release})
  - [Dispatch router book](book/book.html)
  - [qdrouterd](man/qdrouterd.html) - Router daemon
  - [qdrouterd.conf](man/qdrouterd.conf.html) - Daemon configuration
@@ -102,7 +103,7 @@ the files you download.
 </script>
 """
 
-def gen_release_page(release, release_dir):
+def gen_release_page(release, issues_release, source_release, release_dir):
     output_path = join(release_dir, "index.md")
 
     downloads = list()
@@ -126,11 +127,11 @@ def gen_release_page(release, release_di
     downloads = "\n".join(downloads)
     components = "\n".join(components)
 
-    jql = "project = DISPATCH AND fixVersion = '{}' ORDER BY priority DESC".format(release)
+    jql = "project = DISPATCH AND fixVersion = '{}' ORDER BY priority DESC".format(issues_release)
     issues_url = "https://issues.apache.org/jira/issues/?jql={}".format(urllib.quote_plus(jql))
 
     vars = locals()
-    vars["documentation"] = documentation.format(release=release)
+    vars["documentation"] = documentation.format(release=release, source_release=source_release)
     
     output = template.format(**vars)
     output = output.strip()
@@ -190,18 +191,18 @@ def gen_master_release_page(release_dir)
     time = now.strftime("%H:%M %Z")
 
     vars = locals()
-    vars["documentation"] = documentation.format(release="master")
+    vars["documentation"] = documentation.format(release="master", source_release="master")
     
     output = master_template.format(**vars)
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "master":
     gen_master_release_page(release_dir)
 else:
-    gen_release_page(release, release_dir)
+    gen_release_page(release, issues_release, source_release, release_dir)
 
 notice("Release page generated")

Modified: qpid/site/scripts/gen-java-release-books
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-java-release-books?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-java-release-books (original)
+++ qpid/site/scripts/gen-java-release-books Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 import uuid
 from xml.etree import ElementTree
@@ -97,8 +97,8 @@ def remove_namespace(doc, namespace):
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release("java", release, checkout_dir)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release("java", source_release, checkout_dir)
 
 gen_books(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-java-release-examples
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-java-release-examples?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-java-release-examples (original)
+++ qpid/site/scripts/gen-java-release-examples Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 ## JMS ##
 
@@ -55,8 +55,8 @@ def gen_jms(release, source_dir, release
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release("java", release, checkout_dir)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release("java", source_release, checkout_dir)
 
 gen_jms(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-java-release-notes
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-java-release-notes?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-java-release-notes (original)
+++ qpid/site/scripts/gen-java-release-notes Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 template = \
 """
@@ -53,22 +53,22 @@ documentation, see the [release overview
 {release_notes}
 """
 
-def gen_release_notes(release, release_dir):
+def gen_release_notes(release, issues_release, release_dir):
     output_path = join(release_dir, "release-notes.md")
 
-    release_notes = render_release_notes("java", release)
+    release_notes = render_release_notes("qpid-java", issues_release)
 
     output = template.format(**locals())
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "trunk":
     notice("Skipping generation for trunk")
-    sys.exit()
+    exit()
 
-gen_release_notes(release, release_dir)
+gen_release_notes(release, issues_release, release_dir)
 
 notice("Release notes generated")

Modified: qpid/site/scripts/gen-java-release-page
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-java-release-page?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-java-release-page (original)
+++ qpid/site/scripts/gen-java-release-page Wed Oct 28 14:46:29 2015
@@ -18,8 +18,9 @@
 # under the License.
 #
 
+from generate import *
+
 from datetime import datetime
-from qpid_site.generate import *
 
 source_artefact_records = (
     ("qpid-java-{}.tar.gz", "Java broker, Qpid JMS, Qpid JCA"),
@@ -127,7 +128,7 @@ files you download.
 </script>
 """
 
-def gen_release_page(release, release_dir):
+def gen_release_page(release, issues_release, source_release, release_dir):
     output_path = join(release_dir, "index.md")
 
     components = list()
@@ -171,7 +172,7 @@ def gen_release_page(release, release_di
     binary_artefacts = "\n".join(binary_artefacts)
     components = "\n".join(components)
 
-    jql = "project = QPID AND fixVersion = 'qpid-java-{}' ORDER BY priority DESC".format(release)
+    jql = "project = QPID AND fixVersion = '{}' ORDER BY priority DESC".format(issues_release)
     issues_url = "https://issues.apache.org/jira/issues/?jql={}".format(urllib.quote_plus(jql))
 
     vars = locals()
@@ -244,11 +245,11 @@ def gen_trunk_release_page(release_dir):
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "trunk":
     gen_trunk_release_page(release_dir)
 else:
-    gen_release_page(release, release_dir)
+    gen_release_page(release, issues_release, source_release, release_dir)
 
 notice("Release page generated")

Modified: qpid/site/scripts/gen-jms-release-docs
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-jms-release-docs?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-jms-release-docs (original)
+++ qpid/site/scripts/gen-jms-release-docs Wed Oct 28 14:46:29 2015
@@ -18,11 +18,10 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 def gen_docs(release, source_dir, output_dir):
     docs_input_dir = join(source_dir, "qpid-jms-docs")
-
     docs_output_dir = join(output_dir, "docs")
 
     remove(docs_output_dir)
@@ -33,8 +32,8 @@ def gen_docs(release, source_dir, output
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release_from_git("jms", release)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release_from_git("jms", source_release)
 
 gen_docs(release, source_dir, release_dir)
 

Modified: qpid/site/scripts/gen-jms-release-notes
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-jms-release-notes?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-jms-release-notes (original)
+++ qpid/site/scripts/gen-jms-release-notes Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 template = \
 """
@@ -55,22 +55,22 @@ documentation, see the [release overview
 {release_notes}
 """
 
-def gen_release_notes(release, release_dir):
+def gen_release_notes(release, issues_release, release_dir):
     output_path = join(release_dir, "release-notes.md")
 
-    release_notes = render_release_notes("qpidjms", release)
+    release_notes = render_release_notes("qpidjms", issues_release)
 
     output = template.format(**locals())
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
-if release == "trunk":
-    notice("Skipping generation for trunk")
-    sys.exit()
+if release == "master":
+    notice("Skipping generation for master")
+    exit()
 
-gen_release_notes(release, release_dir)
+gen_release_notes(release, issues_release, release_dir)
 
 notice("Release notes generated")

Modified: qpid/site/scripts/gen-jms-release-page
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-jms-release-page?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-jms-release-page (original)
+++ qpid/site/scripts/gen-jms-release-page Wed Oct 28 14:46:29 2015
@@ -18,8 +18,9 @@
 # under the License.
 #
 
+from generate import *
+
 from datetime import datetime
-from qpid_site.generate import *
 
 download_records = (
     ("apache-qpid-jms-{}-bin.tar.gz", "Qpid JMS binaries"),
@@ -31,7 +32,7 @@ documentation = \
 <div class="two-column" markdown="1">
 
  - [API reference](http://docs.oracle.com/javaee/1.4/api/javax/jms/package-summary.html)
- - [Examples](https://github.com/apache/qpid-jms/tree/{release}/qpid-jms-examples)
+ - [Examples](https://github.com/apache/qpid-jms/tree/{source_release}/qpid-jms-examples)
  - [Configuration](docs/index.html)
  - [Building Qpid JMS](building.html)
 
@@ -89,7 +90,7 @@ The client is also available [via Maven]
 
  - [All release artefacts](http://archive.apache.org/dist/qpid/jms/{release})
  - [Resolved issues in JIRA]({issues_url})
- - [Source repository tag](https://git-wip-us.apache.org/repos/asf/qpid-jms.git/tree/refs/tags/{release})
+ - [Source repository tag](https://git-wip-us.apache.org/repos/asf/qpid-jms.git/tree/refs/tags/{source_release})
 
 <script type="text/javascript">
   _deferredFunctions.push(function() {{
@@ -100,7 +101,7 @@ The client is also available [via Maven]
 </script>
 """
 
-def gen_release_page(release, release_dir):
+def gen_release_page(release, issues_release, source_release, release_dir):
     output_path = join(release_dir, "index.md")
 
     downloads = list()
@@ -124,7 +125,7 @@ def gen_release_page(release, release_di
     issues_url = "https://issues.apache.org/jira/issues/?jql={}".format(urllib.quote_plus(jql))
 
     vars = locals()
-    vars["documentation"] = documentation.format(release=release)
+    vars["documentation"] = documentation.format(release=release, source_release=source_release)
 
     output = template.format(**vars)
     output = output.strip()
@@ -186,18 +187,18 @@ def gen_master_release_page(release_dir)
     
     
     vars = locals()
-    vars["documentation"] = documentation.format(release="master")
+    vars["documentation"] = documentation.format(release="master", source_release="master")
 
     output = master_template.format(**vars)
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "master":
     gen_master_release_page(release_dir)
 else:
-    gen_release_page(release, release_dir)
+    gen_release_page(release, issues_release, source_release, release_dir)
 
 notice("Release page generated")

Modified: qpid/site/scripts/gen-proton-release-api-doc
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-proton-release-api-doc?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-proton-release-api-doc (original)
+++ qpid/site/scripts/gen-proton-release-api-doc Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 # API docs
 
@@ -99,8 +99,8 @@ def gen_book(release, source_dir, releas
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release_from_git("proton", release)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release_from_git("proton", source_release)
 
 gen_api_doc(release, source_dir, release_dir)
 gen_book(release, source_dir, release_dir)

Modified: qpid/site/scripts/gen-proton-release-examples
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-proton-release-examples?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-proton-release-examples (original)
+++ qpid/site/scripts/gen-proton-release-examples Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 ## Engine/Reactor ##
 
@@ -147,8 +147,8 @@ def gen_ruby_messenger(release, source_d
 
 ## Now do stuff ##
 
-release, release_dir, checkout_dir = setup_release_script()
-source_dir = export_release_from_git("proton", release)
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
+source_dir = export_release_from_git("proton", source_release)
 
 gen_engine(release, source_dir, release_dir)
 gen_messenger(release, source_dir, release_dir)

Modified: qpid/site/scripts/gen-proton-release-notes
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-proton-release-notes?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-proton-release-notes (original)
+++ qpid/site/scripts/gen-proton-release-notes Wed Oct 28 14:46:29 2015
@@ -18,7 +18,7 @@
 # under the License.
 #
 
-from qpid_site.generate import *
+from generate import *
 
 template = \
 """
@@ -52,22 +52,22 @@ documentation, see the [release overview
 {release_notes}
 """
 
-def gen_release_notes(release, release_dir):
+def gen_release_notes(release, issues_release, release_dir):
     output_path = join(release_dir, "release-notes.md")
 
-    release_notes = render_release_notes("proton", release)
+    release_notes = render_release_notes("proton", issues_release)
 
     output = template.format(**locals())
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "master":
     notice("Skipping generation for master")
-    sys.exit()
+    exit()
 
-gen_release_notes(release, release_dir)
+gen_release_notes(release, issues_release, release_dir)
 
 notice("Release notes generated")

Modified: qpid/site/scripts/gen-proton-release-page
URL: http://svn.apache.org/viewvc/qpid/site/scripts/gen-proton-release-page?rev=1711024&r1=1711023&r2=1711024&view=diff
==============================================================================
--- qpid/site/scripts/gen-proton-release-page (original)
+++ qpid/site/scripts/gen-proton-release-page Wed Oct 28 14:46:29 2015
@@ -18,8 +18,9 @@
 # under the License.
 #
 
+from generate import *
+
 from datetime import datetime
-from qpid_site.generate import *
 
 download_records = (
     ("qpid-proton-{}.tar.gz", "Qpid Proton"),
@@ -35,8 +36,8 @@ documentation = \
  - [Python API reference](proton/python/api/index.html)
  - [Python tutorial](proton/python/book/tutorial.html)
  - [Python examples](proton/python/examples/index.html)
- - [Go binding](https://github.com/apache/qpid-proton/tree/master/proton-c/bindings/go/README.md)
- - [Installing Qpid Proton](https://git-wip-us.apache.org/repos/asf?p=qpid-proton.git;a=blob;f=INSTALL.md;hb={release})
+;; - [Go binding](https://github.com/apache/qpid-proton/tree/master/proton-c/bindings/go/README.md)
+ - [Installing Qpid Proton](https://git-wip-us.apache.org/repos/asf?p=qpid-proton.git;a=blob;f=INSTALL.md;hb={source_release})
 
 </div>
 """
@@ -88,7 +89,7 @@ the files you download.
 
  - [All release artefacts](http://archive.apache.org/dist/qpid/proton/{release})
  - [Resolved issues in JIRA]({issues_url})
- - [Source repository branch](https://git-wip-us.apache.org/repos/asf?p=qpid-proton.git;a=tree;hb={release})
+ - [Source repository branch](https://git-wip-us.apache.org/repos/asf?p=qpid-proton.git;a=tree;hb={source_release})
  - [Source repository tag](https://git-wip-us.apache.org/repos/asf?p=qpid-proton.git;a=tag;h={release})
 
 <script type="text/javascript">
@@ -100,7 +101,7 @@ the files you download.
 </script>
 """
 
-def gen_release_page(release, release_dir):
+def gen_release_page(release, issues_release, source_release, release_dir):
     output_path = join(release_dir, "index.md")
 
     downloads = list()
@@ -111,18 +112,18 @@ def gen_release_page(release, release_di
         artifact_url = artifact_url_template.format(release, artifact)
         asc_url = "{}.asc".format(artifact_url)
         md5_url = "{}.md5".format(artifact_url)
-        sha1_url = "{}.sha".format(artifact_url)
+        sha1_url = "{}.sha1".format(artifact_url)
 
         args = summary, artifact, artifact_url, asc_url, md5_url, sha1_url
         downloads.append("| {} | [{}]({}) | [ASC]({}), [MD5]({}), [SHA1]({}) |".format(*args))
 
     downloads = "\n".join(downloads)
 
-    jql = "project = PROTON AND fixVersion = '{}' ORDER BY priority DESC".format(release)
+    jql = "project = PROTON AND fixVersion = '{}' ORDER BY priority DESC".format(issues_release)
     issues_url = "https://issues.apache.org/jira/issues/?jql={}".format(urllib.quote_plus(jql))
 
     vars = locals()
-    vars["documentation"] = documentation.format(release=release)
+    vars["documentation"] = documentation.format(release=release, source_release=source_release)
     
     output = template.format(**vars)
     output = output.strip()
@@ -182,18 +183,18 @@ def gen_master_release_page(release_dir)
     time = now.strftime("%H:%M %Z")
 
     vars = locals()
-    vars["documentation"] = documentation.format(release="master")
+    vars["documentation"] = documentation.format(release="master", source_release="master")
     
     output = master_template.format(**vars)
     output = output.strip()
 
     write(output_path, output)
 
-release, release_dir, checkout_dir = setup_release_script()
+release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
 
 if release == "master":
     gen_master_release_page(release_dir)
 else:
-    gen_release_page(release, release_dir)
+    gen_release_page(release, issues_release, source_release, release_dir)
 
 notice("Release page generated")



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org