Rework svnpubsub to reduce a lot of complexity and generalize.

In particular the following significant changes have been made:
- XML support has been removed.
- svnpubsub.client now takes URLs instead of host/port tuples.
- svnpubsub.client has been updated to use JSON.
- The JSON stream when connecting to the server no longer starts an object
  that never gets finished.
- The server provides a JSON object with the key svnpubsub that 
  contains a version key.  This is intended to identify the format
  the server will be sending, it can be used to make clients backwards
  compatable to protocol changes.
- Each JSON record is separated with a null character.
- The input JSON is now identical to the object in the commit field
  of the output object.
- A type and format field have been added to the JSON object.  type
  can be used to distinguish say a git commit from a svn commit.
  format is a integer format similar to what SVN uses all over the place.
- The following fields have been renamed to allow the same fields to be
  used across version control systems:
  revision -> id, author -> committer (author could be used for what
  other systems use author for), repos -> repository.
- The following fields are required by the server on the input:
  repository, id, type and format, everything else is optional.
- The dirs_changed field has been removed, it can be calculated from changed.
- The Revision classes have been renamed Commit and in general no longer
  hard code certain fields.
- There is only one type of output stream now, the dirs-changed output
  type has been removed.
- The URLs used by the server have changed.  All PUTs go to /commits.
  Clients no longer pass a format since the only format is JSON.
  Clients can still filter by repository, but can also filter by type now.

[in tools/server-side/svnpubsub]

* svnpubsub/server.py
  (*): Update documentation to reflect changes.
  (twisted.web.static, xml.etree): No longer used don't import.
  (Commit): Remove and replace with...
  (Revision): which has very little in the way of requirements on the
    incoming JSON.
  (Client.init): Remove format and add type as a filter.
  (Client.interested_in): Handle both repository and type.  Takes
    the commit object rather than the uuid as input now.
  (Client.write_data): Data is just a string rather than a dictionary
    since there is only one format JSON and records are separated by a
    null character.
  (JSONClient): Merged into Client since only JSON is supported.
  (Client.write_start): Start with a svnpubsub object that has a version
    field rather than starting a commits object we never close.
  (Client.write_heartbeat): Separate records with null character.
  (XMLClient): Removed.
  (SvnPubSub.clients): Is just a list not a dictionary of clients by
    type.
  (SvnPubSub.cc, SvnPubSub.remove): Adjust for clients being just a list.
  (SvnPubSub.render_GET): Adjust for new URI format and single format.
  (SvnPubSub.notifyAll): Adjust for single format, move log formatting to
    new Commit class and adjust for changes in Client.interested_in().
  (SvnPubSub.render_PUT): Handle format errors and object validation.  Also
    use the new Commit class.
  (svnpubsub_server): Don't reference /dev/null as empty resource just
    create an empty Resource.  Remove dirs-changed and commit URI paths.
  
* svnpubsub/client.py
  (urlparse): Adjust import to deal with Python 3 rename.
  (xml.sax): No longer import, since we no longer support XML.
  (json): New import.
  (Client.__init__): Accept a URL instead of host and port.  Use JSON
    instead of XML.  Deal with bytes vs strings for Python 3.
  (Client.handle_connect, Client.handle_close, Client.handle_error):
    Pass None for the new event_arg parameter on the event_callback.
  (Client.found_terminator): bytes vs strings, Use \0 as the record
    separator and let async_chat split the records for us.
  (Client.collect_incoming_data): Just buffer incoming data, when the
    separator is found it'll call the parser from found_terminator().
  (XMLStreamHandler, Revision): Remove
  (JSONRecordHandler, Commit): Add
  (MultiClient.__init__): Take a list of urls instead of hostports.
  (MultiClient._reconnect, MultiClient._reconnect_later,
   MultiClient._add_channel, MultiClient._check_stale):
    Use a URL instead of host and port as incoming arguments and on
    callbacks.  Add event_arg to the event_callbacks.

* README.txt: Remove svnwcsub todos (moved to svnwcsub.py) and update example.

* commit-hook.py
  (svncmd_dirs): Remove function
  (do_put): PUT to /commits instead of /dirs-changed
  (main): Change format of posted JSON to match changes to the server,
    remove debug print.
  
* daemonize.py
  (daemonize_exit, daemonize): Change to the newer/clearer except Foo as e
    syntax.  Makes this Python 3 compatible.

* example.conf,
* svnwcsub.conf.example:
  Rename example.conf to svnwcsub.conf.example.  Fix the example stream and
  fix the interpolation syntax.

* irkerbridge.py
  (*): Update documentation to reflect changes.
  (Daemon.run, BigDoEverythingClass.__init__): Give MultiClient a list of urls
    instead of list of host port tuples.
  (BigDoEverythingClass.locate_matching_configs,
   BigDoEverythingClass.fill_in_extra_args, BigDoEverythingClass.commit):
    Commit callback gets a url and commit object instead of host, port and
    Revision object.
  (BigDoEverythingClass._generate_dirs_changed): New function to calculate the 
    dirs_changed field from the new changed field.
  (BigDoEverythingClass.fill_in_extra_args): Use _generate_dirs_changed() and
    fix a bug where dirs_root was an empty string.
  (BigDoEverythignClass.event): Event receives a url, event_name and event_arg
    now.

* svnwcsub.py
  (*): Moved TODOs from README.txt here.
  (ConfigParser, Queue, urlparse): Adjust import for Python 3 rename.
  (posixpath): New import.
  (BigDoEverythingClasss.__init__): svnpubsub.client uses urls directly now.
  (BigDoEverythingClasss._normalize_path, BigDoEverythingClasss.commit): Use
    posixpath instead of os.path when working on fspaths.
  (BigDoEverythingClasss.commit, Daemon._event): Adjust for changed callback params.
  (Daemon.run): Use a list of urls instead of a list of hostport tuples.

* test.conf: Delete

* testserver.py
  (TEST_BODY): Change XML to JSON.

* watcher.py
  (urlparse): Adjust import for Python 3 rename.
  (_commit, _event): Adjust for callback parameter changes.
  (main): svnpubsub.client uses URLs now instead of hostports.
  (*): Take a list of URLs on the command line instead of pulling in svnwcsub
    and using its config class.


git-svn-id: https://svn.apache.org/repos/asf/subversion/trunk@1432778 13f79535-47bb-0310-9956-ffa450edef68