Rewrite our screenshot review UI and introduce generic review infrastructure.

The screenshot review support has been rewritten to have a nice
model/view separation and to abstract much of the review process into
generic models and views.

There's now a few new classes: AbstractCommentBlock, AbstractCommentBlockView,
AbstractReviewable, and AbstractReviewableView. These handle the basics
of creating review UIs and comment blocks.

The screenshot subclasses, as a result, are fairly minimal for the most
part.

From here on out, it should be easier to create review UIs for custom
mimetypes. This will get even easier as more of our review
infrastructure is moved to new Backbone models and views.
Fix a quoting issue in .reviewboardrc.

A double quote was mistakingly changed to a single quote.
Merge branch 'release-1.6.x'
Display the "Add Comment" link after canceling an editor.

The "Add Comment" link was only being reshown after submitting a change.
If canceling, the link wasn't being shown again. We now force it to fade
in when canceling.

Fixes bug #2696

Reviewed at http://reviews.reviewboard.org/r/3415/
Fix version parsing for Mercurial.

Our version parsing was relying upon integers only in the version, and
had a probably incorrect hack for handling "+" in the version number.

Since Mercurial is a Python package following Python versioning rules,
we should be using parse_version comparisons. This is a lot less
fragile, and works with their new 1.4-rc release they just put out
(which completely breaks Review Board today).

This will be needed for an upcoming release soon.
Introduce the beginnings of an ssh app.

This introduces an ssh app, which factors out and structures the SSH
utility functions originally found in scmtools/sshutils.py.

The new ssh app contains an SSHClient object, which represents a session
tied either to a base .ssh directory, or a namespaced directory within.
Down the road, we may want to take further advantage of the namespacing,
such as for repository access. Right now, we deifne a namespace as a
'/'-separated path.

Most of the original utility functions in sshutils now live within
SSHClient. Instead of each of those taking a local_site_name parameter,
this is now passed only when defining the SSHClient, as the namespace.

Multiple clients can exist at a time.

The various SSH-related errors have moved into ssh/errors.py, and have
been decoupled from SCMError. This is clean in all cases except
AuthenticationError. Both apps have a concept of an AuthenticationError,
with ssh's being a bit more specific.

What we're doing is keeping two versions. The SSH one is
SSHAuthenticationError, and contains all the original logic. The new one
is AuthenticationError, and basically has SSHAuthenticationError as a
mixin. The two call sites in scmtools that need to really deal with this
check for an SSHAuthenticationError and convert it into an
AuthenticationError. The purpose of this is to keep the ssh app
decoupled from SCMTools.
Add support for storage backends for SSH keys.

The SSH client functionality is now separated from SSH key storage.
SSHClient has no knowledge now of where keys live. It could be on the
file system, in memory, sitting on a gopher server, or whatever else the
storage backend is talking to.

All the file access has been moved to a new FileSSHStorage class.

New unit tests have been added to test the new code paths.
Use the database as the location for SVN certificate acceptance storage.

Our cert model for Subversion worked such that when the user confirmed a
cert before adding a repository, we would tell Subversion to go ahead
and save that cert to the local ~/.subversion/auth. If the cert file
wasn't there, file fetches would fail. This made it quite annoying to
have a multi-server deployment, as that directory would have to be
shared.

Now, upon acceptance of the cert, we store the cert information in the
repository's extra_data field. We then look it up from there if pysvn
tells us it needs verification again on a cert.

We still save on the filesystem as well, which is more convenient, but
we're far more resilient now. We can work multi-server, and we can
easily nuke the auth directory, without affecting file fetches.

We also still generate the Subversion config files to configure rbssh
usage for Local Sites, but these are already resilient enough by
themselves, as they're just recreated as needed. So now, Subversion
should work perfectly fine without having to have a permanent
.subversion directory.
Merge branch 'release-1.6.x'
Use the SHA1 password hasher for unit tests.

Django 1.4 moved to using PBKDF2 for handling password encryption. This
is much slower than the old default, SHA1, which can delay unit tests.

While we don't create many users in our unit tests, we seem to do this a
little bit. Forcing this to use SHA1 for unit tests speeds up the tests
a little bit, and keeps us sped up for future tests. It appears to save
about 6 seconds in our tests.
Bump our Django requirement to 1.3.4.

This bumps to the latest security release of Django.
Merge branch 'release-1.6.x'
Bump our Django requirement to 1.4.2.

This bumps to the latest security release of Django.
Fix unregistering admin UI widgets.

Admin UI widget unregistration actually added the widgets, rather than
removing them. This updates them to call the correct functions.
Add support for extra data in a FileAttachmentComment.

FileAttachmentComment now supports extra data, which is useful for
custom review UIs. These can be modified by sending any additional
fields in a POST or PUT request not normally handled by the resource.

The review UI support will soon make it easy to work with data in this
new field.
Add profiling for unit tests.

This adds a --with-profiling argument for our unit tests that writes a
reviewboard.profile file containing profile data on our test run. We can
make use of this to figure out where the slowdowns are in our test
suite.
Require the latest 0.6.x development version of Djblets.
Require Djblets 0.6.25 dev as a minimum.
Add support for deleting user keys to SSHClient.

This allows SSHClient to delete a user key. It provides a
delete_user_key function on SSHClient and SSHStorage. This can be used
to provide a UI for deleting a user key.

This UI doesn't exist in Review Board yet, but will be easy to wire up
at some point.
Merge branch 'release-1.6.x'