http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/input/releases/qpid-jms-amqp-0-x-master/index.md
----------------------------------------------------------------------
diff --git a/input/releases/qpid-jms-amqp-0-x-master/index.md 
b/input/releases/qpid-jms-amqp-0-x-master/index.md
new file mode 100644
index 0000000..57f8c87
--- /dev/null
+++ b/input/releases/qpid-jms-amqp-0-x-master/index.md
@@ -0,0 +1,46 @@
+;;
+;; 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.
+;;
+
+# Qpid JMS for AMQP 0-x documentation snapshot
+
+<div class="feature" markdown="1">
+
+## Warning! This is a snapshot of work in progress
+
+Documentation found here may be incorrect or incomplete.  For a
+smoother experience, see the [current stable
+release]({{current_jms_amqp_0_x_release_url}}/index.html).
+
+This content was generated at 12:42  on Wednesday, 26 April 2017.
+
+</div>
+
+## Documentation
+
+
+<div class="two-column" markdown="1">
+
+ - [API 
reference](http://docs.oracle.com/javaee/7/api/javax/jms/package-summary.html)
+
+</div>
+
+
+## More information
+
+ - [Source 
repository](https://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x.git)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/input/releases/snapshots.md
----------------------------------------------------------------------
diff --git a/input/releases/snapshots.md b/input/releases/snapshots.md
index 5965acf..d831838 100644
--- a/input/releases/snapshots.md
+++ b/input/releases/snapshots.md
@@ -2,9 +2,11 @@
 
 Warning! These are snapshots of work in progress.
 
+ - [Qpid Broker-J]({{site_url}}/releases/qpid-broker-j-master/index.html)
  - [Qpid C++]({{site_url}}/releases/qpid-cpp-master/index.html)
  - [Qpid Dispatch]({{site_url}}/releases/qpid-dispatch-master/index.html)
  - [Qpid JMS]({{site_url}}/releases/qpid-jms-master/index.html)
+ - [Qpid JMS for AMQP 
0-x]({{site_url}}/releases/qpid-jms-amqp-0-x-master/index.html)
  - [Qpid for Java]({{site_url}}/releases/qpid-java-trunk/index.html)
  - [Qpid Proton]({{site_url}}/releases/qpid-proton-master/index.html)
  - [Qpid Python]({{site_url}}/releases/qpid-python-master/index.html)

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/python/generate.py
----------------------------------------------------------------------
diff --git a/python/generate.py b/python/generate.py
index 33c9841..9d6d982 100644
--- a/python/generate.py
+++ b/python/generate.py
@@ -6,9 +6,9 @@
 # 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
@@ -53,18 +53,18 @@ def setup_release_script():
     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("which sphinx-build > /dev/null")
-    call("svn --version > /dev/null")
-    call("which javadoc > /dev/null")
-    call("xsltproc --version > /dev/null")
+    call_and_print_on_error("cmake --version")
+    call_and_print_on_error("dot -V")
+    call_and_print_on_error("doxygen --version")
+    call_and_print_on_error("epydoc --version")
+    call_and_print_on_error("fop -version")
+    call_and_print_on_error("gcc --version")
+    call_and_print_on_error("make --version")
+    call_and_print_on_error("rdoc --version")
+    call_and_print_on_error("which sphinx-build")
+    call_and_print_on_error("svn --version")
+    call_and_print_on_error("which javadoc")
+    call_and_print_on_error("xsltproc --version")
 
     notice("Release script inputs:")
     notice("  release:         {}", pformat(release))
@@ -96,7 +96,7 @@ def get_svn_release_url(module, release):
 
         if release == "trunk":
             path = "trunk/qpid"
-        
+
         return "{}/{}".format(project_url, path)
 
     path = "{}/{}{}".format(module, release_path_prefix, release)
@@ -113,6 +113,7 @@ def get_git_release_branch_url(module, release, path=""):
     If called without PATH it returns a URL that you can append paths
     to.
     """
+
     modules = {
         "cpp": "https://github.com/apache/qpid-cpp/tree";,
         "proton": "https://github.com/apache/qpid-proton/tree";,
@@ -123,45 +124,24 @@ def get_git_release_branch_url(module, release, path=""):
 
     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_svn_release_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):
+def fetch_source(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)
+    source_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
+    if is_dir(source_dir):
+        debug("Source already exists")
+        return source_dir
 
-    make_dir(export_dir)
+    make_dir(source_dir)
 
     with working_dir(work_dir):
         call("git clone --bare --branch '{}' '{}' .", release, url)
-        call("git archive '{}' | tar -xf - -C '{}'", release, export_dir)
+        call("git archive '{}' | tar -xf - -C '{}'", release, source_dir, 
shell=True)
 
-    return export_dir
+    return source_dir
 
 ## API reference ##
 
@@ -187,7 +167,7 @@ def gen_doxygen(release, title, input_paths, strip_paths, 
output_dir,
     input_paths = " ".join(input_paths)
     strip_paths = " ".join(strip_paths)
     example_paths = " ".join(example_paths)
-    
+
     make_dir(output_dir)
 
     source_conf = ""
@@ -196,7 +176,7 @@ def gen_doxygen(release, title, input_paths, strip_paths, 
output_dir,
     if config_file is not None:
         source_conf = read(config_file)
 
-    path = make_temp("conf")
+    path = make_temp_file()
 
     write(path, source_conf)
     append(path, local_conf)
@@ -221,7 +201,10 @@ def gen_epydoc(release, title, input_paths, 
input_namespaces, output_dir):
     options.append("--url \"http://qpid.apache.org/index.html\"";)
     options = " ".join(options)
 
-    call("PYTHONPATH={} epydoc {} {}", input_paths, options, input_namespaces)
+    env = ENV
+    env["PYTHONPATH"] = input_paths
+
+    call("epydoc {} {}", options, input_namespaces, env=env)
 
     touch(join(output_dir, "_transom_ignore_pages"))
 
@@ -259,8 +242,9 @@ def gen_rdoc(release, title, base_input_path, input_paths, 
output_dir):
 
     input_paths = " ".join(input_paths)
 
-    call("cd {} && rdoc {} {}", base_input_path, options, input_paths)
-    
+    with working_dir(base_input_path):
+        call("rdoc {} {}", options, input_paths)
+
     touch(join(output_dir, "_transom_ignore_pages"))
 
 ## Examples ##
@@ -367,7 +351,7 @@ def gen_examples_index(release, input_names, output_dir, 
title,
 
     example_links = LINE_SEP.join(example_links)
     info_links = LINE_SEP.join(info_links)
-    
+
     index = _examples_index_template.format(**locals())
 
     write(output_path, index)
@@ -424,7 +408,7 @@ def _fetch_issues(project, release):
         }
 
     issues = list()
-    
+
     for i in range(100):
         params["startAt"] = i * page_size
 

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/python/plano.py
----------------------------------------------------------------------
diff --git a/python/plano.py b/python/plano.py
index 52a4e86..15e7bce 100644
--- a/python/plano.py
+++ b/python/plano.py
@@ -6,9 +6,9 @@
 # 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
@@ -20,95 +20,161 @@
 from __future__ import print_function
 
 import atexit as _atexit
+import binascii as _binascii
 import codecs as _codecs
+import collections as _collections
 import fnmatch as _fnmatch
 import getpass as _getpass
+import json as _json
 import os as _os
 import random as _random
 import re as _re
+import shlex as _shlex
 import shutil as _shutil
+import signal as _signal
+import socket as _socket
 import subprocess as _subprocess
 import sys as _sys
 import tarfile as _tarfile
 import tempfile as _tempfile
+import time as _time
 import traceback as _traceback
+import types as _types
+import uuid as _uuid
+
+from subprocess import CalledProcessError
 
 # See documentation at http://www.ssorj.net/projects/plano.html
 
+LINE_SEP = _os.linesep
+PATH_SEP = _os.sep
+PATH_VAR_SEP = _os.pathsep
+ENV = _os.environ
+ARGS = _sys.argv
+
+STD_ERR = _sys.stderr
+STD_OUT = _sys.stdout
+NULL_DEV = _os.devnull
+
+_message_levels = (
+    "debug",
+    "notice",
+    "warn",
+    "error",
+)
+
+_debug = _message_levels.index("debug")
+_notice = _message_levels.index("notice")
+_warn = _message_levels.index("warn")
+_error = _message_levels.index("error")
+
+_message_output = STD_ERR
+_message_threshold = _notice
+
+def set_message_output(writeable):
+    global _message_output
+    _message_output = writeable
+
+def set_message_threshold(level):
+    assert level in _message_levels
+
+    global _message_threshold
+    _message_threshold = _message_levels.index(level)
+
 def fail(message, *args):
     error(message, *args)
 
     if isinstance(message, BaseException):
         raise message
 
-    raise Exception(message)
+    raise Exception(message.format(*args))
 
 def error(message, *args):
-    _traceback.print_exc()
-    _print_message("Error", message, args, _sys.stderr)
+    _print_message("Error", message, args)
 
 def warn(message, *args):
-    _print_message("Warn", message, args, _sys.stderr)
+    if _message_threshold <= _warn:
+        _print_message("Warning", message, args)
 
 def notice(message, *args):
-    _print_message(None, message, args, _sys.stdout)
+    if _message_threshold <= _notice:
+        _print_message(None, message, args)
 
 def debug(message, *args):
-    _print_message("Debug", message, args, _sys.stdout)
+    if _message_threshold <= _debug:
+        _print_message("Debug", message, args)
 
-def exit(message=None, *args):
-    if message is None:
+def exit(arg=None, *args):
+    if arg in (0, None):
         _sys.exit()
 
-    _print_message("Error", message, args, _sys.stderr)
+    if _is_string(arg):
+        error(arg, args)
+        _sys.exit(1)
+    elif isinstance(arg, _types.IntType):
+        if arg > 0:
+            error("Exiting with code {0}", arg)
+        else:
+            notice("Exiting with code {0}", arg)
 
-    _sys.exit(1)
+        _sys.exit(arg)
+    else:
+        raise Exception()
+
+def _print_message(category, message, args):
+    if _message_output is None:
+        return
 
-def _print_message(category, message, args, file):
     message = _format_message(category, message, args)
 
-    print(message, file=file)
-    file.flush()
+    print(message, file=_message_output)
+
+    _message_output.flush()
 
 def _format_message(category, message, args):
-    if isinstance(message, BaseException):
+    if not _is_string(message):
         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)
+    if len(message) > 0 and message[0].islower():
+        message = message[0].upper() + message[1:]
+
+    if category:
+        message = "{0}: {1}".format(category, message)
+
+    program = program_name()
+    message = "{0}: {1}".format(program, message)
 
     return message
 
+def eprint(*args, **kwargs):
+    print(*args, file=STD_ERR, **kwargs)
+
+def flush():
+    STD_OUT.flush()
+    STD_ERR.flush()
+
 absolute_path = _os.path.abspath
 normalize_path = _os.path.normpath
+real_path = _os.path.realpath
 exists = _os.path.exists
 is_absolute = _os.path.isabs
 is_dir = _os.path.isdir
 is_file = _os.path.isfile
 is_link = _os.path.islink
+file_size = _os.path.getsize
 
 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
+sleep = _time.sleep
 
 def home_dir(user=""):
-    return _os.path.expanduser("~{}".format(user))
+    return _os.path.expanduser("~{0}".format(user))
 
 def parent_dir(path):
     path = normalize_path(path)
@@ -135,9 +201,26 @@ def name_stem(file):
 def name_extension(file):
     name = file_name(file)
     stem, ext = split_extension(name)
-    
+
     return ext
 
+def program_name(command=None):
+    if command is None:
+        args = ARGS
+    else:
+        args = command.split()
+
+    for arg in args:
+        if "=" not in arg:
+            return file_name(arg)
+
+def which(program_name):
+    for dir in ENV["PATH"].split(PATH_VAR_SEP):
+        program = join(dir, program_name)
+
+        if _os.access(program, _os.X_OK):
+            return program
+
 def read(file):
     with _codecs.open(file, encoding="utf-8", mode="r") as f:
         return f.read()
@@ -160,9 +243,13 @@ def prepend(file, string):
 
     return write(file, prepended)
 
+# XXX Should this work on directories?
 def touch(file):
     return append(file, "")
 
+def tail(file, n):
+    return "".join(tail_lines(file, n))
+
 def read_lines(file):
     with _codecs.open(file, encoding="utf-8", mode="r") as f:
         return f.readlines()
@@ -188,40 +275,48 @@ def prepend_lines(file, lines):
 
     return file
 
-_temp_dir = _tempfile.mkdtemp(prefix="plano.")
+# Derived from 
http://stackoverflow.com/questions/136168/get-last-n-lines-of-a-file-with-python-similar-to-tail
+def tail_lines(file, n):
+    assert n >= 0
 
-def _get_temp_file(key):
-    assert not key.startswith("_")
+    with _codecs.open(file, encoding="utf-8", mode="r") as f:
+        pos = n + 1
+        lines = list()
 
-    return join(_temp_dir, "_file_{}".format(key))
+        while len(lines) <= n:
+                try:
+                    f.seek(-pos, 2)
+                except IOError:
+                    f.seek(0)
+                    break
+                finally:
+                    lines = f.readlines()
 
-def _remove_temp_dir():
-    _shutil.rmtree(_temp_dir, ignore_errors=True)
+                pos *= 2
 
-_atexit.register(_remove_temp_dir)
+        return lines[-n:]
 
-def read_temp(key):
-    file = _get_temp_file(key)
-    return read(file)
+def read_json(file):
+    with _codecs.open(file, encoding="utf-8", mode="r") as f:
+        return _json.load(f)
 
-def write_temp(key, string):
-    file = _get_temp_file(key)
-    return write(file, string)
+def write_json(file, obj):
+    with _codecs.open(file, encoding="utf-8", mode="w") as f:
+        return _json.dump(obj, f, indent=4, separators=(",", ": "), 
sort_keys=True)
 
-def append_temp(key, string):
-    file = _get_temp_file(key)
-    return append(file, string)
+_temp_dir = _tempfile.mkdtemp(prefix="plano-")
 
-def prepend_temp(key, string):
-    file = _get_temp_file(key)
-    return prepend(file, string)
+def _remove_temp_dir():
+    _shutil.rmtree(_temp_dir, ignore_errors=True)
+
+_atexit.register(_remove_temp_dir)
 
-def make_temp(key):
-    return append_temp(key, "")
+# XXX Use _tempfile instead
+def make_temp_file(extension=""):
+    key = unique_id(4)
+    file = join(_temp_dir, "_file_{0}{1}".format(key, extension))
 
-def open_temp(key, mode="r"):
-    file = _get_temp_file(key)
-    return _codecs.open(file, encoding="utf-8", mode=mode)
+    return append(file, "")
 
 # This one is deleted on process exit
 def make_temp_dir():
@@ -235,13 +330,22 @@ def make_user_temp_dir():
 
     return make_dir(user_temp_dir)
 
-def copy(from_path, to_path):
-    notice("Copying '{}' to '{}'", from_path, to_path)
+def unique_id(length=16):
+    assert length >= 1
+    assert length <= 16
 
-    to_dir = parent_dir(to_path)
+    uuid_bytes = _uuid.uuid4().bytes
+    uuid_bytes = uuid_bytes[:length]
 
-    if to_dir:
-        make_dir(to_dir)
+    return _binascii.hexlify(uuid_bytes).decode("utf-8")
+
+def copy(from_path, to_path):
+    notice("Copying '{0}' to '{1}'", from_path, to_path)
+
+    if is_dir(to_path):
+        to_path = join(to_path, file_name(from_path))
+    else:
+        make_dir(parent_dir(to_path))
 
     if is_dir(from_path):
         _copytree(from_path, to_path, symlinks=True)
@@ -251,7 +355,12 @@ def copy(from_path, to_path):
     return to_path
 
 def move(from_path, to_path):
-    notice("Moving '{}' to '{}'", from_path, to_path)
+    notice("Moving '{0}' to '{1}'", from_path, to_path)
+
+    if is_dir(to_path):
+        to_path = join(to_path, file_name(from_path))
+    else:
+        make_dir(parent_dir(to_path))
 
     _shutil.move(from_path, to_path)
 
@@ -263,14 +372,14 @@ def rename(path, expr, replacement):
     to_name = string_replace(name, expr, replacement)
     to_path = join(parent_dir, to_name)
 
-    notice("Renaming '{}' to '{}'", path, to_path)
+    notice("Renaming '{0}' to '{1}'", path, to_path)
 
     move(path, to_path)
 
     return to_path
 
 def remove(path):
-    notice("Removing '{}'", path)
+    notice("Removing '{0}'", path)
 
     if not exists(path):
         return
@@ -283,10 +392,17 @@ def remove(path):
     return path
 
 def make_link(source_path, link_file):
+    notice("Making link '{0}' to '{1}'", link_file, source_path)
+
     if exists(link_file):
         assert read_link(link_file) == source_path
         return
 
+    link_dir = parent_dir(link_file)
+
+    if link_dir:
+        make_dir(link_dir)
+
     _os.symlink(source_path, link_file)
 
     return link_file
@@ -315,7 +431,7 @@ def find_any_one(dir, *patterns):
 
     if len(paths) == 0:
         return
-    
+
     return paths[0]
 
 def find_only_one(dir, *patterns):
@@ -323,7 +439,7 @@ def find_only_one(dir, *patterns):
 
     if len(paths) == 0:
         return
-    
+
     assert len(paths) == 1
 
     return paths[0]
@@ -341,7 +457,7 @@ def make_dir(dir):
 
 # Returns the current working directory so you can change it back
 def change_dir(dir):
-    notice("Changing directory to '{}'", dir)
+    notice("Changing directory to '{0}'", dir)
 
     cwd = current_dir()
     _os.chdir(dir)
@@ -374,24 +490,152 @@ class working_dir(object):
     def __exit__(self, type, value, traceback):
         change_dir(self.prev_dir)
 
-def _init_call(command, args, kwargs):
-    if args:
-        command = command.format(*args)
+def call(command, *args, **kwargs):
+    proc = start_process(command, *args, **kwargs)
 
-    if "shell" not in kwargs:
-        kwargs["shell"] = True
+    wait_for_process(proc)
 
-    notice("Calling '{}'", command)
+    if proc.returncode != 0:
+        command_string = _command_string(command)
+        command_string = command_string.format(*args)
 
-    return command, kwargs
+        raise CalledProcessError(proc.returncode, command_string)
 
-def call(command, *args, **kwargs):
-    command, args = _init_call(command, args, kwargs)
-    _subprocess.check_call(command, **kwargs)
+def call_for_exit_code(command, *args, **kwargs):
+    proc = start_process(command, *args, **kwargs)
+
+    wait_for_process(proc)
+
+    return proc.returncode
 
 def call_for_output(command, *args, **kwargs):
-    command, args = _init_call(command, args, kwargs)
-    return _subprocess.check_output(command, **kwargs)
+    kwargs["stdout"] = _subprocess.PIPE
+
+    proc = start_process(command, *args, **kwargs)
+    output = proc.communicate()[0]
+    exit_code = proc.poll()
+
+    if exit_code not in (None, 0):
+        command_string = _command_string(command)
+        command_string = command_string.format(*args)
+
+        error = CalledProcessError(exit_code, command_string)
+        error.output = output
+
+        raise error
+
+    return output
+
+def call_and_print_on_error(command, *args, **kwargs):
+    output_file = make_temp_file()
+
+    try:
+        with open(output_file, "w") as out:
+            kwargs["output"] = out
+            call(command, *args, **kwargs)
+    except CalledProcessError:
+        eprint(read(output_file), end="")
+        raise
+
+_child_processes = list()
+
+class _Process(_subprocess.Popen):
+    def __init__(self, command, *args, **kwargs):
+        super(_Process, self).__init__(command, *args, **kwargs)
+
+        try:
+            self.name = kwargs["name"]
+        except KeyError:
+            if _is_string(command):
+                self.name = program_name(command)
+            elif isinstance(command, _collections.Iterable):
+                self.name = command[0]
+            else:
+                raise Exception()
+
+        _child_processes.append(self)
+
+    def __repr__(self):
+        return "process {0} ({1})".format(self.pid, self.name)
+
+def _command_string(command):
+    if _is_string(command):
+        return command
+
+    elems = ["\"{0}\"".format(x) if " " in x else x for x in command]
+
+    return " ".join(elems)
+
+def default_sigterm_handler(signum, frame):
+    for proc in _child_processes:
+        if proc.poll() is None:
+            proc.terminate()
+
+    _remove_temp_dir()
+
+    exit(-(_signal.SIGTERM))
+
+_signal.signal(_signal.SIGTERM, default_sigterm_handler)
+
+def start_process(command, *args, **kwargs):
+    if _is_string(command):
+        command = command.format(*args)
+        command_args = _shlex.split(command)
+        command_string = command
+    elif isinstance(command, _collections.Iterable):
+        assert len(args) == 0, args
+        command_args = command
+        command_string = _command_string(command)
+    else:
+        raise Exception()
+
+    notice("Calling '{0}'", command_string)
+
+    if "output" in kwargs:
+        out = kwargs.pop("output")
+
+        kwargs["stdout"] = out
+        kwargs["stderr"] = out
+
+    if "shell" in kwargs and kwargs["shell"]:
+        proc = _Process(command_string, **kwargs)
+    else:
+        proc = _Process(command_args, **kwargs)
+
+    debug("{0} started", proc)
+
+    return proc
+
+def stop_process(proc):
+    notice("Stopping {0}", proc)
+
+    if proc.poll() is not None:
+        if proc.returncode == 0:
+            debug("{0} already exited normally", proc)
+        elif proc.returncode == -(_signal.SIGTERM):
+            debug("{0} was already terminated", proc)
+        else:
+            debug("{0} already exited with code {1}", proc, proc.returncode)
+
+        return
+
+    proc.terminate()
+
+    return wait_for_process(proc)
+
+def wait_for_process(proc):
+    debug("Waiting for {0} to exit", proc)
+
+    proc.wait()
+
+    if proc.returncode == 0:
+        debug("{0} exited normally", proc)
+    elif proc.returncode == -(_signal.SIGTERM):
+        debug("{0} exited after termination", proc)
+    else:
+        debug("{0} exited with code {1}", proc, proc.returncode)
+
+    return proc.returncode
 
 def make_archive(input_dir, output_dir, archive_stem):
     temp_dir = make_temp_dir()
@@ -400,11 +644,11 @@ def make_archive(input_dir, output_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 = "{0}.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)
+        call("tar -czf {0} {1}", output_file, archive_stem)
 
     return output_file
 
@@ -417,7 +661,7 @@ def extract_archive(archive_file, output_dir):
     archive_file = absolute_path(archive_file)
 
     with working_dir(output_dir):
-        call("tar -xf {}", archive_file)
+        call("tar -xf {0}", archive_file)
 
     return output_dir
 
@@ -425,7 +669,7 @@ def rename_archive(archive_file, new_archive_stem):
     assert is_file(archive_file)
 
     if name_stem(archive_file) == new_archive_stem:
-        return
+        return archive_file
 
     temp_dir = make_temp_dir()
 
@@ -446,6 +690,27 @@ def rename_archive(archive_file, new_archive_stem):
 def random_port(min=49152, max=65535):
     return _random.randint(min, max)
 
+def wait_for_port(port, host="", timeout=30):
+    if _is_string(port):
+        port = int(port)
+
+    sock = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
+    sock.setsockopt(_socket.SOL_SOCKET, _socket.SO_REUSEADDR, 1)
+
+    start = _time.time()
+
+    try:
+        while True:
+            if sock.connect_ex((host, port)) == 0:
+                return
+
+            sleep(0.1)
+
+            if _time.time() - start > timeout:
+                fail("Timed out waiting for port {0} to open", port)
+    finally:
+        sock.close()
+
 # Modified copytree impl that allows for already existing destination
 # dirs
 def _copytree(src, dst, symlinks=False, ignore=None):
@@ -513,3 +778,9 @@ def _copytree(src, dst, symlinks=False, ignore=None):
             errors.append((src, dst, str(why)))
     if errors:
         raise _shutil.Error(errors)
+
+def _is_string(obj):
+    try:
+        return isinstance(obj, basestring)
+    except NameError:
+        return isinstance(obj, str)

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-broker-j-release-docs
----------------------------------------------------------------------
diff --git a/scripts/gen-broker-j-release-docs 
b/scripts/gen-broker-j-release-docs
new file mode 100755
index 0000000..dea889a
--- /dev/null
+++ b/scripts/gen-broker-j-release-docs
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+#
+# 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
+
+from generate import *
+
+import uuid
+from xml.etree import ElementTree
+
+def gen_broker_j_books(release, source_dir, output_dir):
+    toplevel_pom = join(source_dir, "pom.xml")
+    input_dir = join(source_dir, "doc")
+
+    cpp_broker_book_url = 
"/releases/qpid-cpp-{{current_cpp_release}}/cpp-broker/book/"
+    jms_client010_book_url = 
"/releases/qpid-jms-amqp-0-x-{{current_jms_amqp_0_x_release}}/jms-client-0-10/book/"
+
+    call("mvn -f {} -pl doc -amd -Ddoc=true package -DqpidCppBook={} 
-DqpidJmsClient010Book={}",
+         toplevel_pom,
+         cpp_broker_book_url,
+         jms_client010_book_url)
+
+    java_broker_input_dir = join(input_dir, "java-broker", "target", "docbkx")
+    java_broker_output_dir = join(output_dir, "java-broker")
+
+    remove(java_broker_output_dir)
+
+    copy(java_broker_input_dir, join(java_broker_output_dir, "book"))
+
+    for path in find(java_broker_output_dir, "*.html"):
+        print(path)
+
+        tree = ElementTree.parse(path)
+        elem = tree.find(".//{http://www.w3.org/1999/xhtml}body";)
+
+        elem.tag = "div"
+        elem.set("class", "docbook")
+
+        remove_namespace(elem, "http://www.w3.org/1999/xhtml";)
+
+        # A hack to preserve docbook's empty anchors in an
+        # IE-compatible way
+
+        target = str(uuid.uuid4())
+
+        for a in tree.iter("a"):
+            if a.text is None:
+                a.text = target
+
+        content = ElementTree.tostring(elem)
+        content = content.replace(target, "")
+
+        write("{}.in".format(path), content)
+        remove(path)
+
+# From http://homework.nwsnet.de/releases/45be/
+def remove_namespace(doc, namespace):
+    """Remove namespace in the passed document in place."""
+    ns = u'{%s}' % namespace
+    nsl = len(ns)
+    for elem in doc.getiterator():
+        if elem.tag.startswith(ns):
+            elem.tag = elem.tag[nsl:]
+
+## Now do stuff ##
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+source_dir = checkout_dir or fetch_source("broker-j", source_release)
+
+gen_broker_j_books(release, source_dir, release_dir)
+
+notice("Docs generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-broker-j-release-notes
----------------------------------------------------------------------
diff --git a/scripts/gen-broker-j-release-notes 
b/scripts/gen-broker-j-release-notes
new file mode 100755
index 0000000..3a8f494
--- /dev/null
+++ b/scripts/gen-broker-j-release-notes
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+#
+# 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 generate import *
+
+template = \
+"""
+;;
+;; 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.
+;;
+
+# Qpid Broker-J {release} Release Notes
+
+Qpid Broker-J is a message broker written in Java that stores, routes,
+and forwards messages using AMQP.
+
+For more information about this release, including download links and
+documentation, see the [release overview](index.html).
+
+{release_notes}
+"""
+
+def gen_release_notes(release, issues_release, release_dir):
+    output_path = join(release_dir, "release-notes.md")
+
+    release_notes = render_release_notes("broker-j", issues_release)
+
+    output = template.format(**locals())
+    output = output.strip()
+
+    write(output_path, output)
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+
+if release == "master":
+    notice("Skipping generation for master")
+    exit()
+
+gen_release_notes(release, issues_release, release_dir)
+
+notice("Release notes generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-broker-j-release-page
----------------------------------------------------------------------
diff --git a/scripts/gen-broker-j-release-page 
b/scripts/gen-broker-j-release-page
new file mode 100755
index 0000000..065a684
--- /dev/null
+++ b/scripts/gen-broker-j-release-page
@@ -0,0 +1,245 @@
+#!/usr/bin/python
+#
+# 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 generate import *
+
+from datetime import datetime
+
+source_artefact_records = (
+    ("qpid-broker-j-{}.tar.gz", "Qpid Broker-J"),
+)
+
+binary_artefact_records = (
+    ("qpid-broker-{}-bin.tar.gz", "Qpid Broker-J"),
+)
+
+component_records = (
+    ("broker-j", "Qpid Broker-J", "Java", "JVM", "1.0, 0-10, 0-9-1, 0-9, 0-8"),
+)
+
+documentation = \
+"""
+<div class="two-column" markdown="1">
+
+ - [Installing Qpid Broker-J](java-broker/book/Java-Broker-Installation.html)
+ - [Broker book](java-broker/book/index.html)
+
+</div>
+"""
+
+template = \
+"""
+;;
+;; 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.
+;;
+
+# Qpid Broker-J {release}
+
+Qpid Broker-J is a message broker written in Java that stores, routes,
+and forwards messages using AMQP.  More about
+[Qpid]({{{{site_url}}}}/index.html).
+
+For a detailed list of the changes in this release, see the [release
+notes](release-notes.html).
+
+It's important to [verify the
+integrity]({{{{site_url}}}}/download.html#verify-what-you-download) of the
+files you download.
+
+## Source archives
+
+| Content | Download | Verify |
+|---------|----------|--------|
+{source_artefacts}
+
+## Binaries
+
+| Content | Download | Verify |
+|---------|----------|--------|
+{binary_artefacts}
+
+## Components
+
+| Component | Languages | Platforms | AMQP versions |
+|-----------|-----------|-----------|---------------|
+{components}
+
+## Documentation
+
+{documentation}
+
+## More information
+
+ - [All release 
artefacts](http://archive.apache.org/dist/qpid/broker-j/{release})
+ - [Resolved issues in JIRA]({issues_url})
+ - [Source repository 
tag](https://git-wip-us.apache.org/repos/asf/qpid-broker-j.git/tree/refs/tags/{release})
+
+<script type="text/javascript">
+  _deferredFunctions.push(function() {{
+      if ("{release}" === "{{{{current_broker_j_release}}}}") {{
+          _modifyCurrentReleaseLinks();
+      }}
+  }});
+</script>
+"""
+
+def gen_release_page(release, issues_release, source_release, release_dir):
+    output_path = join(release_dir, "index.md")
+
+    components = list()
+
+    source_artefacts = list()
+    source_artefact_url = "http://archive.apache.org/dist/qpid/broker-j/{}/{}";
+
+    binary_artefacts = list()
+    binary_artefact_url = 
"http://archive.apache.org/dist/qpid/broker-j/{}/binaries/{}";
+
+    for artefact, summary in source_artefact_records:
+        artefact = artefact.format(release)
+        artefact_url = source_artefact_url.format(release, artefact)
+        asc_url = "{}.asc".format(artefact_url)
+        md5_url = "{}.md5".format(artefact_url)
+        sha_url = "{}.sha".format(artefact_url)
+
+        args = summary, artefact, artefact_url, asc_url, md5_url, sha_url
+        row = "| {} | [{}]({}) | [ASC]({}), [MD5]({}), [SHA512]({}) 
|".format(*args)
+
+        source_artefacts.append(row)
+
+    for artefact, summary in binary_artefact_records:
+        artefact = artefact.format(release)
+        artefact_url = binary_artefact_url.format(release, artefact)
+        asc_url = "{}.asc".format(artefact_url)
+        md5_url = "{}.md5".format(artefact_url)
+        sha_url = "{}.sha".format(artefact_url)
+
+        args = summary, artefact, artefact_url, asc_url, md5_url, sha_url
+        row = "| {} | [{}]({}) | [ASC]({}), [MD5]({}), [SHA512]({}) 
|".format(*args)
+
+        binary_artefacts.append(row)
+
+    for key, name, languages, platforms, amqp_versions in component_records:
+        if key.endswith(".html"):
+            link = "[{}]({{{{site_url}}}}/components/{})".format(name, key)
+        else:
+            link = 
"[{}]({{{{site_url}}}}/components/{}/index.html)".format(name, key)
+        args = link, languages, platforms, amqp_versions
+        components.append("| {} | {} | {} | {} |".format(*args))
+
+    source_artefacts = "\n".join(source_artefacts)
+    binary_artefacts = "\n".join(binary_artefacts)
+    components = "\n".join(components)
+
+    jql = "project = QPID AND fixVersion = '{}' AND resolution = 'fixed' 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
+    
+    output = template.format(**vars)
+    output = output.strip()
+
+    write(output_path, output)
+
+trunk_template = """
+;;
+;; 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.
+;;
+
+# Qpid Broker-J documentation snapshot
+
+<div class="feature" markdown="1">
+
+## Warning! This is a snapshot of work in progress
+
+Documentation found here may be incorrect or incomplete.  For a
+smoother experience, see the [current stable
+release]({{{{current_broker_j_release_url}}}}/index.html).
+
+This content was generated at {time} on {day}, {date}.
+
+</div>
+
+## Documentation
+
+{documentation}
+
+## More information
+
+ - [Source 
repository](https://git-wip-us.apache.org/repos/asf/qpid-broker-j.git)
+"""
+    
+def gen_master_release_page(release_dir):
+    output_path = join(release_dir, "index.md")
+
+    now = datetime.now()
+
+    day = now.strftime("%A")
+    date = now.strftime("%d %B %Y")
+    time = now.strftime("%H:%M %Z")
+
+    vars = locals()
+    vars["documentation"] = documentation
+    
+    output = trunk_template.format(**vars)
+    output = output.strip()
+
+    write(output_path, output)
+
+## Now do stuff ##
+
+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, issues_release, source_release, release_dir)
+
+notice("Release page generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-cpp-release-api-doc
----------------------------------------------------------------------
diff --git a/scripts/gen-cpp-release-api-doc b/scripts/gen-cpp-release-api-doc
deleted file mode 100755
index 6726483..0000000
--- a/scripts/gen-cpp-release-api-doc
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/python
-#
-# 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 generate import *
-
-def gen_messaging_api(release, source_dir, release_dir):
-    component_dir = join(release_dir, "messaging-api")
-    remove(component_dir)
-
-    gen_cpp_messaging_api(release, source_dir, component_dir)
-    #gen_dotnet_messaging_api(release, source_dir, component_dir)
-    #gen_python_messaging_api(release, source_dir, component_dir)
-    #gen_ruby_messaging_api(release, source_dir, component_dir)
-
-def gen_cpp_messaging_api(release, source_dir, component_dir):
-    include_dir = join(source_dir, "include")
-    input_paths = (
-        join(source_dir, "cpp", "docs", "api", "doxygen_mainpage.h"),
-        join(include_dir, "qpid", "messaging"),
-        join(include_dir, "qpid", "types"),
-        )
-    output_dir = join(component_dir, "cpp", "api")
-
-    gen_doxygen(release=release,
-                title="Qpid C++ Messaging API",
-                input_paths=input_paths,
-                strip_paths=(include_dir,),
-                output_dir=output_dir)
-
-def gen_dotnet_messaging_api(release, source_dir, component_dir):
-    include_dir = join(source_dir, "bindings", "qpid", "dotnet", "src")
-    input_paths = (include_dir,)
-    output_dir = join(component_dir, "dotnet", "api")
-
-    gen_doxygen(release=release,
-                title="Qpid .NET Messaging API",
-                input_paths=input_paths,
-                strip_paths=(include_dir,),
-                output_dir=output_dir)
-
-def gen_python_messaging_api(release, source_dir, component_dir):
-    input_path = join(source_dir, "python")
-    input_namespace = "qpid.messaging"
-    output_dir = join(component_dir, "python", "api")
-
-    gen_epydoc(release=release,
-               title="Qpid Python Messaging API",
-               input_paths=(input_path,),
-               input_namespaces=(input_namespace,),
-               output_dir=output_dir)
-
-def gen_ruby_messaging_api(release, source_dir, component_dir):
-    base_input_path = join(source_dir, "bindings")
-    input_path = join("qpid", "ruby", "lib")
-    output_dir = join(component_dir, "ruby", "api")
-
-    gen_rdoc(release=release,
-             title="Qpid Ruby Messaging API",
-             base_input_path=base_input_path,
-             input_paths=(input_path,),
-             output_dir=output_dir)
-
-    #name = "qpid-{}-ruby-messaging-api-apiref".format(release)
-    #make_archive(api_dir, output_dir, name)
-
-## Now do stuff ##
-
-release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
-source_dir = export_release_from_git("cpp", source_release)
-
-gen_messaging_api(release, source_dir, release_dir)
-
-notice("API documentation generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-cpp-release-books
----------------------------------------------------------------------
diff --git a/scripts/gen-cpp-release-books b/scripts/gen-cpp-release-books
deleted file mode 100755
index 69ba41b..0000000
--- a/scripts/gen-cpp-release-books
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/python
-#
-# 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 generate import *
-
-import uuid
-from xml.etree import ElementTree
-
-def gen_books(release, source_dir, output_dir):
-    input_dir = join(source_dir, "docs", "book")
-
-    stylesheet = """<?xml version='1.0'?>
-    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="1.0">
-    <xsl:import 
href="http://docbook.sourceforge.net/release/xsl/current/xhtml/chunk.xsl"/>
-    </xsl:stylesheet>"""
-
-    write(join(input_dir, "xsl", "html-custom.xsl"), stylesheet)
-
-    call("make -C {} clean all", input_dir)
-
-    cpp_broker_input_dir = join(input_dir, "build", 
"AMQP-Messaging-Broker-CPP-Book")
-    cpp_broker_output_dir = join(output_dir, "cpp-broker")
-
-    remove(cpp_broker_output_dir)
-
-    copy(join(cpp_broker_input_dir, "html"), join(cpp_broker_output_dir, 
"book"))
-
-    copy(join(cpp_broker_input_dir, "pdf", 
"AMQP-Messaging-Broker-CPP-Book.pdf"),
-         join(cpp_broker_output_dir, "cpp-broker-book.pdf"))
-
-    output_dirs = [cpp_broker_output_dir]
-
-    for dir in output_dirs:
-        for path in find(dir, "*.html"):
-            tree = ElementTree.parse(path)
-            elem = tree.find(".//{http://www.w3.org/1999/xhtml}body";)
-
-            elem.tag = "div"
-            elem.set("class", "docbook")
-
-            remove_namespace(elem, "http://www.w3.org/1999/xhtml";)
-
-            # A hack to preserve docbook's empty anchors in an
-            # IE-compatible way
-
-            target = str(uuid.uuid4())
-
-            for a in tree.iter("a"):
-                if a.text is None:
-                    a.text = target
-
-            content = ElementTree.tostring(elem)
-
-            content = content.replace(target, "")
-
-            write("{}.in".format(path), content)
-            remove(path)
-
-# From http://homework.nwsnet.de/releases/45be/
-def remove_namespace(doc, namespace):
-    """Remove namespace in the passed document in place."""
-    ns = u'{%s}' % namespace
-    nsl = len(ns)
-    for elem in doc.getiterator():
-        if elem.tag.startswith(ns):
-            elem.tag = elem.tag[nsl:]
-
-## Now do stuff ##
-
-release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
-source_dir = export_release_from_git("cpp", source_release)
-
-gen_books(release, source_dir, release_dir)
-
-notice("Books generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-cpp-release-docs
----------------------------------------------------------------------
diff --git a/scripts/gen-cpp-release-docs b/scripts/gen-cpp-release-docs
new file mode 100755
index 0000000..f7999e3
--- /dev/null
+++ b/scripts/gen-cpp-release-docs
@@ -0,0 +1,140 @@
+#!/usr/bin/python
+#
+# 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 uuid
+
+from generate import *
+from xml.etree import ElementTree
+
+def gen_cpp_apis(release, source_dir, release_dir):
+    component_dir = join(release_dir, "messaging-api")
+
+    remove(component_dir)
+
+    gen_cpp_messaging_api(release, source_dir, component_dir)
+
+def gen_cpp_messaging_api(release, source_dir, component_dir):
+    include_dir = join(source_dir, "include")
+    input_paths = (
+        join(source_dir, "cpp", "docs", "api", "doxygen_mainpage.h"),
+        join(include_dir, "qpid", "messaging"),
+        join(include_dir, "qpid", "types"),
+        )
+    output_dir = join(component_dir, "cpp", "api")
+
+    gen_doxygen(release=release,
+                title="Qpid C++ Messaging API",
+                input_paths=input_paths,
+                strip_paths=(include_dir,),
+                output_dir=output_dir)
+
+def gen_cpp_books(release, source_dir, output_dir):
+    input_dir = join(source_dir, "docs", "book")
+
+    stylesheet = """<?xml version='1.0'?>
+    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="1.0">
+    <xsl:import 
href="http://docbook.sourceforge.net/release/xsl/current/xhtml/chunk.xsl"/>
+    </xsl:stylesheet>"""
+
+    write(join(input_dir, "xsl", "html-custom.xsl"), stylesheet)
+
+    call("make -C {} clean all", input_dir)
+
+    cpp_broker_input_dir = join(input_dir, "build", 
"AMQP-Messaging-Broker-CPP-Book")
+    cpp_broker_output_dir = join(output_dir, "cpp-broker")
+
+    remove(cpp_broker_output_dir)
+
+    copy(join(cpp_broker_input_dir, "html"), join(cpp_broker_output_dir, 
"book"))
+
+    copy(join(cpp_broker_input_dir, "pdf", 
"AMQP-Messaging-Broker-CPP-Book.pdf"),
+         join(cpp_broker_output_dir, "cpp-broker-book.pdf"))
+
+    output_dirs = [cpp_broker_output_dir]
+
+    for dir in output_dirs:
+        for path in find(dir, "*.html"):
+            tree = ElementTree.parse(path)
+            elem = tree.find(".//{http://www.w3.org/1999/xhtml}body";)
+
+            elem.tag = "div"
+            elem.set("class", "docbook")
+
+            remove_namespace(elem, "http://www.w3.org/1999/xhtml";)
+
+            # A hack to preserve docbook's empty anchors in an
+            # IE-compatible way
+
+            target = str(uuid.uuid4())
+
+            for a in tree.iter("a"):
+                if a.text is None:
+                    a.text = target
+
+            content = ElementTree.tostring(elem)
+
+            content = content.replace(target, "")
+
+            write("{}.in".format(path), content)
+            remove(path)
+
+# From http://homework.nwsnet.de/releases/45be/
+def remove_namespace(doc, namespace):
+    """Remove namespace in the passed document in place."""
+    ns = u'{%s}' % namespace
+    nsl = len(ns)
+    for elem in doc.getiterator():
+        if elem.tag.startswith(ns):
+            elem.tag = elem.tag[nsl:]
+
+def gen_cpp_examples(release, source_dir, release_dir):
+    component_dir = join(release_dir, "messaging-api")
+
+    gen_cpp_messaging_examples(release, source_dir, component_dir)
+
+def gen_cpp_messaging_examples(release, source_dir, component_dir):
+    input_dir = join(source_dir, "examples", "messaging")
+    output_dir = join(component_dir, "cpp", "examples")
+
+    release_url = get_git_release_branch_url("cpp", release)
+    readme_url = 
"https://git-wip-us.apache.org/repos/asf?p=qpid-cpp.git;a=blob_plain;f=examples/README.txt;hb=refs/heads/{}".format("master")
+    source_url = 
"https://git-wip-us.apache.org/repos/asf?p=qpid-cpp.git;a=tree;f=examples/messaging;hb=refs/heads/{}".format("master")
+
+    input_names = list_dir(input_dir, "*.cpp", "*.h")
+
+    gen_examples(release=release,
+                 lang="cpp",
+                 title="C++ Messaging API Examples",
+                 input_dir=input_dir,
+                 input_names=input_names,
+                 output_dir=output_dir,
+                 readme_url=readme_url,
+                 source_url=source_url)
+
+## Now do stuff ##
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+source_dir = checkout_dir or fetch_source("cpp", source_release)
+
+gen_cpp_apis(release, source_dir, release_dir)
+gen_cpp_books(release, source_dir, release_dir)
+gen_cpp_examples(release, source_dir, release_dir)
+
+notice("Docs generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-cpp-release-examples
----------------------------------------------------------------------
diff --git a/scripts/gen-cpp-release-examples b/scripts/gen-cpp-release-examples
deleted file mode 100755
index 3bf29cf..0000000
--- a/scripts/gen-cpp-release-examples
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/python
-#
-# 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 generate import *
-
-## Messaging API ##
-
-def gen_messaging_api(release, source_dir, release_dir):
-    component_dir = join(release_dir, "messaging-api")
-
-    gen_cpp_messaging_api(release, source_dir, component_dir)
-    #gen_dotnet_messaging_api(release, source_dir, component_dir)
-    #gen_python_messaging_api(release, source_dir, component_dir)
-    #gen_ruby_messaging_api(release, source_dir, component_dir)
-
-def gen_cpp_messaging_api(release, source_dir, component_dir):
-    input_dir = join(source_dir, "examples", "messaging")
-    output_dir = join(component_dir, "cpp", "examples")
-
-    release_url = get_git_release_branch_url("cpp", release)
-    readme_url = 
"https://git-wip-us.apache.org/repos/asf?p=qpid-cpp.git;a=blob_plain;f=examples/README.txt;hb=refs/heads/{}".format("master")
-    source_url = 
"https://git-wip-us.apache.org/repos/asf?p=qpid-cpp.git;a=tree;f=examples/messaging;hb=refs/heads/{}".format("master")
-
-    input_names = list_dir(input_dir, "*.cpp", "*.h")
-
-    gen_examples(release=release,
-                 lang="cpp",
-                 title="C++ Messaging API Examples",
-                 input_dir=input_dir,
-                 input_names=input_names,
-                 output_dir=output_dir,
-                 readme_url=readme_url,
-                 source_url=source_url)
-
-def gen_dotnet_messaging_api(release, source_dir, component_dir):
-    input_dir = join(source_dir, "bindings", "qpid", "dotnet", "examples")
-    output_dir = join(component_dir, "dotnet", "examples")
-
-    release_url = get_svn_release_url("main", release)
-    source_url = "{}/bindings/qpid/dotnet/examples".format(release_url)
-
-    # The layout of dotnet examples is funky, so some schlepping to
-    # normalize it
-
-    temp_dir = make_temp_dir()
-    input_names = set()
-
-    for path in find(input_dir, "*.cs"):
-        name = split(path)[1]
-
-        if name == "AssemblyInfo.cs":
-            continue
-
-        copy(path, join(temp_dir, name))
-        input_names.add(name)
-
-    input_names = sorted(input_names)
-
-    gen_examples(release=release,
-                 title=".NET Messaging API Examples",
-                 lang="csharp",
-                 input_dir=temp_dir,
-                 input_names=input_names,
-                 output_dir=output_dir,
-                 source_url=source_url)
-
-def gen_python_messaging_api(release, source_dir, component_dir):
-    input_dir = join(source_dir, "python", "examples", "api")
-    output_dir = join(component_dir, "python", "examples")
-
-    release_url = get_svn_release_url("main", release)
-    readme_url = "{}/python/examples/README.txt".format(release_url)
-    source_url = "{}/python/examples".format(release_url)
-
-    input_names = list_dir(input_dir)
-
-    gen_examples(release=release,
-                 title="Python Messaging API Examples",
-                 lang="python",
-                 input_dir=input_dir,
-                 input_names=input_names,
-                 output_dir=output_dir,
-                 readme_url=readme_url,
-                 source_url=source_url)
-
-def gen_ruby_messaging_api(release, source_dir, component_dir):
-    input_dir = join(source_dir, "bindings", "qpid", "ruby", "examples")
-    output_dir = join(component_dir, "ruby", "examples")
-
-    release_url = get_svn_release_url("main", release)
-    source_url = "{}/bindings/qpid/ruby/examples".format(release_url)
-
-    input_names = list_dir(input_dir, "*.rb")
-
-    gen_examples(release=release,
-                 title="Ruby Messaging API Examples",
-                 lang="ruby",
-                 input_dir=input_dir,
-                 input_names=input_names,
-                 output_dir=output_dir,
-                 source_url=source_url)
-
-## Now do stuff ##
-
-release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
-source_dir = export_release_from_git("cpp", source_release)
-
-gen_messaging_api(release, source_dir, release_dir)
-
-notice("Examples generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-cpp-release-notes
----------------------------------------------------------------------
diff --git a/scripts/gen-cpp-release-notes b/scripts/gen-cpp-release-notes
index 3fa4521..21f3ab0 100755
--- a/scripts/gen-cpp-release-notes
+++ b/scripts/gen-cpp-release-notes
@@ -65,8 +65,8 @@ def gen_release_notes(release, issues_release, release_dir):
 
 release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
 
-if release == "trunk":
-    notice("Skipping generation for trunk")
+if release == "master":
+    notice("Skipping generation for master")
     exit()
 
 gen_release_notes(release, issues_release, release_dir)

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-cpp-release-page
----------------------------------------------------------------------
diff --git a/scripts/gen-cpp-release-page b/scripts/gen-cpp-release-page
index 030b7e8..408cf98 100755
--- a/scripts/gen-cpp-release-page
+++ b/scripts/gen-cpp-release-page
@@ -96,7 +96,7 @@ files you download.
 ## More information
 
  - [Resolved issues in JIRA]({issues_url})
- - [Source repository 
tag](http://svn.apache.org/repos/asf/qpid/tags/qpid-cpp-{release})
+ - [Source repository 
tag](https://git-wip-us.apache.org/repos/asf/qpid-cpp.git/tree/refs/tags/{release})
 
 <script type="text/javascript">
   _deferredFunctions.push(function() {{

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-dispatch-release-books
----------------------------------------------------------------------
diff --git a/scripts/gen-dispatch-release-books 
b/scripts/gen-dispatch-release-books
deleted file mode 100755
index cb9a9e7..0000000
--- a/scripts/gen-dispatch-release-books
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/python
-#
-# 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 os
-from generate import *
-
-def gen_books_and_man(release, source_dir, output_dir):
-    build_dir = join(source_dir, "build")
-    make_dir(build_dir)
-    with working_dir(build_dir):
-        call("cmake ..")
-        call("make")
-        call("make doc")
-
-    book_build_dir = join(build_dir, "doc", "book")
-
-    for f in list_dir(book_build_dir, "*.html.in"):
-        input_file = join(book_build_dir, f)
-        output_file = join(output_dir, "book", f)
-
-        copy(input_file, output_file)
-
-    for f in list_dir(book_build_dir, "*.png"):
-        input_file = join(book_build_dir, f)
-        output_file = join(output_dir, "book", f)
-
-        copy(input_file, output_file)
-
-    # book_image_dir = join(build_dir, "doc", "_images")
-
-    # for f in list_dir(book_image_dir, "*"):
-    #     input_file = join(book_image_dir, f)
-    #     output_file = join(output_dir, "_images", f)
-
-    #     copy(input_file, output_file)
-
-    man_build_dir = join(build_dir, "doc", "man")
-
-    for f in list_dir(man_build_dir, "*.html.in"):
-        input_file = join(man_build_dir, f)
-        output_file = join(output_dir, "man", f)
-
-        copy(input_file, output_file)
-
-## Now do stuff ##
-release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
-source_dir = checkout_dir or export_release_from_git("dispatch", 
source_release)
-
-gen_books_and_man(release, source_dir, release_dir)
-
-notice("Books generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-dispatch-release-docs
----------------------------------------------------------------------
diff --git a/scripts/gen-dispatch-release-docs 
b/scripts/gen-dispatch-release-docs
new file mode 100755
index 0000000..0f3ec34
--- /dev/null
+++ b/scripts/gen-dispatch-release-docs
@@ -0,0 +1,69 @@
+#!/usr/bin/python
+#
+# 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 os
+from generate import *
+
+def gen_dispatch_docs(release, source_dir, output_dir):
+    build_dir = make_temp_dir()
+    
+    with working_dir(build_dir):
+        call("cmake {}", source_dir)
+        call("make")
+        call("make doc")
+
+    book_build_dir = join(build_dir, "doc", "book")
+
+    for f in list_dir(book_build_dir, "*.html.in"):
+        input_file = join(book_build_dir, f)
+        output_file = join(output_dir, "book", f)
+
+        copy(input_file, output_file)
+
+    for f in list_dir(book_build_dir, "*.png"):
+        input_file = join(book_build_dir, f)
+        output_file = join(output_dir, "book", f)
+
+        copy(input_file, output_file)
+
+    # book_image_dir = join(build_dir, "doc", "_images")
+
+    # for f in list_dir(book_image_dir, "*"):
+    #     input_file = join(book_image_dir, f)
+    #     output_file = join(output_dir, "_images", f)
+
+    #     copy(input_file, output_file)
+
+    man_build_dir = join(build_dir, "doc", "man")
+
+    for f in list_dir(man_build_dir, "*.html.in"):
+        input_file = join(man_build_dir, f)
+        output_file = join(output_dir, "man", f)
+
+        copy(input_file, output_file)
+
+## Now do stuff ##
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+source_dir = checkout_dir or fetch_source("dispatch", source_release)
+
+gen_dispatch_docs(release, source_dir, release_dir)
+
+notice("Docs generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-interop-test-release-docs
----------------------------------------------------------------------
diff --git a/scripts/gen-interop-test-release-docs 
b/scripts/gen-interop-test-release-docs
new file mode 100755
index 0000000..a7c7c39
--- /dev/null
+++ b/scripts/gen-interop-test-release-docs
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+#
+# 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 os
+
+from generate import *
+
+def gen_interop_test_docs(release, source_dir, output_dir):
+    pass
+
+## Now do stuff ##
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+source_dir = checkout_dir or fetch_source("interop-test", source_release)
+
+gen_interop_test_docs(release, source_dir, release_dir)
+
+notice("Docs generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-java-release-books
----------------------------------------------------------------------
diff --git a/scripts/gen-java-release-books b/scripts/gen-java-release-books
deleted file mode 100755
index 4e29862..0000000
--- a/scripts/gen-java-release-books
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/usr/bin/python
-#
-# 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 generate import *
-
-import uuid
-from xml.etree import ElementTree
-
-def gen_books(release, source_dir, output_dir):
-    toplevel_pom = join(source_dir, "pom.xml")
-    input_dir = join(source_dir, "doc")
-
-    cpp_broker_book_url = 
"/releases/qpid-cpp-{{current_cpp_release}}/cpp-broker/book/"
-    jms_client010_book_url = 
"/releases/qpid-java-{}/jms-client-0-10/book/".format(release)
-
-    call("mvn -f {} -pl doc -amd -Ddoc=true package -DqpidCppBook={} 
-DqpidJmsClient010Book={}",
-         toplevel_pom,
-         cpp_broker_book_url,
-         jms_client010_book_url)
-
-    java_broker_input_dir = join(input_dir, "java-broker", "target", "docbkx")
-    jms_client08_input_dir = join(input_dir, "jms-client-0-8", "target", 
"docbkx")
-    jms_client010_input_dir = join(input_dir, "jms-client-0-10", "target", 
"docbkx")
-
-
-    java_broker_output_dir = join(output_dir, "java-broker")
-    jms_client08_output_dir = join(output_dir, "jms-client-0-8")
-    jms_client010_output_dir = join(output_dir, "jms-client-0-10")
-
-    remove(java_broker_output_dir)
-    remove(jms_client08_output_dir)
-    remove(jms_client010_output_dir)
-
-    copy(java_broker_input_dir, join(java_broker_output_dir, "book"))
-    copy(jms_client08_input_dir, join(jms_client08_output_dir, "book"))
-    copy(jms_client010_input_dir, join(jms_client010_output_dir, "book"))
-
-    output_dirs = [java_broker_output_dir, jms_client08_output_dir, 
jms_client010_output_dir]
-
-    for dir in output_dirs:
-        for path in find(dir, "*.html"):
-            print path
-
-            tree = ElementTree.parse(path)
-            elem = tree.find(".//{http://www.w3.org/1999/xhtml}body";)
-
-            elem.tag = "div"
-            elem.set("class", "docbook")
-
-            remove_namespace(elem, "http://www.w3.org/1999/xhtml";)
-
-            # A hack to preserve docbook's empty anchors in an
-            # IE-compatible way
-
-            target = str(uuid.uuid4())
-
-            for a in tree.iter("a"):
-                if a.text is None:
-                    a.text = target
-
-            content = ElementTree.tostring(elem)
-            content = content.replace(target, "")
-
-            write("{}.in".format(path), content)
-            remove(path)
-
-def infile_replace(filename, old_string, new_string):
-    fileContent = ""
-    with open(filename,'r') as f:
-        fileContent=f.read()
-    if old_string in fileContent:
-        newContent=fileContent.replace(old_string, new_string)
-        with open(filename,'w') as f:
-            f.write(newContent)
-            f.flush()
-
-# From http://homework.nwsnet.de/releases/45be/
-def remove_namespace(doc, namespace):
-    """Remove namespace in the passed document in place."""
-    ns = u'{%s}' % namespace
-    nsl = len(ns)
-    for elem in doc.getiterator():
-        if elem.tag.startswith(ns):
-            elem.tag = elem.tag[nsl:]
-
-## Now do stuff ##
-
-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)
-
-notice("Books generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-java-release-docs
----------------------------------------------------------------------
diff --git a/scripts/gen-java-release-docs b/scripts/gen-java-release-docs
new file mode 100755
index 0000000..b1d70ee
--- /dev/null
+++ b/scripts/gen-java-release-docs
@@ -0,0 +1,141 @@
+#!/usr/bin/python
+#
+# 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 generate import *
+
+import uuid
+from xml.etree import ElementTree
+
+def gen_java_books(release, source_dir, output_dir):
+    toplevel_pom = join(source_dir, "pom.xml")
+    input_dir = join(source_dir, "doc")
+
+    cpp_broker_book_url = 
"/releases/qpid-cpp-{{current_cpp_release}}/cpp-broker/book/"
+    jms_client010_book_url = 
"/releases/qpid-java-{}/jms-client-0-10/book/".format(release)
+
+    call("mvn -f {} -pl doc -amd -Ddoc=true package -DqpidCppBook={} 
-DqpidJmsClient010Book={}",
+         toplevel_pom,
+         cpp_broker_book_url,
+         jms_client010_book_url)
+
+    java_broker_input_dir = join(input_dir, "java-broker", "target", "docbkx")
+    jms_client08_input_dir = join(input_dir, "jms-client-0-8", "target", 
"docbkx")
+    jms_client010_input_dir = join(input_dir, "jms-client-0-10", "target", 
"docbkx")
+
+    java_broker_output_dir = join(output_dir, "java-broker")
+    jms_client08_output_dir = join(output_dir, "jms-client-0-8")
+    jms_client010_output_dir = join(output_dir, "jms-client-0-10")
+
+    remove(java_broker_output_dir)
+    remove(jms_client08_output_dir)
+    remove(jms_client010_output_dir)
+
+    copy(java_broker_input_dir, join(java_broker_output_dir, "book"))
+    copy(jms_client08_input_dir, join(jms_client08_output_dir, "book"))
+    copy(jms_client010_input_dir, join(jms_client010_output_dir, "book"))
+
+    output_dirs = [java_broker_output_dir, jms_client08_output_dir, 
jms_client010_output_dir]
+
+    for dir in output_dirs:
+        for path in find(dir, "*.html"):
+            print path
+
+            tree = ElementTree.parse(path)
+            elem = tree.find(".//{http://www.w3.org/1999/xhtml}body";)
+
+            elem.tag = "div"
+            elem.set("class", "docbook")
+
+            remove_namespace(elem, "http://www.w3.org/1999/xhtml";)
+
+            # A hack to preserve docbook's empty anchors in an
+            # IE-compatible way
+
+            target = str(uuid.uuid4())
+
+            for a in tree.iter("a"):
+                if a.text is None:
+                    a.text = target
+
+            content = ElementTree.tostring(elem)
+            content = content.replace(target, "")
+
+            write("{}.in".format(path), content)
+            remove(path)
+
+def infile_replace(filename, old_string, new_string):
+    fileContent = ""
+    with open(filename,'r') as f:
+        fileContent=f.read()
+    if old_string in fileContent:
+        newContent=fileContent.replace(old_string, new_string)
+        with open(filename,'w') as f:
+            f.write(newContent)
+            f.flush()
+
+# From http://homework.nwsnet.de/releases/45be/
+def remove_namespace(doc, namespace):
+    """Remove namespace in the passed document in place."""
+    ns = u'{%s}' % namespace
+    nsl = len(ns)
+    for elem in doc.getiterator():
+        if elem.tag.startswith(ns):
+            elem.tag = elem.tag[nsl:]
+
+def gen_java_examples(release, source_dir, release_dir):
+    component_dir = join(release_dir, "qpid-jms")
+    input_dir = join(source_dir, "client", "example", "src", "main",
+                     "java", "org", "apache", "qpid", "example")
+    output_dir = join(component_dir, "examples")
+
+    release_url = 
"http://svn.apache.org/repos/asf/qpid/java/tags/{}".format(release)
+    readme_url = "{}/client/README.txt".format(release_url)
+    source_url = 
"{}/client/example/src/main/java/org/apache/qpid/example".format(release_url)
+
+    input_names = list_dir(input_dir, "*.java", "*.properties")
+
+    for name in input_names:
+        lang = "java"
+
+        if name.endswith(".properties"):
+            lang = "ini"
+
+        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="Qpid JMS Examples (AMQP 0-10)",
+                       readme_url=readme_url,
+                       source_url=source_url)
+
+## Now do stuff ##
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+source_dir = export_release("java", source_release, checkout_dir)
+
+gen_java_books(release, source_dir, release_dir)
+gen_java_examples(release, source_dir, release_dir)
+
+notice("Docs generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-java-release-examples
----------------------------------------------------------------------
diff --git a/scripts/gen-java-release-examples 
b/scripts/gen-java-release-examples
deleted file mode 100755
index 32411fc..0000000
--- a/scripts/gen-java-release-examples
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/python
-#
-# 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 generate import *
-
-## JMS ##
-
-def gen_jms(release, source_dir, release_dir):
-    component_dir = join(release_dir, "qpid-jms")
-    input_dir = join(source_dir, "client", "example", "src", "main",
-                     "java", "org", "apache", "qpid", "example")
-    output_dir = join(component_dir, "examples")
-
-    release_url = 
"http://svn.apache.org/repos/asf/qpid/java/tags/{}".format(release)
-    readme_url = "{}/client/README.txt".format(release_url)
-    source_url = 
"{}/client/example/src/main/java/org/apache/qpid/example".format(release_url)
-
-    input_names = list_dir(input_dir, "*.java", "*.properties")
-
-    for name in input_names:
-        lang = "java"
-
-        if name.endswith(".properties"):
-            lang = "ini"
-
-        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="Qpid JMS Examples (AMQP 0-10)",
-                       readme_url=readme_url,
-                       source_url=source_url)
-
-## Now do stuff ##
-
-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)
-
-notice("Examples generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-jms-amqp-0-x-release-docs
----------------------------------------------------------------------
diff --git a/scripts/gen-jms-amqp-0-x-release-docs 
b/scripts/gen-jms-amqp-0-x-release-docs
new file mode 100755
index 0000000..58125f4
--- /dev/null
+++ b/scripts/gen-jms-amqp-0-x-release-docs
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+#
+# 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 generate import *
+
+def gen_jms_docs(release, source_dir, output_dir):
+    pass
+
+## Now do stuff ##
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+source_dir = checkout_dir or fetch_source("jms-amqp-0-x", source_release)
+
+gen_jms_docs(release, source_dir, release_dir)
+
+notice("Docs generated")

http://git-wip-us.apache.org/repos/asf/qpid-site/blob/32dce6b5/scripts/gen-jms-amqp-0-x-release-notes
----------------------------------------------------------------------
diff --git a/scripts/gen-jms-amqp-0-x-release-notes 
b/scripts/gen-jms-amqp-0-x-release-notes
new file mode 100755
index 0000000..dac4f82
--- /dev/null
+++ b/scripts/gen-jms-amqp-0-x-release-notes
@@ -0,0 +1,74 @@
+#!/usr/bin/python
+#
+# 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 generate import *
+
+template = \
+"""
+;;
+;; 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.
+;;
+
+# Qpid JMS for AMQP 0-x {release} Release Notes
+
+Qpid JMS for AMQP 0-x is XXX.
+
+For more information about this release, including download links and
+documentation, see the [release overview](index.html).
+
+[jms]: http://en.wikipedia.org/wiki/Java_Message_Service
+
+{release_notes}
+"""
+
+def gen_release_notes(release, issues_release, release_dir):
+    output_path = join(release_dir, "release-notes.md")
+
+    release_notes = render_release_notes("qpid", issues_release)
+
+    output = template.format(**locals())
+    output = output.strip()
+
+    write(output_path, output)
+
+release, issues_release, source_release, release_dir, checkout_dir = 
setup_release_script()
+
+if release == "master":
+    notice("Skipping generation for master")
+    exit()
+
+gen_release_notes(release, issues_release, release_dir)
+
+notice("Release notes generated")


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

Reply via email to