Allow user-customization of the default SVN backend.

Users may end up having both PySVN and Subvertpy installed on the same
system. A previous change had SVNTool favor PySVN over Subvertpy, but
it's useful to be able to specify which one specifically should be used
(especially for development and testing).

The list of possible backends is now specified in
settings.SVNTOOL_BACKENDS. It can be overridden to choose a different
backend (even a custom one, in theory).

This will also form the basis of new multi-backend unit tests.

Reviewed at https://reviews.reviewboard.org/r/5970/
Run SVN unit tests with both PySVN and Subvertpy backends.

The SVN unit tests are no longer simply based on what SVN backend we
have installed on our machine. Instead, we now run two copies of the SVN
tests: One with PySVN, and one with Subvertpy.

If a particular backend is not installed, those tests will be skipped.

Reviewed at https://reviews.reviewboard.org/r/5972/
Improve debuggability of some scmtools.core classes.

This adds __repr__ methods to Branch and Commit, making it easier to
debug the output from different methods.

It also changes ChangeSet to be a new-style class, since I was there
anyway.

Reviewed at https://reviews.reviewboard.org/r/5977/
Add a consistent function in the SVN backends for getting history logs.

PySVN and Subvertpy had very different ways of getting history logs from
a repository. Both had functions that accepted paths and revision
ranges, but they had different defaults for these parameters and
represented the results in different ways.

This adds a get_log() function for the SVN client backends that return
entries in consistent ways. It'll soon be used to centralize some of the
logic that is currently duplicated between the backends.

Reviewed at https://reviews.reviewboard.org/r/5978/
Centralize get_commits() in the SVN backends.

Now that we have a standardized get_log() we can call, we no longer need
separate get_commits() functions in each backend.

This change promotes get_commits() to SVNTool, making use of the new
get_log(), and providing results in a consistent way.

Reviewed at https://reviews.reviewboard.org/r/5979/
Fix fetching GitHub branch names containing slashes.

Git branches can contain slashes, but our GitHub support was stripping
them off. We now support showing the entire branch name, slashes
included, by stripping off the leading 'refs/heads/' instead of
splitting on '/' and getting the last component.

Reviewed at https://reviews.reviewboard.org/r/5983/
Centralize get_branches() in the SVN backends.

The get_branches() logic was pretty complicated, and existed in two
places. This change pulls it into SVNTool, and adds new client backend
functions for performing the directory listing operations.

This also simplifies get_branches(), since it was doing a bunch of work
to build new dictionaries out of old ones, which shouldn't be necessary
anymore.

Reviewed at https://reviews.reviewboard.org/r/5980/
Centralize get_change() in the SVN backends.

This provides a single implementation of get_change(). It makes use of
the new get_log(), and also a new diff() function in the backends. This
helps keep the code maintainable and bug-free.

I've removed the commit cache stuff that was part of get_change(), since
we never actually ever saved anything in the cache. It's probably
unlikely we'll need to fetch the same commit info very often, so instead
of fixing the caching, I've just opted to save some memory and accesses
and remove it.

There's a couple fixes in here I ran into for revision normalization as
well, and the removal of definitions and properties that are no longer
needed.

Reviewed at https://reviews.reviewboard.org/r/5982/
Add support for listing commits by branch ID.

Branches now contain a branch ID, which represents that specific branch.
In most cases, this would just be the name of the branch, but SVN uses a
relative path instead.

This branch ID can be passed to get_commits() to limit the commits to
those on the branch.

As of this change, this is not yet supported by the web API, but that's
coming up soon.

Reviewed at https://reviews.reviewboard.org/r/5986/
Fix filtering SVN commits by branch in the New Review Request page.

The New Review Request page wasn't properly filtering commits by branch
for Subversion repositories. It was assuming it could start at a
revision and pass that to the equivalent of 'svn log'. However, this
ended up picking up commits that existed on other branches as well.

The Repository Commits API for commits now accepts a branch= parameter,
which is the branch ID returned by the Repository Branches API. This is
passed through to get_commits(), which will then filter by that branch.

Through this, it's possible to properly limit the commits shown to those
on the branch. We'll also be able to make use of this later for other
repositories, if they suffer the same problem.

Fixes bug #3401
Reviewed at https://reviews.reviewboard.org/r/5987/
Add release notes for Review Board 2.0.2.

This covers all the changes made since the 2.0.1 release.

Reviewed at https://reviews.reviewboard.org/r/5950/
Move the search optimization release notes into "Performance Improvements".
Fix unit test fallout with the latest branches/commits changes.

Some of the API tests were failing with the new changes for branches and
commits. This updates them to provide the data we need for the tests to
pass, and to update function signatures in TestTool to take the new
parameters.

Reviewed at https://reviews.reviewboard.org/r/5988/
Release Review Board 2.0.2.
Merge branch 'release-2.0.x'
Bump to 2.0.3 dev.
Fix display of the "permission denied" box.

The box for the permission denied message was missing some elements, which made
it look very ugly. This fixes that.

Testing done:
Anonymously looked at a review request with anon access turned off.

Reviewed at https://reviews.reviewboard.org/r/5981/
Merge branch 'release-2.0.x'