Add tests for the new checkout helper.

This includes a test (currently failing) for the case where the
requested librobot revision doesn't exist.
Always clone libRobot to a temp folder before zipping.

This removes the requirement that the script cleans its checkout of
user related or other stuff before zipping.
Add a function that determines whether or not a hash exists.
Fix test data expectataions.
If a requested libRobot revision doesn't exist just use HEAD.
Remove a debug statement.
Merge branch 'master' into multi-pyenv
Remove a redundant file that was never used.
Display the review status for images too.

I'm not sure why these were missed out initially, but clearly we do
also need to make any feedback about uploaded images show.
Ensure that the team's ID isn't chopped up.

For some reason, in some IRC clients, not having the whitespace after
the colour flag causes it to lose the first digit of the number. This
doesn't show up for alpha based team IDs, but is an issue for the
numerical ones that we're actually using.
Remove a redundant method.
Fix a case where a revision wasn't shrunk for display.

Long hashes are really annoying to work with, which is why we standardised.
This must have been missed in the original conversion.
Fix #1130: Ensure that usernames are case-insensitive.

LDAP thinks they are at login, but not at group lookup. Since the
SR standard is lowercase representations, this can have funky results.
Avoid calling file/log twice on openning a file.

This bug has been in the IDE for as long as I can remember, and I've
been meaning to try to fix it for ages. The issue here is that
_update_contents (which calls for file/log) is called in a number of
places, many of which can do so simultaneously. This commit only partly
mitigates one of these cases, hence 'avoid' rather than 'fix'.

The particular case that this avoids is that when openning a file,
we both requst the contents of the file, which will eventually call
_recv_contents which calls to set the content of the file in EditArea,
and at the same time focus the newly created tab. The focussing of
course calls to set the contents of EA so that they're correct, having
previously come from an unknown state.

The other case I'm aware of where file/log is called twice is when
switching to an already open file. This is caused by the open call
also setting the desired revision of the file, which causes the file's
contents to be re-loaded from the backend.
Make the status files group writable.

This is required for the image review process, which involves manual
editing of the status files for the moment.
Fix #1147: Ensure that the admin page reviews the right team.

This was a bug where the admin page used the IDE global team value
as the review target, thus causing potentially spurious reviews to
happen. Thankfully the backend has some protection against this, but
it also made it impossible to review a team's status if the reviewer
wasn't a member of the team.

Implemented fix by storing the current review team as a member, and
clearing this whenever it might change or become invalid.
Clear the prompt in more places.

This ensures that if you close the page the prompt will always go
away (previously, the not-an-admin error didn't), and that we clear
the please-select prompt once the user has done so.
Merge branch 'team-status'
Log each zip that we create.

This is so that we can track which versions of pyenv have been run
on which robots, for debugging purposes. It's possible we may also
get some interesting usage stats from this too.
Stop trying to log μ-seconds.

These always show up as 0 in the logs, and we probably don't care
about them anyway. The ordering of things in the log is more likely
to be more useful and of interest.