Use the paleyellow class on all pages with pale yellow tables
Remove unused CSS
Use a shared CSS class for "inset" inline content

Similar to callout, is has a lighter background and a border.
Remove .main centering, letting us fall back on default left alignment
Update my email address in CONTRIBUTORS
Measure code coverage for the githook background service

The original changes in r/92 adding code coverage measuring ended up
broken; the modified background/githook.py was added as a new file since
the real one had been renamed src/background/githook.py in the meantime.

Note: this commit adds coverage measuring superficially differently.
Add Markdown-style references/links to tutorial text formatting

A sub-string [label][name] is transformed into a link with that label
to a URL defined by a named reference.  References are defined by lines
anywhere in the file on the form

[name]: url "title"

where the "title" part is optional.
During installation, add administrator user using criticctl

This is quite a bit simpler.  And since we depended on the (installed)
'auth' module already, we might as well depend on more installed things.
We just need to make sure to install the criticctl executable a bit
earlier, which is uncomplicated since the installation of it doesn't
depend on anything but knowing installation paths.
Disable automatic *.pyc/*.pyo writing in scripts started as root

It's been observed that running upgrade.py after modifying configuration
files under /etc/critic can sometimes fail because Python first updates
the *.pyc/*.pyo files automatically (owned by root), and then our manual
compilation fails to (re)write the same files later on with euid=critic.
Fix criticctl's global (non-command) argument handling

The division into "global arguments", "command" and "command arguments"
in the criticctl script was overly simple; treating the first argument
not starting with a dash as the command, everything before as global
arguments and everything after as command arguments.  This meant that
with "criticctl -i main foo", "main" was interpreted as the command, and
"-i" as the global arguments, which would fail, since "-i" requires a
value.

Also add a test for the basic criticctl functionality, and when doing so,
renumber the existing criticctl tests +1.
Make command line arguments in installation/config.py install only
Add 'criticctl passwd' command for setting user's password

Can also be used to delete a user's password.

Also add --no-password argument to 'criticctl adduser' for creating
a user with no initial password.
Adjust password UI on /home

If the user has no password, or if an administrator is manipulating
another user, set the button's label to "Set password" instead of
"Change password", and open a dialog with no "Current password" field.
(The latter was already the case if the user was an administrator.)

This fixes two things:

 - Confusing UI when a user tried to create a password: the dialog
   asked for the current password even if the user didn't have one.
   (And in the end it was also impossible to successfully create a
   password since the current password check wasn't disabled.)

 - There was no current password check for administrators changing
   their own password.  There's no reason for that; administrators
   should only be able to change other user's passwords without
   knowing them.

Also add an "Edit" button when an administrator user loads /home as
another user without readonly=no.
Add configuration.debug.IS_TESTING, set by the testing framework

Controlled by the (hidden) --is-testing argument to install.py.  To be
used in the hopefully few instances when the installed system needs to
behave differently while testing.

Currently only affects how unexpected errors are handled, the same way
that configuration.debug.IS_DEVELOPMENT already did.
Add framework for authenticating users via external systems

Also add /createuser page, to which login attempts are redirected if no
Critic user is associated with the external account.

Also add an email verification mechanism (verifying that a user really
controls the email address registered) and more advanced primary email
handling, supporting multiple registered email addresses (one of which
is "selected" and actually user.)
Add configuration test mechanism

Run in wsgi.py, and display a "500 Internal Server Error" page if the
configuration test fails.

Also add criticctl commands 'configtest' and 'restart'.  The latter
restarts the host web server and Critic background services, but only
after a successful configuration test.

The actual configuration testing is incomplete; it currently only checks
a few things relating to external authentication providers.
Restructure "Git emails" handling to allow multiple Critic users

IOW, allow multiple Critic users to claim to be using a particular email
address in Git, and thus be considered authors of the same commits.  The
only situation in which this ought to happen is if a person has multiple
Critic users in the same system.

Also simplify some code by using the CommitUserTime.getFullname() helper
function.  This helper now returns the Critic user's fullname if a single
Critic user is identified by the Git email address; otherwise it returns
the name from the Git meta-data.
Put the paleyellow back for /dashboard without any reviews

This fixes a CSS regression introduced in:
56f0f9a ("Use the paleyellow class on all pages with pale yellow tables")
Actually link to reviews in search result page

Fixes regression introduced in 5ec60e30 "Support linking to review
searches", which accidentally sets the href attribute of all anchor
elements in the dialog to the URL of the search.
Set Max-Age directive on cookies again

Fixes regression introduced in 8e83ce2d "Add framework for authenticating
users via external systems", which moved the code that adds Set-Cookie
response headers from src/operation/__init__.py to src/request.py, and
reverted 4c9a1627 "Set Max-Age=<1 year> on all cookies" in the process.