You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by rj...@apache.org on 2014/02/13 06:08:08 UTC

svn commit: r1567849 [3/17] - in /bloodhound/vendor/trac: 1.0-stable/ current/ current/contrib/ current/contrib/cgi-bin/ current/contrib/workflow/ current/doc/ current/doc/utils/ current/sample-plugins/ current/sample-plugins/permissions/ current/sampl...

Modified: bloodhound/vendor/trac/current/trac/config.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/config.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/config.py (original)
+++ bloodhound/vendor/trac/current/trac/config.py Thu Feb 13 05:08:02 2014
@@ -18,12 +18,13 @@ from ConfigParser import ConfigParser
 from copy import deepcopy
 import os.path
 
+from genshi.builder import tag
 from trac.admin import AdminCommandError, IAdminCommandProvider
 from trac.core import *
 from trac.util import AtomicFile, as_bool
-from trac.util.compat import cleandoc
+from trac.util.compat import cleandoc, wait_for_file_mtime_change
 from trac.util.text import printout, to_unicode, CRLF
-from trac.util.translation import _, N_
+from trac.util.translation import _, N_, tag_
 
 __all__ = ['Configuration', 'ConfigSection', 'Option', 'BoolOption',
            'IntOption', 'FloatOption', 'ListOption', 'ChoiceOption',
@@ -43,6 +44,12 @@ class ConfigurationError(TracError):
     """Exception raised when a value in the configuration file is not valid."""
     title = N_('Configuration Error')
 
+    def __init__(self, message=None, title=None, show_traceback=False):
+        if message is None:
+            message = _("Look in the Trac log for more information.")
+        super(ConfigurationError, self).__init__(message, title,
+                                                 show_traceback)
+
 
 class Configuration(object):
     """Thin layer over `ConfigParser` from the Python standard library.
@@ -234,10 +241,12 @@ class Configuration(object):
 
         # At this point, all the strings in `sections` are UTF-8 encoded `str`
         try:
+            wait_for_file_mtime_change(self.filename)
             with AtomicFile(self.filename, 'w') as fileobj:
                 fileobj.write('# -*- coding: utf-8 -*-\n\n')
-                for section, options in sections:
-                    fileobj.write('[%s]\n' % section)
+                for section_str, options in sections:
+                    fileobj.write('[%s]\n' % section_str)
+                    section = to_unicode(section_str)
                     for key_str, val_str in options:
                         if to_unicode(key_str) in self[section].overridden:
                             fileobj.write('# %s = <inherited>\n' % key_str)
@@ -287,7 +296,8 @@ class Configuration(object):
 
     def touch(self):
         if self.filename and os.path.isfile(self.filename) \
-           and os.access(self.filename, os.W_OK):
+                and os.access(self.filename, os.W_OK):
+            wait_for_file_mtime_change(self.filename)
             os.utime(self.filename, None)
 
     def set_defaults(self, compmgr=None):
@@ -296,14 +306,15 @@ class Configuration(object):
 
         Values already set in the configuration are not overridden.
         """
-        for section, default_options in self.defaults(compmgr).items():
-            for name, value in default_options.items():
-                if not self.parser.has_option(_to_utf8(section),
-                                              _to_utf8(name)):
-                    if any(parent[section].contains(name, defaults=False)
-                           for parent in self.parents):
-                        value = None
-                    self.set(section, name, value)
+        for (section, name), option in Option.get_registry(compmgr).items():
+            if not self.parser.has_option(_to_utf8(section), _to_utf8(name)):
+                value = option.default
+                if any(parent[section].contains(name, defaults=False)
+                       for parent in self.parents):
+                    value = None
+                if value is not None:
+                    value = option.dumps(value)
+                self.set(section, name, value)
 
 
 class Section(object):
@@ -325,7 +336,7 @@ class Section(object):
         for parent in self.config.parents:
             if parent[self.name].contains(key, defaults=False):
                 return True
-        return defaults and Option.registry.has_key((self.name, key))
+        return defaults and (self.name, key) in Option.registry
 
     __contains__ = contains
 
@@ -567,7 +578,9 @@ class Option(object):
     """Descriptor for configuration options."""
 
     registry = {}
-    accessor = Section.get
+
+    def accessor(self, section, name, default):
+        return section.get(name, default)
 
     @staticmethod
     def get_registry(compmgr=None):
@@ -606,26 +619,44 @@ class Option(object):
             return value
 
     def __set__(self, instance, value):
-        raise AttributeError, 'can\'t set attribute'
+        raise AttributeError(_("Setting attribute is not allowed."))
 
     def __repr__(self):
         return '<%s [%s] "%s">' % (self.__class__.__name__, self.section,
                                    self.name)
 
+    def dumps(self, value):
+        """Return the value as a string to write to a trac.ini file"""
+        if value is None:
+            return ''
+        if value is True:
+            return 'enabled'
+        if value is False:
+            return 'disabled'
+        if isinstance(value, unicode):
+            return value
+        return to_unicode(value)
+
 
 class BoolOption(Option):
     """Descriptor for boolean configuration options."""
-    accessor = Section.getbool
+
+    def accessor(self, section, name, default):
+        return section.getbool(name, default)
 
 
 class IntOption(Option):
     """Descriptor for integer configuration options."""
-    accessor = Section.getint
+
+    def accessor(self, section, name, default):
+        return section.getint(name, default)
 
 
 class FloatOption(Option):
     """Descriptor for float configuration options."""
-    accessor = Section.getfloat
+
+    def accessor(self, section, name, default):
+        return section.getfloat(name, default)
 
 
 class ListOption(Option):
@@ -642,6 +673,11 @@ class ListOption(Option):
     def accessor(self, section, name, default):
         return section.getlist(name, default, self.sep, self.keep_empty)
 
+    def dumps(self, value):
+        if isinstance(value, (list, tuple)):
+            return self.sep.join(Option.dumps(self, v) or '' for v in value)
+        return Option.dumps(self, value)
+
 
 class ChoiceOption(Option):
     """Descriptor for configuration options providing a choice among a list
@@ -673,10 +709,15 @@ class PathOption(Option):
     Relative paths are resolved to absolute paths using the directory
     containing the configuration file as the reference.
     """
-    accessor = Section.getpath
+
+    def accessor(self, section, name, default):
+        return section.getpath(name, default)
 
 
 class ExtensionOption(Option):
+    """Name of a component implementing `interface`. Raises a
+    `ConfigurationError` if the component cannot be found in the list of
+    active components implementing the interface."""
 
     def __init__(self, section, name, interface, default=None, doc='',
                  doc_domain='tracini'):
@@ -690,11 +731,14 @@ class ExtensionOption(Option):
         for impl in self.xtnpt.extensions(instance):
             if impl.__class__.__name__ == value:
                 return impl
-        raise AttributeError('Cannot find an implementation of the "%s" '
-                             'interface named "%s".  Please update the option '
-                             '%s.%s in trac.ini.'
-                             % (self.xtnpt.interface.__name__, value,
-                                self.section, self.name))
+        raise ConfigurationError(
+            tag_("Cannot find an implementation of the %(interface)s "
+                 "interface named %(implementation)s. Please check "
+                 "that the Component is enabled or update the option "
+                 "%(option)s in trac.ini.",
+                 interface=tag.tt(self.xtnpt.interface.__name__),
+                 implementation=tag.tt(value),
+                 option=tag.tt("[%s] %s" % (self.section, self.name))))
 
 
 class OrderedExtensionsOption(ListOption):
@@ -716,9 +760,23 @@ class OrderedExtensionsOption(ListOption
             return self
         order = ListOption.__get__(self, instance, owner)
         components = []
+        implementing_classes = []
         for impl in self.xtnpt.extensions(instance):
+            implementing_classes.append(impl.__class__.__name__)
             if self.include_missing or impl.__class__.__name__ in order:
                 components.append(impl)
+        not_found = sorted(set(order) - set(implementing_classes))
+        if not_found:
+            raise ConfigurationError(
+                tag_("Cannot find implementation(s) of the %(interface)s "
+                     "interface named %(implementation)s. Please check "
+                     "that the Component is enabled or update the option "
+                     "%(option)s in trac.ini.",
+                     interface=tag.tt(self.xtnpt.interface.__name__),
+                     implementation=tag(
+                         (', ' if idx != 0 else None, tag.tt(impl))
+                         for idx, impl in enumerate(not_found)),
+                     option=tag.tt("[%s] %s" % (self.section, self.name))))
 
         def compare(x, y):
             x, y = x.__class__.__name__, y.__class__.__name__

Modified: bloodhound/vendor/trac/current/trac/core.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/core.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/core.py (original)
+++ bloodhound/vendor/trac/current/trac/core.py Thu Feb 13 05:08:02 2014
@@ -125,6 +125,8 @@ class ComponentMeta(type):
             return self
 
         # The normal case where the component is not also the component manager
+        assert len(args) >= 1 and isinstance(args[0], ComponentManager), \
+               "First argument must be a ComponentManager instance"
         compmgr = args[0]
         self = compmgr.components.get(cls)
         # Note that this check is racy, we intentionally don't use a
@@ -188,11 +190,14 @@ class ComponentManager(object):
         """Activate the component instance for the given class, or
         return the existing instance if the component has already been
         activated.
+
+        Note that `ComponentManager` components can't be activated
+        that way.
         """
         if not self.is_enabled(cls):
             return None
         component = self.components.get(cls)
-        if not component:
+        if not component and not issubclass(cls, ComponentManager):
             if cls not in ComponentMeta._components:
                 raise TracError('Component "%s" not registered' % cls.__name__)
             try:

Modified: bloodhound/vendor/trac/current/trac/db/__init__.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/__init__.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/__init__.py (original)
+++ bloodhound/vendor/trac/current/trac/db/__init__.py Thu Feb 13 05:08:02 2014
@@ -1,2 +1,15 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2005-2013 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://trac.edgewall.org/wiki/TracLicense.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://trac.edgewall.org/log/.
+
 from trac.db.api import *
 from trac.db.schema import *

Modified: bloodhound/vendor/trac/current/trac/db/api.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/api.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/api.py (original)
+++ bloodhound/vendor/trac/current/trac/db/api.py Thu Feb 13 05:08:02 2014
@@ -253,7 +253,7 @@ class DatabaseManager(Component):
     def get_connection(self, readonly=False):
         """Get a database connection from the pool.
 
-        If `readonly` is `True`, the returned connection will purposedly
+        If `readonly` is `True`, the returned connection will purposely
         lack the `rollback` and `commit` methods.
         """
         if not self._cnx_pool:

Modified: bloodhound/vendor/trac/current/trac/db/mysql_backend.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/mysql_backend.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/mysql_backend.py (original)
+++ bloodhound/vendor/trac/current/trac/db/mysql_backend.py Thu Feb 13 05:08:02 2014
@@ -14,14 +14,19 @@
 # individuals. For the exact contribution history, see the revision
 # history and logs, available at http://trac.edgewall.org/log/.
 
-import os, re, types
+import os
+import re
+import sys
+import types
 
 from genshi.core import Markup
 
 from trac.core import *
 from trac.config import Option
-from trac.db.api import IDatabaseConnector, _parse_db_str
+from trac.db.api import DatabaseManager, IDatabaseConnector, _parse_db_str, \
+                        get_column_names
 from trac.db.util import ConnectionWrapper, IterableCursor
+from trac.env import IEnvironmentSetupParticipant
 from trac.util import as_int, get_pkginfo
 from trac.util.compat import close_fds
 from trac.util.text import exception_to_unicode, to_unicode
@@ -73,7 +78,7 @@ class MySQLConnector(Component):
      * `read_default_group`: Configuration group to use from the default file
      * `unix_socket`: Use a Unix socket at the given path to connect
     """
-    implements(IDatabaseConnector)
+    implements(IDatabaseConnector, IEnvironmentSetupParticipant)
 
     mysqldump_path = Option('trac', 'mysqldump_path', 'mysqldump',
         """Location of mysqldump for MySQL database backups""")
@@ -109,17 +114,29 @@ class MySQLConnector(Component):
                 host=None, port=None, params={}):
         cnx = self.get_connection(path, log, user, password, host, port,
                                   params)
+        self._verify_variables(cnx)
+        utf8_size = self._utf8_size(cnx)
         cursor = cnx.cursor()
-        utf8_size = {'utf8': 3, 'utf8mb4': 4}.get(cnx.charset)
         if schema is None:
             from trac.db_default import schema
         for table in schema:
             for stmt in self.to_sql(table, utf8_size=utf8_size):
                 self.log.debug(stmt)
                 cursor.execute(stmt)
+        self._verify_table_status(cnx)
         cnx.commit()
 
-    def _collist(self, table, columns, utf8_size=3):
+    def _utf8_size(self, cnx):
+        if cnx is None:
+            connector, args = DatabaseManager(self.env).get_connector()
+            cnx = connector.get_connection(**args)
+            charset = cnx.charset
+            cnx.close()
+        else:
+            charset = cnx.charset
+        return 4 if charset == 'utf8mb4' else 3
+
+    def _collist(self, table, columns, utf8_size):
         """Take a list of columns and impose limits on each so that indexing
         works properly.
 
@@ -148,7 +165,9 @@ class MySQLConnector(Component):
             cols.append(name)
         return ','.join(cols)
 
-    def to_sql(self, table, utf8_size=3):
+    def to_sql(self, table, utf8_size=None):
+        if utf8_size is None:
+            utf8_size = self._utf8_size(None)
         sql = ['CREATE TABLE %s (' % table.name]
         coldefs = []
         for column in table.columns:
@@ -235,6 +254,83 @@ class MySQLConnector(Component):
             raise TracError(_("No destination file created"))
         return dest_file
 
+    # IEnvironmentSetupParticipant methods
+
+    def environment_created(self):
+        pass
+
+    def environment_needs_upgrade(self, db):
+        if getattr(self, 'required', False):
+            self._verify_table_status(db)
+            self._verify_variables(db)
+        return False
+
+    def upgrade_environment(self, db):
+        pass
+
+    UNSUPPORTED_ENGINES = ('MyISAM', 'EXAMPLE', 'ARCHIVE', 'CSV', 'ISAM')
+
+    def _verify_table_status(self, db):
+        from trac.db_default import schema
+        tables = [t.name for t in schema]
+        cursor = db.cursor()
+        cursor.execute("SHOW TABLE STATUS WHERE name IN (%s)" %
+                       ','.join(('%s',) * len(tables)),
+                       tables)
+        cols = get_column_names(cursor)
+        rows = [dict(zip(cols, row)) for row in cursor]
+
+        engines = [row['Name'] for row in rows
+                               if row['Engine'] in self.UNSUPPORTED_ENGINES]
+        if engines:
+            raise TracError(_(
+                "All tables must be created as InnoDB or NDB storage engine "
+                "to support transactions. The following tables have been "
+                "created as storage engine which doesn't support "
+                "transactions: %(tables)s", tables=', '.join(engines)))
+
+        non_utf8bin = [row['Name'] for row in rows
+                       if row['Collation'] not in ('utf8_bin', 'utf8mb4_bin',
+                                                   None)]
+        if non_utf8bin:
+            raise TracError(_("All tables must be created with utf8_bin or "
+                              "utf8mb4_bin as collation. The following tables "
+                              "don't have the collations: %(tables)s",
+                              tables=', '.join(non_utf8bin)))
+
+    SUPPORTED_COLLATIONS = (('utf8', 'utf8_bin'), ('utf8mb4', 'utf8mb4_bin'))
+
+    def _verify_variables(self, db):
+        cursor = db.cursor()
+        cursor.execute("SHOW VARIABLES WHERE variable_name IN ("
+                       "'default_storage_engine','storage_engine',"
+                       "'default_tmp_storage_engine',"
+                       "'character_set_database','collation_database')")
+        vars = dict((row[0].lower(), row[1]) for row in cursor)
+
+        engine = vars.get('default_storage_engine') or \
+                 vars.get('storage_engine')
+        if engine in self.UNSUPPORTED_ENGINES:
+            raise TracError(_("The current storage engine is %(engine)s. "
+                              "It must be InnoDB or NDB storage engine to "
+                              "support transactions.", engine=engine))
+
+        tmp_engine = vars.get('default_tmp_storage_engine')
+        if tmp_engine in self.UNSUPPORTED_ENGINES:
+            raise TracError(_("The current storage engine for TEMPORARY "
+                              "tables is %(engine)s. It must be InnoDB or NDB "
+                              "storage engine to support transactions.",
+                              engine=tmp_engine))
+
+        charset = vars['character_set_database']
+        collation = vars['collation_database']
+        if (charset, collation) not in self.SUPPORTED_COLLATIONS:
+            raise TracError(_(
+                "The charset and collation of database are '%(charset)s' and "
+                "'%(collation)s'. The database must be created with one of "
+                "%(supported)s.", charset=charset, collation=collation,
+                supported=repr(self.SUPPORTED_COLLATIONS)))
+
 
 class MySQLConnection(ConnectionWrapper):
     """Connection wrapper for MySQL."""
@@ -251,11 +347,15 @@ class MySQLConnection(ConnectionWrapper)
             port = 3306
         opts = {}
         for name, value in params.iteritems():
-            if name in ('init_command', 'read_default_file',
-                        'read_default_group', 'unix_socket'):
-                opts[name] = value
+            key = name.encode('utf-8')
+            if name == 'read_default_group':
+                opts[key] = value
+            elif name == 'init_command':
+                opts[key] = value.encode('utf-8')
+            elif name in ('read_default_file', 'unix_socket'):
+                opts[key] = value.encode(sys.getfilesystemencoding())
             elif name in ('compress', 'named_pipe'):
-                opts[name] = as_int(value, 0)
+                opts[key] = as_int(value, 0)
             else:
                 self.log.warning("Invalid connection string parameter '%s'",
                                  name)

Modified: bloodhound/vendor/trac/current/trac/db/pool.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/pool.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/pool.py (original)
+++ bloodhound/vendor/trac/current/trac/db/pool.py Thu Feb 13 05:08:02 2014
@@ -26,7 +26,7 @@ from trac.util.text import exception_to_
 from trac.util.translation import _
 
 
-class TimeoutError(Exception):
+class TimeoutError(TracError):
     """Exception raised by the connection pool when no connection has become
     available after a given timeout."""
 
@@ -93,7 +93,7 @@ class ConnectionPoolBackend(object):
         deferred = num == 1 and isinstance(cnx, tuple)
         err = None
         if deferred:
-            # Potentially lenghty operations must be done without lock held
+            # Potentially lengthy operations must be done without lock held
             op, cnx = cnx
             try:
                 if op == 'ping':
@@ -214,4 +214,3 @@ class ConnectionPool(object):
 
     def shutdown(self, tid=None):
         _backend.shutdown(tid)
-

Modified: bloodhound/vendor/trac/current/trac/db/postgres_backend.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/postgres_backend.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/postgres_backend.py (original)
+++ bloodhound/vendor/trac/current/trac/db/postgres_backend.py Thu Feb 13 05:08:02 2014
@@ -260,4 +260,3 @@ class PostgreSQLConnection(ConnectionWra
 
     def cursor(self):
         return IterableCursor(self.cnx.cursor(), self.log)
-

Modified: bloodhound/vendor/trac/current/trac/db/sqlite_backend.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/sqlite_backend.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/sqlite_backend.py (original)
+++ bloodhound/vendor/trac/current/trac/db/sqlite_backend.py Thu Feb 13 05:08:02 2014
@@ -255,7 +255,8 @@ class SQLiteConnection(ConnectionWrapper
                              and sqlite.version_info >= (2, 5, 0)
 
     def __init__(self, path, log=None, params={}):
-        assert have_pysqlite > 0
+        if have_pysqlite == 0:
+            raise TracError(_("Cannot load Python bindings for SQLite"))
         self.cnx = None
         if path != ':memory:':
             if not os.access(path, os.F_OK):

Modified: bloodhound/vendor/trac/current/trac/db/tests/__init__.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/tests/__init__.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/tests/__init__.py (original)
+++ bloodhound/vendor/trac/current/trac/db/tests/__init__.py Thu Feb 13 05:08:02 2014
@@ -1,3 +1,16 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2005-2013 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://trac.edgewall.org/wiki/TracLicense.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://trac.edgewall.org/log/.
+
 import unittest
 
 from trac.db.tests import api, mysql_test, postgres_test, util
@@ -15,4 +28,3 @@ def suite():
 
 if __name__ == '__main__':
     unittest.main(defaultTest='suite')
-

Modified: bloodhound/vendor/trac/current/trac/db/tests/api.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/tests/api.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/tests/api.py (original)
+++ bloodhound/vendor/trac/current/trac/db/tests/api.py Thu Feb 13 05:08:02 2014
@@ -1,4 +1,15 @@
 # -*- coding: utf-8 -*-
+#
+# Copyright (C) 2005-2013 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://trac.edgewall.org/wiki/TracLicense.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://trac.edgewall.org/log/.
 
 from __future__ import with_statement
 
@@ -28,7 +39,8 @@ class Error(Exception):
 
 
 def make_env(get_cnx):
-    return Mock(components={DatabaseManager:
+    from trac.core import ComponentManager
+    return Mock(ComponentManager, components={DatabaseManager:
              Mock(get_connection=get_cnx,
                   _transaction_local=ThreadLocal(wdb=None, rdb=None))})
 
@@ -344,10 +356,10 @@ class ConnectionTestCase(unittest.TestCa
 
 def suite():
     suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(ParseConnectionStringTestCase, 'test'))
-    suite.addTest(unittest.makeSuite(StringsTestCase, 'test'))
-    suite.addTest(unittest.makeSuite(ConnectionTestCase, 'test'))
-    suite.addTest(unittest.makeSuite(WithTransactionTest, 'test'))
+    suite.addTest(unittest.makeSuite(ParseConnectionStringTestCase))
+    suite.addTest(unittest.makeSuite(StringsTestCase))
+    suite.addTest(unittest.makeSuite(ConnectionTestCase))
+    suite.addTest(unittest.makeSuite(WithTransactionTest))
     return suite
 
 

Modified: bloodhound/vendor/trac/current/trac/db/tests/functional.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/tests/functional.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/tests/functional.py (original)
+++ bloodhound/vendor/trac/current/trac/db/tests/functional.py Thu Feb 13 05:08:02 2014
@@ -1,4 +1,16 @@
-#!/usr/bin/python
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2013 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://trac.edgewall.org/wiki/TracLicense.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://trac.edgewall.org/log/.
 
 import os
 from trac.tests.functional import *
@@ -18,12 +30,11 @@ class DatabaseBackupTestCase(FunctionalT
 
 def functionalSuite(suite=None):
     if not suite:
-        import trac.tests.functional.testcases
-        suite = trac.tests.functional.testcases.functionalSuite()
+        import trac.tests.functional
+        suite = trac.tests.functional.functionalSuite()
     suite.addTest(DatabaseBackupTestCase())
     return suite
 
 
 if __name__ == '__main__':
     unittest.main(defaultTest='functionalSuite')
-

Modified: bloodhound/vendor/trac/current/trac/db/tests/mysql_test.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/tests/mysql_test.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/tests/mysql_test.py (original)
+++ bloodhound/vendor/trac/current/trac/db/tests/mysql_test.py Thu Feb 13 05:08:02 2014
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2009 Edgewall Software
+# Copyright (C) 2010-2013 Edgewall Software
 # All rights reserved.
 #
 # This software is licensed as described in the file COPYING, which
@@ -14,7 +14,9 @@
 import unittest
 
 from trac.db.mysql_backend import MySQLConnector
-from trac.test import EnvironmentStub
+from trac.db.schema import Table, Column, Index
+from trac.test import EnvironmentStub, Mock
+from trac.tests import compat
 
 
 class MySQLTableAlterationSQLTest(unittest.TestCase):
@@ -50,10 +52,31 @@ class MySQLTableAlterationSQLTest(unitte
                                            {'due': ('int', 'int')})
         self.assertEqual([], list(sql))
 
+    def test_utf8_size(self):
+        connector = MySQLConnector(self.env)
+        self.assertEqual(3, connector._utf8_size(Mock(charset='utf8')))
+        self.assertEqual(4, connector._utf8_size(Mock(charset='utf8mb4')))
+
+    def test_to_sql(self):
+        connector = MySQLConnector(self.env)
+        tab = Table('blah', key=('col1', 'col2'))[Column('col1'),
+                                                  Column('col2'),
+                                                  Index(['col2'])]
+
+        sql = list(connector.to_sql(tab, utf8_size=3))
+        self.assertEqual(2, len(sql))
+        self.assertIn(' PRIMARY KEY (`col1`(166),`col2`(166))', sql[0])
+        self.assertIn(' blah_col2_idx ON blah (`col2`(255))', sql[1])
+
+        sql = list(connector.to_sql(tab, utf8_size=4))
+        self.assertEqual(2, len(sql))
+        self.assertIn(' PRIMARY KEY (`col1`(125),`col2`(125))', sql[0])
+        self.assertIn(' blah_col2_idx ON blah (`col2`(191))', sql[1])
+
 
 def suite():
     suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(MySQLTableAlterationSQLTest, 'test'))
+    suite.addTest(unittest.makeSuite(MySQLTableAlterationSQLTest))
     return suite
 
 

Modified: bloodhound/vendor/trac/current/trac/db/tests/postgres_test.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/tests/postgres_test.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/tests/postgres_test.py (original)
+++ bloodhound/vendor/trac/current/trac/db/tests/postgres_test.py Thu Feb 13 05:08:02 2014
@@ -1,4 +1,15 @@
 # -*- coding: utf-8 -*-
+#
+# Copyright (C) 2009-2013 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://trac.edgewall.org/wiki/TracLicense.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://trac.edgewall.org/log/.
 
 import re
 import unittest
@@ -149,8 +160,8 @@ class PostgresTableAlterationSQLTest(uni
 
 def suite():
     suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(PostgresTableCreationSQLTest, 'test'))
-    suite.addTest(unittest.makeSuite(PostgresTableAlterationSQLTest, 'test'))
+    suite.addTest(unittest.makeSuite(PostgresTableCreationSQLTest))
+    suite.addTest(unittest.makeSuite(PostgresTableAlterationSQLTest))
     return suite
 
 

Modified: bloodhound/vendor/trac/current/trac/db/tests/util.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/db/tests/util.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/db/tests/util.py (original)
+++ bloodhound/vendor/trac/current/trac/db/tests/util.py Thu Feb 13 05:08:02 2014
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2010 Edgewall Software
+# Copyright (C) 2010-2013 Edgewall Software
 # All rights reserved.
 #
 # This software is licensed as described in the file COPYING, which
@@ -34,7 +34,7 @@ class SQLEscapeTestCase(unittest.TestCas
 
 def suite():
     suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(SQLEscapeTestCase, 'test'))
+    suite.addTest(unittest.makeSuite(SQLEscapeTestCase))
     return suite
 
 if __name__ == '__main__':

Modified: bloodhound/vendor/trac/current/trac/dist.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/dist.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/dist.py (original)
+++ bloodhound/vendor/trac/current/trac/dist.py Thu Feb 13 05:08:02 2014
@@ -85,8 +85,8 @@ try:
         in_def = in_translator_comments = False
         comment_tag = None
 
-        encoding = parse_encoding(fileobj) \
-                   or options.get('encoding', 'iso-8859-1')
+        encoding = str(parse_encoding(fileobj) or
+                       options.get('encoding', 'iso-8859-1'))
         kwargs_maps = _DEFAULT_KWARGS_MAPS.copy()
         if 'kwargs_maps' in options:
             kwargs_maps.update(options['kwargs_maps'])

Modified: bloodhound/vendor/trac/current/trac/env.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/env.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/env.py (original)
+++ bloodhound/vendor/trac/current/trac/env.py Thu Feb 13 05:08:02 2014
@@ -275,7 +275,6 @@ class Environment(Component, ComponentMa
 
         self.path = path
         self.systeminfo = []
-        self._href = self._abs_href = None
 
         if create:
             self.create(options)
@@ -326,17 +325,14 @@ class Environment(Component, ComponentMa
             name = name_or_class.__module__ + '.' + name_or_class.__name__
         return name.lower()
 
-    @property
+    @lazy
     def _component_rules(self):
-        try:
-            return self._rules
-        except AttributeError:
-            self._rules = {}
-            for name, value in self.components_section.options():
-                if name.endswith('.*'):
-                    name = name[:-2]
-                self._rules[name.lower()] = value.lower() in ('enabled', 'on')
-            return self._rules
+        _rules = {}
+        for name, value in self.components_section.options():
+            if name.endswith('.*'):
+                name = name[:-2]
+            _rules[name.lower()] = value.lower() in ('enabled', 'on')
+        return _rules
 
     def is_component_enabled(self, cls):
         """Implemented to only allow activation of components that are
@@ -373,8 +369,10 @@ class Environment(Component, ComponentMa
                 break
             cname = cname[:idx]
 
-        # By default, all components in the trac package are enabled
-        return component_name.startswith('trac.') or None
+        # By default, all components in the trac package except
+        # trac.test are enabled
+        return component_name.startswith('trac.') and \
+               not component_name.startswith('trac.test.') or None
 
     def enable_component(self, cls):
         """Enable a component or module."""
@@ -599,7 +597,7 @@ class Environment(Component, ComponentMa
         rows = self.db_query("""
                 SELECT value FROM system WHERE name='%sdatabase_version'
                 """ % ('initial_' if initial else ''))
-        return rows and int(rows[0][0])
+        return int(rows[0][0]) if rows else False
 
     def setup_config(self):
         """Load the configuration file."""
@@ -715,24 +713,21 @@ class Environment(Component, ComponentMa
             DatabaseManager(self).shutdown()
         return True
 
-    @property
+    @lazy
     def href(self):
         """The application root path"""
-        if not self._href:
-            self._href = Href(urlsplit(self.abs_href.base)[2])
-        return self._href
+        return Href(urlsplit(self.abs_href.base).path)
 
-    @property
+    @lazy
     def abs_href(self):
         """The application URL"""
-        if not self._abs_href:
-            if not self.base_url:
-                self.log.warn("base_url option not set in configuration, "
-                              "generated links may be incorrect")
-                self._abs_href = Href('')
-            else:
-                self._abs_href = Href(self.base_url)
-        return self._abs_href
+        if not self.base_url:
+            self.log.warn("base_url option not set in configuration, "
+                          "generated links may be incorrect")
+            _abs_href = Href('')
+        else:
+            _abs_href = Href(self.base_url)
+        return _abs_href
 
 
 class EnvironmentSetup(Component):
@@ -754,7 +749,7 @@ class EnvironmentSetup(Component):
         self._update_sample_config()
 
     def environment_needs_upgrade(self, db):
-        dbver = self.env.get_version(db)
+        dbver = self.env.get_version()
         if dbver == db_default.db_version:
             return False
         elif dbver > db_default.db_version:

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/admin.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/admin.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/admin.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/admin.css Thu Feb 13 05:08:02 2014
@@ -57,14 +57,14 @@ form.addnew p.help {
 }
 form.addnew div.field,
 form.addnew div.buttons {
- padding: 0.2em 0.5em 0.2em 0;
+ padding: 0.2em 0;
  white-space: nowrap;
 }
-form.addnew div.buttons input { margin: 0 0.5em 0 0; }
+form.addnew div.field { padding-right: 1em; }
+form.addnew div.buttons input { margin: 0 1em 0 0; }
 form.addnew p.hint,
 form.addnew span.hint {
- padding-left: 0.5em;
- padding-right: 0.5em;
+ padding-left: 0.25em;
 }
 form.addnew p.help { margin-top: 0.5em; }
 form.addnew br { display: none; }
@@ -103,6 +103,7 @@ table.listing .num { text-align: right; 
 .plugin .info dd { padding: 0; margin: 0; }
 .plugin .listing { width: 100%; }
 .plugin .listing th.sel input { margin-right: 0.5em; vertical-align: bottom; }
+.plugin .listing td.trac-module { background: #fcfcfc; }
 .plugin .listing td { background: #fff; }
 .trac-heading { margin: 0; }
 .trac-name { font-family: monospace; }
@@ -125,9 +126,10 @@ table.trac-pluglist td { padding-left: 1
 #permlist { margin-bottom: 2em; }
 #permlist label, #grouplist label {
  float: left;
- min-width: 13em;
- max-width: 33%;
- padding: 0 2em 0 0;
+ width: 13em;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ padding: 0;
  white-space: nowrap;
 }
 fieldset tr.field th { text-align: right; }

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/browser.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/browser.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/browser.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/browser.css Thu Feb 13 05:08:02 2014
@@ -146,7 +146,7 @@ table.chglist { margin-top: 0 }
  vertical-align: middle;
 }
 .chglist td.author { color: #888 }
-.chglist td.change span.edit {
+.chglist td.change span {
  border: 1px solid #999;
  float: left;
  margin: .2em .5em 0 0;

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/changeset.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/changeset.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/changeset.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/changeset.css Thu Feb 13 05:08:02 2014
@@ -1,5 +1,5 @@
 /* Changeset overview */
-#overview .files { padding-top: 1em }
+#overview .files { padding: 1px 0 }
 #overview .files ul { margin: 0; padding: 0 }
 #overview .files li { list-style-type: none }
 #overview .files li .comment { display: none }
@@ -22,7 +22,6 @@
  margin-bottom: 0;
  margin-top: 0;
 }
-#overview .files { padding: 1px 0 }
 
 .diff ul.props {
  font-size: 90%;

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/code.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/code.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/code.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/code.css Thu Feb 13 05:08:02 2014
@@ -66,6 +66,9 @@ table.code tbody th :link, table.code tb
 table.code tbody th :link:hover, table.code tbody th :visited:hover {
  color: #000;
 }
+table.code tbody tr:hover td {
+ background: #eed;
+}
 table.code td {
  font: normal 11px monospace;
  overflow: hidden;

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/diff.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/diff.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/diff.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/diff.css Thu Feb 13 05:08:02 2014
@@ -2,16 +2,15 @@
 #prefs fieldset { margin: 1em .5em .5em; padding: .5em 1em 0 }
 
 /* Diff/change overview */
-#overview { line-height: 130%; margin-top: 1em; padding: .5em }
+#overview { line-height: 130%; margin-top: 1em; padding: .5em .5em .5em 0 }
 #overview dt.property {
+ clear: left;
+ float: left;
  font-weight: bold;
- padding-right: .25em;
- position: absolute; /* relies on #content { position: relative } */
- left: 0;
  text-align: right;
  width: 7.75em;
 }
-#overview dd { margin-left: 8em }
+#overview dd { margin-left: 8.5em }
 
 #overview .message { padding: 1em 0 1px }
 #overview dd.message p, #overview dd.message ul, #overview dd.message ol,
@@ -132,6 +131,18 @@
  padding: 1px 2px;
  vertical-align: top;
 }
+.diff table.trac-diff tbody tr:hover td {
+ background: #eed;
+}
+.diff table.trac-diff tbody.mod tr:hover td,
+.diff table.trac-diff tbody.add tr:hover td,
+.diff table.trac-diff tbody.rem tr:hover td {
+ background: #ddc;
+}
+.diff table.trac-diff tbody.mod tr:hover td del,
+.diff table.trac-diff tbody.mod tr:hover td ins {
+ background: #bb9;
+}
 .diff table.trac-diff tbody.skipped td, .diff table.trac-diff thead td {
  background: #f7f7f7;
  border: 1px solid #d7d7d7;

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/jquery-ui/jquery-ui.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/jquery-ui/jquery-ui.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/jquery-ui/jquery-ui.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/jquery-ui/jquery-ui.css Thu Feb 13 05:08:02 2014
@@ -47,15 +47,15 @@
  *
  * http://docs.jquery.com/UI/Theming/API
  *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Verdana,Arial,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'Bitstream%20Vera%20Sans\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\',Helvetica,sans-serif&fwDefault=normal&fsDefault=13px&cornerRadius=.3em&bgColorHeader=ffffdd&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=80&borderColorHeader=bbbbbb&fcHeader=000000&iconColorHeader=707070&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=00&borderColorContent=bbbbbb&fcContent=000000&iconColorContent=222222&bgColorDefault=ffffff&bgTextureDefault=01_flat.png&bgImgOpacityDefault=0&borderColorDefault=bbbbbb&fcDefault=b00000&iconColorDefault=b00000&bgColorHover=ffffdd&bgTextureHover=01_flat.png&bgImgOpacityHover=0&borderColorHover=505050&fcHover=505050&iconColorHover=505050&bgColorActive=303030&bgTextureActive=03_highlight_soft.png&bgImgOpacityActive=30&borderColorActive=bbbbbb&fcActive=eeeeee&iconColorActive=d7d7d7&bgColorHighlight=c
 0f0c0&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=c0f0c0&fcHighlight=363636&iconColorHighlight=4b954f&bgColorError=ffddcc&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=9b081d&fcError=500000&iconColorError=9b081d&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Verdana,Arial,'Bitstream%20Vera%20Sans',Helvetica,sans-serif&fwDefault=normal&fsDefault=13px&cornerRadius=.3em&bgColorHeader=ffffdd&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=80&borderColorHeader=bbbbbb&fcHeader=000000&iconColorHeader=707070&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=00&borderColorContent=bbbbbb&fcContent=000000&iconColorContent=222222&bgColorDefault=ffffff&bgTextureDefault=01_flat.png&bgImgOpacityDefault=0&borderColorDefault=bbbbbb&fcDefault=b00000&iconColorDefault=b00000&bgColorHover=ffffdd&bgTextureHover=01_flat.png&bgImgOpacityHover=0&borderColorHover=505050&fcHover=505050&iconColorHover=505050&bgColorActive=303030&bgTextureActive=03_highlight_soft.png&bgImgOpacityActive=30&borderColorActive=bbbbbb&fcActive=eeeeee&iconColorActive=d7d7d7&bgColorHighlight=c0f0c0&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=7
 5&borderColorHighlight=c0f0c0&fcHighlight=363636&iconColorHighlight=4b954f&bgColorError=ffddcc&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=9b081d&fcError=500000&iconColorError=9b081d&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
  */
 
 
 /* Component containers
 ----------------------------------*/
-.ui-widget { font-family: Verdana,Arial,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'Bitstream Vera Sans\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\',Helvetica,sans-serif; font-size: 13px; }
+.ui-widget { font-family: Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif; font-size: 13px; }
 .ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'Bitstream Vera Sans\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\',Helvetica,sans-serif; font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif; font-size: 1em; }
 .ui-widget-content { border: 1px solid #bbbbbb; background: #ffffff url(images/ui-bg_flat_00_ffffff_40x100.png) 50% 50% repeat-x; color: #000000; }
 .ui-widget-content a { color: #000000; }
 .ui-widget-header { border: 1px solid #bbbbbb; background: #ffffdd url(images/ui-bg_highlight-soft_80_ffffdd_1x100.png) 50% 50% repeat-x; color: #000000; font-weight: bold; }

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/report.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/report.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/report.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/report.css Thu Feb 13 05:08:02 2014
@@ -221,6 +221,8 @@ table.tickets tbody tr.fullrow th {
   text-align: center;
   font-size: 85%;
 }
+table.tickets tbody tr p:first-child { margin-top: 0 }
+table.tickets tbody tr p:last-child { margin-bottom: 0 }
 
 /* Batchmod Form */
 

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/roadmap.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/roadmap.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/roadmap.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/roadmap.css Thu Feb 13 05:08:02 2014
@@ -55,11 +55,8 @@ p.percent {
  font-style: italic;
  margin: 0 0 1em 0;
 }
-.milestone .description { margin-left: 1em }
-
-/* Styles for the milestone view */
-.milestone .date { color: #888; font-style: italic; margin: 0 }
 .milestone .description { margin: 1em 0 2em }
+
 #stats {
  float: right;
  margin: 0 1em 2em 2em;

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/ticket.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/ticket.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/ticket.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/ticket.css Thu Feb 13 05:08:02 2014
@@ -132,8 +132,9 @@
 ul.children {
  margin-top: 1.5em;
  padding-left: 2em;
- list-style-image: url(../inreply.png);
 }
+ul.children, ul.children ul.children { list-style-image: url(../inreply.png) }
+ul.children ul, ul.children ol { list-style-image: none }
 ul.children > li.child {
  padding-left: .5em;
  margin-bottom: 1.5em;
@@ -155,12 +156,6 @@ ul.children > li.child {
  #changelog h3, #ticketchange h3 { box-shadow: none }
 }
 
-div.comment ul { list-style: disc }
-div.comment ul ul, div.comment ol ul { list-style: circle }
-div.comment ul ul ul, div.comment ol ul ul { list-style: square }
-div.comment ul ol ul, div.comment ol ol ul { list-style: square }
-div.comment ol { list-style: decimal }
-
 /* Comment editor */
 #trac-comment-editor { margin-left: 2em; margin-bottom: 1em }
 #trac-comment-editor div.trac-resizable { width: 100% }
@@ -242,4 +237,4 @@ fieldset.radio legend {
 }
 fieldset.radio label { padding-right: 1em }
 
-#content.ticket .trac-nav a { margin-left: 1em; }
\ No newline at end of file
+#content.ticket .trac-nav a { margin-left: 1em; }

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/trac.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/trac.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/trac.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/trac.css Thu Feb 13 05:08:02 2014
@@ -82,6 +82,8 @@ span:target {
 
 /* Forms */
 input, textarea, select { margin: 2px }
+/* Avoid to inherit white-space of its parent element for IE 11, #11376 */
+textarea { white-space: pre-wrap }
 input, select { vertical-align: middle }
 input[type=button], input[type=submit], input[type=reset], button {
  *overflow: visible; /* Workaround too much margin on button in IE7 */
@@ -225,6 +227,26 @@ input[type=submit].trac-delete:hover {
 #metanav {
  padding-top: .3em;
 }
+#metanav form.trac-logout {
+ display: inline;
+ margin: 0;
+ padding: 0;
+}
+#metanav form.trac-logout button {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ background: transparent;
+ font-family: inherit;
+ font-size: inherit;
+ color: #b00;
+ border-bottom: 1px dotted #bbb;
+ cursor: pointer;
+}
+#metanav form.trac-logout button::-moz-focus-inner { border: 0; padding: 0 }
+#metanav form.trac-logout button:hover { background-color: #eee; color: #555 }
+#metanav form.trac-logout button:active { position: static }
 
 /* Main navigation bar */
 #mainnav {
@@ -311,7 +333,7 @@ input[type=submit].trac-delete:hover {
  text-align: center;
 }
 #altlinks h3 { font-size: 12px; letter-spacing: normal; margin: 0 }
-#altlinks ul { list-style: none; margin: 0; }
+#altlinks ul { list-style: none; margin: 0; padding: 0 }
 #altlinks li {
  border-right: 1px solid #d7d7d7;
  display: inline;
@@ -473,6 +495,11 @@ a.trac-diff:after { content: "∆" }
 div.compact > p:first-child { margin-top: 0 }
 div.compact > p:last-child { margin-bottom: 0 }
 
+/* Styles related to RTL support */
+.rtl { direction: rtl; }
+.rtl div.wiki-toc { float: left; }
+.rtl .wiki-toc ul ul, .wiki-toc ol ol { padding-right: 1.2em }
+
 a.missing:link, a.missing:visited, a.missing, span.missing,
 a.forbidden, span.forbidden { color: #998 }
 a.missing:hover { color: #000 }
@@ -532,6 +559,8 @@ table.wiki th {
  padding: .1em .25em;
  background-color: #f7f7f7;
 }
+table.wiki tbody tr.even { background-color: #fcfcfc }
+table.wiki tbody tr.odd { background-color: #f7f7f7 }
 
 .wikitoolbar {
  margin-top: 0.3em;
@@ -649,7 +678,7 @@ table.listing tbody td a:hover, table.li
 table.listing tbody tr { border-top: 1px solid #ddd }
 table.listing tbody tr.even { background-color: #fcfcfc }
 table.listing tbody tr.odd { background-color: #f7f7f7 }
-table.listing tbody tr:hover { background: #eed !important }
+table.listing tbody tr:hover td { background: #eed !important }
 table.listing tbody tr.focus { background: #ddf !important }
 
 table.listing pre { white-space: pre-wrap }

Modified: bloodhound/vendor/trac/current/trac/htdocs/css/wiki.css
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/css/wiki.css?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/htdocs/css/wiki.css (original)
+++ bloodhound/vendor/trac/current/trac/htdocs/css/wiki.css Thu Feb 13 05:08:02 2014
@@ -118,11 +118,6 @@ div.trac-modifiedby span.trac-print { di
  div.trac-modifiedby span.trac-print { display: block; }
 }
 
-/* Styles related to RTL support */
-.rtl { direction: rtl; }
-.rtl div.wiki-toc { float: left; }
-.rtl .wiki-toc ul ul, .wiki-toc ol ol { padding-right: 1.2em }
-
 /* TracIni default value */
 div.tracini td.default { font-size: 90% }
 div.tracini td.nodefault {

Modified: bloodhound/vendor/trac/current/trac/htdocs/js/jquery-ui-i18n.js
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/js/jquery-ui-i18n.js?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
Binary files - no diff available.

Modified: bloodhound/vendor/trac/current/trac/htdocs/js/query.js
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/js/query.js?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
Binary files - no diff available.

Modified: bloodhound/vendor/trac/current/trac/htdocs/js/threaded_comments.js
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/js/threaded_comments.js?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
Binary files - no diff available.

Modified: bloodhound/vendor/trac/current/trac/htdocs/js/trac.js
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/htdocs/js/trac.js?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
Binary files - no diff available.

Modified: bloodhound/vendor/trac/current/trac/loader.py
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/loader.py?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/loader.py (original)
+++ bloodhound/vendor/trac/current/trac/loader.py Thu Feb 13 05:08:02 2014
@@ -239,7 +239,7 @@ def match_plugins_to_frames(plugins, fra
                 pass    # Metadata not found
 
     for plugin in plugins:
-        base, ext = os.path.splitext(plugin['path'])
+        base, ext = os.path.splitext(plugin['path'].replace('\\', '/'))
         if ext == '.egg' and egg_frames:
             find_egg_frame_index(plugin)
         else:

Modified: bloodhound/vendor/trac/current/trac/locale/ca/LC_MESSAGES/messages-js.po
URL: http://svn.apache.org/viewvc/bloodhound/vendor/trac/current/trac/locale/ca/LC_MESSAGES/messages-js.po?rev=1567849&r1=1567848&r2=1567849&view=diff
==============================================================================
--- bloodhound/vendor/trac/current/trac/locale/ca/LC_MESSAGES/messages-js.po (original)
+++ bloodhound/vendor/trac/current/trac/locale/ca/LC_MESSAGES/messages-js.po Thu Feb 13 05:08:02 2014
@@ -1,21 +1,22 @@
 # Catalan translation of Trac-js.
-# Copyright © 2010 Edgewall Software
+# Copyright © 2010, 2013 Edgewall Software
 # This file is distributed under the same license as the Trac project.
-# Jordi Mallach <jo...@sindominio.net>, 2010.
+# Jordi Mallach <jo...@sindominio.net>, 2010, 2013.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Trac 0.12\n"
+"Project-Id-Version: Trac 1.0-dev\n"
 "Report-Msgid-Bugs-To: trac-dev@googlegroups.com\n"
-"POT-Creation-Date: 2013-01-27 11:21+0900\n"
-"PO-Revision-Date: 2010-06-18 13:55+0200\n"
+"POT-Creation-Date: 2013-03-21 22:54+0100\n"
+"PO-Revision-Date: 2013-04-25 17:42+0200\n"
 "Last-Translator: Jordi Mallach <jo...@sindominio.net>\n"
 "Language-Team: Catalan <ca...@dodds.net>\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Language: ca\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6dev-r0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Generated-By: Babel 0.9.6\n"
 
 #: trac/htdocs/js/blame.js:84
 msgid "(no changeset information)"
@@ -72,67 +73,65 @@ msgstr "%(title)s (feu clic per a amagar
 #. and showMonthAfterYear
 #: trac/htdocs/js/jquery-ui-i18n.js:4
 msgid "$month$year"
-msgstr ""
+msgstr "$month$year"
 
 #. TRANSLATOR: Link that closes the datepicker
 #. TRANSLATOR: Link that closes the timepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:7 trac/htdocs/js/jquery-ui-i18n.js:39
 msgid "Done"
-msgstr ""
+msgstr "Fet"
 
 #. TRANSLATOR: Link to the previous month in the datepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:9
 msgid "Prev"
-msgstr ""
+msgstr "Ant"
 
 #. TRANSLATOR: Link to the next month in the datepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:11
 msgid "Next"
-msgstr ""
+msgstr "Seg"
 
 #. TRANSLATOR: Link to the current day in the datepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:13
 msgid "Today"
-msgstr ""
+msgstr "Avui"
 
 #. TRANSLATOR: Heading for the week-of-the-year column in the datepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:20
 msgid "Wk"
-msgstr ""
+msgstr "St"
 
 #. TRANSLATOR: Heading of the standalone timepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:30
 msgid "Choose Time"
-msgstr ""
+msgstr "Selecciona l'hora"
 
 #. TRANSLATOR: Time selector label
 #: trac/htdocs/js/jquery-ui-i18n.js:32
 msgid "Time"
-msgstr ""
+msgstr "Hora"
 
 #. TRANSLATOR: Time labels in the timepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:34
-#, fuzzy
 msgid "Hour"
-msgstr "o"
+msgstr "Hora"
 
 #: trac/htdocs/js/jquery-ui-i18n.js:34
 msgid "Minute"
-msgstr ""
+msgstr "Minut"
 
 #: trac/htdocs/js/jquery-ui-i18n.js:34
 msgid "Second"
-msgstr ""
+msgstr "Segon"
 
 #: trac/htdocs/js/jquery-ui-i18n.js:35
 msgid "Time Zone"
-msgstr ""
+msgstr "Fus horari"
 
 #. TRANSLATOR: Link to pick the current time in the timepicker
 #: trac/htdocs/js/jquery-ui-i18n.js:37
-#, fuzzy
 msgid "Now"
-msgstr "no"
+msgstr "Ara"
 
 #: trac/htdocs/js/query.js:132
 msgid "A filter already exists for that property"
@@ -160,20 +159,20 @@ msgstr "i"
 
 #: trac/htdocs/js/query.js:337
 msgid " remove:"
-msgstr ""
+msgstr " suprimeix:"
 
 #: trac/htdocs/js/query.js:347
 msgid " add:"
-msgstr ""
+msgstr " afegeix:"
 
 #: trac/htdocs/js/query.js:376
 #, python-format
 msgid "Select ticket %(id)s for modification"
-msgstr ""
+msgstr "Seleccioneu els %(id)s de tiquets a modificars"
 
 #: trac/htdocs/js/query.js:387
 msgid "Toggle selection of all tickets shown in this group"
-msgstr ""
+msgstr "Commuta la selecció de tots els tiquets mostrats en aquest grup"
 
 #: trac/htdocs/js/trac.js:7
 msgid "Link here"
@@ -227,4 +226,3 @@ msgstr "Enllaç a aquest diff"
 #, python-format
 msgid "Link to #%(id)s"
 msgstr "Enllaç a #%(id)s"
-