Make pane resizing work in Chrome too.
Fix for exceptions being throw due to function not being defined.

Because resource/tabify.js, which defines calculateTabWidth(),
is conditioned on "tabify" option, these inline scripts should
be too.
Merge pull request #29 from rchl/resize-panes-webkit

Make pane resizing work in Chrome too.
Merge pull request #30 from rchl/exception-fixes

Fix for exceptions being throw due to function not being defined.
Remove redundant import
Use _global_ variable site_enabled
Don't fetch it if it's not going to be used
Drop unused function linkToCommit() in review/html.py
Remove various assigned-but-not-used variables
Delete log/tree.py
Basic uninstall script

http://critic.whyi.org/r/18
Fix upgrading that removes source files

The SHA-1 of the existing file was calculated incorrectly (Git
doesn't just hash the contents of the file) so when comparing to
the file's SHA-1 according to Git, all files appeared to have been
modified.

Also, if a file to remove wasn't detected as having been changed
(which before this fix never happened) then it wouldn't be removed
at all, since removing it was strictly conditioned on the user
answering "remove it" when asked what to do.

Also, if a Python source file A.py is removed, remove A.pyc and
A.pyo as well.  If they are left, Python is likely to pick them up
and use them even if the original A.py is gone.
Remove redundant function

The class review.filters.Filters has two isReviewer() functions, one
that uses __getUserFileAssociation() (the correct one) and one that
essentially inlines __getUserFileAssociation() (the now removed one.)

Don't know how that happened.
Move review.utils.countDraftItems() into dbutils

That way it's closer to its only user, dbutils.Review.getDraftItems().
Use new-style classes
Import fewer things globally in the 'dbutils' module
Add debugging code for incorrectly re-used cursor objects

If a cursor object is currently being iterated over, it's a bad idea
to execute a new statement using it.  What's worse, the database query
profiling preference hid the problems caused by doing so.

With this code (which is only used when query profiling is enabled)
incorrectly re-using a cursor object while iterating over it triggers
an exception the next time next() is called on the iterator.
Tweak dbutils.User class a little

Move static makeAnonymous() function down to the other static functions.

Don't load all preferences when setting one, and update the cached or
loaded preference value when setting the preference.

Raise base.ImplementationError exception instead of Exception when
attempting to read a preference that doesn't exist in the database.

Assert against using str() or int() on anonymous user.  They normally
return the user name or id, and anonymous users have neither.  (And
Python doesn't allow returning None from __str__() or __int__().)

Use isinstance(X, basestring) instead of isinstance(X, str).
Remove dbutils.User.retire()

Call review.utils.retireUser() directly instead in the one place where
it was used.
Clean up path functions a little

Primarily avoid doing

  try:
    # code that is expected to fail in certain conditions
  except: pass

and instead do things that are not expected to fail and specifically
detect the expected "failures" and handle them, thus avoiding masking
unexpected errors.