changeset 5530:7f9040460576

Merge stable 0.3
author Mads Kiilerich <madski@unity3d.com>
date Fri, 02 Oct 2015 22:46:15 +0200
parents 889ff0f436c8 (current diff) 1c9c3b0f21ae (diff)
children 4b647864075e
files kallithea/__init__.py kallithea/i18n/fr/LC_MESSAGES/kallithea.po whitespacecleanup.sh
diffstat 64 files changed, 2120 insertions(+), 884 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Tue Sep 08 10:56:22 2015 +0000
+++ b/.hgignore	Fri Oct 02 22:46:15 2015 +0200
@@ -28,3 +28,4 @@
 ^my\.ini$
 ^fabfile.py
 ^\.idea$
+^\.cache$
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgsigs	Fri Oct 02 22:46:15 2015 +0200
@@ -0,0 +1,1 @@
+9b3e9e242f5c97cc0c7657e5ac93dce7de61ca16 0 iQEcBAABAgAGBQJWDuAdAAoJEJ1bI/kYT6UUAlYH/ReCa7Im5tvy+ot5oAc7xey/O2rCVHp2h6i82tTWK/0i9EaS4DP+eTbAjV4WJA4qWF5DPenEJ3X9JhrTLNvGkR0f7lUqiFVMTJ472YlSsvIWg38gVFruzwk1cODRfq72o8ERYcRSfzrL4cDpIqjEd/vVVCV/gKVvPmzr4/FED/ZmS0X6T9gxWJo/eWSuLNAxHHtE/pCWDO3XEe+iOm+hHjkyz4Hn2r9/+ucrirnzycH6DnYO/kWvQzBnzgMjJm+1rLZ5cfU89V8zfhv6z0pd8CHZfpKGc2Z8EwVJq9LR+M4/76uDlYXx7IfZAxhRNqN6MC+yvPmDo3382dNr7Wkopi0=
--- a/.hgtags	Tue Sep 08 10:56:22 2015 +0000
+++ b/.hgtags	Fri Oct 02 22:46:15 2015 +0200
@@ -61,3 +61,4 @@
 ad0ce803b40cb17fc3988373052943e041030b02 0.2
 c6e32714336345403adf76abb6ebf9b8116fcdc7 0.2.1
 14f488a5dc4ca6647bc6acf12534fd137e968aa8 0.2.2
+9b3e9e242f5c97cc0c7657e5ac93dce7de61ca16 0.3
--- a/CONTRIBUTORS	Tue Sep 08 10:56:22 2015 +0000
+++ b/CONTRIBUTORS	Fri Oct 02 22:46:15 2015 +0200
@@ -35,6 +35,7 @@
     Niemand Jedermann <predatorix@web.de> 2015
     Peter Vitt <petervitt@web.de> 2015
     Robert Martinez <ntttq@inboxen.org> 2015
+    Robert Rauch <mail@robertrauch.de> 2015
     Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> 2015
     Sam Jaques <sam.jaques@me.com> 2015
     Søren Løvborg <sorenl@unity3d.com> 2015
--- a/README.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/README.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -37,6 +37,13 @@
 Please visit https://docs.kallithea-scm.org/en/latest/installation.html for
 more details.
 
+There is also an experimental `Puppet module`_ for installing and setting up
+Kallithea. Currently, only basic functionality is provided, but it is still
+enough to get up and running quickly, especially for people without Python
+background. See
+https://docs.kallithea-scm.org/en/latest/installation_puppet.html for further
+information.
+
 
 Source code
 -----------
@@ -178,7 +185,7 @@
 This location will depend on where you installed Kallithea. If you installed
 via::
 
-   python setup.py install
+   python2 setup.py install
 
 then you will find this location at
 ``$VIRTUAL_ENV/lib/python2.7/site-packages/Kallithea-0.1-py2.7.egg/kallithea``.
@@ -194,7 +201,7 @@
    cd /path/to/kallithea
    cp /path/to/rhodecode/rhodecode.db kallithea.db
    pip install sqlalchemy-migrate
-   python kallithea/bin/rebranddb.py sqlite:///kallithea.db
+   python2 kallithea/bin/rebranddb.py sqlite:///kallithea.db
 
 .. Note::
 
@@ -238,3 +245,4 @@
 .. _Celery: http://celeryproject.org/
 .. _vcs: http://pypi.python.org/pypi/vcs
 .. _Software Freedom Conservancy: http://sfconservancy.org/
+.. _Puppet module: https://forge.puppetlabs.com/rauch/kallithea
--- a/development.ini	Tue Sep 08 10:56:22 2015 +0000
+++ b/development.ini	Fri Oct 02 22:46:15 2015 +0200
@@ -57,7 +57,7 @@
 ## SMTP server settings
 ## Only smtp_server is mandatory. All other settings take the specified default
 ## values.
-#smtp_server = mail.server.com
+#smtp_server = smtp.example.com
 #smtp_username =
 #smtp_password =
 #smtp_port = 25
@@ -228,8 +228,8 @@
 
 ## gist URL alias, used to create nicer urls for gist. This should be an
 ## url that does rewrites to _admin/gists/<gistid>.
-## example: http://gist.kallithea.server/{gistid}. Empty means use the internal
-## Kallithea url, ie. http[s]://your.kallithea.server/_admin/gists/<gistid>
+## example: http://gist.example.com/{gistid}. Empty means use the internal
+## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid>
 gist_alias_url =
 
 ## white list of API enabled controllers. This allows to add list of
@@ -264,7 +264,7 @@
 ## fetched from the regex and {repo} is replaced with full repository name
 ## including groups {repo_name} is replaced with just name of repo
 
-issue_server_link = https://myissueserver.com/{repo}/issue/{id}
+issue_server_link = https://issues.example.com/{repo}/issue/{id}
 
 ## prefix to add to link to indicate it's an url
 ## #314 will be replaced by <issue_prefix><id>
@@ -274,10 +274,10 @@
 ## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
 ## multiple patterns, to other issues server, wiki or others
 ## below an example how to create a wiki pattern
-# wiki-some-id -> https://mywiki.com/some-id
+# wiki-some-id -> https://wiki.example.com/some-id
 
 #issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://mywiki.com/{id}
+#issue_server_link_wiki = https://wiki.example.com/{id}
 #issue_prefix_wiki = WIKI-
 
 ## instance-id prefix
--- a/docs/api/api.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/api/api.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -49,7 +49,7 @@
 
 For example, to pull to a local "CPython" mirror using curl::
 
-    curl https://example.com/_admin/api -X POST -H 'content-type:text/plain' \
+    curl https://kallithea.example.com/_admin/api -X POST -H 'content-type:text/plain' \
         --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
 
 In general, provide
@@ -83,30 +83,29 @@
 
 For example, to call ``get_repo``::
 
- kallithea-api --apihost=<your.kallithea.server.url> --apikey=<yourapikey> get_repo
+    kallithea-api --apihost=<Kallithea URL> --apikey=<API key> get_repo
 
- calling {"api_key": "<apikey>", "id": 75, "args": {}, "method": "get_repo"} to http://127.0.0.1:5000
- Kallithea said:
- {'error': 'Missing non optional `repoid` arg in JSON DATA',
-  'id': 75,
-  'result': None}
+    Calling method get_repo => <Kallithea URL>
+    Server response
+    ERROR:"Missing non optional `repoid` arg in JSON DATA"
 
 Oops, looks like we forgot to add an argument. Let's try again, now
 providing the ``repoid`` as a parameter::
 
-    kallithea-api get_repo repoid:myrepo
+    kallithea-api --apihost=<Kallithea URL> --apikey=<API key> get_repo repoid:myrepo
 
-    calling {"api_key": "<apikey>", "id": 39, "args": {"repoid": "myrepo"}, "method": "get_repo"} to http://127.0.0.1:5000
-    Kallithea said:
-    {'error': None,
-     'id': 39,
-     'result': <json data...>}
+    Calling method get_repo => <Kallithea URL>
+    Server response
+    {
+        "clone_uri": null,
+        "created_on": "2015-08-31T14:55:19.042",
+    ...
 
 To avoid specifying ``apihost`` and ``apikey`` every time, run::
 
-  kallithea-api --save-config --apihost=<your.kallithea.server.url> --apikey=<yourapikey>
+    kallithea-api --save-config --apihost=<Kallithea URL> --apikey=<API key>
 
-This will create a ``~/.config/kallithea`` with the specified hostname and API key
+This will create a ``~/.config/kallithea`` with the specified URL and API key
 so you don't have to specify them every time.
 
 
--- a/docs/contributing.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/contributing.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -34,7 +34,8 @@
         cd kallithea
         virtualenv ../kallithea-venv
         source ../kallithea-venv/bin/activate
-        python setup.py develop
+        pip install --upgrade pip setuptools
+        python2 setup.py develop
         paster make-config Kallithea my.ini
         paster setup-db my.ini --user=user --email=user@example.com --password=password --repos=/tmp
         paster serve my.ini --reload &
--- a/docs/index.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/index.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -22,6 +22,7 @@
    installation_win_old
    installation_iis
    setup
+   installation_puppet
 
 **Usage**
 
--- a/docs/installation.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/installation.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -39,8 +39,9 @@
         cd kallithea
         virtualenv ../kallithea-venv
         source ../kallithea-venv/bin/activate
-        python setup.py develop
-        python setup.py compile_catalog   # for translation of the UI
+        pip install --upgrade pip setuptools
+        python2 setup.py develop
+        python2 setup.py compile_catalog   # for translation of the UI
 
 You can now proceed to :ref:`setup`.
 
@@ -64,14 +65,25 @@
 
     virtualenv /srv/kallithea/venv
 
-- Activate the virtualenv_ in your current shell session by running::
+- Activate the virtualenv_ in your current shell session and make sure the
+  basic requirements are up-to-date by running::
 
     source /srv/kallithea/venv/bin/activate
+    pip install --upgrade pip setuptools
 
 .. note:: You can't use UNIX ``sudo`` to source the ``virtualenv`` script; it
    will "activate" a shell that terminates immediately. It is also perfectly
    acceptable (and desirable) to create a virtualenv as a normal user.
 
+.. note:: Some dependencies are optional. If you need them, install them in
+   the virtualenv too::
+
+     pip install psycopg2
+     pip install python-ldap
+
+   This might require installation of development packages using your
+   distribution's package manager.
+
 - Make a folder for Kallithea data files, and configuration somewhere on the
   filesystem. For example::
 
@@ -84,7 +96,7 @@
   Alternatively, download a .tar.gz from http://pypi.python.org/pypi/Kallithea,
   extract it and run::
 
-    python setup.py install
+    python2 setup.py install
 
 - This will install Kallithea together with pylons_ and all other required
   python libraries into the activated virtualenv.
--- a/docs/installation_iis.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/installation_iis.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -55,7 +55,7 @@
 has been generated, it is necessary to run the following command due to the way
 that ISAPI-WSGI is made::
 
-    python dispatch.py install
+    python2 dispatch.py install
 
 This accomplishes two things: generating an ISAPI compliant DLL file,
 ``_dispatch.dll``, and installing a script map handler into IIS for the
@@ -103,7 +103,7 @@
 In order to dump output from WSGI using ``win32traceutil`` it is sufficient to
 type the following in a console window::
 
-    python -m win32traceutil
+    python2 -m win32traceutil
 
 and any exceptions occurring in the WSGI layer and below (i.e. in the Kallithea
 application itself) that are uncaught, will be printed here complete with stack
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/installation_puppet.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -0,0 +1,175 @@
+.. _installation_puppet:
+
+===================================
+Installation and setup using Puppet
+===================================
+
+The whole installation and setup process of Kallithea can be simplified by
+using Puppet and the `rauch/kallithea
+<https://forge.puppetlabs.com/rauch/kallithea>`_ Puppet module. This is
+especially useful for getting started quickly, without having to deal with all
+the Python specialities.
+
+.. note:: The following instructions assume you are not familiar with Puppet at
+          all. If this is not the case, you should probably skip directly to the
+          `Kallithea Puppet module documentation
+          <https://forge.puppetlabs.com/rauch/kallithea#puppet-kallithea>`_.
+
+
+Installing Puppet
+-----------------
+
+This installation variant requires a Unix/Linux type server with Puppet 3.0+
+installed. Many major distributions have Puppet in their standard repositories.
+Thus, you will probably be ready to go by running, e.g. ``apt-get install
+puppet`` or ``yum install puppet``, depending on your distro's favoured package
+manager. Afterwards, check the Puppet version by running ``puppet --version``
+and ensure you have at least 3.0.
+
+If your distribution does not provide Puppet packages or you need a
+newer version, please see the `Puppet Reference Manual
+<https://docs.puppetlabs.com/puppet/4.2/reference/install_linux.html>`_ for
+instructions on how to install Puppet on your target platform.
+
+
+Installing the Puppet module
+----------------------------
+
+To install the latest version of the Kallithea Puppet module from the Puppet
+Forge, run the following as ``root``:
+
+.. code-block:: bash
+
+    puppet module install rauch/kallithea
+
+This will install both the Kallithea Puppet module and its dependency modules.
+
+.. warning::  Be aware that Puppet can do all kinds of things to your systems.
+              Third-party modules (like the ``kallithea`` module) may run
+              arbitrary commands on your system (most of the time as the
+              ``root`` user), so do not apply them on production machines if
+              you don't know what you are doing. Instead, use a test system
+              (e.g. a virtual machine) for evaluation purposes.
+
+
+Applying the module
+-------------------
+
+To trigger the actual installation process, we have to *apply* the
+``kallithea`` Puppet class, which is provided by the module we have just
+installed, to our system. For this, create a file named e.g. ``kallithea.pp``,
+a *Puppet manifest*, with the following content:
+
+.. _simple_manifest:
+.. code-block:: puppet
+
+    class { 'kallithea':
+      seed_db    => true,
+      manage_git => true,
+    }
+
+To apply the manifest, simply run the following (preferably as root):
+
+.. code-block:: bash
+
+    puppet apply kallithea.pp
+
+This will basically run through the usual Kallithea :ref:`installation` and
+:ref:`setup` steps, as documented. Consult the module documentation for details
+on `what the module affects
+<https://forge.puppetlabs.com/rauch/kallithea#what-kallithea-affects>`_. You
+can also do a *dry run* by adding the ``--noop`` option to the command.
+
+
+Using parameters for customizing the setup process
+--------------------------------------------------
+
+The ``kallithea`` Puppet class provides a number of `parameters
+<https://forge.puppetlabs.com/rauch/kallithea#class-kallithea>`_ for
+customizing the setup process. You have seen the usage of the ``seed_db``
+parameter in the :ref:`example above <simple_manifest>`, but there are more.
+For example, you can specify the installation directory, the name of the user
+under which Kallithea gets installed, the initial admin password, etc.
+Notably, you can provide arbitrary modifications to Kallitheas configuration
+file by means of the ``config_hash`` parameter.
+
+Parameters, which have not been set explicitly, will be set to default values,
+which are defined inside the ``kallithea`` Puppet module. For example, if you
+just stick to the defaults as in the :ref:`example above <simple_manifest>`,
+you will end up with a Kallithea instance, which
+
+- is installed in ``/srv/kallithea``, owned by the user ``kallithea``
+- uses the Kallithea default configuration
+- uses the admin user ``admin`` with password ``adminpw``
+- is started automatically and enabled on boot
+
+As of Kallithea 0.3.0, this in particular means that Kallithea will use an
+SQLite database and listen on ``http://localhost:5000``.
+
+See also the `full parameters list
+<https://forge.puppetlabs.com/rauch/kallithea#class-kallithea>`_ for more
+information.
+
+
+Making your Kallithea instance publicly available
+-------------------------------------------------
+
+If you followed the instructions above, the Kallithea instance will be
+listening on ``http://localhost:5000`` and therefore not publicly available.
+There are several ways to change this.
+
+The direct way
+^^^^^^^^^^^^^^
+
+The simplest setup is to instruct Kallithea to listen on another IP address
+and/or port by using the ``config_hash`` parameter of the Kallithea Puppet
+class. For example, assume we want to listen on all interfaces on port 80:
+
+.. code-block:: puppet
+
+    class { 'kallithea':
+      seed_db => true,
+      config_hash => {
+        "server:main" => {
+          'host' => '0.0.0.0',
+          'port' => '80',
+        }
+      }
+    }
+
+Using Apache as reverse proxy
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In a more advanced setup, you might instead want use a full-blown web server
+like Apache HTTP Server as the public web server, configured such that requests
+are internally forwarded to the local Kallithea instance (a so called *reverse
+proxy setup*). This can be easily done with Puppet as well:
+
+First, install the `puppetlabs/apache
+<https://forge.puppetlabs.com/puppetlabs/apache>`_ Puppet module as above by running the following as root:
+
+.. code-block:: bash
+
+    puppet module install puppetlabs/apache
+
+Then, append the following to your manifest:
+
+.. code-block:: puppet
+
+    include apache
+
+    apache::vhost { 'kallithea.example.com':
+      docroot             => '/var/www/html',
+      manage_docroot      => false,
+      port                => 80,
+      proxy_preserve_host => true,
+      proxy_pass          => [
+        {
+          path => '/',
+          url  => 'http://localhost:5000/',
+        },
+      ],
+    }
+
+Applying the resulting manifest will install the Apache web server and setup a
+virtual host acting as a reverse proxy for your local Kallithea instance.
--- a/docs/installation_win.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/installation_win.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -71,7 +71,7 @@
 
 - Go to https://bootstrap.pypa.io
 - Right-click on get-pip.py and choose Saves as...
-- Run "python get-pip.py" in the folder where you downloaded get-pip.py (may require admin access).
+- Run "python2 get-pip.py" in the folder where you downloaded get-pip.py (may require admin access).
 
 .. note::
 
@@ -134,6 +134,7 @@
 
   cd C:\Kallithea\Env\Scripts
   activate
+  pip install --upgrade pip setuptools
 
 The prompt will change into "(Env) C:\\Kallithea\\Env\\Scripts" or similar
 (depending of your folder structure). Then type::
--- a/docs/installation_win_old.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/installation_win_old.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -151,7 +151,7 @@
 do so, open a CMD (Python Path should be included in Step3), navigate
 where you downloaded "virtualenv.py", and write::
 
- python virtualenv.py C:\Kallithea\Env
+  python2 virtualenv.py C:\Kallithea\Env
 
 (--no-site-packages is now the default behaviour of virtualenv, no need
 to include it)
@@ -183,6 +183,7 @@
 
   cd C:\Kallithea\Env\Scripts (or similar)
   activate
+  pip install --upgrade pip setuptools
 
 The prompt will change into "(Env) C:\\Kallithea\\Env\\Scripts" or similar
 (depending of your folder structure). Then type::
--- a/docs/setup.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/setup.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -36,7 +36,7 @@
 The ``setup-db`` values can also be given on the command line.
 Example::
 
-    paster setup-db my.ini --user=nn --password=secret --email=nn@example.org --repos=/srv/repos
+    paster setup-db my.ini --user=nn --password=secret --email=nn@example.com --repos=/srv/repos
 
 The ``setup-db`` command will create all needed tables and an
 admin account. When choosing a root path you can either use a new
@@ -108,7 +108,7 @@
 example set to ``/srv/repos`` and the repository you are using is
 named ``kallithea``, then to clone via ssh you should run::
 
-    hg clone ssh://user@server.com//srv/repos/kallithea
+    hg clone ssh://user@kallithea.example.com/srv/repos/kallithea
 
 Using other external tools such as mercurial-server_ or using ssh key-based
 authentication is fully supported.
@@ -176,7 +176,7 @@
 
  Connection settings
  Enable LDAP          = checked
- Host                 = host.example.org
+ Host                 = host.example.com
  Port                 = 389
  Account              = <account>
  Password             = <password>
@@ -443,7 +443,7 @@
 uncomment the following variables in the ini file::
 
     issue_pat = (?:^#|\s#)(\w+)
-    issue_server_link = https://myissueserver.com/{repo}/issue/{id}
+    issue_server_link = https://issues.example.com/{repo}/issue/{id}
     issue_prefix = #
 
 ``issue_pat`` is the regular expression describing which strings in
@@ -461,13 +461,13 @@
 
 .. code-block:: html
 
-  <a href="https://myissueserver.com/example_repo/issue/300">ISSUE-300</a>
+  <a href="https://issues.example.com/example_repo/issue/300">ISSUE-300</a>
 
 If needed, more than one pattern can be specified by appending a unique suffix to
 the variables. For example::
 
     issue_pat_wiki = (?:wiki-)(.+)
-    issue_server_link_wiki = https://mywiki.com/{id}
+    issue_server_link_wiki = https://wiki.example.com/{id}
     issue_prefix_wiki = WIKI-
 
 With these settings, wiki pages can be referenced as wiki-some-id, and every
@@ -475,7 +475,7 @@
 
 .. code-block:: html
 
-  <a href="https://mywiki.com/some-id">WIKI-some-id</a>
+  <a href="https://wiki.example.com/some-id">WIKI-some-id</a>
 
 
 Hook management
@@ -569,7 +569,7 @@
     ## gist alias
     server {
        listen          443;
-       server_name     gist.myserver.com;
+       server_name     gist.example.com;
        access_log      /var/log/nginx/gist.access.log;
        error_log       /var/log/nginx/gist.error.log;
 
@@ -583,13 +583,13 @@
        ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;
        ssl_prefer_server_ciphers on;
 
-       rewrite ^/(.+)$ https://your.kallithea.server/_admin/gists/$1;
-       rewrite (.*)    https://your.kallithea.server/_admin/gists;
+       rewrite ^/(.+)$ https://kallithea.example.com/_admin/gists/$1;
+       rewrite (.*)    https://kallithea.example.com/_admin/gists;
     }
 
     server {
        listen          443;
-       server_name     your.kallithea.server;
+       server_name     kallithea.example.com
        access_log      /var/log/nginx/kallithea.access.log;
        error_log       /var/log/nginx/kallithea.error.log;
 
@@ -612,7 +612,7 @@
        }
 
        location @kallithea {
-            proxy_pass      http://kallithea;
+            proxy_pass      http://127.0.0.1:5000;
        }
 
     }
@@ -648,8 +648,7 @@
 .. code-block:: apache
 
     <VirtualHost *:80>
-            ServerName hg.myserver.com
-            ServerAlias hg.myserver.com
+            ServerName kallithea.example.com
 
             <Proxy *>
               # For Apache 2.4 and later:
--- a/docs/usage/general.rst	Tue Sep 08 10:56:22 2015 +0000
+++ b/docs/usage/general.rst	Fri Oct 02 22:46:15 2015 +0200
@@ -78,11 +78,11 @@
 Due to the complicated nature of repository grouping, URLs of repositories
 can often change. For example, a repository originally accessible from::
 
-  http://example.com/repo_name
+  http://kallithea.example.com/repo_name
 
 would get a new URL after moving it to test_group::
 
-  http://example.com/test_group/repo_name
+  http://kallithea.example.com/test_group/repo_name
 
 Such moving of a repository to a group can be an issue for build systems and
 other scripts where the repository paths are hardcoded. To mitigate this,
@@ -94,7 +94,7 @@
 
 In the example, the repository could also be accessible as::
 
-  http://example.com/_<ID>
+  http://kallithea.example.com/_<ID>
 
 The ID of a given repository can be shown from the repository ``Summary`` page,
 by selecting the ``Show by ID`` button next to ``Clone URL``.
@@ -137,7 +137,7 @@
 
 If you need to clone repositories that are protected via basic authentication,
 you can pass the credentials in the URL, e.g.
-``http://user:passw@remote.server/repo``. Kallithea will then try to login and
+``http://user:passw@remote.example.com/repo``. Kallithea will then try to login and
 clone using the given credentials. Please note that the given credentials will
 be stored as plaintext inside the database. However, the authentication
 information will not be shown in the clone URL on the summary page.
--- a/kallithea/__init__.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/__init__.py	Fri Oct 02 22:46:15 2015 +0200
@@ -29,7 +29,7 @@
 import sys
 import platform
 
-VERSION = (0, 2, 2)
+VERSION = (0, 3)
 BACKENDS = {
     'hg': 'Mercurial repository',
     'git': 'Git repository',
--- a/kallithea/bin/kallithea_api.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/bin/kallithea_api.py	Fri Oct 02 22:46:15 2015 +0200
@@ -36,7 +36,7 @@
       "kallithea-api [-h] [--format=FORMAT] [--apikey=APIKEY] [--apihost=APIHOST] "
       "[--config=CONFIG] [--save-config] "
       "METHOD <key:val> <key2:val> ...\n"
-      "Create config file: kallithea-api --apikey=<key> --apihost=http://your.kallithea.server --save-config"
+      "Create config file: kallithea-api --apikey=<key> --apihost=http://kallithea.example.com --save-config"
     )
 
     parser = argparse.ArgumentParser(description='Kallithea API cli',
--- a/kallithea/bin/kallithea_gist.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/bin/kallithea_gist.py	Fri Oct 02 22:46:15 2015 +0200
@@ -39,7 +39,7 @@
       "kallithea-gist [-h] [--format=FORMAT] [--apikey=APIKEY] [--apihost=APIHOST] "
       "[--config=CONFIG] [--save-config] [GIST OPTIONS] "
       "[filename or stdin use - for terminal stdin ]\n"
-      "Create config file: kallithea-gist --apikey=<key> --apihost=http://your.kallithea.server --save-config"
+      "Create config file: kallithea-gist --apikey=<key> --apihost=http://kallithea.example.com --save-config"
     )
 
     parser = argparse.ArgumentParser(description='Kallithea Gist cli',
--- a/kallithea/bin/ldap_sync.conf	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/bin/ldap_sync.conf	Fri Oct 02 22:46:15 2015 +0200
@@ -1,11 +1,11 @@
 [default]
-api_url = http://your.kallithea.server:5000/_admin/api
+api_url = http://kallithea.example.com/_admin/api
 api_user = admin
 api_key = XXXXXXXXXXXX
 
-ldap_uri = ldap://your.ldap.server:389
-ldap_user = cn=kallithea,ou=binders,dc=linaro,dc=org
+ldap_uri = ldap://ldap.example.com:389
+ldap_user = cn=kallithea,dc=example,dc=com
 ldap_key = XXXXXXXXX
-base_dn = dc=linaro,dc=org
+base_dn = dc=example,dc=com
 
 sync_users = True
\ No newline at end of file
--- a/kallithea/bin/template.ini.mako	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/bin/template.ini.mako	Fri Oct 02 22:46:15 2015 +0200
@@ -51,7 +51,7 @@
 <%text>## SMTP server settings</%text>
 <%text>## Only smtp_server is mandatory. All other settings take the specified default</%text>
 <%text>## values.</%text>
-#smtp_server = mail.server.com
+#smtp_server = smtp.example.com
 #smtp_username =
 #smtp_password =
 #smtp_port = 25
@@ -226,8 +226,8 @@
 
 <%text>## gist URL alias, used to create nicer urls for gist. This should be an</%text>
 <%text>## url that does rewrites to _admin/gists/<gistid>.</%text>
-<%text>## example: http://gist.kallithea.server/{gistid}. Empty means use the internal</%text>
-<%text>## Kallithea url, ie. http[s]://your.kallithea.server/_admin/gists/<gistid></%text>
+<%text>## example: http://gist.example.com/{gistid}. Empty means use the internal</%text>
+<%text>## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid></%text>
 gist_alias_url =
 
 <%text>## white list of API enabled controllers. This allows to add list of</%text>
@@ -262,7 +262,7 @@
 <%text>## fetched from the regex and {repo} is replaced with full repository name</%text>
 <%text>## including groups {repo_name} is replaced with just name of repo</%text>
 
-issue_server_link = https://myissueserver.com/{repo}/issue/{id}
+issue_server_link = https://issues.example.com/{repo}/issue/{id}
 
 <%text>## prefix to add to link to indicate it's an url</%text>
 <%text>## #314 will be replaced by <issue_prefix><id></%text>
@@ -272,10 +272,10 @@
 <%text>## issue_pat, issue_server_link, issue_prefix can have suffixes to specify</%text>
 <%text>## multiple patterns, to other issues server, wiki or others</%text>
 <%text>## below an example how to create a wiki pattern</%text>
-# wiki-some-id -> https://mywiki.com/some-id
+# wiki-some-id -> https://wiki.example.com/some-id
 
 #issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://mywiki.com/{id}
+#issue_server_link_wiki = https://wiki.example.com/{id}
 #issue_prefix_wiki = WIKI-
 
 <%text>## instance-id prefix</%text>
--- a/kallithea/config/deployment.ini_tmpl	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/config/deployment.ini_tmpl	Fri Oct 02 22:46:15 2015 +0200
@@ -52,7 +52,7 @@
 ## SMTP server settings
 ## Only smtp_server is mandatory. All other settings take the specified default
 ## values.
-#smtp_server = mail.server.com
+#smtp_server = smtp.example.com
 #smtp_username =
 #smtp_password =
 #smtp_port = 25
@@ -222,8 +222,8 @@
 
 ## gist URL alias, used to create nicer urls for gist. This should be an
 ## url that does rewrites to _admin/gists/<gistid>.
-## example: http://gist.kallithea.server/{gistid}. Empty means use the internal
-## Kallithea url, ie. http[s]://your.kallithea.server/_admin/gists/<gistid>
+## example: http://gist.example.com/{gistid}. Empty means use the internal
+## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid>
 gist_alias_url =
 
 ## white list of API enabled controllers. This allows to add list of
@@ -258,7 +258,7 @@
 ## fetched from the regex and {repo} is replaced with full repository name
 ## including groups {repo_name} is replaced with just name of repo
 
-issue_server_link = https://myissueserver.com/{repo}/issue/{id}
+issue_server_link = https://issues.example.com/{repo}/issue/{id}
 
 ## prefix to add to link to indicate it's an url
 ## #314 will be replaced by <issue_prefix><id>
@@ -268,10 +268,10 @@
 ## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
 ## multiple patterns, to other issues server, wiki or others
 ## below an example how to create a wiki pattern
-# wiki-some-id -> https://mywiki.com/some-id
+# wiki-some-id -> https://wiki.example.com/some-id
 
 #issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://mywiki.com/{id}
+#issue_server_link_wiki = https://wiki.example.com/{id}
 #issue_prefix_wiki = WIKI-
 
 ## instance-id prefix
--- a/kallithea/controllers/changelog.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/controllers/changelog.py	Fri Oct 02 22:46:15 2015 +0200
@@ -98,7 +98,6 @@
         # TODO: Somehow just don't send this extra junk in the GET URL
         if request.GET.get('set'):
             request.GET.pop('set', None)
-            request.GET.pop('_authentication_token', None)
             if revision is None:
                 return redirect(url('changelog_home', repo_name=repo_name, **request.GET))
             return redirect(url('changelog_file_home', repo_name=repo_name, revision=revision, f_path=f_path, **request.GET))
--- a/kallithea/controllers/login.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/controllers/login.py	Fri Oct 02 22:46:15 2015 +0200
@@ -27,8 +27,8 @@
 
 
 import logging
+import re
 import formencode
-import urlparse
 
 from formencode import htmlfill
 from webob.exc import HTTPFound, HTTPBadRequest
@@ -56,32 +56,27 @@
     def __before__(self):
         super(LoginController, self).__before__()
 
-    def _validate_came_from(self, came_from):
-        """Return True if came_from is valid and can and should be used"""
-        if not came_from:
-            return False
+    def _validate_came_from(self, came_from,
+            _re=re.compile(r"/(?!/)[-!#$%&'()*+,./:;=?@_~0-9A-Za-z]*$")):
+        """Return True if came_from is valid and can and should be used.
+
+        Determines if a URI reference is valid and relative to the origin;
+        or in RFC 3986 terms, whether it matches this production:
 
-        parsed = urlparse.urlparse(came_from)
-        server_parsed = urlparse.urlparse(url.current())
-        allowed_schemes = ['http', 'https']
-        if parsed.scheme and parsed.scheme not in allowed_schemes:
-            log.error('Suspicious URL scheme detected %s for url %s',
-                     parsed.scheme, parsed)
-            return False
-        if server_parsed.netloc != parsed.netloc:
-            log.error('Suspicious NETLOC detected %s for url %s server url '
-                      'is: %s' % (parsed.netloc, parsed, server_parsed))
-            return False
-        return True
+          origin-relative-ref = path-absolute [ "?" query ] [ "#" fragment ]
 
-    def _redirect_to_origin(self, origin):
-        '''redirect to the original page, preserving any get arguments given'''
-        request.GET.pop('came_from', None)
-        raise HTTPFound(location=url(origin, **request.GET))
+        with the exception that '%' escapes are not validated and '#' is
+        allowed inside the fragment part.
+        """
+        return _re.match(came_from) is not None
 
     def index(self):
         c.came_from = safe_str(request.GET.get('came_from', ''))
-        if not self._validate_came_from(c.came_from):
+        if c.came_from:
+            if not self._validate_came_from(c.came_from):
+                log.error('Invalid came_from (not server-relative): %r', c.came_from)
+                raise HTTPBadRequest()
+        else:
             c.came_from = url('home')
 
         not_default = self.authuser.username != User.DEFAULT_USER
@@ -89,7 +84,7 @@
 
         # redirect if already logged in
         if self.authuser.is_authenticated and not_default and ip_allowed:
-            return self._redirect_to_origin(c.came_from)
+            raise HTTPFound(location=c.came_from)
 
         if request.POST:
             # import Login Form validator class
@@ -119,7 +114,7 @@
             else:
                 log_in_user(user, c.form_result['remember'],
                     is_external_auth=False)
-                return self._redirect_to_origin(c.came_from)
+                raise HTTPFound(location=c.came_from)
 
         return render('/login.html')
 
--- a/kallithea/controllers/pullrequests.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/controllers/pullrequests.py	Fri Oct 02 22:46:15 2015 +0200
@@ -502,9 +502,10 @@
         pull_request.title = _form['pullrequest_title']
         pull_request.description = _form['pullrequest_desc'].strip() or _('No description')
         pull_request.owner = User.get_by_username(_form['owner'])
+        user = User.get(c.authuser.user_id)
         try:
-            PullRequestModel().mention_from_description(pull_request, old_description)
-            PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
+            PullRequestModel().mention_from_description(user, pull_request, old_description)
+            PullRequestModel().update_reviewers(user, pull_request_id, reviewers_ids)
         except UserInvalidException as u:
             h.flash(_('Invalid reviewer "%s" specified') % u, category='error')
             raise HTTPBadRequest()
@@ -590,7 +591,7 @@
             # candidates: descendants of old head that are on the right branch
             #             and not are the old head itself ...
             #             and nothing at all if old head is a descendant of target ref name
-            if other_scm_instance._repo.revs('present(%s)::&%s', c.cs_ranges[-1].raw_id, c.a_branch_name):
+            if not c.is_range and other_scm_instance._repo.revs('present(%s)::&%s', c.cs_ranges[-1].raw_id, c.a_branch_name):
                 c.update_msg = _('This pull request has already been merged to %s.') % c.a_branch_name
             elif c.pull_request.is_closed():
                 c.update_msg = _('This pull request has been closed and can not be updated.')
@@ -614,10 +615,11 @@
                     c.update_msg = _('This pull request can be updated with changes on %s:') % c.cs_branch_name
                 else:
                     show = set()
+                    avail_revs = set() # drop revs[0]
                     c.update_msg = _('No changesets found for updating this pull request.')
 
                 # TODO: handle branch heads that not are tip-most
-                brevs = org_scm_instance._repo.revs('%s - %ld', c.cs_branch_name, avail_revs)
+                brevs = org_scm_instance._repo.revs('%s - %ld - %s', c.cs_branch_name, avail_revs, revs[0])
                 if brevs:
                     # also show changesets that are on branch but neither ancestors nor descendants
                     show.update(org_scm_instance._repo.revs('::%ld - ::%ld - ::%s', brevs, avail_revs, c.a_branch_name))
--- a/kallithea/controllers/summary.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/controllers/summary.py	Fri Oct 02 22:46:15 2015 +0200
@@ -195,6 +195,7 @@
         stats = self.sa.query(Statistics)\
             .filter(Statistics.repository == c.db_repo)\
             .scalar()
+        c.stats_percentage = 0
         if stats and stats.languages:
             c.no_data = False is c.db_repo.enable_statistics
             lang_stats_d = json.loads(stats.languages)
--- a/kallithea/i18n/fr/LC_MESSAGES/kallithea.po	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/i18n/fr/LC_MESSAGES/kallithea.po	Fri Oct 02 22:46:15 2015 +0200
@@ -8,10 +8,10 @@
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
 "POT-Creation-Date: 2015-09-08 10:34+0200\n"
-"PO-Revision-Date: 2015-09-07 16:35+0200\n"
-"Last-Translator: Andrew Shadura <andrew@shadura.me>\n"
+"PO-Revision-Date: 2015-09-10 15:13+0200\n"
+"Last-Translator: Étienne Gilli <etienne.gilli@gmail.com>\n"
 "Language-Team: French "
-"<https://hosted.weblate.org/projects/kallithea/kallithea/fr/>\n"
+"<https://hosted.weblate.org/projects/kallithea/stable/fr/>\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -50,9 +50,9 @@
 msgstr "Ignorer les espaces et tabulations"
 
 #: kallithea/controllers/changeset.py:169
-#, fuzzy, python-format
+#, python-format
 msgid "Increase diff context to %(num)s lines"
-msgstr "augmenter le contexte du diff à %(num)s lignes"
+msgstr "Augmenter le contexte du diff à %(num)s lignes"
 
 #: kallithea/controllers/changeset.py:212 kallithea/controllers/files.py:96
 #: kallithea/controllers/files.py:116 kallithea/controllers/files.py:742
@@ -299,8 +299,7 @@
 msgid "Journal"
 msgstr "Historique"
 
-#: kallithea/controllers/login.py:150 kallithea/controllers/login.py:196
-#| msgid "bad captcha"
+#: kallithea/controllers/login.py:151 kallithea/controllers/login.py:197
 msgid "Bad captcha"
 msgstr "Mauvais captcha"
 
@@ -309,16 +308,15 @@
 msgstr "Vous vous êtes inscrits avec succès à Kallithea"
 
 #: kallithea/controllers/login.py:202
-#, fuzzy
 #| msgid "Your password reset link was sent"
 msgid "A password reset confirmation code has been sent"
-msgstr "Un lien de rénitialisation de votre mot de passe vous a été envoyé"
+msgstr ""
+"Un lien de confirmation de réinitialisation de mot de passe a été envoyé"
 
 #: kallithea/controllers/login.py:251
-#, fuzzy
 #| msgid "Password reset link"
 msgid "Invalid password reset token"
-msgstr "Lien de remise à zéro du mot de passe"
+msgstr "Clé de réinitialisation de mot de passe invalide"
 
 #: kallithea/controllers/login.py:256
 #: kallithea/controllers/admin/my_account.py:167
@@ -438,7 +436,7 @@
 
 #: kallithea/controllers/pullrequests.py:617
 msgid "No changesets found for updating this pull request."
-msgstr "Pas de changeset trouvé pour ce pull request"
+msgstr "Pas de changeset trouvé pour ce pull request."
 
 #: kallithea/controllers/pullrequests.py:625
 #, python-format
@@ -451,7 +449,7 @@
 
 #: kallithea/controllers/pullrequests.py:722
 msgid "No permission to change pull request status"
-msgstr ""
+msgstr "Permission manquante pour changer le statut du pull request"
 
 #: kallithea/controllers/pullrequests.py:727
 msgid "Closing."
@@ -502,9 +500,8 @@
 #: kallithea/controllers/admin/gists.py:59
 #: kallithea/controllers/admin/my_account.py:243
 #: kallithea/controllers/admin/users.py:285
-#, fuzzy
 msgid "Forever"
-msgstr "pour toujours"
+msgstr "Pour toujours"
 
 #: kallithea/controllers/admin/gists.py:60
 #: kallithea/controllers/admin/my_account.py:244
@@ -546,9 +543,8 @@
 msgstr "Gist %s supprimé"
 
 #: kallithea/controllers/admin/gists.py:233
-#, fuzzy
 msgid "Unmodified"
-msgstr "non modifié"
+msgstr "Non modifié"
 
 #: kallithea/controllers/admin/gists.py:262
 msgid "Successfully updated gist content"
@@ -832,9 +828,9 @@
 msgstr "Dépôt %s supprimé"
 
 #: kallithea/controllers/admin/repos.py:321
-#, fuzzy, python-format
+#, python-format
 msgid "Cannot delete repository %s which still has forks"
-msgstr "Impossible de supprimer le dépôt %s : Des forks y sont attachés"
+msgstr "Impossible de supprimer le dépôt %s : des forks y sont attachés"
 
 #: kallithea/controllers/admin/repos.py:326
 #, python-format
@@ -882,15 +878,13 @@
 
 #: kallithea/controllers/admin/repos.py:537
 #: kallithea/controllers/admin/repos.py:564
-#, fuzzy
 msgid "Repository has been locked"
-msgstr "Ce dépôt n’est pas verrouillé"
+msgstr "Ce dépôt a été verrouillé"
 
 #: kallithea/controllers/admin/repos.py:540
 #: kallithea/controllers/admin/repos.py:561
-#, fuzzy
 msgid "Repository has been unlocked"
-msgstr "Ce dépôt n’est pas verrouillé"
+msgstr "Ce dépôt a été déverrouillé"
 
 #: kallithea/controllers/admin/repos.py:543
 #: kallithea/controllers/admin/repos.py:568
@@ -1049,7 +1043,7 @@
 
 #: kallithea/controllers/admin/users.py:236
 msgid "The default user cannot be edited"
-msgstr ""
+msgstr "L'utilisateur par défaut ne peut pas être modifié"
 
 #: kallithea/controllers/admin/users.py:463
 #, python-format
@@ -1070,9 +1064,8 @@
 msgstr "IP %s non autorisée"
 
 #: kallithea/lib/auth.py:756
-#, fuzzy
 msgid "Invalid API key"
-msgstr "Nouvelle clé d'API"
+msgstr "Clé d'API invalide"
 
 #: kallithea/lib/auth.py:812
 msgid "You need to be a registered user to perform this action"
@@ -1084,7 +1077,7 @@
 
 #: kallithea/lib/base.py:490
 msgid "Repository not found in the filesystem"
-msgstr ""
+msgstr "Dépôt non trouvé sur le système de fichiers"
 
 #: kallithea/lib/base.py:516 kallithea/lib/helpers.py:622
 msgid "Changeset not found"
@@ -1120,9 +1113,8 @@
 msgstr "Afficher les changements combinés %s->%s"
 
 #: kallithea/lib/helpers.py:677
-#, fuzzy
 msgid "Compare view"
-msgstr "vue de comparaison"
+msgstr "Vue de comparaison"
 
 #: kallithea/lib/helpers.py:696
 msgid "and"
@@ -1138,14 +1130,14 @@
 msgstr "révisions"
 
 #: kallithea/lib/helpers.py:722
-#, fuzzy, python-format
+#, python-format
 msgid "Fork name %s"
-msgstr "nom du fork %s"
+msgstr "Nom du fork %s"
 
 #: kallithea/lib/helpers.py:742
-#, fuzzy, python-format
+#, python-format
 msgid "Pull request %s"
-msgstr "Requête de pull #%s"
+msgstr "Requête de pull %s"
 
 #: kallithea/lib/helpers.py:752
 msgid "[deleted] repository"
@@ -1236,7 +1228,7 @@
 #: kallithea/templates/compare/compare_diff.html:65
 #: kallithea/templates/pullrequests/pullrequest_show.html:326
 msgid "No files"
-msgstr ""
+msgstr "Aucun fichier"
 
 #: kallithea/lib/helpers.py:1194
 msgid "new file"
@@ -1781,111 +1773,113 @@
 
 #: kallithea/model/db.py:1667
 msgid "Default user has no access to new repositories"
-msgstr ""
+msgstr "L'utilisateur par défaut n'a pas accès aux nouveaux dépôts"
 
 #: kallithea/model/db.py:1668
-#, fuzzy
 msgid "Default user has read access to new repositories"
-msgstr "Accès interdit à cette ressource"
+msgstr "L'utilisateur par défaut a un accès en lecture aux nouveaux dépôts"
 
 #: kallithea/model/db.py:1669
-#, fuzzy
 msgid "Default user has write access to new repositories"
-msgstr "Accès interdit à cette ressource"
+msgstr "L'utilisateur par défaut a un accès en écriture aux nouveaux dépôts"
 
 #: kallithea/model/db.py:1670
 msgid "Default user has admin access to new repositories"
-msgstr ""
+msgstr "L'utilisateur par défaut a un accès administrateur aux nouveaux dépôts"
 
 #: kallithea/model/db.py:1672
 msgid "Default user has no access to new repository groups"
-msgstr ""
+msgstr "L'utilisateur par défaut n'a pas accès aux nouveaux groupes de dépôts"
 
 #: kallithea/model/db.py:1673
 msgid "Default user has read access to new repository groups"
 msgstr ""
+"L'utilisateur par défaut a accès en lecture seule aux nouveaux groupes de "
+"dépôts"
 
 #: kallithea/model/db.py:1674
 msgid "Default user has write access to new repository groups"
 msgstr ""
+"L'utilisateur par défaut a accès en écriture aux nouveaux groupes de dépôts"
 
 #: kallithea/model/db.py:1675
 msgid "Default user has admin access to new repository groups"
 msgstr ""
+"L'utilisateur par défaut a accès administrateur aux nouveaux groupes de "
+"dépôts"
 
 #: kallithea/model/db.py:1677
 msgid "Default user has no access to new user groups"
 msgstr ""
+"L'utilisateur par défaut n'a pas accès aux nouveaux groupes d'utilisateurs"
 
 #: kallithea/model/db.py:1678
 msgid "Default user has read access to new user groups"
 msgstr ""
+"L'utilisateur par défaut a accès en lecture seule aux nouveaux groupes "
+"d'utilisateurs"
 
 #: kallithea/model/db.py:1679
 msgid "Default user has write access to new user groups"
 msgstr ""
+"L'utilisateur par défaut a accès en écriture aux nouveaux groupes "
+"d'utilisateurs"
 
 #: kallithea/model/db.py:1680
 msgid "Default user has admin access to new user groups"
 msgstr ""
+"L'utilisateur par défaut a un accès administrateur aux nouveaux groupes "
+"d'utilisateurs"
 
 #: kallithea/model/db.py:1682
-#, fuzzy
 msgid "Only admins can create repository groups"
-msgstr "Groupe de dépôts %s créé"
+msgstr "Seul un administrateur peut créer un groupe de dépôts"
 
 #: kallithea/model/db.py:1683
-#, fuzzy
 msgid "Non-admins can create repository groups"
-msgstr "Groupe de dépôts %s créé"
+msgstr ""
+"Les utilisateurs non-administrateurs peuvent créer des groupes de dépôts"
 
 #: kallithea/model/db.py:1685
-#, fuzzy
 msgid "Only admins can create user groups"
-msgstr "[créé] groupe d'utilisateurs"
+msgstr "Seul un administrateur peut créer des groupes d'utilisateurs"
 
 #: kallithea/model/db.py:1686
-#, fuzzy
 msgid "Non-admins can create user groups"
-msgstr "[créé] groupe d'utilisateurs"
+msgstr ""
+"Les utilisateurs non-administrateurs peuvent créer des groupes d'utilisateurs"
 
 #: kallithea/model/db.py:1688
-#, fuzzy
 msgid "Only admins can create top level repositories"
-msgstr "Dépôts de niveau supérieur"
+msgstr "Seul un administrateur peut créer des dépôts de niveau supérieur"
 
 #: kallithea/model/db.py:1689
-#, fuzzy
 msgid "Non-admins can create top level repositories"
-msgstr "Dépôts de niveau supérieur"
+msgstr ""
+"Les utilisateurs non-administrateurs peuvent créer des dépôts de niveau "
+"supérieur"
 
 #: kallithea/model/db.py:1694
-#, fuzzy
 msgid "Only admins can fork repositories"
-msgstr "Dépôts totaux"
+msgstr "Seul un administrateur peut faire un fork de dépôt"
 
 #: kallithea/model/db.py:1695
-#, fuzzy
 msgid "Non-admins can can fork repositories"
-msgstr "Invalider le cache pour tous les dépôts"
+msgstr "Les utilisateurs non-administrateurs peuvent faire un fork de dépôt"
 
 #: kallithea/model/db.py:1698
-#, fuzzy
 msgid "User registration with manual account activation"
 msgstr "Enregistrement des utilisateurs avec activation de compte manuelle"
 
 #: kallithea/model/db.py:1699
-#, fuzzy
 msgid "User registration with automatic account activation"
 msgstr "Enregistrement des utilisateurs avec activation de compte automatique"
 
 #: kallithea/model/db.py:2228
-#, fuzzy
 msgid "Not reviewed"
 msgstr "Pas encore relue"
 
 #: kallithea/model/db.py:2231
-#, fuzzy
 msgid "Under review"
 msgstr "En cours de relecture"
 
@@ -1912,34 +1906,34 @@
 msgstr "Le nom ne doit pas contenir seulement des chiffres"
 
 #: kallithea/model/notification.py:254
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s commented on changeset %(age)s"
-msgstr "%(user)s a commenté sur le changeset à %(when)s"
+msgstr "%(user)s a commenté sur le changeset %(age)s"
 
 #: kallithea/model/notification.py:255
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s sent message %(age)s"
-msgstr "%(user)s a envoyé un message à %(when)s"
+msgstr "%(user)s a envoyé un message %(age)s"
 
 #: kallithea/model/notification.py:256
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s mentioned you %(age)s"
-msgstr "%(user)s vous a mentionné à %(when)s"
+msgstr "%(user)s vous a mentionné %(age)s"
 
 #: kallithea/model/notification.py:257
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s registered in Kallithea %(age)s"
-msgstr "%(user)s s'est enregistré sur Kallithea à %(when)s"
+msgstr "%(user)s s'est enregistré sur Kallithea %(age)s"
 
 #: kallithea/model/notification.py:258
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s opened new pull request %(age)s"
-msgstr "%(user)s a ouvert une nouvelle demande de pull à %(when)s"
+msgstr "%(user)s a ouvert une nouvelle demande de pull %(age)s"
 
 #: kallithea/model/notification.py:259
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s commented on pull request %(age)s"
-msgstr "%(user)s a commenté la demande de pull à %(when)s"
+msgstr "%(user)s a commenté la demande de pull %(age)s"
 
 #: kallithea/model/notification.py:266
 #, python-format
@@ -1974,7 +1968,7 @@
 #: kallithea/model/notification.py:302
 #, python-format
 msgid "[Comment] %(repo_name)s changeset %(short_id)s on %(branch)s"
-msgstr ""
+msgstr "[Commentaire] Changeset %(short_id)s de %(repo_name)s dans %(branch)s"
 
 #: kallithea/model/notification.py:305
 #, python-format
@@ -1982,29 +1976,30 @@
 msgstr "Nouvel utilisateur %(new_username)s enregistré"
 
 #: kallithea/model/notification.py:307
-#, fuzzy, python-format
-#| msgid "%(user)s wants you to review pull request %(pr_nice_id)s:
-#| %(pr_title)s"
+#, python-format
+#| msgid "%(user)s wants you to review pull request %(pr_nice_id)s:"
 msgid "[Added] %(repo_name)s pull request %(pr_nice_id)s from %(ref)s"
 msgstr ""
-"%(user)s veut que vous regardiez la demande de pull #%(pr_id)s : "
-"%(pr_title)s"
+"[Ajouté] Demande de pull %(pr_nice_id)s à partir de %(ref)s pour "
+"%(repo_name)s"
 
 #: kallithea/model/notification.py:308
-#, fuzzy, python-format
+#, python-format
 #| msgid "[commented] on pull request for"
 msgid "[Comment] %(repo_name)s pull request %(pr_nice_id)s from %(ref)s"
-msgstr "[a commenté] la requête de pull pour"
+msgstr ""
+"[Commentaire] Demande de pull %(pr_nice_id)s à partir de %(ref)s pour "
+"%(repo_name)s"
 
 #: kallithea/model/notification.py:321
 msgid "Closing"
 msgstr "Fermeture"
 
 #: kallithea/model/pull_request.py:137
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 msgstr ""
-"%(user)s veut que vous regardiez la demande de pull #%(pr_id)s : "
+"%(user)s veut que vous regardiez la demande de pull %(pr_nice_id)s : "
 "%(pr_title)s"
 
 #: kallithea/model/scm.py:812
@@ -2016,11 +2011,10 @@
 msgstr "Nouveau enregistrement d'utilisateur"
 
 #: kallithea/model/user.py:256
-#, fuzzy
 msgid "You can't remove this user since it is crucial for the entire application"
 msgstr ""
-"Vous ne pouvez pas supprimer cet utilisateur ; il est nécessaire pour le "
-"bon fonctionnement de l’application"
+"Vous ne pouvez pas supprimer cet utilisateur ; il est nécessaire pour le bon "
+"fonctionnement de l’application"
 
 #: kallithea/model/user.py:261
 #, python-format
@@ -2041,23 +2035,23 @@
 "supprimé. Changez les propriétaires ou supprimez ces dépôts : %s"
 
 #: kallithea/model/user.py:273
-#, fuzzy, python-format
+#, python-format
 msgid ""
 "User \"%s\" still owns %s user groups and cannot be removed. Switch "
 "owners or remove those user groups: %s"
 msgstr ""
-"L’utilisateur « %s » possède %s dépôts et ne peut être supprimé. Changez "
-"les propriétaires de ces dépôts. %s"
+"L’utilisateur « %s » possède %s groupes d'utilisateurs et ne peut pas être "
+"supprimé. Changez les propriétaires de ces groupes d'utilisateurs ou "
+"supprimez-les : %s"
 
 #: kallithea/model/user.py:360
 msgid "Password reset link"
 msgstr "Lien de remise à zéro du mot de passe"
 
 #: kallithea/model/user.py:408
-#, fuzzy
 #| msgid "Password reset link"
 msgid "Password reset notification"
-msgstr "Lien de remise à zéro du mot de passe"
+msgstr "Notification de réinitialisation du mot de passe"
 
 #: kallithea/model/user.py:409
 #, python-format
@@ -2065,6 +2059,8 @@
 "The password to your account %s has been changed using password reset "
 "form."
 msgstr ""
+"Le mot de passe de votre compte %s a été changé via le formulaire de "
+"réinitialisation du mot de passe."
 
 #: kallithea/model/validators.py:77 kallithea/model/validators.py:78
 msgid "Value cannot be an empty list"
@@ -2076,22 +2072,18 @@
 msgstr "Le nom d’utilisateur « %(username)s » existe déjà"
 
 #: kallithea/model/validators.py:97
-#, fuzzy, python-format
+#, python-format
 msgid "Username \"%(username)s\" cannot be used"
 msgstr "Le nom d’utilisateur « %(username)s » n’est pas valide"
 
 #: kallithea/model/validators.py:99
-#, fuzzy
-#| msgid "" "Username may only contain alphanumeric characters underscores,
-#| periods or" " dashes and must begin with alphanumeric character or
-#| underscore"
 msgid ""
 "Username may only contain alphanumeric characters underscores, periods or"
 " dashes and must begin with an alphanumeric character or underscore"
 msgstr ""
-"Le pseudonyme ne peut contenir que des caractères alphanumériques, des "
-"tirets, points, traits d'union et doit commencer avec un caractère "
-"alphanumérique ou un trait d'union"
+"Le nom d'utilisateur ne peut contenir que des caractères alphanumériques, "
+"des underscores (_), points, traits d'union et doit commencer avec un "
+"caractère alphanumérique ou un underscore"
 
 #: kallithea/model/validators.py:126
 msgid "The input is not valid"
@@ -2147,16 +2139,15 @@
 msgstr "Les mots de passe ne correspondent pas"
 
 #: kallithea/model/validators.py:300
-#, fuzzy
 msgid "Invalid username or password"
-msgstr "mot de passe invalide"
+msgstr "Nom d'utilisateur ou mot de passe invalide"
 
 #: kallithea/model/validators.py:331
 msgid "Token mismatch"
 msgstr "Jeton d’authentification incorrect"
 
 #: kallithea/model/validators.py:345
-#, fuzzy, python-format
+#, python-format
 msgid "Repository name %(repo)s is not allowed"
 msgstr "Le nom de dépôt « %(repo)s » n’est pas autorisé"
 
@@ -2176,15 +2167,16 @@
 msgstr "Un groupe de dépôts avec le nom « %(repo)s » existe déjà"
 
 #: kallithea/model/validators.py:465
-#, fuzzy
 msgid "Invalid repository URL"
-msgstr "Dépôt privé"
+msgstr "URL de dépôt invalide"
 
 #: kallithea/model/validators.py:466
 msgid ""
 "Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
 "svn+https URL"
 msgstr ""
+"URL de dépôt invalide. Ce doit être une URL valide de type http, https, ssh, "
+"svn+http ou svn+https"
 
 #: kallithea/model/validators.py:489
 msgid "Fork has to be the same type as parent"
@@ -2211,14 +2203,13 @@
 msgstr "Ceci n’est pas un chemin valide"
 
 #: kallithea/model/validators.py:705
-#, fuzzy
 msgid "This email address is already in use"
 msgstr "Cette adresse e-mail est déjà enregistrée"
 
 #: kallithea/model/validators.py:725
-#, fuzzy, python-format
+#, python-format
 msgid "Email address \"%(email)s\" not found"
-msgstr "L’adresse e-mail « %(email)s » n’existe pas."
+msgstr "L’adresse e-mail « %(email)s » n’existe pas"
 
 #: kallithea/model/validators.py:762
 msgid ""
@@ -2507,46 +2498,45 @@
 msgstr "Envoyer l'E-mail de réinitialisation du mot de passe"
 
 #: kallithea/templates/password_reset.html:47
-#, fuzzy
-#| msgid "" "Password reset link will be sent to the email address matching
-#| your " "username."
+#| msgid "" "
 msgid ""
 "A password reset link will be sent to the specified email address if it "
 "is registered in the system."
 msgstr ""
-"Le lien de réinitialisation du mot de passe sera envoyé à l'adresse "
-"e-mail correspondant à votre nom d'utilisateur."
+"Un lien de réinitialisation du mot de passe sera envoyé à l'adresse e-mail "
+"indiquée si elle est enregistrée dans le système."
 
 #: kallithea/templates/password_reset_confirmation.html:19
 #, python-format
 msgid "You are about to set a new password for the email address %s."
 msgstr ""
+"Vous êtes sur le point de changer le mot de passe pour l'adresse e-mail %s."
 
 #: kallithea/templates/password_reset_confirmation.html:20
 msgid ""
 "Note that you must use the same browser session for this as the one used "
 "to request the password reset."
 msgstr ""
+"Vous devez utiliser la même session de navigateur pour cette opération que "
+"celle utilisée pour la demande de réinitialisation de mot de passe."
 
 #: kallithea/templates/password_reset_confirmation.html:30
 msgid "Code you received in the email"
-msgstr ""
+msgstr "Le code que vous avez reçu dans l'e-mail"
 
 #: kallithea/templates/password_reset_confirmation.html:39
-#, fuzzy
 #| msgid "New password"
 msgid "New Password"
 msgstr "Nouveau mot de passe"
 
 #: kallithea/templates/password_reset_confirmation.html:48
-#, fuzzy
 #| msgid "Confirm new password"
 msgid "Confirm New Password"
 msgstr "Confirmer le nouveau mot de passe"
 
 #: kallithea/templates/password_reset_confirmation.html:56
 msgid "Confirm"
-msgstr ""
+msgstr "Confirmation"
 
 #: kallithea/templates/register.html:5 kallithea/templates/register.html:14
 #: kallithea/templates/register.html:90
@@ -2589,10 +2579,12 @@
 #: kallithea/templates/register.html:92
 msgid "Registered accounts are ready to use and need no further action."
 msgstr ""
+"Les comptes enregistrés sont prêts à être utilisés, et ne nécessitent aucune "
+"autre action."
 
 #: kallithea/templates/register.html:94
 msgid "Please wait for an administrator to activate your account."
-msgstr ""
+msgstr "Merci d'attendre qu'un administrateur active votre compte."
 
 #: kallithea/templates/switch_to_list.html:10
 #: kallithea/templates/branches/branches_data.html:69
@@ -2690,16 +2682,12 @@
 msgstr "Greffons activés"
 
 #: kallithea/templates/admin/auth/auth_settings.html:33
-#, fuzzy
-#| msgid "" "Comma separated list of plugins. Order of plugins is also order in
-#| which " "Kallithea will try to authenticate user"
 msgid ""
 "Comma-separated list of plugins; Kallithea will try user authentication "
 "in plugin order"
 msgstr ""
-"Une liste séparée avec des virgules des greffons. L'ordre des greffons "
-"est aussi celui dans lequel Kallithea va essayer d'authentifier un "
-"utilisateur"
+"Une liste séparée avec des virgules des greffons. L'ordre des greffons est "
+"aussi celui dans lequel Kallithea va essayer d'authentifier un utilisateur"
 
 #: kallithea/templates/admin/auth/auth_settings.html:34
 msgid "Available built-in plugins"
@@ -2836,9 +2824,8 @@
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:27
 #: kallithea/templates/admin/users/user_edit_api_keys.html:8
 #: kallithea/templates/admin/users/user_edit_api_keys.html:27
-#, fuzzy
 msgid "Never"
-msgstr "jamais"
+msgstr "Jamais"
 
 #: kallithea/templates/admin/gists/edit.html:145
 msgid "Update Gist"
@@ -3020,9 +3007,8 @@
 msgstr "Profil"
 
 #: kallithea/templates/admin/my_account/my_account.html:36
-#, fuzzy
 msgid "Email Addresses"
-msgstr "Nouvelle adrese"
+msgstr "Adresses e-mail"
 
 #: kallithea/templates/admin/my_account/my_account.html:38
 #: kallithea/templates/admin/users/user_edit.html:31
@@ -3030,23 +3016,20 @@
 msgstr "Clés de l'API"
 
 #: kallithea/templates/admin/my_account/my_account.html:39
-#, fuzzy
 msgid "Owned Repositories"
-msgstr "Dépôts"
+msgstr "Dépôts possédés"
 
 #: kallithea/templates/admin/my_account/my_account.html:40
 #: kallithea/templates/journal/journal.html:53
-#, fuzzy
 msgid "Watched Repositories"
-msgstr "Création de dépôts"
+msgstr "Dépôts surveillés"
 
 #: kallithea/templates/admin/my_account/my_account.html:41
 #: kallithea/templates/admin/permissions/permissions.html:30
 #: kallithea/templates/admin/user_groups/user_group_edit.html:32
 #: kallithea/templates/admin/users/user_edit.html:34
-#, fuzzy
 msgid "Show Permissions"
-msgstr "Copier les permissions"
+msgstr "Afficher les permissions"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:6
 #: kallithea/templates/admin/users/user_edit_api_keys.html:6
@@ -3055,37 +3038,33 @@
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:14
 #: kallithea/templates/admin/users/user_edit_api_keys.html:14
-#, fuzzy, python-format
+#, python-format
 msgid "Confirm to reset this API key: %s"
 msgstr "Confirmer la remise à zéro de cette clé d'API : %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:30
 #: kallithea/templates/admin/users/user_edit_api_keys.html:30
-#, fuzzy
 msgid "Expired"
 msgstr "a expiré"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:40
 #: kallithea/templates/admin/users/user_edit_api_keys.html:40
-#, fuzzy, python-format
+#, python-format
 msgid "Confirm to remove this API key: %s"
 msgstr "Confirmer la suppression de cette clé d'API : %s"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:42
 #: kallithea/templates/admin/users/user_edit_api_keys.html:42
-#, fuzzy
 msgid "Remove"
-msgstr "supprimer"
+msgstr "Supprimer"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:49
 #: kallithea/templates/admin/users/user_edit_api_keys.html:49
-#, fuzzy
 msgid "No additional API keys specified"
 msgstr "Pas de clés d'API supplémentaires spécifiées"
 
 #: kallithea/templates/admin/my_account/my_account_api_keys.html:61
 #: kallithea/templates/admin/users/user_edit_api_keys.html:61
-#, fuzzy
 msgid "New API key"
 msgstr "Nouvelle clé d'API"
 
@@ -3142,6 +3121,7 @@
 #, python-format
 msgid "This account is managed with %s and the password cannot be changed here"
 msgstr ""
+"Ce compte est géré avec %s et le mot de passe ne peut pas être changé ici"
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:11
 msgid "Change your avatar at"
@@ -3163,9 +3143,8 @@
 
 #: kallithea/templates/admin/my_account/my_account_profile.html:16
 #: kallithea/templates/admin/users/user_edit_profile.html:15
-#, fuzzy
 msgid "Current IP"
-msgstr "adresse IP actuelle"
+msgstr "Adresse IP actuelle"
 
 #: kallithea/templates/admin/my_account/my_account_repos.html:1
 msgid "Repositories You Own"
@@ -3225,7 +3204,6 @@
 #: kallithea/templates/admin/permissions/permissions.html:5
 #: kallithea/templates/admin/permissions/permissions.html:11
 #: kallithea/templates/base/base.html:64
-#, fuzzy
 msgid "Default Permissions"
 msgstr "Permissions par défaut"
 
@@ -3244,13 +3222,13 @@
 msgstr "Accès anonyme"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:13
-#, fuzzy, python-format
+#, python-format
 msgid ""
 "Allow access to Kallithea without needing to log in. Anonymous users use "
 "%s user permissions."
 msgstr ""
 "Autoriser l'accès à Kallithea sans le besoin de se connecter. Les "
-"utilisateurs anonymes ont les permissions de %s"
+"utilisateurs anonymes ont les permissions de l'utilisateur %s."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:25
 msgid ""
@@ -3258,15 +3236,17 @@
 "permission, note that all custom default permission on repositories will "
 "be lost"
 msgstr ""
+"Toutes les permissions par défaut de chaque dépôt vont être réinitialisées "
+"aux valeurs choisies. Notez que toutes les permissions par défaut "
+"personnalisées sur les dépôts seront perdues"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:26
-#, fuzzy
 msgid "Apply to all existing repositories"
-msgstr "Importer un dépôt existant ?"
+msgstr "Appliquer à tous les dépôts existants"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:27
 msgid "Permissions for the Default user on new repositories."
-msgstr ""
+msgstr "Permissions pour l'utilisateur par défaut sur les nouveaux dépôts."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:32
 #: kallithea/templates/admin/repos/repo_add_base.html:37
@@ -3282,15 +3262,18 @@
 "permission, note that all custom default permission on repository groups "
 "will be lost"
 msgstr ""
+"Toutes les permissions par défaut de chaque groupe de dépôts vont être "
+"réinitialisées aux valeurs choisies. Notez que toutes les permissions par "
+"défaut personnalisées sur les groupes de dépôts seront perdues"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:40
-#, fuzzy
 msgid "Apply to all existing repository groups"
-msgstr "Importer un dépôt existant ?"
+msgstr "Appliquer à tous les groupes de dépôts existants"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:41
 msgid "Permissions for the Default user on new repository groups."
 msgstr ""
+"Permissions pour l'utilisateur par défaut sur les nouveaux groupes de dépôts."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:46
 #: kallithea/templates/data_table/_dt_elements.html:209
@@ -3303,29 +3286,38 @@
 "permission, note that all custom default permission on user groups will "
 "be lost"
 msgstr ""
+"Toutes les permissions par défaut de chaque groupe d'utilisateurs vont être "
+"réinitialisées aux valeurs choisies. Notez que toutes les permissions par "
+"défaut personnalisées sur les groupes d'utilisateurs seront perdues"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:54
 msgid "Apply to all existing user groups"
-msgstr ""
+msgstr "Appliquer à tous les groupes d'utilisateurs existants"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:55
 msgid "Permissions for the Default user on new user groups."
 msgstr ""
+"Permissions pour l'utilisateur par défaut sur les nouveaux groupes "
+"d'utilisateurs."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:60
-#, fuzzy
 msgid "Top level repository creation"
-msgstr "Création de dépôt"
+msgstr "Création de dépôt de niveau supérieur"
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:64
 msgid "Enable this to allow non-admins to create repositories at the top level."
 msgstr ""
+"Activer pour autoriser les non-administrateurs à créer des dépôts au niveau "
+"supérieur."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:65
 msgid ""
 "Note: This will also give all users API access to create repositories "
 "everywhere. That might change in future versions."
 msgstr ""
+"Note : Cela autorisera également tous les utilisateurs à utiliser l'API pour "
+"créer des dépôts partout. Ce comportement peut changer dans des versions "
+"futures."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:70
 msgid "Repository creation with group write access"
@@ -3337,6 +3329,9 @@
 "repositories inside that group. Without this, group write permissions "
 "mean nothing."
 msgstr ""
+"Avec ceci, le droit d'écriture dans un groupe de dépôt donne le droit de "
+"créer des dépôts dans ce groupe. Sans ceci, le droit d'écriture pour les "
+"groupes n'a pas d'impact."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:79
 msgid "User group creation"
@@ -3345,6 +3340,8 @@
 #: kallithea/templates/admin/permissions/permissions_globals.html:83
 msgid "Enable this to allow non-admins to create user groups."
 msgstr ""
+"Activer pour autoriser les non-administrateurs à créer des groupes "
+"d'utilisateurs."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:88
 msgid "Repository forking"
@@ -3353,6 +3350,7 @@
 #: kallithea/templates/admin/permissions/permissions_globals.html:92
 msgid "Enable this to allow non-admins to fork repositories."
 msgstr ""
+"Activer pour autoriser les non-administrateurs à faire des fork de dépôt."
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:97
 msgid "Registration"
@@ -3360,19 +3358,18 @@
 
 #: kallithea/templates/admin/permissions/permissions_globals.html:105
 msgid "External auth account activation"
-msgstr ""
+msgstr "Activation de l'authentification externe"
 
 #: kallithea/templates/admin/permissions/permissions_ips.html:13
 #: kallithea/templates/admin/users/user_edit_ips.html:23
-#, fuzzy, python-format
+#, python-format
 msgid "Confirm to delete this IP address: %s"
 msgstr "Confirmer la suppression de cette adresse IP : %s"
 
 #: kallithea/templates/admin/permissions/permissions_ips.html:19
 #: kallithea/templates/admin/users/user_edit_ips.html:30
-#, fuzzy
 msgid "All IP addresses are allowed."
-msgstr "Toutes les adresses IP sont autorisées"
+msgstr "Toutes les adresses IP sont autorisées."
 
 #: kallithea/templates/admin/permissions/permissions_ips.html:30
 #: kallithea/templates/admin/users/user_edit_ips.html:42
@@ -3407,12 +3404,12 @@
 #: kallithea/templates/admin/repo_groups/repo_group_add.html:64
 #: kallithea/templates/admin/repos/repo_add_base.html:50
 msgid "Copy permission set from parent repository group."
-msgstr ""
+msgstr "Copier les permissions à partir du groupe de dépôts parent."
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:5
-#, fuzzy, python-format
+#, python-format
 msgid "%s Repository Group Settings"
-msgstr "Réglages du groupe de dépôts %s"
+msgstr "Options du groupe de dépôts %s"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit.html:21
 msgid "Add Child Group"
@@ -3481,9 +3478,8 @@
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:11
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:12
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:11
-#, fuzzy
 msgid "User/User Group"
-msgstr "utilisateur/groupe d'utilisateurs"
+msgstr "Utilisateur/groupe d'utilisateurs"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:28
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:45
@@ -3491,9 +3487,8 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:37
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:28
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:45
-#, fuzzy
 msgid "Default"
-msgstr "[Par défaut]"
+msgstr "Par défaut"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:34
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:71
@@ -3501,7 +3496,6 @@
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:68
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:34
 #: kallithea/templates/admin/user_groups/user_group_edit_perms.html:71
-#, fuzzy
 msgid "Revoke"
 msgstr "Révoquer"
 
@@ -3512,7 +3506,6 @@
 msgstr "Ajouter un nouveau"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
-#, fuzzy
 msgid "Apply to children"
 msgstr "Appliquer aux enfants"
 
@@ -3525,6 +3518,8 @@
 "Set or revoke permission to all children of that group, including non-"
 "private repositories and other groups if selected."
 msgstr ""
+"Ajouter ou révoquer la permission pour tous les enfants de ce groupe, y "
+"compris les dépôts non-privés et les autres groupes si sélectionné."
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:38
 msgid ""
@@ -3536,12 +3531,11 @@
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:53
 msgid "Remove this group"
-msgstr ""
+msgstr "Supprimer ce groupe"
 
 #: kallithea/templates/admin/repo_groups/repo_group_edit_settings.html:53
-#, fuzzy
 msgid "Confirm to delete this group"
-msgstr "Confirmer la suppression de cette adresse IP : %s"
+msgstr "Confirmer la suppression de ce groupe"
 
 #: kallithea/templates/admin/repo_groups/repo_group_show.html:4
 #, python-format
@@ -3557,25 +3551,24 @@
 msgstr "comprenant"
 
 #: kallithea/templates/admin/repo_groups/repo_groups.html:5
-#, fuzzy
 msgid "Repository Groups Administration"
 msgstr "Administration des groupes de dépôts"
 
 #: kallithea/templates/admin/repo_groups/repo_groups.html:48
-#, fuzzy
 msgid "Number of Top-level Repositories"
-msgstr "Nombre de sous-dépôts"
+msgstr "Nombre de dépôts de niveau supérieur"
 
 #: kallithea/templates/admin/repos/repo_add_base.html:17
-#, fuzzy
 msgid "Clone remote repository"
-msgstr "[a créé] le dépôt"
+msgstr "Cloner le dépôt distant"
 
 #: kallithea/templates/admin/repos/repo_add_base.html:22
 msgid ""
 "Optional: URL of a remote repository. If set, the repository will be "
 "created as a clone from this URL."
 msgstr ""
+"Optionnel : URL d'un dépôt distant. Si renseigné, le dépôt sera créé comme "
+"un clone à partir de cette URL."
 
 #: kallithea/templates/admin/repos/repo_add_base.html:32
 #: kallithea/templates/admin/repos/repo_edit_settings.html:69
@@ -3606,11 +3599,14 @@
 "Default revision for files page, downloads, full text search index and "
 "readme generation"
 msgstr ""
+"Révision par défaut pour les pages de fichiers, de téléchargement, de "
+"l'index de recherche dans le texte complet, et de génération de "
+"documentation (readme)"
 
 #: kallithea/templates/admin/repos/repo_creating.html:9
-#, fuzzy, python-format
+#, python-format
 msgid "%s Creating Repository"
-msgstr "%s Création du dépôt"
+msgstr "Création du dépôt %s"
 
 #: kallithea/templates/admin/repos/repo_creating.html:13
 msgid "Creating repository"
@@ -3622,25 +3618,29 @@
 "Repository \"%(repo_name)s\" is being created, you will be redirected "
 "when this process is finished.repo_name"
 msgstr ""
+"Le dépôt « %(repo_name)s » est en cours de création, vous allez être "
+"redirigé quand cette opération sera terminée."
 
 #: kallithea/templates/admin/repos/repo_creating.html:39
 msgid ""
 "We're sorry but error occurred during this operation. Please check your "
 "Kallithea server logs, or contact administrator."
 msgstr ""
+"Désolé, une erreur est survenue pendant l'opération. Vérifiez les journaux "
+"du serveur Kallithea, ou contactez votre administrateur."
 
 #: kallithea/templates/admin/repos/repo_edit.html:8
-#, fuzzy, python-format
+#, python-format
 msgid "%s Repository Settings"
-msgstr "Réglages du groupe de dépôts %s"
+msgstr "Réglages du dépôt %s"
 
 #: kallithea/templates/admin/repos/repo_edit.html:49
 msgid "Extra Fields"
-msgstr ""
+msgstr "Champs supplémentaires"
 
 #: kallithea/templates/admin/repos/repo_edit.html:52
 msgid "Caches"
-msgstr ""
+msgstr "Caches"
 
 #: kallithea/templates/admin/repos/repo_edit.html:55
 msgid "Remote"
@@ -3654,68 +3654,58 @@
 msgstr "Statistiques"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:1
-#, fuzzy
 msgid "Parent"
-msgstr "Parent du groupe"
+msgstr "Parent"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:5
 #: kallithea/templates/admin/repos/repo_edit_fork.html:5
 msgid "Set"
-msgstr ""
+msgstr "Appliquer"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:8
 #: kallithea/templates/admin/repos/repo_edit_fork.html:9
-#, fuzzy
 msgid "Manually set this repository as a fork of another from the list."
-msgstr "Marquer ce dépôt comme fork d’un autre dépôt de la liste"
+msgstr "Marquer manuellement ce dépôt comme fork d’un autre dépôt de la liste."
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:22
-#, fuzzy
 msgid "Public Journal Visibility"
-msgstr "Journal public"
+msgstr "Visibilité du journal public"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:29
 msgid "Remove from public journal"
 msgstr "Supprimer du journal public"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:34
-#, fuzzy
 msgid "Add to Public Journal"
-msgstr "Journal public"
+msgstr "Ajouter au journal public"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:40
-#, fuzzy
 msgid ""
 "All actions done in this repository will be visible to everyone in the "
 "public journal."
 msgstr ""
-"Le descriptif des actions réalisées sur ce dépôt sera visible à tous "
-"depuis le journal public"
+"Les actions réalisées sur ce dépôt seront visibles à tous depuis le journal "
+"public."
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:46
-#, fuzzy
 msgid "Change Locking"
-msgstr "Activer le verrouillage"
+msgstr "Changer le verrouillage"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:52
-#, fuzzy
 msgid "Confirm to unlock repository."
-msgstr "Veuillez confirmer le déverrouillage de ce dépôt"
+msgstr "Veuillez confirmer le déverrouillage de ce dépôt."
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:54
-#, fuzzy
 msgid "Unlock Repository"
-msgstr "Dépôt non verrouillé"
+msgstr "Déverrouiller le dépôt"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:60
-#, fuzzy
 msgid "Confirm to lock repository."
-msgstr "Veuillez confirmer le verrouillage de ce dépôt"
+msgstr "Veuillez confirmer le verrouillage de ce dépôt."
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:62
-#, fuzzy
 msgid "Lock Repository"
-msgstr "Dépôt non verrouillé"
+msgstr "Verrouiller le dépôt"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:64
 msgid "Repository is not locked"
@@ -3728,6 +3718,10 @@
 "pulling locks the repository; only the user who pulled and locked it can "
 "unlock it by doing a push."
 msgstr ""
+"Forcer le verrouillage du dépôt. Ne fonctionne que lorsque l'accès anonyme "
+"est désactivé. Déclencher un pull verrouille le dépôt. L'utilisateur qui "
+"fait le pull verrouille le dépôt ; seul l'utilisateur qui a fait le pull et "
+"a verrouillé peut déverrouiller en faisant un push."
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:79
 #: kallithea/templates/data_table/_dt_elements.html:130
@@ -3736,24 +3730,23 @@
 msgstr "Voulez-vous vraiment supprimer le dépôt %s ?"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:81
-#, fuzzy
 msgid "Delete this Repository"
-msgstr "Supprimer ce groupe de dépôts"
+msgstr "Supprimer ce dépôt"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:84
-#, fuzzy, python-format
+#, python-format
 msgid "This repository has %s fork"
 msgid_plural "This repository has %s forks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Ce dépôt a %s fork"
+msgstr[1] "Ce dépôt a %s forks"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:85
 msgid "Detach forks"
-msgstr ""
+msgstr "Détacher les forks"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:86
 msgid "Delete forks"
-msgstr ""
+msgstr "Supprimer les forks"
 
 #: kallithea/templates/admin/repos/repo_edit_advanced.html:90
 msgid ""
@@ -3761,39 +3754,38 @@
 "administrator expires it. The administrator can both permanently delete "
 "it or restore it."
 msgstr ""
+"Le dépôt supprimé sera mis de côté et caché jusqu'à ce que l'administrateur "
+"le fasse expirer. L'administrateur peut soit le supprimer définitivement, "
+"soit le restaurer."
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:4
-#, fuzzy
 msgid "Invalidate Repository Cache"
 msgstr "Invalider le cache du dépôt"
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:4
-#, fuzzy
 msgid "Confirm to invalidate repository cache."
 msgstr "Voulez-vous vraiment invalider le cache du dépôt ?"
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:7
-#, fuzzy
 msgid ""
 "Manually invalidate cache for this repository. On first access, the "
 "repository will be cached again."
 msgstr ""
-"Invalide manuellement le cache de ce dépôt. Au prochain accès sur ce "
-"dépôt, il sera à nouveau mis en cache"
+"Invalider manuellement le cache de ce dépôt. Au prochain accès sur ce dépôt, "
+"il sera à nouveau mis en cache."
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:12
-#, fuzzy
 msgid "List of Cached Values"
 msgstr "Liste des valeurs en cache"
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:15
 msgid "Prefix"
-msgstr ""
+msgstr "Préfixe"
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:16
 #: kallithea/templates/admin/repos/repo_edit_fields.html:6
 msgid "Key"
-msgstr ""
+msgstr "Clé"
 
 #: kallithea/templates/admin/repos/repo_edit_caches.html:17
 #: kallithea/templates/admin/user_groups/user_group_add.html:49
@@ -3807,74 +3799,69 @@
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:5
 msgid "Label"
-msgstr ""
+msgstr "Libellé"
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:19
 #, python-format
 msgid "Confirm to delete this field: %s"
-msgstr ""
+msgstr "Voulez-vous vraiment supprimer ce champ : %s ?"
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:33
 msgid "New field key"
-msgstr ""
+msgstr "Clé du nouveau champ"
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:41
 msgid "New field label"
-msgstr ""
+msgstr "Libellé du nouveau champ"
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:44
 msgid "Enter short label"
-msgstr ""
+msgstr "Saisir un libellé court"
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:50
 msgid "New field description"
-msgstr ""
+msgstr "Description du nouveau champ"
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:53
 msgid "Enter description of a field"
-msgstr ""
+msgstr "Saisir la description du champ"
 
 #: kallithea/templates/admin/repos/repo_edit_fields.html:66
-#, fuzzy
 msgid "Extra fields are disabled."
-msgstr "Les avatars sont désactivés"
+msgstr "Les champs supplémentaires sont désactivés."
 
 #: kallithea/templates/admin/repos/repo_edit_permissions.html:21
-#, fuzzy
 msgid "Private Repository"
 msgstr "Dépôt privé"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:3
-#, fuzzy
 msgid "Remote repository URL"
-msgstr "Dépôt %s créé"
+msgstr "URL du dépôt distant"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:9
-#, fuzzy
 msgid "Pull Changes from Remote Repository"
-msgstr "[a pullé depuis un site distant] dans le dépôt"
+msgstr "Récupérer les modifications depuis le dépôt distant"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:11
-#, fuzzy
 msgid "Confirm to pull changes from remote repository."
-msgstr "Voulez-vous vraiment récupérer les changements depuis le site distant ?"
+msgstr ""
+"Voulez-vous vraiment récupérer les changements depuis le dépôt distant ?"
 
 #: kallithea/templates/admin/repos/repo_edit_remote.html:17
 msgid "This repository does not have a remote repository URL."
-msgstr ""
+msgstr "Ce dépôt n'a pas d'URL de dépôt distant."
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
-#, fuzzy
 msgid "Permanent Repository ID"
-msgstr "Dépôt privé"
+msgstr "ID permanent du dépôt"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:11
 msgid "What is that?"
-msgstr ""
+msgstr "Qu'est-ce que c'est ?"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:13
 msgid "URL by id"
-msgstr ""
+msgstr "URL par id"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:14
 msgid ""
@@ -3885,22 +3872,29 @@
 "                               This is useful for CI systems, or any "
 "other cases that you need to hardcode the URL into a 3rd party service."
 msgstr ""
+"Si ce dépôt est renommé ou déplacé dans un autre groupe, l'URL du dépôt "
+"change.\n"
+"                               L'utilisation de l'URL permanente ci-dessus "
+"garantit que ce dépôt sera toujours accessible via cette URL.\n"
+"                               Cela peut être utile pour les systèmes "
+"d'intégration continue, ou dans tous les cas où vous devez saisir l'URL « en "
+"dur » dans un service tiers."
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:21
-#, fuzzy
 msgid "Remote repository"
-msgstr "[a créé] le dépôt"
+msgstr "Dépôt distant"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:25
-#, fuzzy
 msgid "Repository URL"
-msgstr "Dépôt"
+msgstr "URL du dépôt"
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:29
 msgid ""
 "Optional: URL of a remote repository. If set, the repository can be "
 "pulled from this URL."
 msgstr ""
+"Optionel : URL d'un dépôt distant. Si renseigné, le dépôt sera pullé à "
+"partir de cette URL."
 
 #: kallithea/templates/admin/repos/repo_edit_settings.html:48
 msgid "Default revision for files page, downloads, whoosh and readme"
@@ -3914,24 +3908,21 @@
 
 #: kallithea/templates/admin/repos/repo_edit_statistics.html:6
 msgid "Processed commits"
-msgstr ""
+msgstr "Commits traités"
 
 #: kallithea/templates/admin/repos/repo_edit_statistics.html:7
 msgid "Processed progress"
-msgstr ""
+msgstr "Avancement"
 
 #: kallithea/templates/admin/repos/repo_edit_statistics.html:10
-#, fuzzy
 msgid "Reset Statistics"
 msgstr "Remettre les statistiques à zéro"
 
 #: kallithea/templates/admin/repos/repo_edit_statistics.html:10
-#, fuzzy
 msgid "Confirm to remove current statistics."
 msgstr "Souhaitez-vous vraiment réinitialiser les statistiques de ce dépôt ?"
 
 #: kallithea/templates/admin/repos/repos.html:5
-#, fuzzy
 msgid "Repositories Administration"
 msgstr "Administration des dépôts"
 
@@ -3940,9 +3931,8 @@
 msgstr "État"
 
 #: kallithea/templates/admin/settings/settings.html:5
-#, fuzzy
 msgid "Settings Administration"
-msgstr "Administration générale"
+msgstr "Administration des options"
 
 #: kallithea/templates/admin/settings/settings.html:27
 msgid "VCS"
@@ -3950,7 +3940,7 @@
 
 #: kallithea/templates/admin/settings/settings.html:28
 msgid "Remap and Rescan"
-msgstr ""
+msgstr "Mapper et scanner"
 
 #: kallithea/templates/admin/settings/settings.html:30
 msgid "Visual"
@@ -3962,7 +3952,6 @@
 msgstr "Hooks"
 
 #: kallithea/templates/admin/settings/settings.html:33
-#, fuzzy
 msgid "Full Text Search"
 msgstr "Recherche dans le texte complet"
 
@@ -3980,7 +3969,7 @@
 
 #: kallithea/templates/admin/settings/settings_global.html:8
 msgid "Site branding"
-msgstr ""
+msgstr "Nom du site"
 
 #: kallithea/templates/admin/settings/settings_global.html:12
 msgid "Set a custom title for your Kallithea Service."
@@ -3988,17 +3977,19 @@
 
 #: kallithea/templates/admin/settings/settings_global.html:18
 msgid "HTTP authentication realm"
-msgstr ""
+msgstr "Domaine d'authentification HTTP (realm)"
 
 #: kallithea/templates/admin/settings/settings_global.html:27
 msgid "Analytics HTML block"
-msgstr ""
+msgstr "Bloc HTML pour l'analytique"
 
 #: kallithea/templates/admin/settings/settings_global.html:31
 msgid ""
 "HTML with JavaScript for web analytics systems like Google Analytics or "
 "Piwik. This will be added at the bottom of every page."
 msgstr ""
+"HTML avec du JavaScript pour les systèmes d'analyse Web comme Google "
+"Analytics ou Piwik. Ceci sera ajouté en bas de chaque page."
 
 #: kallithea/templates/admin/settings/settings_global.html:37
 msgid "ReCaptcha public key"
@@ -4013,33 +4004,33 @@
 msgstr "Clé privée ReCaptcha"
 
 #: kallithea/templates/admin/settings/settings_global.html:51
-#, fuzzy
 msgid ""
 "Private key for reCaptcha system. Setting this value will enable captcha "
 "on registration."
 msgstr ""
 "Clé privée pour le système reCaptcha. Définir cette valeur activera le "
-"captcha d'enregistrement"
+"captcha à l'enregistrement."
 
 #: kallithea/templates/admin/settings/settings_global.html:56
 #: kallithea/templates/admin/settings/settings_vcs.html:80
 #: kallithea/templates/admin/settings/settings_visual.html:116
-#, fuzzy
 msgid "Save Settings"
-msgstr "Enregister les options"
+msgstr "Enregistrer les options"
 
 #: kallithea/templates/admin/settings/settings_hooks.html:1
 msgid "Built-in Mercurial Hooks (Read-Only)"
-msgstr ""
+msgstr "Hooks Mercurial intégrés (lecture seule)"
 
 #: kallithea/templates/admin/settings/settings_hooks.html:15
 msgid ""
 "Hooks can be used to trigger actions on certain events such as push / "
 "pull. They can trigger Python functions or external applications."
 msgstr ""
+"Les hooks peuvent être utilisés pour déclencher des actions lors de certains "
+"évènements comme le push et le pull. Ils peuvent déclencher des fonctions "
+"Python ou des applications externes."
 
 #: kallithea/templates/admin/settings/settings_hooks.html:19
-#, fuzzy
 msgid "Custom Hooks"
 msgstr "Hooks personnalisés"
 
@@ -4049,40 +4040,45 @@
 
 #: kallithea/templates/admin/settings/settings_mapping.html:6
 msgid "Rescan option"
-msgstr ""
+msgstr "Option de scan"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:11
 msgid "Delete records of missing repositories"
-msgstr ""
+msgstr "Supprimer les enregistrements de dépôts manquants"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:13
 msgid ""
 "Check this option to remove all comments, pull requests and other records"
 " related to repositories that no longer exist in the filesystem."
 msgstr ""
+"Cocher cette option pour supprimer tous les commentaires, les requêtes de "
+"pull et d'autres informations liées aux dépôts qui n'existent plus sur le "
+"système de fichiers."
 
 #: kallithea/templates/admin/settings/settings_mapping.html:17
 msgid "Invalidate cache for all repositories"
 msgstr "Invalider le cache pour tous les dépôts"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:19
-#, fuzzy
 msgid "Check this to reload data and clear cache keys for all repositories."
-msgstr "Invalider le cache pour tous les dépôts"
+msgstr ""
+"Cocher pour recharger les données et vider le cache pour tous les dépôts."
 
 #: kallithea/templates/admin/settings/settings_mapping.html:23
 msgid "Install Git hooks"
-msgstr ""
+msgstr "Installer des hooks Git"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:25
 msgid ""
 "Verify if Kallithea's Git hooks are installed for each repository. "
 "Current hooks will be updated to the latest version."
 msgstr ""
+"Vérifier si les hooks Git de Kallithea sont installés pour chaque dépôt. Les "
+"hooks actuels seront mis à jour vers la dernière version."
 
 #: kallithea/templates/admin/settings/settings_mapping.html:28
 msgid "Overwrite existing Git hooks"
-msgstr ""
+msgstr "Écraser les hooks Git existants"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:30
 msgid ""
@@ -4090,14 +4086,17 @@
 "not seem to come from Kallithea. WARNING: This operation will destroy any"
 " custom git hooks you may have deployed by hand!"
 msgstr ""
+"Lors de l'installation des hooks Git, écraser tous les hooks existants, même "
+"s'ils ne semblent pas provenir de Kallithea. ATTENTION : cette opération "
+"détruira tous les hooks Git que vous avez déployés à la main !"
 
 #: kallithea/templates/admin/settings/settings_mapping.html:35
 msgid "Rescan Repositories"
-msgstr ""
+msgstr "Relancer le scan des dépôts"
 
 #: kallithea/templates/admin/settings/settings_search.html:7
 msgid "Index build option"
-msgstr ""
+msgstr "Option de construction de l'index"
 
 #: kallithea/templates/admin/settings/settings_search.html:12
 msgid "Build from scratch"
@@ -4108,6 +4107,8 @@
 "This option completely reindexeses all of the repositories for proper "
 "fulltext search capabilities."
 msgstr ""
+"Cette option ré-indexe complètement tous les dépôts pour pouvoir faire des "
+"recherches dans le texte complet."
 
 #: kallithea/templates/admin/settings/settings_search.html:21
 msgid "Reindex"
@@ -4118,13 +4119,12 @@
 msgstr "Version de Kallithea"
 
 #: kallithea/templates/admin/settings/settings_system.html:4
-#, fuzzy
 msgid "Check for updates"
-msgstr "vérifier les mises à jour"
+msgstr "Vérifier les mises à jour"
 
 #: kallithea/templates/admin/settings/settings_system.html:5
 msgid "Kallithea configuration file"
-msgstr ""
+msgstr "Fichier de configuration de Kallithea"
 
 #: kallithea/templates/admin/settings/settings_system.html:6
 msgid "Python version"
@@ -4135,21 +4135,18 @@
 msgstr "Plateforme"
 
 #: kallithea/templates/admin/settings/settings_system.html:8
-#, fuzzy
 msgid "Git version"
 msgstr "Version de Git"
 
 #: kallithea/templates/admin/settings/settings_system.html:9
-#, fuzzy
 msgid "Git path"
 msgstr "Chemin de Git"
 
 #: kallithea/templates/admin/settings/settings_system.html:10
 msgid "Upgrade info endpoint"
-msgstr ""
+msgstr "Point d'accès aux informations de mise à jour"
 
 #: kallithea/templates/admin/settings/settings_system.html:10
-#, fuzzy
 msgid "Note: please make sure this server can access this URL"
 msgstr "Note : vérifiez que le serveur peut accéder cette URL"
 
@@ -4158,7 +4155,6 @@
 msgstr "Vérification des mises à jour…"
 
 #: kallithea/templates/admin/settings/settings_system.html:23
-#, fuzzy
 msgid "Python Packages"
 msgstr "Paquets Python"
 
@@ -4171,14 +4167,13 @@
 msgstr "Nécessiter SSL pour les opérations de VCS"
 
 #: kallithea/templates/admin/settings/settings_vcs.html:13
-#, fuzzy
 msgid ""
 "Activate to require SSL both pushing and pulling. If SSL certificate is "
 "missing, it will return an HTTP Error 406: Not Acceptable."
 msgstr ""
-"Activez pour faire en sorte que Kallithea force l'utilisation de SSL pour"
-" pousser ou tirer. Si le certificate SSL est manquant, une erreur HTTP "
-"406 Not Acceptable sera retournée."
+"Activez pour faire en sorte que Kallithea force l'utilisation de SSL pour "
+"pousser ou tirer. Si le certificat SSL est manquant, une erreur « HTTP 406: "
+"Not Acceptable » sera renvoyée."
 
 #: kallithea/templates/admin/settings/settings_vcs.html:24
 msgid "Show repository size after push"
@@ -4197,31 +4192,28 @@
 msgstr "Mettre à jour les dépôts après un push (hg update)"
 
 #: kallithea/templates/admin/settings/settings_vcs.html:42
-#, fuzzy
 msgid "Mercurial extensions"
 msgstr "Extensions Mercurial"
 
 #: kallithea/templates/admin/settings/settings_vcs.html:47
 msgid "Enable largefiles extension"
-msgstr ""
+msgstr "Activer l'extension largefiles"
 
 #: kallithea/templates/admin/settings/settings_vcs.html:51
 msgid "Enable hgsubversion extension"
 msgstr "Activer l'extension hgsubversion"
 
 #: kallithea/templates/admin/settings/settings_vcs.html:53
-#, fuzzy
 msgid ""
 "Requires hgsubversion library to be installed. Enables cloning of remote "
 "Subversion repositories while converting them to Mercurial."
 msgstr ""
-"La bibliothèque hgsubversion doit être installée. Elle permet de cloner "
-"des dépôts SVN distants et de les migrer vers Mercurial."
+"La bibliothèque hgsubversion doit être installée. Elle permet de cloner des "
+"dépôts SVN distants et de les migrer vers Mercurial."
 
 #: kallithea/templates/admin/settings/settings_vcs.html:64
-#, fuzzy
 msgid "Location of repositories"
-msgstr "Dépôts totaux"
+msgstr "Emplacement des dépôts"
 
 #: kallithea/templates/admin/settings/settings_vcs.html:69
 msgid ""
@@ -4236,30 +4228,34 @@
 "Filesystem location where repositories are stored. After changing this "
 "value, a restart and rescan of the repository folder are both required."
 msgstr ""
+"Emplacement où les dépôts sont stockés sur le système de fichiers. La "
+"modification de cette valeur nécessite un re-démarrage et un nouveau scan."
 
 #: kallithea/templates/admin/settings/settings_visual.html:8
 msgid "General"
-msgstr ""
+msgstr "Général"
 
 #: kallithea/templates/admin/settings/settings_visual.html:13
 msgid "Use repository extra fields"
-msgstr ""
+msgstr "Activer les champs supplémentaires sur les dépôts"
 
 #: kallithea/templates/admin/settings/settings_visual.html:15
 msgid "Allows storing additional customized fields per repository."
 msgstr ""
+"Permet d'enregistrer des champs personnalisés additionnels pour chaque dépôt."
 
 #: kallithea/templates/admin/settings/settings_visual.html:18
 msgid "Show Kallithea version"
-msgstr ""
+msgstr "Afficher la version de Kallithea"
 
 #: kallithea/templates/admin/settings/settings_visual.html:20
 msgid "Shows or hides a version number of Kallithea displayed in the footer."
 msgstr ""
+"Afficher ou cacher le numéro de version de Kallithea dans le pied de page."
 
 #: kallithea/templates/admin/settings/settings_visual.html:24
 msgid "Use Gravatars in Kallithea"
-msgstr ""
+msgstr "Utiliser Gravatar sur Kallithea"
 
 #: kallithea/templates/admin/settings/settings_visual.html:30
 msgid ""
@@ -4277,6 +4273,20 @@
 "                                                        {netloc}    "
 "network location/server host of running Kallithea server"
 msgstr ""
+"L'URL de Gravatar vous permet d'utiliser un autre serveur d'avatars.\n"
+"                                                        Les variables "
+"suivantes dans l'URL seront remplacées comme suit :\n"
+"                                                        {scheme}    'http' "
+"ou 'https' envoyé à partir du serveur Kallithea en cours d'utilisation,\n"
+"                                                        {email}     adresse "
+"e-mail de l'utilisateur,\n"
+"                                                        {md5email}  "
+"empreinte md5 (hash) de l'adresse e-mail de l'utilisateur (comme sur "
+"gravatar.com),\n"
+"                                                        {size}      taille "
+"de l'image demandée au serveur,\n"
+"                                                        {netloc}    "
+"emplacement réseau/hôte du serveur Kallithea en cours d'utilisation."
 
 #: kallithea/templates/admin/settings/settings_visual.html:42
 msgid ""
@@ -4295,26 +4305,44 @@
 "                                                        {repoid} ID of "
 "repository, can be used to contruct clone-by-id"
 msgstr ""
+"Modèle de construction d'URL de clone. Par exemple : "
+"'{scheme}://{user}@{netloc}/{repo}'.\n"
+"                                                       Les variables "
+"suivantes sont disponibles :\n"
+"                                                        {scheme}    'http' "
+"ou 'https' envoyé à partir du serveur Kallithea en cours d'utilisation,\n"
+"                                                        {user}     nom de "
+"l'utilisateur courant,\n"
+"                                                        {netloc}    "
+"emplacement réseau/hôte du serveur Kallithea en cours d'utilisation,\n"
+"                                                        {repo}    nom "
+"complet du dépôt,\n"
+"                                                        {repoid}    ID du "
+"dépôt, peut être utilisé pour cloner par ID."
 
 #: kallithea/templates/admin/settings/settings_visual.html:55
 msgid "Dashboard items"
-msgstr ""
+msgstr "Élements du tableau de bord"
 
 #: kallithea/templates/admin/settings/settings_visual.html:59
 msgid ""
 "Number of items displayed in the main page dashboard before pagination is"
 " shown."
 msgstr ""
+"Nombre d'éléments affichés dans la page principale du tableau de bord avant "
+"d'afficher la pagination."
 
 #: kallithea/templates/admin/settings/settings_visual.html:65
 msgid "Admin pages items"
-msgstr ""
+msgstr "Élements des pages admin"
 
 #: kallithea/templates/admin/settings/settings_visual.html:69
 msgid ""
 "Number of items displayed in the admin pages grids before pagination is "
 "shown."
 msgstr ""
+"Nombre d'éléments affichés dans les grilles des pages admin avant d'afficher "
+"la pagination."
 
 #: kallithea/templates/admin/settings/settings_visual.html:75
 msgid "Icons"
@@ -4329,60 +4357,59 @@
 msgstr "Afficher l’icône de dépôt privé sur les dépôts"
 
 #: kallithea/templates/admin/settings/settings_visual.html:86
-#, fuzzy
 msgid "Show public/private icons next to repository names."
-msgstr "Afficher l’icône de dépôt public sur les dépôts"
+msgstr "Afficher l’icône « public/privé » à côté du nom des dépôts."
 
 #: kallithea/templates/admin/settings/settings_visual.html:92
-#, fuzzy
 msgid "Meta Tagging"
 msgstr "Meta-tagging"
 
 #: kallithea/templates/admin/settings/settings_visual.html:97
 msgid "Stylify recognised meta tags:"
-msgstr ""
+msgstr "Styliser les méta-tags reconnus :"
 
 #: kallithea/templates/admin/settings/settings_visual.html:111
 msgid ""
 "Parses meta tags from the repository description field and turns them "
 "into colored tags."
 msgstr ""
+"Analyser les méta-tags dans le champ de description du dépôt et les "
+"transformer en tags colorés."
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:5
 msgid "Add user group"
-msgstr ""
+msgstr "Ajouter un groupe d'utilisateurs"
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:10
 #: kallithea/templates/admin/user_groups/user_group_edit.html:11
 #: kallithea/templates/admin/user_groups/user_groups.html:10
 #: kallithea/templates/base/base.html:63 kallithea/templates/base/base.html:83
 msgid "User Groups"
-msgstr ""
+msgstr "Groupes d'utilisateurs"
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:12
 #: kallithea/templates/admin/user_groups/user_groups.html:25
 msgid "Add User Group"
-msgstr ""
+msgstr "Ajouter un groupe d'utilisateurs"
 
 #: kallithea/templates/admin/user_groups/user_group_add.html:44
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:19
 msgid "Short, optional description for this user group."
-msgstr ""
+msgstr "Description courte pour ce groupe d'utilisateur (optionnel)."
 
 #: kallithea/templates/admin/user_groups/user_group_edit.html:5
 #, python-format
 msgid "%s user group settings"
-msgstr ""
+msgstr "Réglages du groupe d'utilisateurs %s"
 
 #: kallithea/templates/admin/user_groups/user_group_edit.html:33
-#, fuzzy
 msgid "Show Members"
-msgstr "Membres"
+msgstr "Afficher les membres"
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:1
 #, python-format
 msgid "User Group: %s"
-msgstr ""
+msgstr "Groupe d'utilisateurs : %s"
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:6
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:32
@@ -4394,28 +4421,27 @@
 #: kallithea/templates/data_table/_dt_elements.html:174
 #, python-format
 msgid "Confirm to delete this user group: %s"
-msgstr ""
+msgstr "Voulez-vous vraiment supprimer ce groupe utilisateur : %s ?"
 
 #: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:21
 msgid "Delete this user group"
-msgstr ""
+msgstr "Supprimer ce groupe d'utilisateurs"
 
 #: kallithea/templates/admin/user_groups/user_group_edit_members.html:17
 msgid "No members yet"
-msgstr ""
+msgstr "Aucun membre pour l'instant"
 
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:40
 msgid "Chosen group members"
-msgstr ""
+msgstr "Membres de groupe sélectionnés"
 
 #: kallithea/templates/admin/user_groups/user_group_edit_settings.html:49
 msgid "Available members"
 msgstr "Membres disponibles"
 
 #: kallithea/templates/admin/user_groups/user_groups.html:5
-#, fuzzy
 msgid "User Groups Administration"
-msgstr "Administration des groupes de dépôts"
+msgstr "Administration des groupes d'utilisateurs"
 
 #: kallithea/templates/admin/users/user_add.html:5
 msgid "Add user"
@@ -4431,7 +4457,7 @@
 #: kallithea/templates/admin/users/user_add.html:12
 #: kallithea/templates/admin/users/users.html:24
 msgid "Add User"
-msgstr ""
+msgstr "Ajouter un utilisateur"
 
 #: kallithea/templates/admin/users/user_add.html:50
 msgid "Password confirmation"
@@ -4440,30 +4466,30 @@
 #: kallithea/templates/admin/users/user_edit.html:5
 #, python-format
 msgid "%s user settings"
-msgstr ""
+msgstr "Réglages de l'utilisateur %s"
 
 #: kallithea/templates/admin/users/user_edit.html:30
 msgid "Emails"
-msgstr ""
+msgstr "E-mails"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:1
 #, python-format
 msgid "User: %s"
-msgstr ""
+msgstr "Utilisateur : %s"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:7
 #: kallithea/templates/admin/users/user_edit_profile.html:42
 msgid "Source of Record"
-msgstr ""
+msgstr "Source de l'enregistrement"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:9
 #: kallithea/templates/admin/users/users.html:53
 msgid "Last Login"
-msgstr ""
+msgstr "Dernière connexion"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:10
 msgid "Member of User Groups"
-msgstr ""
+msgstr "Membre des groupes d'utilisateurs"
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:21
 #: kallithea/templates/data_table/_dt_elements.html:158
@@ -4473,46 +4499,46 @@
 
 #: kallithea/templates/admin/users/user_edit_advanced.html:23
 msgid "Delete this user"
-msgstr ""
+msgstr "Supprimer cet utilisateur"
 
 #: kallithea/templates/admin/users/user_edit_ips.html:8
 #, python-format
 msgid "Inherited from %s"
-msgstr ""
+msgstr "Hérité de %s"
 
 #: kallithea/templates/admin/users/user_edit_profile.html:8
 msgid "Change avatar at"
-msgstr ""
+msgstr "Changer l'avatar sur"
 
 #: kallithea/templates/admin/users/user_edit_profile.html:12
 msgid "Missing email, please update this user email address."
 msgstr ""
+"E-mail manquant, veuillez mettre à jour l'adresse e-mail de cet utilisateur."
 
 #: kallithea/templates/admin/users/user_edit_profile.html:51
 msgid "Name in Source of Record"
-msgstr ""
+msgstr "Nom dans la source de l'enregistrement"
 
 #: kallithea/templates/admin/users/user_edit_profile.html:69
 msgid "New password confirmation"
 msgstr "Confirmation du nouveau mot de passe"
 
 #: kallithea/templates/admin/users/users.html:5
-#, fuzzy
 msgid "Users Administration"
 msgstr "Administration des utilisateurs"
 
 #: kallithea/templates/admin/users/users.html:56
 msgid "Auth Type"
-msgstr ""
+msgstr "Type d'authentification"
 
 #: kallithea/templates/base/base.html:18
 #, python-format
 msgid "Server instance: %s"
-msgstr ""
+msgstr "Instance de serveur : %s"
 
 #: kallithea/templates/base/base.html:30
 msgid "Support"
-msgstr ""
+msgstr "Support"
 
 #: kallithea/templates/base/base.html:90
 msgid "Mercurial repository"
@@ -4523,9 +4549,8 @@
 msgstr "Dépôt Git"
 
 #: kallithea/templates/base/base.html:119
-#, fuzzy
 msgid "Create Fork"
-msgstr "créé"
+msgstr "Créer un fork"
 
 #: kallithea/templates/base/base.html:130
 #: kallithea/templates/data_table/_dt_elements.html:13
@@ -4551,7 +4576,7 @@
 
 #: kallithea/templates/base/base.html:138
 msgid "Switch To"
-msgstr ""
+msgstr "Basculer vers"
 
 #: kallithea/templates/base/base.html:145
 #: kallithea/templates/base/base.html:147
@@ -4560,7 +4585,6 @@
 
 #: kallithea/templates/base/base.html:155
 #: kallithea/templates/forks/forks_data.html:21
-#, fuzzy
 msgid "Compare Fork"
 msgstr "Comparer le fork"
 
@@ -4583,19 +4607,19 @@
 
 #: kallithea/templates/base/base.html:163
 msgid "Unlock"
-msgstr ""
+msgstr "Déverrouiller"
 
 #: kallithea/templates/base/base.html:165
 msgid "Lock"
-msgstr ""
+msgstr "Verrouiller"
 
 #: kallithea/templates/base/base.html:173
 msgid "Follow"
-msgstr ""
+msgstr "Suivre"
 
 #: kallithea/templates/base/base.html:174
 msgid "Unfollow"
-msgstr ""
+msgstr "Arrêter de suivre"
 
 #: kallithea/templates/base/base.html:177
 #: kallithea/templates/data_table/_dt_elements.html:37
@@ -4607,16 +4631,16 @@
 #: kallithea/templates/base/base.html:178
 #: kallithea/templates/pullrequests/pullrequest.html:88
 msgid "Create Pull Request"
-msgstr ""
+msgstr "Créer une requête de pull"
 
 #: kallithea/templates/base/base.html:183
 #, python-format
 msgid "Show Pull Requests for %s"
-msgstr ""
+msgstr "Afficher les requêtes de pull pour %s"
 
 #: kallithea/templates/base/base.html:221
 msgid "Show recent activity"
-msgstr ""
+msgstr "Afficher l'activité récente"
 
 #: kallithea/templates/base/base.html:227
 #: kallithea/templates/base/base.html:228
@@ -4625,45 +4649,40 @@
 
 #: kallithea/templates/base/base.html:233
 msgid "Show public gists"
-msgstr ""
+msgstr "Afficher les gists publics"
 
 #: kallithea/templates/base/base.html:234
 msgid "Gists"
-msgstr ""
+msgstr "Gists"
 
 #: kallithea/templates/base/base.html:238
-#, fuzzy
 msgid "All Public Gists"
-msgstr "Gists publics"
+msgstr "Tous les Gists publics"
 
 #: kallithea/templates/base/base.html:240
-#, fuzzy
 msgid "My Public Gists"
-msgstr "Gists publics"
+msgstr "Mes Gists publics"
 
 #: kallithea/templates/base/base.html:241
-#, fuzzy
 msgid "My Private Gists"
-msgstr "Gist privé"
+msgstr "Mes Gist privés"
 
 #: kallithea/templates/base/base.html:246
 msgid "Search in repositories"
-msgstr ""
+msgstr "Recherche dans les dépôts"
 
 #: kallithea/templates/base/base.html:269
 #: kallithea/templates/base/base.html:270
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:6
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:10
-#, fuzzy
 msgid "My Pull Requests"
-msgstr "Requêtes de pull"
+msgstr "Mes requêtes de pull"
 
 #: kallithea/templates/base/base.html:289
 msgid "Not Logged In"
-msgstr ""
+msgstr "Non connecté"
 
 #: kallithea/templates/base/base.html:296
-#, fuzzy
 msgid "Login to Your Account"
 msgstr "Connexion à votre compte"
 
@@ -4677,20 +4696,19 @@
 
 #: kallithea/templates/base/base.html:395
 msgid "No matches found"
-msgstr ""
+msgstr "Aucune correspondance trouvée"
 
 #: kallithea/templates/base/base.html:524
 msgid "Keyboard shortcuts"
-msgstr ""
+msgstr "Raccourcis clavier"
 
 #: kallithea/templates/base/base.html:533
 msgid "Site-wide shortcuts"
-msgstr ""
+msgstr "Raccourcis globaux"
 
 #: kallithea/templates/base/default_perms_box.html:14
-#, fuzzy
 msgid "Inherit defaults"
-msgstr "Réglages par défaut du dépôt"
+msgstr "Hériter des réglages par défaut"
 
 #: kallithea/templates/base/default_perms_box.html:19
 #, python-format
@@ -4698,6 +4716,8 @@
 "Select to inherit global settings, IP whitelist and permissions from the "
 "%s."
 msgstr ""
+"Sélectionner pour hériter des réglages généraux, de la liste blanche d'IP et "
+"des permissions depuis les %s."
 
 #: kallithea/templates/base/default_perms_box.html:28
 msgid "Create repositories"
@@ -4706,14 +4726,17 @@
 #: kallithea/templates/base/default_perms_box.html:33
 msgid "Select this option to allow repository creation for this user"
 msgstr ""
+"Sélectionner cette option pour autoriser cet utilisateur à créer des dépôts"
 
 #: kallithea/templates/base/default_perms_box.html:40
 msgid "Create user groups"
-msgstr ""
+msgstr "Créer des groupes d'utilisateurs"
 
 #: kallithea/templates/base/default_perms_box.html:45
 msgid "Select this option to allow user group creation for this user"
 msgstr ""
+"Sélectionner cette option pour autoriser cet utilisateur à créer des groupes "
+"d'utilisateurs"
 
 #: kallithea/templates/base/default_perms_box.html:52
 msgid "Fork repositories"
@@ -4722,6 +4745,7 @@
 #: kallithea/templates/base/default_perms_box.html:57
 msgid "Select this option to allow repository forking for this user"
 msgstr ""
+"Sélectionner cette option pour autoriser cet utilisateur à forker des dépôts"
 
 #: kallithea/templates/base/perms_summary.html:13
 #: kallithea/templates/changelog/changelog.html:42
@@ -4730,7 +4754,7 @@
 
 #: kallithea/templates/base/perms_summary.html:22
 msgid "No permissions defined yet"
-msgstr ""
+msgstr "Aucune permission définie pour l'instant"
 
 #: kallithea/templates/base/perms_summary.html:30
 #: kallithea/templates/base/perms_summary.html:54
@@ -4744,12 +4768,11 @@
 
 #: kallithea/templates/base/perms_summary.html:90
 msgid "No permission defined"
-msgstr ""
+msgstr "Aucune permission définie"
 
 #: kallithea/templates/base/root.html:22
-#, fuzzy
 msgid "Add Another Comment"
-msgstr "%d commentaire"
+msgstr "Ajouter un autre commentaire"
 
 #: kallithea/templates/base/root.html:23
 #: kallithea/templates/data_table/_dt_elements.html:214
@@ -4770,38 +4793,35 @@
 
 #: kallithea/templates/base/root.html:27
 msgid "Loading ..."
-msgstr ""
+msgstr "Chargement..."
 
 #: kallithea/templates/base/root.html:28
 msgid "loading ..."
-msgstr ""
+msgstr "chargement..."
 
 #: kallithea/templates/base/root.html:29
 msgid "Search truncated"
-msgstr ""
+msgstr "Recherche tronquée"
 
 #: kallithea/templates/base/root.html:30
 msgid "No matching files"
-msgstr ""
+msgstr "Aucun fichier correspondant"
 
 #: kallithea/templates/base/root.html:31
-#, fuzzy
 #| msgid "on pull request"
 msgid "Open New Pull Request from {0}"
-msgstr "[a commenté] la requête de pull pour"
+msgstr "Ouvrir une nouvelle requête de pull à partir de {0}"
 
 #: kallithea/templates/base/root.html:32
 msgid "Open New Pull Request for {0} &rarr; {1}"
-msgstr ""
+msgstr "Ouvrir une nouvelle requête de pull pour {0} &rarr; {1}"
 
 #: kallithea/templates/base/root.html:33
-#, fuzzy
 #| msgid "Show Selected Changeset __S"
 msgid "Show Selected Changesets {0} &rarr; {1}"
-msgstr "Sélectionner le changeset"
+msgstr "Afficher les changesets sélectionnés {0} &rarr; {1}"
 
 #: kallithea/templates/base/root.html:34
-#, fuzzy
 msgid "Selection Link"
 msgstr "Lien vers la sélection"
 
@@ -4816,12 +4836,11 @@
 
 #: kallithea/templates/base/root.html:37
 msgid "Failed to revoke permission"
-msgstr ""
+msgstr "Échec de la révocation de permission"
 
 #: kallithea/templates/base/root.html:38
-#, fuzzy
 msgid "Confirm to revoke permission for {0}: {1} ?"
-msgstr "Impossible de révoquer votre permission d'administrateur"
+msgstr "Voulez-vous vraiment révoquer la permission pour {0} : {1} ?"
 
 #: kallithea/templates/base/root.html:39
 msgid "enabled"
@@ -4832,7 +4851,6 @@
 msgstr "désactivé"
 
 #: kallithea/templates/base/root.html:42
-#, fuzzy
 msgid "Specify changeset"
 msgstr "Sélectionner le changeset"
 
@@ -4843,7 +4861,7 @@
 
 #: kallithea/templates/bookmarks/bookmarks.html:26
 msgid "Compare Bookmarks"
-msgstr ""
+msgstr "Comparer les marque-pages"
 
 #: kallithea/templates/bookmarks/bookmarks.html:53
 #: kallithea/templates/bookmarks/bookmarks_data.html:10
@@ -4875,7 +4893,7 @@
 
 #: kallithea/templates/branches/branches.html:26
 msgid "Compare Branches"
-msgstr ""
+msgstr "Comparer les branches"
 
 #: kallithea/templates/changelog/changelog.html:6
 #, python-format
@@ -4891,29 +4909,27 @@
 
 #: kallithea/templates/changelog/changelog.html:49
 msgid "Clear selection"
-msgstr ""
+msgstr "Vider la sélection"
 
 #: kallithea/templates/changelog/changelog.html:55
-#, fuzzy
 msgid "Go to tip of repository"
-msgstr "Veuillez confirmer le verrouillage de ce dépôt"
+msgstr "Aller au sommet (tip) du dépôt"
 
 #: kallithea/templates/changelog/changelog.html:60
 #: kallithea/templates/forks/forks_data.html:19
 #, python-format
 msgid "Compare fork with %s"
-msgstr ""
+msgstr "Comparer le fork avec %s"
 
 #: kallithea/templates/changelog/changelog.html:62
 #, python-format
 msgid "Compare fork with parent repository (%s)"
-msgstr ""
+msgstr "Comparer le fork avec le dépôt parent (%s)"
 
 #: kallithea/templates/changelog/changelog.html:66
 #: kallithea/templates/files/files.html:29
-#, fuzzy
 msgid "Branch filter:"
-msgstr "filtre"
+msgstr "Filtre de branche :"
 
 #: kallithea/templates/changelog/changelog.html:92
 #: kallithea/templates/changelog/changelog_summary_data.html:20
@@ -4922,22 +4938,24 @@
 "Changeset status: %s\n"
 "Click to open associated pull request %s"
 msgstr ""
+"Statut du changeset : %s\n"
+"Cliquer pour ouvrir la requête de pull %s associée"
 
 #: kallithea/templates/changelog/changelog.html:96
 #: kallithea/templates/compare/compare_cs.html:24
 #, python-format
 msgid "Changeset status: %s"
-msgstr ""
+msgstr "Statut de changeset : %s"
 
 #: kallithea/templates/changelog/changelog.html:115
 #: kallithea/templates/compare/compare_cs.html:63
 msgid "Expand commit message"
-msgstr ""
+msgstr "Développer le message de commit"
 
 #: kallithea/templates/changelog/changelog.html:124
 #: kallithea/templates/compare/compare_cs.html:30
 msgid "Changeset has comments"
-msgstr ""
+msgstr "Le changeset a des commentaires"
 
 #: kallithea/templates/changelog/changelog.html:134
 #: kallithea/templates/changelog/changelog_summary_data.html:54
@@ -4945,7 +4963,7 @@
 #: kallithea/templates/changeset/changeset_range.html:92
 #, python-format
 msgid "Bookmark %s"
-msgstr ""
+msgstr "Marque-page %s"
 
 #: kallithea/templates/changelog/changelog.html:140
 #: kallithea/templates/changelog/changelog_summary_data.html:60
@@ -4953,7 +4971,7 @@
 #: kallithea/templates/changeset/changeset_range.html:98
 #, python-format
 msgid "Tag %s"
-msgstr ""
+msgstr "Tag %s"
 
 #: kallithea/templates/changelog/changelog.html:145
 #: kallithea/templates/changelog/changelog_summary_data.html:65
@@ -4961,7 +4979,7 @@
 #: kallithea/templates/changeset/changeset_range.html:102
 #, python-format
 msgid "Branch %s"
-msgstr ""
+msgstr "Branche %s"
 
 #: kallithea/templates/changelog/changelog.html:310
 msgid "There are no changes yet"
@@ -4970,18 +4988,18 @@
 #: kallithea/templates/changelog/changelog_details.html:4
 #: kallithea/templates/changeset/changeset.html:77
 msgid "Removed"
-msgstr ""
+msgstr "Supprimé"
 
 #: kallithea/templates/changelog/changelog_details.html:5
 #: kallithea/templates/changeset/changeset.html:78
 msgid "Changed"
-msgstr ""
+msgstr "Modifié"
 
 #: kallithea/templates/changelog/changelog_details.html:6
 #: kallithea/templates/changeset/changeset.html:79
 #: kallithea/templates/changeset/diff_block.html:79
 msgid "Added"
-msgstr ""
+msgstr "Ajouté"
 
 #: kallithea/templates/changelog/changelog_details.html:8
 #: kallithea/templates/changelog/changelog_details.html:9
@@ -4991,23 +5009,23 @@
 #: kallithea/templates/changeset/changeset.html:83
 #, python-format
 msgid "Affected %s files"
-msgstr ""
+msgstr "%s fichiers affectés"
 
 #: kallithea/templates/changelog/changelog_summary_data.html:8
 #: kallithea/templates/files/files_add.html:60
 #: kallithea/templates/files/files_delete.html:39
 #: kallithea/templates/files/files_edit.html:63
 msgid "Commit Message"
-msgstr ""
+msgstr "Message de commit"
 
 #: kallithea/templates/changelog/changelog_summary_data.html:9
 #: kallithea/templates/pullrequests/pullrequest_data.html:17
 msgid "Age"
-msgstr ""
+msgstr "Âge"
 
 #: kallithea/templates/changelog/changelog_summary_data.html:11
 msgid "Refs"
-msgstr ""
+msgstr "Refs"
 
 #: kallithea/templates/changelog/changelog_summary_data.html:81
 msgid "Add or upload files directly via Kallithea"
@@ -5017,10 +5035,9 @@
 #: kallithea/templates/files/files_add.html:21
 #: kallithea/templates/files/files_ypjax.html:9
 msgid "Add New File"
-msgstr ""
+msgstr "Ajouter un nouveau fichier"
 
 #: kallithea/templates/changelog/changelog_summary_data.html:90
-#, fuzzy
 msgid "Push new repository"
 msgstr "Pusher le nouveau dépôt"
 
@@ -5035,11 +5052,11 @@
 
 #: kallithea/templates/changeset/changeset.html:36
 msgid "Parent rev."
-msgstr ""
+msgstr "Révision parente"
 
 #: kallithea/templates/changeset/changeset.html:42
 msgid "Child rev."
-msgstr ""
+msgstr "Révision fille"
 
 #: kallithea/templates/changeset/changeset.html:50
 #: kallithea/templates/changeset/changeset_file_comment.html:37
@@ -5051,42 +5068,38 @@
 #: kallithea/templates/changeset/diff_block.html:27
 #: kallithea/templates/files/diff_2way.html:49
 msgid "Raw diff"
-msgstr ""
+msgstr "Diff brut"
 
 #: kallithea/templates/changeset/changeset.html:57
 msgid "Patch diff"
-msgstr ""
+msgstr "Diff patch"
 
 #: kallithea/templates/changeset/changeset.html:60
 #: kallithea/templates/changeset/diff_block.html:30
 #: kallithea/templates/files/diff_2way.html:52
 msgid "Download diff"
-msgstr ""
+msgstr "Télécharger le diff"
 
 #: kallithea/templates/changeset/changeset.html:89
 #: kallithea/templates/changeset/changeset_range.html:88
-#, fuzzy
 msgid "Merge"
 msgstr "Fusion"
 
 #: kallithea/templates/changeset/changeset.html:123
-#, fuzzy
 msgid "Grafted from:"
-msgstr "Créé le"
+msgstr "Grafté depuis :"
 
 #: kallithea/templates/changeset/changeset.html:129
 msgid "Transplanted from:"
-msgstr ""
+msgstr "Transplanté depuis :"
 
 #: kallithea/templates/changeset/changeset.html:135
-#, fuzzy
 msgid "Replaced by:"
-msgstr "créé"
+msgstr "Remplacé par :"
 
 #: kallithea/templates/changeset/changeset.html:149
-#, fuzzy
 msgid "Preceded by:"
-msgstr "créé"
+msgstr "Précédé par :"
 
 #: kallithea/templates/changeset/changeset.html:166
 #: kallithea/templates/compare/compare_diff.html:54
@@ -5094,8 +5107,8 @@
 #, python-format
 msgid "%s file changed"
 msgid_plural "%s files changed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%s fichier changé"
+msgstr[1] "%s fichiers changés"
 
 #: kallithea/templates/changeset/changeset.html:168
 #: kallithea/templates/compare/compare_diff.html:56
@@ -5103,46 +5116,40 @@
 #, python-format
 msgid "%s file changed with %s insertions and %s deletions"
 msgid_plural "%s files changed with %s insertions and %s deletions"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%s fichier changé avec %s insertions et %s suppressions"
+msgstr[1] "%s fichiers changés avec %s insertions et %s suppressions"
 
 #: kallithea/templates/changeset/changeset.html:182
 #: kallithea/templates/changeset/changeset.html:195
 #: kallithea/templates/pullrequests/pullrequest_show.html:339
 #: kallithea/templates/pullrequests/pullrequest_show.html:363
 msgid "Show full diff anyway"
-msgstr ""
+msgstr "Afficher le diff complet quand même"
 
 #: kallithea/templates/changeset/changeset.html:247
 #: kallithea/templates/changeset/changeset.html:284
-#, fuzzy
 msgid "No revisions"
-msgstr "révisions"
+msgstr "Aucune révision"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:21
-#, fuzzy
 msgid "on pull request"
-msgstr "[a commenté] la requête de pull pour"
+msgstr "sur la requête de pull"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:22
-#, fuzzy
 msgid "No title"
-msgstr "nouveau fichier"
+msgstr "Aucun titre"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:24
-#, fuzzy
 msgid "on this changeset"
-msgstr "Aucun changeset"
+msgstr "sur ce changeset"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:30
-#, fuzzy
 msgid "Delete comment?"
-msgstr "%d commentaire"
+msgstr "Supprimer le commentaire ?"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:37
-#, fuzzy
 msgid "Status change"
-msgstr "fichiers modifiés"
+msgstr "Changement de statut"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:59
 msgid "Commenting on line {1}."
@@ -5157,19 +5164,17 @@
 "commande %s."
 
 #: kallithea/templates/changeset/changeset_file_comment.html:62
-#, fuzzy
 msgid "Use @username inside this text to notify another user"
 msgstr ""
-"Utilisez @nomutilisateur dans ce texte pour envoyer une notification à "
-"l’utilisateur Kallithea en question"
+"Utilisez @nomutilisateur dans ce texte pour envoyer une notification à un "
+"autre utilisateur"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:72
 #: kallithea/templates/changeset/changeset_file_comment.html:184
 msgid "Comment preview"
-msgstr ""
+msgstr "Aperçu du commentaire"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:77
-#, fuzzy
 msgid "Submitting ..."
 msgstr "Envoi…"
 
@@ -5181,7 +5186,7 @@
 #: kallithea/templates/changeset/changeset_file_comment.html:82
 #: kallithea/templates/changeset/changeset_file_comment.html:191
 msgid "Preview"
-msgstr ""
+msgstr "Aperçu"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:90
 msgid "You need to be logged in to comment."
@@ -5203,44 +5208,40 @@
 msgstr[1] "%d commentaires"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:107
-#, fuzzy, python-format
+#, python-format
 msgid "%d inline"
 msgid_plural "%d inline"
-msgstr[0] "(et %d en ligne)"
-msgstr[1] "(et %d en ligne)"
+msgstr[0] "%d de ligne"
+msgstr[1] "%d de ligne"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:108
 #, python-format
 msgid "%d general"
 msgid_plural "%d general"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d général"
+msgstr[1] "%d généraux"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:150
-#, fuzzy
 msgid "Use @username inside this text to notify another user."
 msgstr ""
-"Utilisez @nomutilisateur dans ce texte pour envoyer une notification à "
-"l’utilisateur Kallithea en question"
+"Utilisez @nomutilisateur dans ce texte pour envoyer une notification à un "
+"autre utilisateur."
 
 #: kallithea/templates/changeset/changeset_file_comment.html:157
 msgid "Vote for pull request status"
-msgstr ""
+msgstr "Voter pour le statut de la requête de pull"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:159
-#, fuzzy
 msgid "Set changeset status"
-msgstr "Statut du changeset"
+msgstr "Modifier le statut du changeset"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:163
-#, fuzzy
 msgid "No change"
 msgstr "Aucun changement"
 
 #: kallithea/templates/changeset/changeset_file_comment.html:176
-#, fuzzy
 msgid "Close"
-msgstr "(fermé)"
+msgstr "Fermer"
 
 #: kallithea/templates/changeset/changeset_range.html:5
 #, python-format
@@ -5254,27 +5255,25 @@
 #: kallithea/templates/changeset/diff_block.html:21
 #: kallithea/templates/files/diff_2way.html:43
 msgid "Show full diff for this file"
-msgstr ""
+msgstr "Afficher le diff complet pour ce fichier"
 
 #: kallithea/templates/changeset/diff_block.html:24
 #: kallithea/templates/changeset/diff_block.html:98
 #: kallithea/templates/files/diff_2way.html:46
 msgid "Show full side-by-side diff for this file"
-msgstr ""
+msgstr "Afficher le diff complet côte-à-côte pour ce fichier"
 
 #: kallithea/templates/changeset/diff_block.html:38
 msgid "Show inline comments"
-msgstr ""
+msgstr "Afficher les commentaires de ligne"
 
 #: kallithea/templates/changeset/diff_block.html:86
-#, fuzzy
 msgid "Deleted"
-msgstr "Supprimer"
+msgstr "Supprimé"
 
 #: kallithea/templates/changeset/diff_block.html:89
-#, fuzzy
 msgid "Renamed"
-msgstr "renommer"
+msgstr "Renommé"
 
 #: kallithea/templates/compare/compare_cs.html:4
 msgid "No changesets"
@@ -5286,19 +5285,19 @@
 
 #: kallithea/templates/compare/compare_cs.html:44
 msgid "First (oldest) changeset in this list"
-msgstr ""
+msgstr "Premier changeset dans cette liste (le plus vieux)"
 
 #: kallithea/templates/compare/compare_cs.html:46
 msgid "Last (most recent) changeset in this list"
-msgstr ""
+msgstr "Dernier changeset dans cette liste (le plus récent)"
 
 #: kallithea/templates/compare/compare_cs.html:48
 msgid "Position in this list of changesets"
-msgstr ""
+msgstr "Position dans cette liste de changesets"
 
 #: kallithea/templates/compare/compare_cs.html:76
 msgid "Show merge diff"
-msgstr ""
+msgstr "Afficher le diff de fusion"
 
 #: kallithea/templates/compare/compare_cs.html:86
 #: kallithea/templates/pullrequests/pullrequest_show.html:310
@@ -5310,51 +5309,49 @@
 msgstr "Aucun ancêtre commun trouvé - les dépôts n'ont aucun lien entre eux"
 
 #: kallithea/templates/compare/compare_cs.html:98
-#, fuzzy
 msgid "is"
-msgstr "Gist"
+msgstr "est"
 
 #: kallithea/templates/compare/compare_cs.html:99
-#, fuzzy, python-format
+#, python-format
 msgid "%s changesets"
 msgstr "Changesets de %s"
 
 #: kallithea/templates/compare/compare_cs.html:100
-#, fuzzy
 msgid "behind"
-msgstr "Mettre à jour l’index"
+msgstr "derrière"
 
 #: kallithea/templates/compare/compare_diff.html:6
 #: kallithea/templates/compare/compare_diff.html:8
 #, python-format
 msgid "%s Compare"
-msgstr ""
+msgstr "Comparaison de %s"
 
 #: kallithea/templates/compare/compare_diff.html:13
 #: kallithea/templates/compare/compare_diff.html:35
 msgid "Compare Revisions"
-msgstr ""
+msgstr "Comparer les révisions"
 
 #: kallithea/templates/compare/compare_diff.html:33
 msgid "Swap"
-msgstr ""
+msgstr "Échanger"
 
 #: kallithea/templates/compare/compare_diff.html:42
 msgid "Compare revisions, branches, bookmarks, or tags."
-msgstr ""
+msgstr "Comparer les révisions, les branches, les marque-pages ou les tags."
 
 #: kallithea/templates/compare/compare_diff.html:47
 #: kallithea/templates/pullrequests/pullrequest_show.html:305
 #, python-format
 msgid "Showing %s commit"
 msgid_plural "Showing %s commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Affichage de %s commit"
+msgstr[1] "Affichage de %s commits"
 
 #: kallithea/templates/compare/compare_diff.html:78
 #: kallithea/templates/compare/compare_diff.html:89
 msgid "Show full diff"
-msgstr ""
+msgstr "Afficher le diff complet"
 
 #: kallithea/templates/data_table/_dt_elements.html:74
 msgid "Public repository"
@@ -5362,7 +5359,7 @@
 
 #: kallithea/templates/data_table/_dt_elements.html:84
 msgid "Repository creation in progress..."
-msgstr ""
+msgstr "Création du dépôt en cours..."
 
 #: kallithea/templates/data_table/_dt_elements.html:98
 msgid "No changesets yet"
@@ -5382,83 +5379,88 @@
 
 #: kallithea/templates/data_table/_dt_elements.html:139
 msgid "Creating"
-msgstr ""
+msgstr "En cours de création"
 
 #: kallithea/templates/email_templates/changeset_comment.html:5
 #, python-format
 msgid "Comment from %s on %s changeset %s mentioned you"
-msgstr ""
+msgstr "Le commentaire de %s sur le changeset de %s (%s) mentionne votre nom"
 
 #: kallithea/templates/email_templates/changeset_comment.html:7
 #, python-format
 msgid "Comment from %s on %s changeset %s"
-msgstr ""
+msgstr "Commentaire de %s sur le changeset de %s (%s)"
 
 #: kallithea/templates/email_templates/changeset_comment.html:12
 msgid "The changeset status was changed to"
-msgstr ""
+msgstr "Le statut du changeset a été changé en"
 
 #: kallithea/templates/email_templates/main.html:6
 msgid "This is an automatic notification. Don't reply to this mail."
-msgstr ""
+msgstr "Ceci est une notification automatique. Ne pas répondre à cet e-mail."
 
 #: kallithea/templates/email_templates/password_reset.html:4
 #, python-format
 msgid "Hello %s"
-msgstr ""
+msgstr "Bonjour %s"
 
 #: kallithea/templates/email_templates/password_reset.html:6
 msgid "We have received a request to reset the password for your account."
 msgstr ""
+"Nous avons reçu une demande de réinitialisation du mot de passe de votre "
+"compte."
 
 #: kallithea/templates/email_templates/password_reset.html:7
 msgid "To set a new password, click the following link"
-msgstr ""
+msgstr "Pour choisir un nouveau mot de passe, cliquez sur le lien suivant"
 
 #: kallithea/templates/email_templates/password_reset.html:10
 msgid ""
 "Should you not be able to use the link above, please type the following "
 "code into the password reset form"
 msgstr ""
+"Si vous ne pouvez pas utiliser le lien ci-dessus, merci de saisir le code "
+"suivant dans le formulaire de réinitialisation de mot de passe"
 
 #: kallithea/templates/email_templates/password_reset.html:12
 msgid ""
 "If it weren't you who requested the password reset, just disregard this "
 "message."
 msgstr ""
+"Si vous n'avez pas demandé la réinitialisation de votre mot de passe, ne "
+"tenez pas compte de ce message."
 
 #: kallithea/templates/email_templates/pull_request.html:5
-#, fuzzy, python-format
+#, python-format
 msgid "%s mentioned you on %s pull request \"%s\""
-msgstr ""
+msgstr "%s a mentionné votre nom dans la requête de pull %s « %s »"
 
 #: kallithea/templates/email_templates/pull_request.html:7
-#, fuzzy, python-format
+#, python-format
 msgid "%s requested your review of %s pull request \"%s\""
-msgstr ""
+msgstr "%s vous demande de vérifier la requête de pull %s « %s »"
 
 #: kallithea/templates/email_templates/pull_request_comment.html:4
-#, fuzzy, python-format
+#, python-format
 msgid "Comment from %s on %s pull request \"%s\""
-msgstr ""
+msgstr "Commentaire de %s sur la requête de pull %s « %s »"
 
 #: kallithea/templates/email_templates/pull_request_comment.html:9
-#, fuzzy
 msgid "The comment closed the pull request with status"
-msgstr "Montrer les demandes de pull fermées"
+msgstr "Le commentaire a fermé la requête de pull avec le statut"
 
 #: kallithea/templates/email_templates/pull_request_comment.html:11
 msgid "The comment was made with status"
-msgstr ""
+msgstr "Le commentaire a été fait avec le statut"
 
 #: kallithea/templates/email_templates/registration.html:6
 msgid "View this user here"
-msgstr ""
+msgstr "Visualiser cet utilisateur ici"
 
 #: kallithea/templates/files/diff_2way.html:15
 #, python-format
 msgid "%s File side-by-side diff"
-msgstr ""
+msgstr "Diff côte-à-côte de fichier pour %s"
 
 #: kallithea/templates/files/diff_2way.html:19
 #: kallithea/templates/files/file_diff.html:8
@@ -5468,7 +5470,7 @@
 #: kallithea/templates/files/file_diff.html:4
 #, python-format
 msgid "%s File Diff"
-msgstr ""
+msgstr "Diff de fichier pour %s"
 
 #: kallithea/templates/files/files.html:4
 #: kallithea/templates/files/files.html:80
@@ -5479,7 +5481,7 @@
 #: kallithea/templates/files/files_add.html:4
 #, python-format
 msgid "%s Files Add"
-msgstr ""
+msgstr "Ajout de fichiers pour %s"
 
 #: kallithea/templates/files/files_add.html:40
 #: kallithea/templates/files/files_edit.html:38
@@ -5489,7 +5491,7 @@
 
 #: kallithea/templates/files/files_add.html:42
 msgid "Enter filename..."
-msgstr ""
+msgstr "Saisir le nom du fichier..."
 
 #: kallithea/templates/files/files_add.html:44
 #: kallithea/templates/files/files_add.html:48
@@ -5498,38 +5500,37 @@
 
 #: kallithea/templates/files/files_add.html:44
 msgid "Upload File"
-msgstr ""
+msgstr "Uploader un fichier"
 
 #: kallithea/templates/files/files_add.html:48
 msgid "Create New File"
-msgstr ""
+msgstr "Créer un nouveau fichier"
 
 #: kallithea/templates/files/files_add.html:53
 msgid "New file mode"
-msgstr ""
+msgstr "Mode du nouveau fichier"
 
 #: kallithea/templates/files/files_add.html:64
 #: kallithea/templates/files/files_delete.html:43
 #: kallithea/templates/files/files_edit.html:67
-#, fuzzy
 msgid "Commit Changes"
 msgstr "Commiter les changements"
 
 #: kallithea/templates/files/files_browser.html:33
 msgid "Previous revision"
-msgstr ""
+msgstr "Révision précédente"
 
 #: kallithea/templates/files/files_browser.html:35
 msgid "Next revision"
-msgstr ""
+msgstr "Révision suivante"
 
 #: kallithea/templates/files/files_browser.html:41
 msgid "Follow current branch"
-msgstr ""
+msgstr "Suivre la branche courante"
 
 #: kallithea/templates/files/files_browser.html:44
 msgid "Search File List"
-msgstr ""
+msgstr "Rechercher dans la liste des fichiers"
 
 #: kallithea/templates/files/files_browser.html:48
 msgid "Loading file list..."
@@ -5544,47 +5545,45 @@
 msgstr "Dernière révision"
 
 #: kallithea/templates/files/files_browser.html:63
-#, fuzzy
 msgid "Last Modified"
 msgstr "Dernière modification"
 
 #: kallithea/templates/files/files_browser.html:64
-#, fuzzy
 msgid "Last Committer"
 msgstr "Dernier commiteur"
 
 #: kallithea/templates/files/files_delete.html:4
 #, python-format
 msgid "%s Files Delete"
-msgstr ""
+msgstr "Suppression de fichiers pour %s"
 
 #: kallithea/templates/files/files_delete.html:12
 #: kallithea/templates/files/files_delete.html:31
 msgid "Delete file"
-msgstr ""
+msgstr "Supprimer le fichier"
 
 #: kallithea/templates/files/files_edit.html:4
 #, python-format
 msgid "%s File Edit"
-msgstr ""
+msgstr "Édition de fichier pour %s"
 
 #: kallithea/templates/files/files_edit.html:21
 msgid "Edit file"
-msgstr ""
+msgstr "Éditer le fichier"
 
 #: kallithea/templates/files/files_edit.html:48
 #: kallithea/templates/files/files_source.html:32
 msgid "Show Annotation"
-msgstr ""
+msgstr "Afficher l'annotation"
 
 #: kallithea/templates/files/files_edit.html:50
 #: kallithea/templates/files/files_source.html:35
 msgid "Download as Raw"
-msgstr ""
+msgstr "Télécharger au format brut"
 
 #: kallithea/templates/files/files_edit.html:53
 msgid "Source"
-msgstr ""
+msgstr "Source"
 
 #: kallithea/templates/files/files_edit.html:58
 msgid "Editing file"
@@ -5599,40 +5598,44 @@
 
 #: kallithea/templates/files/files_source.html:7
 msgid "Diff to Revision"
-msgstr ""
+msgstr "Diff par rapport à une révision"
 
 #: kallithea/templates/files/files_source.html:8
 msgid "Show at Revision"
-msgstr ""
+msgstr "Afficher à une révision"
 
 #: kallithea/templates/files/files_source.html:10
 msgid "Show Full History"
-msgstr ""
+msgstr "Afficher l'historique complet"
 
 #: kallithea/templates/files/files_source.html:11
 msgid "Show Authors"
-msgstr ""
+msgstr "Afficher les auteurs"
 
 #: kallithea/templates/files/files_source.html:30
 msgid "Show Source"
-msgstr ""
+msgstr "Afficher la source"
 
 #: kallithea/templates/files/files_source.html:38
 #, python-format
 msgid "Edit on Branch:%s"
-msgstr ""
+msgstr "Éditer sur la branche : %s"
 
 #: kallithea/templates/files/files_source.html:41
 msgid "Editing binary files not allowed"
-msgstr ""
+msgstr "Édition de fichiers binaires interdite"
 
 #: kallithea/templates/files/files_source.html:44
 msgid "Editing files allowed only when on branch head revision"
 msgstr ""
+"Édition de fichiers autorisée uniquement sur la révision de tête (head) de "
+"la branche"
 
 #: kallithea/templates/files/files_source.html:45
 msgid "Deleting files allowed only when on branch head revision"
 msgstr ""
+"Suppression de fichiers autorisée uniquement sur la révision de tête (head) "
+"de la branche"
 
 #: kallithea/templates/files/files_source.html:63
 #, python-format
@@ -5649,7 +5652,7 @@
 
 #: kallithea/templates/files/files_ypjax.html:23
 msgid "Go Back"
-msgstr ""
+msgstr "Retour"
 
 #: kallithea/templates/files/files_ypjax.html:24
 msgid "No files at given path"
@@ -5673,18 +5676,17 @@
 #: kallithea/templates/forks/fork.html:5
 #, python-format
 msgid "Fork repository %s"
-msgstr ""
+msgstr "Forker le dépôt %s"
 
 #: kallithea/templates/forks/fork.html:27
 msgid "Fork name"
 msgstr "Nom du fork"
 
 #: kallithea/templates/forks/fork.html:62
-#, fuzzy
 msgid "Default revision for files page, downloads, whoosh, and readme."
 msgstr ""
 "Révision par défaut pour les pages de fichiers, de téléchargements, de "
-"recherche et de documentation"
+"recherche et de documentation."
 
 #: kallithea/templates/forks/fork.html:68
 msgid "Private"
@@ -5708,7 +5710,7 @@
 
 #: kallithea/templates/forks/fork.html:96
 msgid "Fork this Repository"
-msgstr ""
+msgstr "Forker ce dépôt"
 
 #: kallithea/templates/forks/forks.html:5
 #, python-format
@@ -5723,7 +5725,7 @@
 
 #: kallithea/templates/forks/forks_data.html:17
 msgid "Forked"
-msgstr ""
+msgstr "Forké"
 
 #: kallithea/templates/forks/forks_data.html:30
 msgid "There are no forks yet"
@@ -5755,7 +5757,6 @@
 
 #: kallithea/templates/pullrequests/pullrequest.html:4
 #: kallithea/templates/pullrequests/pullrequest.html:8
-#, fuzzy
 msgid "New Pull Request"
 msgstr "Nouvelle requête de pull"
 
@@ -5768,55 +5769,53 @@
 
 #: kallithea/templates/pullrequests/pullrequest.html:34
 msgid "Summarize the changes - or leave empty"
-msgstr ""
+msgstr "Résumer les modifications - ou laisser vide"
 
 #: kallithea/templates/pullrequests/pullrequest.html:43
 #: kallithea/templates/pullrequests/pullrequest_show.html:66
 msgid "Write a short description on this pull request"
-msgstr ""
+msgstr "Saisir une courte description de cette requête de pull"
 
 #: kallithea/templates/pullrequests/pullrequest.html:49
 msgid "Changeset flow"
-msgstr ""
+msgstr "Flux des changesets"
 
 #: kallithea/templates/pullrequests/pullrequest.html:56
 msgid "Origin repository"
-msgstr ""
+msgstr "Dépôt d'origine"
 
 #: kallithea/templates/pullrequests/pullrequest.html:72
 msgid "Destination repository"
-msgstr ""
+msgstr "Dépôt de destination"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:6
-#, fuzzy
 msgid "No entries"
-msgstr "Aucune entrée pour le moment"
+msgstr "Aucune entrée"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:14
-#, fuzzy
 msgid "Vote"
-msgstr "Révoquer"
+msgstr "Voter"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:18
 msgid "From"
-msgstr ""
+msgstr "Depuis"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:19
 msgid "To"
-msgstr ""
+msgstr "Vers"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:28
 #, python-format
 msgid "You voted: %s"
-msgstr ""
+msgstr "Vous avez voté : %s"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:30
 msgid "You didn't vote"
-msgstr ""
+msgstr "Vous n'avez pas voté"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:35
 msgid "(no title)"
-msgstr ""
+msgstr "(sans titre)"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:37
 #: kallithea/templates/pullrequests/pullrequest_show.html:31
@@ -5825,42 +5824,42 @@
 msgstr "Fermée"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:67
-#, fuzzy
 msgid "Delete Pull Request"
-msgstr "Nouvelle requête de pull"
+msgstr "Supprimer la requête de pull"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:68
 msgid "Confirm to delete this pull request"
 msgstr "Veuillez confirmer la suppression de cette requête de pull"
 
 #: kallithea/templates/pullrequests/pullrequest_data.html:70
-#, fuzzy, python-format
+#, python-format
 msgid "Confirm again to delete this pull request with %s comments"
-msgstr "Veuillez confirmer la suppression de cette requête de pull"
+msgstr ""
+"Veuillez confirmer la suppression de cette requête de pull avec %s "
+"commentaires"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:6
-#, fuzzy, python-format
+#, python-format
 msgid "%s Pull Request %s"
-msgstr "Requête de pull #%s"
+msgstr "%s Requête de pull %s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:10
-#, fuzzy, python-format
+#, python-format
 msgid "Pull request %s from %s#%s"
-msgstr "Requête de pull #%s"
+msgstr "Requête de pull %s depuis %s#%s"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:57
-#, fuzzy
 msgid "Summarize the changes"
-msgstr "Commiter les changements"
+msgstr "Résumer les changements"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:74
 msgid "Reviewer voting result"
-msgstr ""
+msgstr "Résultat du vote des relecteurs"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:80
 #: kallithea/templates/pullrequests/pullrequest_show.html:81
 msgid "Pull request status calculated from votes"
-msgstr ""
+msgstr "Statut de la requête de pull calculé à partir des votes"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:93
 msgid "Still not reviewed by"
@@ -5875,145 +5874,137 @@
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:99
 msgid "Pull request was reviewed by all reviewers"
-msgstr ""
+msgstr "La requête de pull a été relue par tous les relecteurs"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:101
-#, fuzzy
 msgid "There are no reviewers"
-msgstr "Aucune branche n’a été créée pour le moment"
+msgstr "Il n'y a aucun relecteur"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:107
 msgid "Origin"
-msgstr ""
+msgstr "Origine"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:113
-#, fuzzy
 msgid "on"
-msgstr "Aucune"
+msgstr "sur"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:120
 msgid "Target"
-msgstr ""
+msgstr "Cible"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:124
 msgid ""
 "This is just a range of changesets and doesn't have a target or a real "
 "merge ancestor."
 msgstr ""
+"Ceci est juste une série de changesets, et n'a pas de cible ou de véritable "
+"ancêtre de fusion."
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:133
 msgid "Pull changes"
-msgstr ""
+msgstr "Puller les modifications"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:173
-#, fuzzy
 msgid "Update"
-msgstr "[a mis à jour] l’utilisateur"
+msgstr "Mettre à jour"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:191
 msgid "Current revision - no change"
-msgstr ""
+msgstr "Révision courante - aucun changement"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:213
-#, fuzzy
 msgid "Pull Request Reviewers"
 msgstr "Relecteurs de la requête de pull"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:238
-#, fuzzy
 msgid "Remove reviewer"
-msgstr "%d relecteur"
+msgstr "Supprimer le relecteur"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:250
 msgid "Type name of reviewer to add"
-msgstr ""
+msgstr "Saisir le nom du relecteur à ajouter"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:258
-#, fuzzy
 msgid "Potential Reviewers"
-msgstr "%d relecteur"
+msgstr "Relecteurs potentiels"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:261
 msgid "Click to add the repository owner as reviewer:"
-msgstr ""
+msgstr "Cliquer pour ajouter le propriétaire du dépôt comme relecteur :"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:284
 msgid "Save Changes"
-msgstr ""
+msgstr "Enregistrer les changements"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:285
-#, fuzzy
 msgid "Save as New Pull Request"
-msgstr "Nouvelle requête de pull"
+msgstr "Sauvegarder en tant que nouvelle requête de pull"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:286
-#, fuzzy
 msgid "Cancel Changes"
-msgstr "Sélectionner le changeset"
+msgstr "Annuler les modifications"
 
 #: kallithea/templates/pullrequests/pullrequest_show.html:296
-#, fuzzy
 msgid "Pull Request Content"
-msgstr "Requêtes de pull"
+msgstr "Contenu de la requête de pull"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:6
 #, python-format
 msgid "%s Pull Requests"
-msgstr ""
+msgstr "Requêtes de pull pour %s"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:11
-#, fuzzy, python-format
+#, python-format
 msgid "Pull Requests from %s'"
-msgstr "Requête de pull #%s"
+msgstr "Requête de pull depuis %s'"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:13
-#, fuzzy, python-format
+#, python-format
 msgid "Pull Requests to '%s'"
-msgstr "Requête de pull #%s"
+msgstr "Requête de pull vers '%s'"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:32
-#, fuzzy
 msgid "Open New Pull Request"
-msgstr "Nouvelle requête de pull"
+msgstr "Ouvrir une nouvelle requête de pull"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:37
-#, fuzzy, python-format
+#, python-format
 msgid "Show Pull Requests to %s"
-msgstr "Requête de pull #%s"
+msgstr "Afficher les requêtes de pull vers %s"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:39
-#, fuzzy, python-format
+#, python-format
 msgid "Show Pull Requests from '%s'"
-msgstr ""
+msgstr "Afficher les requêtes de pull depuis '%s'"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:49
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:28
 msgid "Hide closed pull requests (only show open pull requests)"
 msgstr ""
+"Cacher les requêtes de pull fermées (afficher uniquement les requêtes de "
+"pull ouvertes)"
 
 #: kallithea/templates/pullrequests/pullrequest_show_all.html:51
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:30
 msgid "Show closed pull requests (in addition to open pull requests)"
 msgstr ""
+"Afficher les requêtes de pull fermées (en plus des requêtes de pull ouvertes)"
 
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:35
-#, fuzzy
 msgid "Pull Requests Created by Me"
-msgstr "Relecteurs de la requête de pull"
+msgstr "Requêtes de pull créées par moi"
 
 #: kallithea/templates/pullrequests/pullrequest_show_my.html:38
-#, fuzzy
 msgid "Pull Requests I Participate In"
-msgstr "Je participe à"
+msgstr "Requêtes de pull auxquelles je participe"
 
 #: kallithea/templates/search/search.html:6
 #, python-format
 msgid "%s Search"
-msgstr ""
+msgstr "Recherche pour %s"
 
 #: kallithea/templates/search/search.html:8
 #: kallithea/templates/search/search.html:16
-#, fuzzy
 msgid "Search in All Repositories"
 msgstr "Rechercher dans tous les dépôts"
 
@@ -6046,25 +6037,25 @@
 #: kallithea/templates/summary/statistics.html:4
 #, python-format
 msgid "%s Statistics"
-msgstr ""
+msgstr "Statistiques pour %s"
 
 #: kallithea/templates/summary/statistics.html:16
 #: kallithea/templates/summary/summary.html:39
 #, python-format
 msgid "%s ATOM feed"
-msgstr ""
+msgstr "Flux ATOM pour %s"
 
 #: kallithea/templates/summary/statistics.html:17
 #: kallithea/templates/summary/summary.html:40
 #, python-format
 msgid "%s RSS feed"
-msgstr ""
+msgstr "Flux RSS pour %s"
 
 #: kallithea/templates/summary/statistics.html:36
 #: kallithea/templates/summary/summary.html:100
 #: kallithea/templates/summary/summary.html:116
 msgid "Enable"
-msgstr ""
+msgstr "Activer"
 
 #: kallithea/templates/summary/statistics.html:39
 msgid "Stats gathered: "
@@ -6078,7 +6069,7 @@
 #: kallithea/templates/summary/statistics.html:113
 #: kallithea/templates/summary/summary.html:373
 msgid "Show more"
-msgstr ""
+msgstr "Afficher plus"
 
 #: kallithea/templates/summary/statistics.html:390
 msgid "commits"
@@ -6120,11 +6111,11 @@
 #: kallithea/templates/summary/summary.html:13
 #, python-format
 msgid "Repository locked by %s"
-msgstr ""
+msgstr "Dépôt verrouillé par %s"
 
 #: kallithea/templates/summary/summary.html:15
 msgid "Repository unlocked"
-msgstr ""
+msgstr "Dépôt déverrouillé"
 
 #: kallithea/templates/summary/summary.html:22
 msgid "Fork of"
@@ -6171,9 +6162,8 @@
 msgstr "Télécharger une archive contenant également les sous-dépôts éventuels"
 
 #: kallithea/templates/summary/summary.html:125
-#, fuzzy
 msgid "With subrepos"
-msgstr "avec les sous-dépôts"
+msgstr "Avec les sous-dépôts"
 
 #: kallithea/templates/summary/summary.html:156
 msgid "Repository Size"
@@ -6242,6 +6232,8 @@
 #~ msgstr "Aucun fichier"
 
 #~ msgid ""
+#~ "_: \n"
+#~ ""
 #~ msgstr ""
 
 #~ msgid "Username \"%(username)s\" is forbidden"
--- a/kallithea/i18n/how_to	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/i18n/how_to	Fri Oct 02 22:46:15 2015 +0200
@@ -50,11 +50,11 @@
 In the prepared development environment, run the following to ensure
 all translation strings are extracted and up-to-date::
 
-    python setup.py extract_messages
+    python2 setup.py extract_messages
 
 Create new language by executing following command::
 
-    python setup.py init_catalog -l <new_language_code>
+    python2 setup.py init_catalog -l <new_language_code>
 
 This creates a new translation under directory `kallithea/i18n/<new_language_code>`
 based on the translation template file, `kallithea/i18n/kallithea.pot`.
@@ -67,7 +67,7 @@
 
 Finally, compile the translations::
 
-    python setup.py compile_catalog -l <new_language_code>
+    python2 setup.py compile_catalog -l <new_language_code>
 
 
 Updating translations
@@ -75,11 +75,11 @@
 
 Extract the latest versions of strings for translation by running::
 
-    python setup.py extract_messages
+    python2 setup.py extract_messages
 
 Update the PO file by doing::
 
-    python setup.py update_catalog -l <new_language_code>
+    python2 setup.py update_catalog -l <new_language_code>
 
 Edit the new updated translation file. Repeat all steps after `init_catalog` step from
 new translation instructions
--- a/kallithea/i18n/ru/LC_MESSAGES/kallithea.po	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/i18n/ru/LC_MESSAGES/kallithea.po	Fri Oct 02 22:46:15 2015 +0200
@@ -1904,34 +1904,34 @@
 msgstr ""
 
 #: kallithea/model/notification.py:254
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s commented on changeset %(age)s"
-msgstr "%(user)s оставил комментарий к набору изменений %(when)s"
+msgstr "%(user)s оставил комментарий к набору изменений %(age)s"
 
 #: kallithea/model/notification.py:255
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s sent message %(age)s"
-msgstr "%(user)s отправил сообщение %(when)s"
+msgstr "%(user)s отправил сообщение %(age)s"
 
 #: kallithea/model/notification.py:256
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s mentioned you %(age)s"
-msgstr "%(user)s упомянул вас %(when)s"
+msgstr "%(user)s упомянул вас %(age)s"
 
 #: kallithea/model/notification.py:257
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s registered in Kallithea %(age)s"
-msgstr "%(user)s зарегистрировался в Kallithea %(when)s"
+msgstr "%(user)s зарегистрировался в Kallithea %(age)s"
 
 #: kallithea/model/notification.py:258
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s opened new pull request %(age)s"
-msgstr "%(user)s открыл новый pull-запрос %(when)s"
+msgstr "%(user)s открыл новый pull-запрос %(age)s"
 
 #: kallithea/model/notification.py:259
-#, fuzzy, python-format
+#, python-format
 msgid "%(user)s commented on pull request %(age)s"
-msgstr "%(user)s оставил комментарий к pull-запросу %(when)s"
+msgstr "%(user)s оставил комментарий к pull-запросу %(age)s"
 
 #: kallithea/model/notification.py:266
 #, python-format
--- a/kallithea/lib/auth.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/lib/auth.py	Fri Oct 02 22:46:15 2015 +0200
@@ -34,7 +34,7 @@
 
 from decorator import decorator
 
-from pylons import url, request
+from pylons import url, request, session
 from pylons.controllers.util import abort, redirect
 from pylons.i18n.translation import _
 from webhelpers.pylonslib import secure_form
@@ -712,11 +712,12 @@
 
 def redirect_to_login(message=None):
     from kallithea.lib import helpers as h
-    p = url.current()
+    p = request.path_qs
     if message:
         h.flash(h.literal(message), category='warning')
     log.debug('Redirecting to login page, origin: %s', p)
-    return redirect(url('login_home', came_from=p, **request.GET))
+    return redirect(url('login_home', came_from=p))
+
 
 class LoginRequired(object):
     """
@@ -765,6 +766,15 @@
         if request.method not in ['GET', 'HEAD', 'POST', 'PUT']:
             return abort(405)
 
+        # Make sure CSRF token never appears in the URL. If so, invalidate it.
+        if secure_form.token_key in request.GET:
+            log.error('CSRF key leak detected')
+            session.pop(secure_form.token_key, None)
+            session.save()
+            from kallithea.lib import helpers as h
+            h.flash(_("CSRF token leak has been detected - all form tokens have been expired"),
+                    category='error')
+
         # CSRF protection: Whenever a request has ambient authority (whether
         # through a session cookie or its origin IP address), it must include
         # the correct token, unless the HTTP method is GET or HEAD (and thus
--- a/kallithea/lib/helpers.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/lib/helpers.py	Fri Oct 02 22:46:15 2015 +0200
@@ -36,12 +36,13 @@
 from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
     end_form, file, hidden, image, javascript_link, link_to, \
     link_to_if, link_to_unless, ol, required_legend, select, stylesheet_link, \
-    submit, text, password, textarea, title, ul, xml_declaration, radio
+    submit, text, password, textarea, title, ul, xml_declaration, radio, \
+    form as insecure_form
 from webhelpers.html.tools import auto_link, button_to, highlight, \
     js_obfuscate, mail_to, strip_links, strip_tags, tag_re
 from webhelpers.number import format_byte_size, format_bit_size
 from webhelpers.pylonslib import Flash as _Flash
-from webhelpers.pylonslib.secure_form import secure_form as form, authentication_token
+from webhelpers.pylonslib.secure_form import secure_form, authentication_token
 from webhelpers.text import chop_at, collapse, convert_accented_entities, \
     convert_misc_entities, lchop, plural, rchop, remove_formatting, \
     replace_whitespace, urlify, truncate, wrap_paragraphs
@@ -1451,3 +1452,13 @@
     from kallithea.model.db import UserIpMap
     s, e = UserIpMap._get_ip_range(ip_addr)
     return '%s - %s' % (s, e)
+
+
+def form(url, method="post", **attrs):
+    """Like webhelpers.html.tags.form but automatically using secure_form with
+    authentication_token for POST. authentication_token is thus never leaked
+    in the URL."""
+    if method.lower() == 'get':
+        return insecure_form(url, method=method, **attrs)
+    # webhelpers will turn everything but GET into POST
+    return secure_form(url, method=method, **attrs)
--- a/kallithea/lib/rcmail/response.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/lib/rcmail/response.py	Fri Oct 02 22:46:15 2015 +0200
@@ -138,7 +138,7 @@
     as __init__ parameters, or by setting those attributes.
 
     You can initially set the From, To, and Subject, but they are headers so
-    use the dict notation to change them: msg['From'] = 'joe@test.com'.
+    use the dict notation to change them: msg['From'] = 'joe@example.com'.
 
     The message is not fully crafted until right when you convert it with
     MailResponse.to_message.  This lets you change it and work with it, then
--- a/kallithea/lib/vcs/backends/git/repository.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/lib/vcs/backends/git/repository.py	Fri Oct 02 22:46:15 2015 +0200
@@ -675,10 +675,10 @@
         try:
             update_server_info(self._repo)
         except OSError as e:
-            if e.errno != errno.ENOENT:
+            if e.errno not in [errno.ENOENT, errno.EROFS]:
                 raise
             # Workaround for dulwich crashing on for example its own dulwich/tests/data/repos/simple_merge.git/info/refs.lock
-            log.error('Ignoring error running update-server-info: %s', e)
+            log.error('Ignoring %s running update-server-info: %s', type(e).__name__, e)
 
     @LazyProperty
     def workdir(self):
--- a/kallithea/model/comment.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/model/comment.py	Fri Oct 02 22:46:15 2015 +0200
@@ -100,7 +100,7 @@
             recipients += [cs_author]
             email_kwargs = {
                 'status_change': status_change,
-                'cs_comment_user': h.person(user, 'full_name_and_username'),
+                'cs_comment_user': user.full_name_and_username,
                 'cs_target_repo': h.canonical_url('summary_home', repo_name=repo.repo_name),
                 'cs_comment_url': comment_url,
                 'raw_id': revision,
@@ -148,7 +148,7 @@
                 'status_change': status_change,
                 'closing_pr': closing_pr,
                 'pr_comment_url': comment_url,
-                'pr_comment_user': h.person(user, 'full_name_and_username'),
+                'pr_comment_user': user.full_name_and_username,
                 'pr_target_repo': h.canonical_url('summary_home',
                                    repo_name=pull_request.other_repo.repo_name),
                 'repo_name': pull_request.other_repo.repo_name,
--- a/kallithea/model/pull_request.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/model/pull_request.py	Fri Oct 02 22:46:15 2015 +0200
@@ -111,11 +111,11 @@
 
         mention_recipients = set(User.get_by_username(username, case_insensitive=True)
                                  for username in extract_mentioned_users(new.description))
-        self.__add_reviewers(new, reviewers, mention_recipients)
+        self.__add_reviewers(created_by_user, new, reviewers, mention_recipients)
 
         return new
 
-    def __add_reviewers(self, pr, reviewers, mention_recipients=None):
+    def __add_reviewers(self, user, pr, reviewers, mention_recipients=None):
         #members
         for member in set(reviewers):
             _usr = self._get_user(member)
@@ -135,7 +135,7 @@
         subject = safe_unicode(
             h.link_to(
               _('%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s') % \
-                {'user': pr.owner.username,
+                {'user': user.username,
                  'pr_title': pr.title,
                  'pr_nice_id': pr.nice_id()},
                 pr_url)
@@ -144,19 +144,19 @@
         _org_ref_type, org_ref_name, _org_rev = pr.org_ref.split(':')
         email_kwargs = {
             'pr_title': pr.title,
-            'pr_user_created': h.person(pr.owner),
+            'pr_user_created': user.full_name_and_username,
             'pr_repo_url': h.canonical_url('summary_home', repo_name=pr.other_repo.repo_name),
             'pr_url': pr_url,
             'pr_revisions': revision_data,
             'repo_name': pr.other_repo.repo_name,
             'pr_nice_id': pr.nice_id(),
             'ref': org_ref_name,
-            'pr_username': pr.owner.username,
+            'pr_username': user.username,
             'threading': threading,
             'is_mention': False,
             }
         if reviewers:
-            NotificationModel().create(created_by=pr.owner, subject=subject, body=body,
+            NotificationModel().create(created_by=user, subject=subject, body=body,
                                        recipients=reviewers,
                                        type_=Notification.TYPE_PULL_REQUEST,
                                        email_kwargs=email_kwargs)
@@ -167,21 +167,21 @@
         if mention_recipients:
             email_kwargs['is_mention'] = True
             subject = _('[Mention]') + ' ' + subject
-            NotificationModel().create(created_by=pr.owner, subject=subject, body=body,
+            NotificationModel().create(created_by=user, subject=subject, body=body,
                                        recipients=mention_recipients,
                                        type_=Notification.TYPE_PULL_REQUEST,
                                        email_kwargs=email_kwargs)
 
-    def mention_from_description(self, pr, old_description=''):
+    def mention_from_description(self, user, pr, old_description=''):
         mention_recipients = set(User.get_by_username(username, case_insensitive=True)
                                  for username in extract_mentioned_users(pr.description))
         mention_recipients.difference_update(User.get_by_username(username, case_insensitive=True)
                                              for username in extract_mentioned_users(old_description))
 
         log.debug("Mentioning %s", mention_recipients)
-        self.__add_reviewers(pr, [], mention_recipients)
+        self.__add_reviewers(user, pr, [], mention_recipients)
 
-    def update_reviewers(self, pull_request, reviewers_ids):
+    def update_reviewers(self, user, pull_request, reviewers_ids):
         reviewers_ids = set(reviewers_ids)
         pull_request = self.__get_pull_request(pull_request)
         current_reviewers = PullRequestReviewers.query()\
@@ -194,7 +194,7 @@
         to_remove = current_reviewers_ids.difference(reviewers_ids)
 
         log.debug("Adding %s reviewers", to_add)
-        self.__add_reviewers(pull_request, to_add)
+        self.__add_reviewers(user, pull_request, to_add)
 
         log.debug("Removing %s reviewers", to_remove)
         for uid in to_remove:
--- a/kallithea/public/css/style.css	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/public/css/style.css	Fri Oct 02 22:46:15 2015 +0200
@@ -4309,7 +4309,7 @@
     background-color: #FAFAFA;
 }
 
-.inline-comments .add-comment {
+.inline-comments .add-button-row {
     padding: 2px 4px 8px 5px;
 }
 
@@ -4826,6 +4826,7 @@
 
 div.comment:target>.comment-wrapp {
     border: solid 2px #ee0 !important;
+    margin: 2px 2px 4px 4px;
 }
 
 .lineno:target a {
--- a/kallithea/public/js/base.js	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/public/js/base.js	Fri Oct 02 22:46:15 2015 +0200
@@ -655,7 +655,7 @@
 // set $comment_div state - showing or not showing form and Add button
 function comment_div_state($comment_div, f_path, line_no, show_form) {
     var $forms = $comment_div.children('.comment-inline-form');
-    var $buttons = $comment_div.children('.add-comment');
+    var $buttonrow = $comment_div.children('.add-button-row');
     var $comments = $comment_div.children('.comment');
     if (show_form) {
         if (!$forms.length) {
@@ -664,7 +664,7 @@
     } else {
         $forms.remove();
     }
-    $buttons.remove();
+    $buttonrow.remove();
     if ($comments.length && !show_form) {
         _comment_div_append_add($comment_div, f_path, line_no);
     }
@@ -673,9 +673,9 @@
 // append an Add button to $comment_div and hook it up to show form
 function _comment_div_append_add($comment_div, f_path, line_no) {
     var addlabel = TRANSLATION_MAP['Add Another Comment'];
-    var $add = $('<div class="add-comment"><span class="btn btn-mini">{0}</span></div>'.format(addlabel));
+    var $add = $('<div class="add-button-row"><span class="btn btn-mini add-button">{0}</span></div>'.format(addlabel));
     $comment_div.append($add);
-    $add.click(function(e) {
+    $add.children('.add-button').click(function(e) {
         comment_div_state($comment_div, f_path, line_no, true);
     });
 }
@@ -896,14 +896,14 @@
 };
 
 
-var initCodeMirror = function(textarea_id, resetUrl){
+var initCodeMirror = function(textarea_id, baseUrl, resetUrl){
     var myCodeMirror = CodeMirror.fromTextArea($('#' + textarea_id)[0], {
             mode: "null",
             lineNumbers: true,
             indentUnit: 4,
             autofocus: true
         });
-    CodeMirror.modeURL = "/codemirror/mode/%N/%N.js";
+    CodeMirror.modeURL = baseUrl + "/codemirror/mode/%N/%N.js";
 
     $('#reset').click(function(e){
             window.location=resetUrl;
@@ -951,7 +951,7 @@
 var getSelectionLink = function(e) {
     //get selection from start/to nodes
     if (typeof window.getSelection != "undefined") {
-        s = window.getSelection();
+        var s = window.getSelection();
 
         var from = _getIdentNode(s.anchorNode);
         var till = _getIdentNode(s.focusNode);
--- a/kallithea/public/js/codemirror_loadmode.js	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/public/js/codemirror_loadmode.js	Fri Oct 02 22:46:15 2015 +0200
@@ -1,7 +1,4 @@
 (function() {
-  // FIXME: if this default value ever is used, it will probably be wrong
-  if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js";
-
   var loading = {};
   function splitCallback(cont, n) {
     var countDown = n;
--- a/kallithea/templates/about.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/about.html	Fri Oct 02 22:46:15 2015 +0200
@@ -62,6 +62,7 @@
   <li>Copyright &copy; 2015, Niemand Jedermann</li>
   <li>Copyright &copy; 2015, Peter Vitt</li>
   <li>Copyright &copy; 2015, Robert Martinez</li>
+  <li>Copyright &copy; 2015, Robert Rauch</li>
   <li>Copyright &copy; 2015, Ronny Pfannschmidt</li>
   <li>Copyright &copy; 2015, Sam Jaques</li>
   <li>Copyright &copy; 2015, Søren Løvborg</li>
--- a/kallithea/templates/admin/gists/edit.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/admin/gists/edit.html	Fri Oct 02 22:46:15 2015 +0200
@@ -81,7 +81,7 @@
 
                 ## dynamic edit box.
                 <script type="text/javascript">
-                var myCodeMirror = initCodeMirror("editor_${h.FID('f',file.path)}", '');
+                var myCodeMirror = initCodeMirror("editor_${h.FID('f',file.path)}", "${request.script_name}", '');
 
                 //inject new modes
                 var $modes_select = $('#mimetype_${h.FID('f',file.path)}');
--- a/kallithea/templates/admin/gists/new.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/admin/gists/new.html	Fri Oct 02 22:46:15 2015 +0200
@@ -59,7 +59,7 @@
             </div>
           ${h.end_form()}
           <script type="text/javascript">
-            var myCodeMirror = initCodeMirror('editor', '');
+            var myCodeMirror = initCodeMirror('editor', "${request.script_name}", '');
 
             //inject new modes
             var $modes_select = $('#mimetype');
--- a/kallithea/templates/admin/notifications/notifications_data.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/admin/notifications/notifications_data.html	Fri Oct 02 22:46:15 2015 +0200
@@ -32,7 +32,7 @@
 
 <div class="notification-paginator">
   <div class="pagination-wh pagination-left">
-  ${c.notifications.pager('$link_previous ~2~ $link_next',**request.GET.mixed())}
+  ${c.notifications.pager('$link_previous ~2~ $link_next',controller='admin/notifications',**request.GET.mixed())}
   </div>
 </div>
 
--- a/kallithea/templates/base/base.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/base/base.html	Fri Oct 02 22:46:15 2015 +0200
@@ -294,7 +294,7 @@
         <div id="quick_login">
           %if c.authuser.username == 'default' or c.authuser.user_id is None:
             <h4>${_('Login to Your Account')}</h4>
-            ${h.form(h.url('login_home',came_from=h.url.current()))}
+            ${h.form(h.url('login_home', came_from=request.path_qs))}
             <div class="form">
                 <div class="fields">
                     <div class="field">
--- a/kallithea/templates/changelog/changelog.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/changelog/changelog.html	Fri Oct 02 22:46:15 2015 +0200
@@ -110,7 +110,7 @@
                             </a>
                         </td>
                         <td class="date">
-                            <div class="date">${h.age(cs.date,True)}</div>
+                            <div class="date tooltip" title="${h.fmt_date(cs.date)}">${h.age(cs.date,True)}</div>
                         </td>
                         <td class="expand_commit" commit_id="${cs.raw_id}" title="${_('Expand commit message')}">
                             <i class="icon-align-left" style="color:#999"></i>
--- a/kallithea/templates/changeset/changeset_file_comment.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/changeset/changeset_file_comment.html	Fri Oct 02 22:46:15 2015 +0200
@@ -87,7 +87,7 @@
       ${h.form('')}
       <div class="clearfix">
           <div class="comment-help">
-            ${_('You need to be logged in to comment.')} <a href="${h.url('login_home',came_from=h.url.current())}">${_('Login now')}</a>
+            ${_('You need to be logged in to comment.')} <a href="${h.url('login_home', came_from=request.path_qs)}">${_('Login now')}</a>
           </div>
       </div>
       <div class="comment-button">
--- a/kallithea/templates/files/files_add.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/files/files_add.html	Fri Oct 02 22:46:15 2015 +0200
@@ -67,7 +67,7 @@
             ${h.end_form()}
             <script type="text/javascript">
             var reset_url = "${h.url('files_home',repo_name=c.repo_name,revision=c.cs.raw_id,f_path=c.f_path)}";
-            var myCodeMirror = initCodeMirror('editor',reset_url);
+            var myCodeMirror = initCodeMirror('editor', "${request.script_name}", reset_url);
 
             //inject new modes, based on codeMirrors modeInfo object
             $('#set_mode').each(function(){
--- a/kallithea/templates/files/files_edit.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/files/files_edit.html	Fri Oct 02 22:46:15 2015 +0200
@@ -75,7 +75,7 @@
 <script type="text/javascript">
 $(document).ready(function(){
     var reset_url = "${h.url('files_home',repo_name=c.repo_name,revision=c.cs.raw_id,f_path=c.file.path)}";
-    var myCodeMirror = initCodeMirror('editor',reset_url);
+    var myCodeMirror = initCodeMirror('editor', "${request.script_name}", reset_url);
 
    //inject new modes, based on codeMirrors modeInfo object
     $('#set_mode').each(function(){
--- a/kallithea/templates/login.html	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/templates/login.html	Fri Oct 02 22:46:15 2015 +0200
@@ -16,7 +16,7 @@
         %endif
     </div>
     <div class="panel-body inner">
-        ${h.form(h.url.current(**request.GET))}
+        ${h.form(url('login_home', came_from=c.came_from))}
         <div class="form">
             <i class="icon-lock"></i>
             <!-- fields -->
--- a/kallithea/tests/__init__.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/__init__.py	Fri Oct 02 22:46:15 2015 +0200
@@ -90,15 +90,15 @@
 TESTS_TMP_PATH = jn('/', 'tmp', 'rc_test_%s' % _RandomNameSequence().next())
 TEST_USER_ADMIN_LOGIN = 'test_admin'
 TEST_USER_ADMIN_PASS = 'test12'
-TEST_USER_ADMIN_EMAIL = 'test_admin@mail.com'
+TEST_USER_ADMIN_EMAIL = 'test_admin@example.com'
 
 TEST_USER_REGULAR_LOGIN = 'test_regular'
 TEST_USER_REGULAR_PASS = 'test12'
-TEST_USER_REGULAR_EMAIL = 'test_regular@mail.com'
+TEST_USER_REGULAR_EMAIL = 'test_regular@example.com'
 
 TEST_USER_REGULAR2_LOGIN = 'test_regular2'
 TEST_USER_REGULAR2_PASS = 'test12'
-TEST_USER_REGULAR2_EMAIL = 'test_regular2@mail.com'
+TEST_USER_REGULAR2_EMAIL = 'test_regular2@example.com'
 
 HG_REPO = 'vcs_test_hg'
 GIT_REPO = 'vcs_test_git'
--- a/kallithea/tests/api/api_base.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/api/api_base.py	Fri Oct 02 22:46:15 2015 +0200
@@ -552,7 +552,7 @@
     def test_api_create_existing_user(self):
         id_, params = _build_data(self.apikey, 'create_user',
                                   username=TEST_USER_ADMIN_LOGIN,
-                                  email='test@foo.com',
+                                  email='test@example.com',
                                   password='trololo')
         response = api_call(self, params)
 
@@ -571,7 +571,7 @@
 
     def test_api_create_user(self):
         username = 'test_new_api_user'
-        email = username + "@foo.com"
+        email = username + "@example.com"
 
         id_, params = _build_data(self.apikey, 'create_user',
                                   username=username,
@@ -593,7 +593,7 @@
 
     def test_api_create_user_without_password(self):
         username = 'test_new_api_user_passwordless'
-        email = username + "@foo.com"
+        email = username + "@example.com"
 
         id_, params = _build_data(self.apikey, 'create_user',
                                   username=username,
@@ -613,7 +613,7 @@
 
     def test_api_create_user_with_extern_name(self):
         username = 'test_new_api_user_passwordless'
-        email = username + "@foo.com"
+        email = username + "@example.com"
 
         id_, params = _build_data(self.apikey, 'create_user',
                                   username=username,
@@ -635,7 +635,7 @@
     def test_api_create_user_when_exception_happened(self):
 
         username = 'test_new_api_user'
-        email = username + "@foo.com"
+        email = username + "@example.com"
 
         id_, params = _build_data(self.apikey, 'create_user',
                                   username=username,
@@ -1138,7 +1138,7 @@
         ('description', {'description': 'new description'}),
         ('active', {'active': True}),
         ('active', {'active': False}),
-        ('clone_uri', {'clone_uri': 'http://foo.com/repo'}),
+        ('clone_uri', {'clone_uri': 'http://example.com/repo'}),
         ('clone_uri', {'clone_uri': None}),
         ('landing_rev', {'landing_rev': 'branch:master'}),
         ('enable_statistics', {'enable_statistics': True}),
--- a/kallithea/tests/functional/test_admin_users.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/functional/test_admin_users.py	Fri Oct 02 22:46:15 2015 +0200
@@ -47,7 +47,7 @@
         password_confirmation = password
         name = 'name'
         lastname = 'lastname'
-        email = 'mail@mail.com'
+        email = 'mail@example.com'
 
         response = self.app.post(url('users'),
             {'username': username,
@@ -83,7 +83,7 @@
         password = ''
         name = 'name'
         lastname = 'lastname'
-        email = 'errmail.com'
+        email = 'errmail.example.com'
 
         response = self.app.post(url('users'), {'username': username,
                                                'password': password,
@@ -119,7 +119,7 @@
          ('extern_name', {'extern_name': None}),
          ('active', {'active': False}),
          ('active', {'active': True}),
-         ('email', {'email': 'some@email.com'}),
+         ('email', {'email': 'someemail@example.com'}),
         # ('new_password', {'new_password': 'foobar123',
         #                   'password_confirmation': 'foobar123'})
         ])
--- a/kallithea/tests/functional/test_files.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/functional/test_files.py	Fri Oct 02 22:46:15 2015 +0200
@@ -97,7 +97,7 @@
                                     revision='8911406ad776fdd3d0b9932a2e89677e57405a48',
                                     f_path='vcs/nodes.py'))
 
-        response.mustcontain("""<div class="commit">Partially implemented <a class="issue-tracker-link" href="https://myissueserver.com/vcs_test_hg/issue/16">#16</a>. filecontent/commit message/author/node name are safe_unicode now.
+        response.mustcontain("""<div class="commit">Partially implemented <a class="issue-tracker-link" href="https://issues.example.com/vcs_test_hg/issue/16">#16</a>. filecontent/commit message/author/node name are safe_unicode now.
 In addition some other __str__ are unicode as well
 Added test for unicode
 Improved test to clone into uniq repository.
--- a/kallithea/tests/functional/test_login.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/functional/test_login.py	Fri Oct 02 22:46:15 2015 +0200
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 import re
 import time
+import urlparse
 
 import mock
 
@@ -103,20 +104,19 @@
           ('data:text/html,<script>window.alert("xss")</script>',),
           ('mailto:test@example.com',),
           ('file:///etc/passwd',),
-          ('ftp://some.ftp.server',),
-          ('http://other.domain/bl%C3%A5b%C3%A6rgr%C3%B8d',),
+          ('ftp://ftp.example.com',),
+          ('http://other.example.com/bl%C3%A5b%C3%A6rgr%C3%B8d',),
+          ('//evil.example.com/',),
+          ('/\r\nX-Header-Injection: boo',),
+          ('/invälid_url_bytes',),
+          ('non-absolute-path',),
     ])
     def test_login_bad_came_froms(self, url_came_from):
         response = self.app.post(url(controller='login', action='index',
                                      came_from=url_came_from),
                                  {'username': TEST_USER_ADMIN_LOGIN,
-                                  'password': TEST_USER_ADMIN_PASS})
-        self.assertEqual(response.status, '302 Found')
-        self.assertEqual(response._environ['paste.testing_variables']
-                         ['tmpl_context'].came_from, '/')
-        response = response.follow()
-
-        self.assertEqual(response.status, '200 OK')
+                                  'password': TEST_USER_ADMIN_PASS},
+                                 status=400)
 
     def test_login_short_password(self):
         response = self.app.post(url(controller='login', action='index'),
@@ -136,9 +136,9 @@
     # verify that get arguments are correctly passed along login redirection
 
     @parameterized.expand([
-        ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
+        ({'foo':'one', 'bar':'two'}, (('foo', 'one'), ('bar', 'two'))),
         ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
-             ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
+             (('blue', u'blå'.encode('utf-8')), ('green', u'grøn'.encode('utf-8')))),
     ])
     def test_redirection_to_login_form_preserves_get_args(self, args, args_encoded):
         with fixture.anon_access(False):
@@ -146,30 +146,31 @@
                                         repo_name=HG_REPO,
                                         **args))
             self.assertEqual(response.status, '302 Found')
+            came_from = urlparse.parse_qs(urlparse.urlparse(response.location).query)['came_from'][0]
+            came_from_qs = urlparse.parse_qsl(urlparse.urlparse(came_from).query)
             for encoded in args_encoded:
-                self.assertIn(encoded, response.location)
+                self.assertIn(encoded, came_from_qs)
 
     @parameterized.expand([
         ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
-        ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
+        ({'blue': u'blå', 'green':u'grøn'},
              ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
     ])
     def test_login_form_preserves_get_args(self, args, args_encoded):
         response = self.app.get(url(controller='login', action='index',
-                                    came_from = '/_admin/users',
-                                    **args))
+                                    came_from=url('/_admin/users', **args)))
+        came_from = urlparse.parse_qs(urlparse.urlparse(response.form.action).query)['came_from'][0]
         for encoded in args_encoded:
-            self.assertIn(encoded, response.form.action)
+            self.assertIn(encoded, came_from)
 
     @parameterized.expand([
         ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
-        ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
+        ({'blue': u'blå', 'green':u'grøn'},
              ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
     ])
     def test_redirection_after_successful_login_preserves_get_args(self, args, args_encoded):
         response = self.app.post(url(controller='login', action='index',
-                                     came_from = '/_admin/users',
-                                     **args),
+                                     came_from = url('/_admin/users', **args)),
                                  {'username': TEST_USER_ADMIN_LOGIN,
                                   'password': TEST_USER_ADMIN_PASS})
         self.assertEqual(response.status, '302 Found')
@@ -178,19 +179,19 @@
 
     @parameterized.expand([
         ({'foo':'one', 'bar':'two'}, ('foo=one', 'bar=two')),
-        ({'blue': u'blå'.encode('utf-8'), 'green':u'grøn'},
+        ({'blue': u'blå', 'green':u'grøn'},
              ('blue=bl%C3%A5', 'green=gr%C3%B8n')),
     ])
     def test_login_form_after_incorrect_login_preserves_get_args(self, args, args_encoded):
         response = self.app.post(url(controller='login', action='index',
-                                     came_from = '/_admin/users',
-                                     **args),
+                                     came_from=url('/_admin/users', **args)),
                                  {'username': 'error',
                                   'password': 'test12'})
 
         response.mustcontain('Invalid username or password')
+        came_from = urlparse.parse_qs(urlparse.urlparse(response.form.action).query)['came_from'][0]
         for encoded in args_encoded:
-            self.assertIn(encoded, response.form.action)
+            self.assertIn(encoded, came_from)
 
     #==========================================================================
     # REGISTRATIONS
@@ -205,7 +206,7 @@
                                             {'username': uname,
                                              'password': 'test12',
                                              'password_confirmation': 'test12',
-                                             'email': 'goodmail@domain.com',
+                                             'email': 'goodmail@example.com',
                                              'firstname': 'test',
                                              'lastname': 'test'})
 
@@ -304,7 +305,7 @@
     def test_register_ok(self):
         username = 'test_regular4'
         password = 'qweqwe'
-        email = 'username@test.com'
+        email = 'user4@example.com'
         name = 'testname'
         lastname = 'testlastname'
 
@@ -348,7 +349,7 @@
 
         username = 'test_password_reset_1'
         password = 'qweqwe'
-        email = 'username@python-works.com'
+        email = 'username@example.com'
         name = 'passwd'
         lastname = 'reset'
         timestamp = int(time.time())
--- a/kallithea/tests/functional/test_my_account.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/functional/test_my_account.py	Fri Oct 02 22:46:15 2015 +0200
@@ -67,16 +67,16 @@
         response.mustcontain('No additional emails specified')
 
         response = self.app.post(url('my_account_emails'),
-                                 {'new_email': 'foo@barz.com', '_authentication_token': self.authentication_token()})
+                                 {'new_email': 'barz@example.com', '_authentication_token': self.authentication_token()})
 
         response = self.app.get(url('my_account_emails'))
 
         from kallithea.model.db import UserEmailMap
         email_id = UserEmailMap.query()\
             .filter(UserEmailMap.user == User.get_by_username(TEST_USER_ADMIN_LOGIN))\
-            .filter(UserEmailMap.email == 'foo@barz.com').one().email_id
+            .filter(UserEmailMap.email == 'barz@example.com').one().email_id
 
-        response.mustcontain('foo@barz.com')
+        response.mustcontain('barz@example.com')
         response.mustcontain('<input id="del_email_id" name="del_email_id" type="hidden" value="%s" />' % email_id)
 
         response = self.app.post(url('my_account_emails'),
@@ -97,7 +97,7 @@
          #('extern_name', {'extern_name': None}),
          ('active', {'active': False}),
          ('active', {'active': True}),
-         ('email', {'email': 'some@email.com'}),
+         ('email', {'email': 'someemail@example.com'}),
         # ('new_password', {'new_password': 'foobar123',
         #                   'password_confirmation': 'foobar123'})
         ])
--- a/kallithea/tests/other/manual_test_vcs_operations.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/other/manual_test_vcs_operations.py	Fri Oct 02 22:46:15 2015 +0200
@@ -112,13 +112,13 @@
     for i in xrange(kwargs.get('files_no', 3)):
         cmd = """echo 'added_line%s' >> %s""" % (i, added_file)
         Command(cwd).execute(cmd)
-        author_str = 'User ǝɯɐᴎ <me@email.com>'
+        author_str = 'User ǝɯɐᴎ <me@example.com>'
         if vcs == 'hg':
             cmd = """hg commit -m 'commited new %s' -u '%s' %s """ % (
                 i, author_str, added_file
             )
         elif vcs == 'git':
-            cmd = """EMAIL="me@email.com" git commit -m 'commited new %s' --author '%s' %s """ % (
+            cmd = """EMAIL="me@example.com" git commit -m 'commited new %s' --author '%s' %s """ % (
                 i, author_str, added_file
             )
         Command(cwd).execute(cmd)
--- a/kallithea/tests/other/test_libs.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/other/test_libs.py	Fri Oct 02 22:46:15 2015 +0200
@@ -42,11 +42,11 @@
      '%s://127.0.0.1' % proto),
     ('%s://127.0.0.1:8080' % proto, ['%s://' % proto, '127.0.0.1', '8080'],
      '%s://127.0.0.1:8080' % proto),
-    ('%s://domain.org' % proto, ['%s://' % proto, 'domain.org'],
-     '%s://domain.org' % proto),
-    ('%s://user:pass@domain.org:8080' % proto, ['%s://' % proto, 'domain.org',
+    ('%s://example.com' % proto, ['%s://' % proto, 'example.com'],
+     '%s://example.com' % proto),
+    ('%s://user:pass@example.com:8080' % proto, ['%s://' % proto, 'example.com',
                                                 '8080'],
-     '%s://domain.org:8080' % proto),
+     '%s://example.com:8080' % proto),
 ]
 
 proto = 'https'
@@ -59,11 +59,11 @@
      '%s://127.0.0.1' % proto),
     ('%s://127.0.0.1:8080' % proto, ['%s://' % proto, '127.0.0.1', '8080'],
      '%s://127.0.0.1:8080' % proto),
-    ('%s://domain.org' % proto, ['%s://' % proto, 'domain.org'],
-     '%s://domain.org' % proto),
-    ('%s://user:pass@domain.org:8080' % proto, ['%s://' % proto, 'domain.org',
+    ('%s://example.com' % proto, ['%s://' % proto, 'example.com'],
+     '%s://example.com' % proto),
+    ('%s://user:pass@example.com:8080' % proto, ['%s://' % proto, 'example.com',
                                                 '8080'],
-     '%s://domain.org:8080' % proto),
+     '%s://example.com:8080' % proto),
 ]
 
 
@@ -104,11 +104,11 @@
     def test_mention_extractor(self):
         from kallithea.lib.utils2 import extract_mentioned_users
         sample = (
-            "@first hi there @world here's my email username@email.com "
+            "@first hi there @world here's my email username@example.com "
             "@lukaszb check @one_more22 it pls @ ttwelve @D[] @one@two@three "
             "@UPPER    @cAmEL @2one_more22 @john please see this http://org.pl "
             "@marian.user just do it @marco-polo and next extract @marco_polo "
-            "user.dot  hej ! not-needed maril@domain.org"
+            "user.dot  hej ! not-needed maril@example.com"
         )
 
         s = sorted([
@@ -184,7 +184,7 @@
     def test_tag_exctrator(self):
         sample = (
             "hello pta[tag] gog [[]] [[] sda ero[or]d [me =>>< sa]"
-            "[requires] [stale] [see<>=>] [see => http://url.com]"
+            "[requires] [stale] [see<>=>] [see => http://example.com]"
             "[requires => url] [lang => python] [just a tag]"
             "[,d] [ => ULR ] [obsolete] [desc]]"
         )
@@ -205,7 +205,7 @@
         class fake_url(object):
             @classmethod
             def current(cls, *args, **kwargs):
-                return 'https://server.com'
+                return 'https://example.com'
 
         #mock pylons.tmpl_context
         def fake_tmpl_context(_url):
@@ -218,35 +218,35 @@
 
 
         with mock.patch('pylons.url', fake_url):
-            fake = fake_tmpl_context(_url='http://test.com/{email}')
+            fake = fake_tmpl_context(_url='http://example.com/{email}')
             with mock.patch('pylons.tmpl_context', fake):
                     from pylons import url
-                    assert url.current() == 'https://server.com'
-                    grav = gravatar_url(email_address='test@foo.com', size=24)
-                    assert grav == 'http://test.com/test@foo.com'
+                    assert url.current() == 'https://example.com'
+                    grav = gravatar_url(email_address='test@example.com', size=24)
+                    assert grav == 'http://example.com/test@example.com'
 
-            fake = fake_tmpl_context(_url='http://test.com/{email}')
+            fake = fake_tmpl_context(_url='http://example.com/{email}')
             with mock.patch('pylons.tmpl_context', fake):
-                grav = gravatar_url(email_address='test@foo.com', size=24)
-                assert grav == 'http://test.com/test@foo.com'
+                grav = gravatar_url(email_address='test@example.com', size=24)
+                assert grav == 'http://example.com/test@example.com'
 
-            fake = fake_tmpl_context(_url='http://test.com/{md5email}')
+            fake = fake_tmpl_context(_url='http://example.com/{md5email}')
             with mock.patch('pylons.tmpl_context', fake):
-                em = 'test@foo.com'
+                em = 'test@example.com'
                 grav = gravatar_url(email_address=em, size=24)
-                assert grav == 'http://test.com/%s' % (_md5(em))
+                assert grav == 'http://example.com/%s' % (_md5(em))
 
-            fake = fake_tmpl_context(_url='http://test.com/{md5email}/{size}')
+            fake = fake_tmpl_context(_url='http://example.com/{md5email}/{size}')
             with mock.patch('pylons.tmpl_context', fake):
-                em = 'test@foo.com'
+                em = 'test@example.com'
                 grav = gravatar_url(email_address=em, size=24)
-                assert grav == 'http://test.com/%s/%s' % (_md5(em), 24)
+                assert grav == 'http://example.com/%s/%s' % (_md5(em), 24)
 
             fake = fake_tmpl_context(_url='{scheme}://{netloc}/{md5email}/{size}')
             with mock.patch('pylons.tmpl_context', fake):
-                em = 'test@foo.com'
+                em = 'test@example.com'
                 grav = gravatar_url(email_address=em, size=24)
-                assert grav == 'https://server.com/%s/%s' % (_md5(em), 24)
+                assert grav == 'https://example.com/%s/%s' % (_md5(em), 24)
 
     @parameterized.expand([
         (Repository.DEFAULT_CLONE_URI, 'group/repo1', {}, '', 'http://vps1:8000/group/repo1'),
@@ -260,9 +260,9 @@
         ('{scheme}://{user}@{netloc}/_{repoid}', 'group/repo1', {'user': 'username'}, '', 'http://username@vps1:8000/_23'),
         ('http://{user}@{netloc}/_{repoid}', 'group/repo1', {'user': 'username'}, '', 'http://username@vps1:8000/_23'),
         ('http://{netloc}/_{repoid}', 'group/repo1', {'user': 'username'}, '', 'http://vps1:8000/_23'),
-        ('https://{user}@proxy1.server.com/{repo}', 'group/repo1', {'user': 'username'}, '', 'https://username@proxy1.server.com/group/repo1'),
-        ('https://{user}@proxy1.server.com/{repo}', 'group/repo1', {}, '', 'https://proxy1.server.com/group/repo1'),
-        ('https://proxy1.server.com/{user}/{repo}', 'group/repo1', {'user': 'username'}, '', 'https://proxy1.server.com/username/group/repo1'),
+        ('https://{user}@proxy1.example.com/{repo}', 'group/repo1', {'user': 'username'}, '', 'https://username@proxy1.example.com/group/repo1'),
+        ('https://{user}@proxy1.example.com/{repo}', 'group/repo1', {}, '', 'https://proxy1.example.com/group/repo1'),
+        ('https://proxy1.example.com/{user}/{repo}', 'group/repo1', {'user': 'username'}, '', 'https://proxy1.example.com/username/group/repo1'),
     ])
     def test_clone_url_generator(self, tmpl, repo_name, overrides, prefix, expected):
         from kallithea.lib.utils2 import get_clone_url
@@ -337,12 +337,12 @@
        "from rev a also rev url[http://google.com]",
        "http://google.com"),
        ("""Multi line
-       https://foo.bar.com
+       https://foo.bar.example.com
        some text lalala""",
        """Multi line
-       url[https://foo.bar.com]
+       url[https://foo.bar.example.com]
        some text lalala""",
-       "https://foo.bar.com")
+       "https://foo.bar.example.com")
     ])
     def test_urlify_test(self, sample, expected, url_):
         from kallithea.lib.helpers import urlify_text
--- a/kallithea/tests/scripts/manual_test_concurrency.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/scripts/manual_test_concurrency.py	Fri Oct 02 22:46:15 2015 +0200
@@ -107,7 +107,7 @@
         new_usr = User()
         new_usr.username = USER
         new_usr.password = get_crypt_password(PASS)
-        new_usr.email = 'mail@mail.com'
+        new_usr.email = 'mail@example.com'
         new_usr.name = 'test'
         new_usr.lastname = 'lasttestname'
         new_usr.active = True
--- a/kallithea/tests/test.ini	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/test.ini	Fri Oct 02 22:46:15 2015 +0200
@@ -56,7 +56,7 @@
 ## SMTP server settings
 ## Only smtp_server is mandatory. All other settings take the specified default
 ## values.
-#smtp_server = mail.server.com
+#smtp_server = smtp.example.com
 #smtp_username =
 #smtp_password =
 #smtp_port = 25
@@ -228,8 +228,8 @@
 
 ## gist URL alias, used to create nicer urls for gist. This should be an
 ## url that does rewrites to _admin/gists/<gistid>.
-## example: http://gist.kallithea.server/{gistid}. Empty means use the internal
-## Kallithea url, ie. http[s]://your.kallithea.server/_admin/gists/<gistid>
+## example: http://gist.example.com/{gistid}. Empty means use the internal
+## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid>
 gist_alias_url =
 
 ## white list of API enabled controllers. This allows to add list of
@@ -264,7 +264,7 @@
 ## fetched from the regex and {repo} is replaced with full repository name
 ## including groups {repo_name} is replaced with just name of repo
 
-issue_server_link = https://myissueserver.com/{repo}/issue/{id}
+issue_server_link = https://issues.example.com/{repo}/issue/{id}
 
 ## prefix to add to link to indicate it's an url
 ## #314 will be replaced by <issue_prefix><id>
@@ -274,10 +274,10 @@
 ## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
 ## multiple patterns, to other issues server, wiki or others
 ## below an example how to create a wiki pattern
-# wiki-some-id -> https://mywiki.com/some-id
+# wiki-some-id -> https://wiki.example.com/some-id
 
 #issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://mywiki.com/{id}
+#issue_server_link_wiki = https://wiki.example.com/{id}
 #issue_prefix_wiki = WIKI-
 
 ## instance-id prefix
--- a/kallithea/tests/vcs/test_utils.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/kallithea/tests/vcs/test_utils.py	Fri Oct 02 22:46:15 2015 +0200
@@ -184,26 +184,26 @@
 
 
 class TestAuthorExtractors(unittest.TestCase):
-    TEST_AUTHORS = [("Username Last'o'Name <username@python-works.com>",
-                    ("Username Last'o'Name", "username@python-works.com")),
-                  ("Username Last'o'Name Spaces < username@python-works.com >",
-                    ("Username Last'o'Name Spaces", "username@python-works.com")),
-                  ("Username Last'o'Name <username.lastname@python-works.com>",
-                    ("Username Last'o'Name", "username.lastname@python-works.com")),
-                  ('mrf RFC_SPEC <username+lastname@python-works.com>',
-                    ('mrf RFC_SPEC', 'username+lastname@python-works.com')),
-                  ('username <user@email.com>',
-                    ('username', 'user@email.com')),
-                  ('username <user@email.com',
-                   ('username', 'user@email.com')),
-                  ('broken missing@email.com',
-                   ('broken', 'missing@email.com')),
-                  ('<justemail@mail.com>',
-                   ('', 'justemail@mail.com')),
+    TEST_AUTHORS = [("Username Last'o'Name <username@example.com>",
+                    ("Username Last'o'Name", "username@example.com")),
+                  ("Username Last'o'Name Spaces < username@example.com >",
+                    ("Username Last'o'Name Spaces", "username@example.com")),
+                  ("Username Last'o'Name <username.lastname@example.com>",
+                    ("Username Last'o'Name", "username.lastname@example.com")),
+                  ('mrf RFC_SPEC <username+lastname@example.com>',
+                    ('mrf RFC_SPEC', 'username+lastname@example.com')),
+                  ('username <user@example.com>',
+                    ('username', 'user@example.com')),
+                  ('username <user@example.com',
+                   ('username', 'user@example.com')),
+                  ('broken missing@example.com',
+                   ('broken', 'missing@example.com')),
+                  ('<justemail@example.com>',
+                   ('', 'justemail@example.com')),
                   ('justname',
                    ('justname', '')),
-                  ('Mr Double Name withemail@email.com ',
-                   ('Mr Double Name', 'withemail@email.com')),
+                  ('Mr Double Name withemail@example.com ',
+                   ('Mr Double Name', 'withemail@example.com')),
                   ]
 
     def test_author_email(self):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/make-release	Fri Oct 02 22:46:15 2015 +0200
@@ -0,0 +1,63 @@
+#!/bin/bash
+set -e
+set -x
+
+echo "Checking tools needed for uploading stuff"
+pip freeze | grep '^Sphinx==' || pip install Sphinx
+pip freeze | grep '^Sphinx-PyPI-upload==' || pip install Sphinx-PyPI-upload
+
+echo "Verifying everything can build"
+hg purge --all dist
+python2 setup.py build_sphinx
+python2 setup.py compile_catalog # TODO: check for errors
+python2 setup.py sdist
+
+echo "Verifying VERSION from kallithea/__init__.py"
+namerel=$(cd dist && echo Kallithea-*.tar.gz)
+namerel=${namerel%.tar.gz}
+version=${namerel#Kallithea-}
+echo "Releasing Kallithea $version in directory $namerel"
+echo "Verifying current revision is tagged for $version"
+hg log -r "'$version'&." | grep .
+
+echo "Cleaning before making release build"
+hg up -c .
+hg revert -a -r null
+hg up -C "'$version'&."
+hg purge --all
+
+echo "Building dist file"
+python2 setup.py compile_catalog
+python2 setup.py sdist
+
+echo "Verifying dist file content"
+tar tf dist/Kallithea-*.tar.gz | sed "s|^$namerel/||" | LANG=C sort > scripts/manifest
+hg diff
+hg up -c . # fail if manifest changed
+
+echo "Now, make sure"
+echo "* the copyright and contributor lists have been updated"
+echo "* all tests are passing"
+echo "* release note is ready"
+echo "* announcement is ready"
+echo "* source has been pushed to https://kallithea-scm.org/repos/kallithea"
+echo
+
+echo -n "Enter \"pypi\" to upload Kallithea $version to pypi: "
+read answer
+[ "$answer" = "pypi" ]
+extraargs=${EMAIL:+--identity=$EMAIL}
+python2 setup.py sdist upload --sign $extraargs
+xdg-open https://pypi.python.org/pypi/Kallithea
+
+echo "Uploading docs to pypi"
+# See https://wiki.python.org/moin/PyPiDocumentationHosting
+python2 setup.py build_sphinx upload_sphinx
+xdg-open https://pythonhosted.org/Kallithea/
+xdg-open http://packages.python.org/Kallithea/installation.html
+
+echo "Rebuilding readthedocs for docs.kallithea-scm.org"
+xdg-open https://readthedocs.org/projects/kallithea/
+curl -X POST http://readthedocs.org/build/kallithea
+xdg-open https://readthedocs.org/builds/kallithea/
+xdg-open http://docs.kallithea-scm.org/en/latest/ # or whatever the branch is
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/manifest	Fri Oct 02 22:46:15 2015 +0200
@@ -0,0 +1,952 @@
+
+Apache-License-2.0.txt
+CONTRIBUTORS
+COPYING
+Kallithea.egg-info/
+Kallithea.egg-info/PKG-INFO
+Kallithea.egg-info/SOURCES.txt
+Kallithea.egg-info/dependency_links.txt
+Kallithea.egg-info/entry_points.txt
+Kallithea.egg-info/not-zip-safe
+Kallithea.egg-info/paster_plugins.txt
+Kallithea.egg-info/requires.txt
+Kallithea.egg-info/top_level.txt
+LICENSE-MERGELY.html
+LICENSE.md
+MANIFEST.in
+MIT-Permissive-License.txt
+PKG-INFO
+README.rst
+development.ini
+docs/
+docs/Makefile
+docs/api/
+docs/api/api.rst
+docs/api/models.rst
+docs/changelog.rst
+docs/conf.py
+docs/contributing.rst
+docs/images/
+docs/images/.img
+docs/index.rst
+docs/installation.rst
+docs/installation_iis.rst
+docs/installation_puppet.rst
+docs/installation_win.rst
+docs/installation_win_old.rst
+docs/make.bat
+docs/overview.rst
+docs/readme.rst
+docs/setup.rst
+docs/theme/
+docs/theme/nature/
+docs/theme/nature/layout.html
+docs/theme/nature/static/
+docs/theme/nature/static/kallithea-logo.svg
+docs/theme/nature/static/nature.css_t
+docs/theme/nature/static/pygments.css
+docs/theme/nature/theme.conf
+docs/usage/
+docs/usage/backup.rst
+docs/usage/debugging.rst
+docs/usage/email.rst
+docs/usage/general.rst
+docs/usage/locking.rst
+docs/usage/performance.rst
+docs/usage/statistics.rst
+docs/usage/troubleshooting.rst
+docs/usage/vcs_support.rst
+init.d/
+init.d/celeryd-upstart.conf
+init.d/kallithea-daemon-arch
+init.d/kallithea-daemon-debian
+init.d/kallithea-daemon-gentoo
+init.d/kallithea-daemon-redhat
+init.d/kallithea-upstart.conf
+init.d/supervisord.conf
+kallithea/
+kallithea/__init__.py
+kallithea/bin/
+kallithea/bin/__init__.py
+kallithea/bin/base.py
+kallithea/bin/kallithea_api.py
+kallithea/bin/kallithea_backup.py
+kallithea/bin/kallithea_config.py
+kallithea/bin/kallithea_gist.py
+kallithea/bin/ldap_sync.conf
+kallithea/bin/ldap_sync.py
+kallithea/bin/rebranddb.py
+kallithea/bin/template.ini.mako
+kallithea/config/
+kallithea/config/__init__.py
+kallithea/config/conf.py
+kallithea/config/deployment.ini_tmpl
+kallithea/config/environment.py
+kallithea/config/middleware.py
+kallithea/config/post_receive_tmpl.py
+kallithea/config/pre_receive_tmpl.py
+kallithea/config/rcextensions/
+kallithea/config/rcextensions/__init__.py
+kallithea/config/routing.py
+kallithea/controllers/
+kallithea/controllers/__init__.py
+kallithea/controllers/admin/
+kallithea/controllers/admin/__init__.py
+kallithea/controllers/admin/admin.py
+kallithea/controllers/admin/auth_settings.py
+kallithea/controllers/admin/defaults.py
+kallithea/controllers/admin/gists.py
+kallithea/controllers/admin/my_account.py
+kallithea/controllers/admin/notifications.py
+kallithea/controllers/admin/permissions.py
+kallithea/controllers/admin/repo_groups.py
+kallithea/controllers/admin/repos.py
+kallithea/controllers/admin/settings.py
+kallithea/controllers/admin/user_groups.py
+kallithea/controllers/admin/users.py
+kallithea/controllers/api/
+kallithea/controllers/api/__init__.py
+kallithea/controllers/api/api.py
+kallithea/controllers/bookmarks.py
+kallithea/controllers/branches.py
+kallithea/controllers/changelog.py
+kallithea/controllers/changeset.py
+kallithea/controllers/compare.py
+kallithea/controllers/error.py
+kallithea/controllers/feed.py
+kallithea/controllers/files.py
+kallithea/controllers/followers.py
+kallithea/controllers/forks.py
+kallithea/controllers/home.py
+kallithea/controllers/journal.py
+kallithea/controllers/login.py
+kallithea/controllers/pullrequests.py
+kallithea/controllers/search.py
+kallithea/controllers/summary.py
+kallithea/controllers/tags.py
+kallithea/i18n/
+kallithea/i18n/be/
+kallithea/i18n/be/LC_MESSAGES/
+kallithea/i18n/be/LC_MESSAGES/kallithea.mo
+kallithea/i18n/be/LC_MESSAGES/kallithea.po
+kallithea/i18n/cs/
+kallithea/i18n/cs/LC_MESSAGES/
+kallithea/i18n/cs/LC_MESSAGES/kallithea.mo
+kallithea/i18n/cs/LC_MESSAGES/kallithea.po
+kallithea/i18n/de/
+kallithea/i18n/de/LC_MESSAGES/
+kallithea/i18n/de/LC_MESSAGES/kallithea.mo
+kallithea/i18n/de/LC_MESSAGES/kallithea.po
+kallithea/i18n/en/
+kallithea/i18n/en/LC_MESSAGES/
+kallithea/i18n/en/LC_MESSAGES/kallithea.mo
+kallithea/i18n/fr/
+kallithea/i18n/fr/LC_MESSAGES/
+kallithea/i18n/fr/LC_MESSAGES/kallithea.mo
+kallithea/i18n/fr/LC_MESSAGES/kallithea.po
+kallithea/i18n/how_to
+kallithea/i18n/hu/
+kallithea/i18n/hu/LC_MESSAGES/
+kallithea/i18n/hu/LC_MESSAGES/kallithea.mo
+kallithea/i18n/hu/LC_MESSAGES/kallithea.po
+kallithea/i18n/ja/
+kallithea/i18n/ja/LC_MESSAGES/
+kallithea/i18n/ja/LC_MESSAGES/kallithea.mo
+kallithea/i18n/ja/LC_MESSAGES/kallithea.po
+kallithea/i18n/kallithea.pot
+kallithea/i18n/nl_BE/
+kallithea/i18n/nl_BE/LC_MESSAGES/
+kallithea/i18n/nl_BE/LC_MESSAGES/kallithea.mo
+kallithea/i18n/nl_BE/LC_MESSAGES/kallithea.po
+kallithea/i18n/pl/
+kallithea/i18n/pl/LC_MESSAGES/
+kallithea/i18n/pl/LC_MESSAGES/kallithea.mo
+kallithea/i18n/pl/LC_MESSAGES/kallithea.po
+kallithea/i18n/pt_BR/
+kallithea/i18n/pt_BR/LC_MESSAGES/
+kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.mo
+kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po
+kallithea/i18n/ru/
+kallithea/i18n/ru/LC_MESSAGES/
+kallithea/i18n/ru/LC_MESSAGES/kallithea.mo
+kallithea/i18n/ru/LC_MESSAGES/kallithea.po
+kallithea/i18n/sk/
+kallithea/i18n/sk/LC_MESSAGES/
+kallithea/i18n/sk/LC_MESSAGES/kallithea.mo
+kallithea/i18n/sk/LC_MESSAGES/kallithea.po
+kallithea/i18n/zh_CN/
+kallithea/i18n/zh_CN/LC_MESSAGES/
+kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.mo
+kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po
+kallithea/i18n/zh_TW/
+kallithea/i18n/zh_TW/LC_MESSAGES/
+kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.mo
+kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po
+kallithea/lib/
+kallithea/lib/__init__.py
+kallithea/lib/annotate.py
+kallithea/lib/app_globals.py
+kallithea/lib/auth.py
+kallithea/lib/auth_modules/
+kallithea/lib/auth_modules/__init__.py
+kallithea/lib/auth_modules/auth_container.py
+kallithea/lib/auth_modules/auth_crowd.py
+kallithea/lib/auth_modules/auth_internal.py
+kallithea/lib/auth_modules/auth_ldap.py
+kallithea/lib/auth_modules/auth_pam.py
+kallithea/lib/base.py
+kallithea/lib/caching_query.py
+kallithea/lib/celerylib/
+kallithea/lib/celerylib/__init__.py
+kallithea/lib/celerylib/tasks.py
+kallithea/lib/celerypylons/
+kallithea/lib/celerypylons/__init__.py
+kallithea/lib/celerypylons/commands.py
+kallithea/lib/celerypylons/loader.py
+kallithea/lib/colored_formatter.py
+kallithea/lib/compat.py
+kallithea/lib/db_manage.py
+kallithea/lib/dbmigrate/
+kallithea/lib/dbmigrate/__init__.py
+kallithea/lib/dbmigrate/migrate.cfg
+kallithea/lib/dbmigrate/migrate/
+kallithea/lib/dbmigrate/migrate/__init__.py
+kallithea/lib/dbmigrate/migrate/changeset/
+kallithea/lib/dbmigrate/migrate/changeset/__init__.py
+kallithea/lib/dbmigrate/migrate/changeset/ansisql.py
+kallithea/lib/dbmigrate/migrate/changeset/constraint.py
+kallithea/lib/dbmigrate/migrate/changeset/databases/
+kallithea/lib/dbmigrate/migrate/changeset/databases/__init__.py
+kallithea/lib/dbmigrate/migrate/changeset/databases/firebird.py
+kallithea/lib/dbmigrate/migrate/changeset/databases/mysql.py
+kallithea/lib/dbmigrate/migrate/changeset/databases/oracle.py
+kallithea/lib/dbmigrate/migrate/changeset/databases/postgres.py
+kallithea/lib/dbmigrate/migrate/changeset/databases/sqlite.py
+kallithea/lib/dbmigrate/migrate/changeset/databases/visitor.py
+kallithea/lib/dbmigrate/migrate/changeset/schema.py
+kallithea/lib/dbmigrate/migrate/exceptions.py
+kallithea/lib/dbmigrate/migrate/versioning/
+kallithea/lib/dbmigrate/migrate/versioning/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/api.py
+kallithea/lib/dbmigrate/migrate/versioning/cfgparse.py
+kallithea/lib/dbmigrate/migrate/versioning/config.py
+kallithea/lib/dbmigrate/migrate/versioning/genmodel.py
+kallithea/lib/dbmigrate/migrate/versioning/migrate_repository.py
+kallithea/lib/dbmigrate/migrate/versioning/pathed.py
+kallithea/lib/dbmigrate/migrate/versioning/repository.py
+kallithea/lib/dbmigrate/migrate/versioning/schema.py
+kallithea/lib/dbmigrate/migrate/versioning/schemadiff.py
+kallithea/lib/dbmigrate/migrate/versioning/script/
+kallithea/lib/dbmigrate/migrate/versioning/script/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/script/base.py
+kallithea/lib/dbmigrate/migrate/versioning/script/py.py
+kallithea/lib/dbmigrate/migrate/versioning/script/sql.py
+kallithea/lib/dbmigrate/migrate/versioning/shell.py
+kallithea/lib/dbmigrate/migrate/versioning/template.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/
+kallithea/lib/dbmigrate/migrate/versioning/templates/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/manage.py_tmpl
+kallithea/lib/dbmigrate/migrate/versioning/templates/manage/
+kallithea/lib/dbmigrate/migrate/versioning/templates/manage/default.py_tmpl
+kallithea/lib/dbmigrate/migrate/versioning/templates/manage/pylons.py_tmpl
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/README
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/migrate.cfg
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/versions/
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/default/versions/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/README
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/migrate.cfg
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/versions/
+kallithea/lib/dbmigrate/migrate/versioning/templates/repository/pylons/versions/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/script/
+kallithea/lib/dbmigrate/migrate/versioning/templates/script/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/templates/script/default.py_tmpl
+kallithea/lib/dbmigrate/migrate/versioning/templates/script/pylons.py_tmpl
+kallithea/lib/dbmigrate/migrate/versioning/templates/sql_script/
+kallithea/lib/dbmigrate/migrate/versioning/templates/sql_script/default.py_tmpl
+kallithea/lib/dbmigrate/migrate/versioning/templates/sql_script/pylons.py_tmpl
+kallithea/lib/dbmigrate/migrate/versioning/util/
+kallithea/lib/dbmigrate/migrate/versioning/util/__init__.py
+kallithea/lib/dbmigrate/migrate/versioning/util/importpath.py
+kallithea/lib/dbmigrate/migrate/versioning/util/keyedinstance.py
+kallithea/lib/dbmigrate/migrate/versioning/version.py
+kallithea/lib/dbmigrate/schema/
+kallithea/lib/dbmigrate/schema/__init__.py
+kallithea/lib/dbmigrate/schema/db_1_1_0.py
+kallithea/lib/dbmigrate/schema/db_1_2_0.py
+kallithea/lib/dbmigrate/schema/db_1_3_0.py
+kallithea/lib/dbmigrate/schema/db_1_4_0.py
+kallithea/lib/dbmigrate/schema/db_1_5_0.py
+kallithea/lib/dbmigrate/schema/db_1_5_2.py
+kallithea/lib/dbmigrate/schema/db_1_6_0.py
+kallithea/lib/dbmigrate/schema/db_1_7_0.py
+kallithea/lib/dbmigrate/schema/db_1_8_0.py
+kallithea/lib/dbmigrate/schema/db_2_0_0.py
+kallithea/lib/dbmigrate/schema/db_2_0_1.py
+kallithea/lib/dbmigrate/schema/db_2_0_2.py
+kallithea/lib/dbmigrate/schema/db_2_1_0.py
+kallithea/lib/dbmigrate/schema/db_2_2_0.py
+kallithea/lib/dbmigrate/schema/db_2_2_3.py
+kallithea/lib/dbmigrate/versions/
+kallithea/lib/dbmigrate/versions/001_initial_release.py
+kallithea/lib/dbmigrate/versions/002_version_1_1_0.py
+kallithea/lib/dbmigrate/versions/003_version_1_2_0.py
+kallithea/lib/dbmigrate/versions/004_version_1_3_0.py
+kallithea/lib/dbmigrate/versions/005_version_1_3_0.py
+kallithea/lib/dbmigrate/versions/006_version_1_4_0.py
+kallithea/lib/dbmigrate/versions/007_version_1_4_0.py
+kallithea/lib/dbmigrate/versions/008_version_1_5_0.py
+kallithea/lib/dbmigrate/versions/009_version_1_5_1.py
+kallithea/lib/dbmigrate/versions/010_version_1_5_2.py
+kallithea/lib/dbmigrate/versions/011_version_1_6_0.py
+kallithea/lib/dbmigrate/versions/012_version_1_7_0.py
+kallithea/lib/dbmigrate/versions/013_version_1_7_0.py
+kallithea/lib/dbmigrate/versions/014_version_1_7_1.py
+kallithea/lib/dbmigrate/versions/015_version_1_8_0.py
+kallithea/lib/dbmigrate/versions/016_version_2_0_0.py
+kallithea/lib/dbmigrate/versions/017_version_2_0_0.py
+kallithea/lib/dbmigrate/versions/018_version_2_0_0.py
+kallithea/lib/dbmigrate/versions/019_version_2_0_0.py
+kallithea/lib/dbmigrate/versions/020_version_2_0_1.py
+kallithea/lib/dbmigrate/versions/021_version_2_0_2.py
+kallithea/lib/dbmigrate/versions/022_version_2_0_2.py
+kallithea/lib/dbmigrate/versions/023_version_2_1_0.py
+kallithea/lib/dbmigrate/versions/024_version_2_1_0.py
+kallithea/lib/dbmigrate/versions/025_version_2_1_0.py
+kallithea/lib/dbmigrate/versions/026_version_2_2_0.py
+kallithea/lib/dbmigrate/versions/027_version_2_2_0.py
+kallithea/lib/dbmigrate/versions/028_version_2_2_3.py
+kallithea/lib/dbmigrate/versions/029_version_2_2_3.py
+kallithea/lib/dbmigrate/versions/030_version_2_2_3.py
+kallithea/lib/dbmigrate/versions/031_version_2_2_3.py
+kallithea/lib/dbmigrate/versions/__init__.py
+kallithea/lib/diffs.py
+kallithea/lib/exceptions.py
+kallithea/lib/ext_json.py
+kallithea/lib/graphmod.py
+kallithea/lib/helpers.py
+kallithea/lib/hooks.py
+kallithea/lib/indexers/
+kallithea/lib/indexers/__init__.py
+kallithea/lib/indexers/daemon.py
+kallithea/lib/ipaddr.py
+kallithea/lib/markup_renderer.py
+kallithea/lib/middleware/
+kallithea/lib/middleware/__init__.py
+kallithea/lib/middleware/errormator.py
+kallithea/lib/middleware/https_fixup.py
+kallithea/lib/middleware/pygrack.py
+kallithea/lib/middleware/sentry.py
+kallithea/lib/middleware/sessionmiddleware.py
+kallithea/lib/middleware/simplegit.py
+kallithea/lib/middleware/simplehg.py
+kallithea/lib/middleware/wrapper.py
+kallithea/lib/paster_commands/
+kallithea/lib/paster_commands/__init__.py
+kallithea/lib/paster_commands/cache_keys.py
+kallithea/lib/paster_commands/cleanup.py
+kallithea/lib/paster_commands/install_iis.py
+kallithea/lib/paster_commands/ishell.py
+kallithea/lib/paster_commands/make_index.py
+kallithea/lib/paster_commands/make_rcextensions.py
+kallithea/lib/paster_commands/repo_scan.py
+kallithea/lib/paster_commands/setup_db.py
+kallithea/lib/paster_commands/update_repoinfo.py
+kallithea/lib/pidlock.py
+kallithea/lib/profiler.py
+kallithea/lib/rcmail/
+kallithea/lib/rcmail/__init__.py
+kallithea/lib/rcmail/exceptions.py
+kallithea/lib/rcmail/message.py
+kallithea/lib/rcmail/response.py
+kallithea/lib/rcmail/smtp_mailer.py
+kallithea/lib/rcmail/utils.py
+kallithea/lib/recaptcha.py
+kallithea/lib/timerproxy.py
+kallithea/lib/utils.py
+kallithea/lib/utils2.py
+kallithea/lib/vcs/
+kallithea/lib/vcs/__init__.py
+kallithea/lib/vcs/backends/
+kallithea/lib/vcs/backends/__init__.py
+kallithea/lib/vcs/backends/base.py
+kallithea/lib/vcs/backends/git/
+kallithea/lib/vcs/backends/git/__init__.py
+kallithea/lib/vcs/backends/git/changeset.py
+kallithea/lib/vcs/backends/git/inmemory.py
+kallithea/lib/vcs/backends/git/repository.py
+kallithea/lib/vcs/backends/git/workdir.py
+kallithea/lib/vcs/backends/hg/
+kallithea/lib/vcs/backends/hg/__init__.py
+kallithea/lib/vcs/backends/hg/changeset.py
+kallithea/lib/vcs/backends/hg/inmemory.py
+kallithea/lib/vcs/backends/hg/repository.py
+kallithea/lib/vcs/backends/hg/workdir.py
+kallithea/lib/vcs/conf/
+kallithea/lib/vcs/conf/__init__.py
+kallithea/lib/vcs/conf/settings.py
+kallithea/lib/vcs/exceptions.py
+kallithea/lib/vcs/nodes.py
+kallithea/lib/vcs/subprocessio.py
+kallithea/lib/vcs/utils/
+kallithea/lib/vcs/utils/__init__.py
+kallithea/lib/vcs/utils/annotate.py
+kallithea/lib/vcs/utils/archivers.py
+kallithea/lib/vcs/utils/baseui_config.py
+kallithea/lib/vcs/utils/compat.py
+kallithea/lib/vcs/utils/diffs.py
+kallithea/lib/vcs/utils/fakemod.py
+kallithea/lib/vcs/utils/filesize.py
+kallithea/lib/vcs/utils/helpers.py
+kallithea/lib/vcs/utils/hgcompat.py
+kallithea/lib/vcs/utils/imports.py
+kallithea/lib/vcs/utils/lazy.py
+kallithea/lib/vcs/utils/lockfiles.py
+kallithea/lib/vcs/utils/ordered_dict.py
+kallithea/lib/vcs/utils/paths.py
+kallithea/lib/vcs/utils/progressbar.py
+kallithea/lib/vcs/utils/termcolors.py
+kallithea/lib/verlib.py
+kallithea/model/
+kallithea/model/__init__.py
+kallithea/model/api_key.py
+kallithea/model/changeset_status.py
+kallithea/model/comment.py
+kallithea/model/db.py
+kallithea/model/forms.py
+kallithea/model/gist.py
+kallithea/model/meta.py
+kallithea/model/notification.py
+kallithea/model/permission.py
+kallithea/model/pull_request.py
+kallithea/model/repo.py
+kallithea/model/repo_group.py
+kallithea/model/repo_permission.py
+kallithea/model/scm.py
+kallithea/model/user.py
+kallithea/model/user_group.py
+kallithea/model/validators.py
+kallithea/public/
+kallithea/public/codemirror/
+kallithea/public/codemirror/LICENSE
+kallithea/public/codemirror/lib/
+kallithea/public/codemirror/lib/codemirror.css
+kallithea/public/codemirror/lib/codemirror.js
+kallithea/public/codemirror/mode/
+kallithea/public/codemirror/mode/apl/
+kallithea/public/codemirror/mode/apl/apl.js
+kallithea/public/codemirror/mode/asterisk/
+kallithea/public/codemirror/mode/asterisk/asterisk.js
+kallithea/public/codemirror/mode/clike/
+kallithea/public/codemirror/mode/clike/clike.js
+kallithea/public/codemirror/mode/clojure/
+kallithea/public/codemirror/mode/clojure/clojure.js
+kallithea/public/codemirror/mode/cobol/
+kallithea/public/codemirror/mode/cobol/cobol.js
+kallithea/public/codemirror/mode/coffeescript/
+kallithea/public/codemirror/mode/coffeescript/coffeescript.js
+kallithea/public/codemirror/mode/commonlisp/
+kallithea/public/codemirror/mode/commonlisp/commonlisp.js
+kallithea/public/codemirror/mode/css/
+kallithea/public/codemirror/mode/css/css.js
+kallithea/public/codemirror/mode/css/less_test.js
+kallithea/public/codemirror/mode/css/scss_test.js
+kallithea/public/codemirror/mode/cypher/
+kallithea/public/codemirror/mode/cypher/cypher.js
+kallithea/public/codemirror/mode/d/
+kallithea/public/codemirror/mode/d/d.js
+kallithea/public/codemirror/mode/diff/
+kallithea/public/codemirror/mode/diff/diff.js
+kallithea/public/codemirror/mode/django/
+kallithea/public/codemirror/mode/django/django.js
+kallithea/public/codemirror/mode/dtd/
+kallithea/public/codemirror/mode/dtd/dtd.js
+kallithea/public/codemirror/mode/dylan/
+kallithea/public/codemirror/mode/dylan/dylan.js
+kallithea/public/codemirror/mode/ecl/
+kallithea/public/codemirror/mode/ecl/ecl.js
+kallithea/public/codemirror/mode/eiffel/
+kallithea/public/codemirror/mode/eiffel/eiffel.js
+kallithea/public/codemirror/mode/erlang/
+kallithea/public/codemirror/mode/erlang/erlang.js
+kallithea/public/codemirror/mode/fortran/
+kallithea/public/codemirror/mode/fortran/fortran.js
+kallithea/public/codemirror/mode/gas/
+kallithea/public/codemirror/mode/gas/gas.js
+kallithea/public/codemirror/mode/gfm/
+kallithea/public/codemirror/mode/gfm/gfm.js
+kallithea/public/codemirror/mode/gherkin/
+kallithea/public/codemirror/mode/gherkin/gherkin.js
+kallithea/public/codemirror/mode/go/
+kallithea/public/codemirror/mode/go/go.js
+kallithea/public/codemirror/mode/groovy/
+kallithea/public/codemirror/mode/groovy/groovy.js
+kallithea/public/codemirror/mode/haml/
+kallithea/public/codemirror/mode/haml/haml.js
+kallithea/public/codemirror/mode/haskell/
+kallithea/public/codemirror/mode/haskell/haskell.js
+kallithea/public/codemirror/mode/haxe/
+kallithea/public/codemirror/mode/haxe/haxe.js
+kallithea/public/codemirror/mode/htmlembedded/
+kallithea/public/codemirror/mode/htmlembedded/htmlembedded.js
+kallithea/public/codemirror/mode/htmlmixed/
+kallithea/public/codemirror/mode/htmlmixed/htmlmixed.js
+kallithea/public/codemirror/mode/http/
+kallithea/public/codemirror/mode/http/http.js
+kallithea/public/codemirror/mode/jade/
+kallithea/public/codemirror/mode/jade/jade.js
+kallithea/public/codemirror/mode/javascript/
+kallithea/public/codemirror/mode/javascript/javascript.js
+kallithea/public/codemirror/mode/jinja2/
+kallithea/public/codemirror/mode/jinja2/jinja2.js
+kallithea/public/codemirror/mode/julia/
+kallithea/public/codemirror/mode/julia/julia.js
+kallithea/public/codemirror/mode/kotlin/
+kallithea/public/codemirror/mode/kotlin/kotlin.js
+kallithea/public/codemirror/mode/livescript/
+kallithea/public/codemirror/mode/livescript/livescript.js
+kallithea/public/codemirror/mode/lua/
+kallithea/public/codemirror/mode/lua/lua.js
+kallithea/public/codemirror/mode/markdown/
+kallithea/public/codemirror/mode/markdown/markdown.js
+kallithea/public/codemirror/mode/meta.js
+kallithea/public/codemirror/mode/mirc/
+kallithea/public/codemirror/mode/mirc/mirc.js
+kallithea/public/codemirror/mode/mllike/
+kallithea/public/codemirror/mode/mllike/mllike.js
+kallithea/public/codemirror/mode/modelica/
+kallithea/public/codemirror/mode/modelica/modelica.js
+kallithea/public/codemirror/mode/nginx/
+kallithea/public/codemirror/mode/nginx/nginx.js
+kallithea/public/codemirror/mode/ntriples/
+kallithea/public/codemirror/mode/ntriples/ntriples.js
+kallithea/public/codemirror/mode/octave/
+kallithea/public/codemirror/mode/octave/octave.js
+kallithea/public/codemirror/mode/pascal/
+kallithea/public/codemirror/mode/pascal/pascal.js
+kallithea/public/codemirror/mode/pegjs/
+kallithea/public/codemirror/mode/pegjs/pegjs.js
+kallithea/public/codemirror/mode/perl/
+kallithea/public/codemirror/mode/perl/perl.js
+kallithea/public/codemirror/mode/php/
+kallithea/public/codemirror/mode/php/php.js
+kallithea/public/codemirror/mode/pig/
+kallithea/public/codemirror/mode/pig/pig.js
+kallithea/public/codemirror/mode/properties/
+kallithea/public/codemirror/mode/properties/properties.js
+kallithea/public/codemirror/mode/puppet/
+kallithea/public/codemirror/mode/puppet/puppet.js
+kallithea/public/codemirror/mode/python/
+kallithea/public/codemirror/mode/python/python.js
+kallithea/public/codemirror/mode/q/
+kallithea/public/codemirror/mode/q/q.js
+kallithea/public/codemirror/mode/r/
+kallithea/public/codemirror/mode/r/r.js
+kallithea/public/codemirror/mode/rpm/
+kallithea/public/codemirror/mode/rpm/rpm.js
+kallithea/public/codemirror/mode/rst/
+kallithea/public/codemirror/mode/rst/rst.js
+kallithea/public/codemirror/mode/ruby/
+kallithea/public/codemirror/mode/ruby/ruby.js
+kallithea/public/codemirror/mode/rust/
+kallithea/public/codemirror/mode/rust/rust.js
+kallithea/public/codemirror/mode/sass/
+kallithea/public/codemirror/mode/sass/sass.js
+kallithea/public/codemirror/mode/scheme/
+kallithea/public/codemirror/mode/scheme/scheme.js
+kallithea/public/codemirror/mode/shell/
+kallithea/public/codemirror/mode/shell/shell.js
+kallithea/public/codemirror/mode/sieve/
+kallithea/public/codemirror/mode/sieve/sieve.js
+kallithea/public/codemirror/mode/slim/
+kallithea/public/codemirror/mode/slim/slim.js
+kallithea/public/codemirror/mode/smalltalk/
+kallithea/public/codemirror/mode/smalltalk/smalltalk.js
+kallithea/public/codemirror/mode/smarty/
+kallithea/public/codemirror/mode/smarty/smarty.js
+kallithea/public/codemirror/mode/smartymixed/
+kallithea/public/codemirror/mode/smartymixed/smartymixed.js
+kallithea/public/codemirror/mode/solr/
+kallithea/public/codemirror/mode/solr/solr.js
+kallithea/public/codemirror/mode/sparql/
+kallithea/public/codemirror/mode/sparql/sparql.js
+kallithea/public/codemirror/mode/sql/
+kallithea/public/codemirror/mode/sql/sql.js
+kallithea/public/codemirror/mode/stex/
+kallithea/public/codemirror/mode/stex/stex.js
+kallithea/public/codemirror/mode/tcl/
+kallithea/public/codemirror/mode/tcl/tcl.js
+kallithea/public/codemirror/mode/textile/
+kallithea/public/codemirror/mode/textile/textile.js
+kallithea/public/codemirror/mode/tiddlywiki/
+kallithea/public/codemirror/mode/tiddlywiki/tiddlywiki.css
+kallithea/public/codemirror/mode/tiddlywiki/tiddlywiki.js
+kallithea/public/codemirror/mode/tiki/
+kallithea/public/codemirror/mode/tiki/tiki.css
+kallithea/public/codemirror/mode/tiki/tiki.js
+kallithea/public/codemirror/mode/toml/
+kallithea/public/codemirror/mode/toml/toml.js
+kallithea/public/codemirror/mode/tornado/
+kallithea/public/codemirror/mode/tornado/tornado.js
+kallithea/public/codemirror/mode/turtle/
+kallithea/public/codemirror/mode/turtle/turtle.js
+kallithea/public/codemirror/mode/vb/
+kallithea/public/codemirror/mode/vb/vb.js
+kallithea/public/codemirror/mode/vbscript/
+kallithea/public/codemirror/mode/vbscript/vbscript.js
+kallithea/public/codemirror/mode/velocity/
+kallithea/public/codemirror/mode/velocity/velocity.js
+kallithea/public/codemirror/mode/verilog/
+kallithea/public/codemirror/mode/verilog/verilog.js
+kallithea/public/codemirror/mode/xml/
+kallithea/public/codemirror/mode/xml/xml.js
+kallithea/public/codemirror/mode/xquery/
+kallithea/public/codemirror/mode/xquery/xquery.js
+kallithea/public/codemirror/mode/yaml/
+kallithea/public/codemirror/mode/yaml/yaml.js
+kallithea/public/codemirror/mode/z80/
+kallithea/public/codemirror/mode/z80/z80.js
+kallithea/public/css/
+kallithea/public/css/bootstrap.css
+kallithea/public/css/contextbar.css
+kallithea/public/css/mergely.css
+kallithea/public/css/pygments.css
+kallithea/public/css/style.css
+kallithea/public/fontello/
+kallithea/public/fontello/README-kallithea.txt
+kallithea/public/fontello/README.txt
+kallithea/public/fontello/config.json
+kallithea/public/fontello/css/
+kallithea/public/fontello/css/kallithea.css
+kallithea/public/fontello/font/
+kallithea/public/fontello/font/kallithea.eot
+kallithea/public/fontello/font/kallithea.svg
+kallithea/public/fontello/font/kallithea.ttf
+kallithea/public/fontello/font/kallithea.woff
+kallithea/public/images/
+kallithea/public/images/background.png
+kallithea/public/images/favicon.ico
+kallithea/public/images/kallithea-logo.png
+kallithea/public/images/kallithea-logo.svg
+kallithea/public/images/pager.png
+kallithea/public/images/pager_selected.png
+kallithea/public/js/
+kallithea/public/js/base.js
+kallithea/public/js/bootstrap.js
+kallithea/public/js/codemirror_loadmode.js
+kallithea/public/js/graph.js
+kallithea/public/js/jquery-1.11.1.min.js
+kallithea/public/js/mergely.js
+kallithea/public/js/mousetrap.js
+kallithea/public/js/native.history.js
+kallithea/public/js/select2/
+kallithea/public/js/select2/select2-bootstrap.css
+kallithea/public/js/select2/select2-spinner.gif
+kallithea/public/js/select2/select2.css
+kallithea/public/js/select2/select2.js
+kallithea/public/js/select2/select2.png
+kallithea/public/js/select2/select2x2.png
+kallithea/public/js/yui.2.9.js
+kallithea/public/js/yui.flot.js
+kallithea/templates/
+kallithea/templates/about.html
+kallithea/templates/admin/
+kallithea/templates/admin/admin.html
+kallithea/templates/admin/admin_log.html
+kallithea/templates/admin/auth/
+kallithea/templates/admin/auth/auth_settings.html
+kallithea/templates/admin/defaults/
+kallithea/templates/admin/defaults/defaults.html
+kallithea/templates/admin/gists/
+kallithea/templates/admin/gists/edit.html
+kallithea/templates/admin/gists/index.html
+kallithea/templates/admin/gists/new.html
+kallithea/templates/admin/gists/show.html
+kallithea/templates/admin/my_account/
+kallithea/templates/admin/my_account/my_account.html
+kallithea/templates/admin/my_account/my_account_api_keys.html
+kallithea/templates/admin/my_account/my_account_emails.html
+kallithea/templates/admin/my_account/my_account_password.html
+kallithea/templates/admin/my_account/my_account_perms.html
+kallithea/templates/admin/my_account/my_account_profile.html
+kallithea/templates/admin/my_account/my_account_repos.html
+kallithea/templates/admin/my_account/my_account_watched.html
+kallithea/templates/admin/notifications/
+kallithea/templates/admin/notifications/notifications.html
+kallithea/templates/admin/notifications/notifications_data.html
+kallithea/templates/admin/notifications/show_notification.html
+kallithea/templates/admin/permissions/
+kallithea/templates/admin/permissions/permissions.html
+kallithea/templates/admin/permissions/permissions_globals.html
+kallithea/templates/admin/permissions/permissions_ips.html
+kallithea/templates/admin/permissions/permissions_perms.html
+kallithea/templates/admin/repo_groups/
+kallithea/templates/admin/repo_groups/repo_group_add.html
+kallithea/templates/admin/repo_groups/repo_group_edit.html
+kallithea/templates/admin/repo_groups/repo_group_edit_advanced.html
+kallithea/templates/admin/repo_groups/repo_group_edit_perms.html
+kallithea/templates/admin/repo_groups/repo_group_edit_settings.html
+kallithea/templates/admin/repo_groups/repo_group_show.html
+kallithea/templates/admin/repo_groups/repo_groups.html
+kallithea/templates/admin/repos/
+kallithea/templates/admin/repos/repo_add.html
+kallithea/templates/admin/repos/repo_add_base.html
+kallithea/templates/admin/repos/repo_creating.html
+kallithea/templates/admin/repos/repo_edit.html
+kallithea/templates/admin/repos/repo_edit_advanced.html
+kallithea/templates/admin/repos/repo_edit_caches.html
+kallithea/templates/admin/repos/repo_edit_fields.html
+kallithea/templates/admin/repos/repo_edit_fork.html
+kallithea/templates/admin/repos/repo_edit_permissions.html
+kallithea/templates/admin/repos/repo_edit_remote.html
+kallithea/templates/admin/repos/repo_edit_settings.html
+kallithea/templates/admin/repos/repo_edit_statistics.html
+kallithea/templates/admin/repos/repos.html
+kallithea/templates/admin/settings/
+kallithea/templates/admin/settings/settings.html
+kallithea/templates/admin/settings/settings_email.html
+kallithea/templates/admin/settings/settings_global.html
+kallithea/templates/admin/settings/settings_hooks.html
+kallithea/templates/admin/settings/settings_mapping.html
+kallithea/templates/admin/settings/settings_search.html
+kallithea/templates/admin/settings/settings_system.html
+kallithea/templates/admin/settings/settings_system_update.html
+kallithea/templates/admin/settings/settings_vcs.html
+kallithea/templates/admin/settings/settings_visual.html
+kallithea/templates/admin/user_groups/
+kallithea/templates/admin/user_groups/user_group_add.html
+kallithea/templates/admin/user_groups/user_group_edit.html
+kallithea/templates/admin/user_groups/user_group_edit_advanced.html
+kallithea/templates/admin/user_groups/user_group_edit_default_perms.html
+kallithea/templates/admin/user_groups/user_group_edit_members.html
+kallithea/templates/admin/user_groups/user_group_edit_perms.html
+kallithea/templates/admin/user_groups/user_group_edit_settings.html
+kallithea/templates/admin/user_groups/user_groups.html
+kallithea/templates/admin/users/
+kallithea/templates/admin/users/user_add.html
+kallithea/templates/admin/users/user_edit.html
+kallithea/templates/admin/users/user_edit_advanced.html
+kallithea/templates/admin/users/user_edit_api_keys.html
+kallithea/templates/admin/users/user_edit_emails.html
+kallithea/templates/admin/users/user_edit_ips.html
+kallithea/templates/admin/users/user_edit_perms.html
+kallithea/templates/admin/users/user_edit_profile.html
+kallithea/templates/admin/users/users.html
+kallithea/templates/base/
+kallithea/templates/base/base.html
+kallithea/templates/base/default_perms_box.html
+kallithea/templates/base/flash_msg.html
+kallithea/templates/base/perms_summary.html
+kallithea/templates/base/root.html
+kallithea/templates/bookmarks/
+kallithea/templates/bookmarks/bookmarks.html
+kallithea/templates/bookmarks/bookmarks_data.html
+kallithea/templates/branches/
+kallithea/templates/branches/branches.html
+kallithea/templates/branches/branches_data.html
+kallithea/templates/changelog/
+kallithea/templates/changelog/changelog.html
+kallithea/templates/changelog/changelog_details.html
+kallithea/templates/changelog/changelog_summary_data.html
+kallithea/templates/changeset/
+kallithea/templates/changeset/changeset.html
+kallithea/templates/changeset/changeset_comment_block.html
+kallithea/templates/changeset/changeset_file_comment.html
+kallithea/templates/changeset/changeset_range.html
+kallithea/templates/changeset/diff_block.html
+kallithea/templates/changeset/patch_changeset.html
+kallithea/templates/compare/
+kallithea/templates/compare/compare_cs.html
+kallithea/templates/compare/compare_diff.html
+kallithea/templates/data_table/
+kallithea/templates/data_table/_dt_elements.html
+kallithea/templates/email_templates/
+kallithea/templates/email_templates/changeset_comment.html
+kallithea/templates/email_templates/changeset_comment.txt
+kallithea/templates/email_templates/default.html
+kallithea/templates/email_templates/default.txt
+kallithea/templates/email_templates/main.html
+kallithea/templates/email_templates/main.txt
+kallithea/templates/email_templates/password_reset.html
+kallithea/templates/email_templates/password_reset.txt
+kallithea/templates/email_templates/pull_request.html
+kallithea/templates/email_templates/pull_request.txt
+kallithea/templates/email_templates/pull_request_comment.html
+kallithea/templates/email_templates/pull_request_comment.txt
+kallithea/templates/email_templates/registration.html
+kallithea/templates/email_templates/registration.txt
+kallithea/templates/errors/
+kallithea/templates/errors/error_document.html
+kallithea/templates/files/
+kallithea/templates/files/diff_2way.html
+kallithea/templates/files/file_diff.html
+kallithea/templates/files/files.html
+kallithea/templates/files/files_add.html
+kallithea/templates/files/files_browser.html
+kallithea/templates/files/files_delete.html
+kallithea/templates/files/files_edit.html
+kallithea/templates/files/files_history_box.html
+kallithea/templates/files/files_source.html
+kallithea/templates/files/files_ypjax.html
+kallithea/templates/followers/
+kallithea/templates/followers/followers.html
+kallithea/templates/followers/followers_data.html
+kallithea/templates/forks/
+kallithea/templates/forks/fork.html
+kallithea/templates/forks/forks.html
+kallithea/templates/forks/forks_data.html
+kallithea/templates/index.html
+kallithea/templates/index_base.html
+kallithea/templates/journal/
+kallithea/templates/journal/journal.html
+kallithea/templates/journal/journal_data.html
+kallithea/templates/journal/public_journal.html
+kallithea/templates/login.html
+kallithea/templates/password_reset.html
+kallithea/templates/password_reset_confirmation.html
+kallithea/templates/pullrequests/
+kallithea/templates/pullrequests/pullrequest.html
+kallithea/templates/pullrequests/pullrequest_data.html
+kallithea/templates/pullrequests/pullrequest_show.html
+kallithea/templates/pullrequests/pullrequest_show_all.html
+kallithea/templates/pullrequests/pullrequest_show_my.html
+kallithea/templates/register.html
+kallithea/templates/search/
+kallithea/templates/search/search.html
+kallithea/templates/search/search_commit.html
+kallithea/templates/search/search_content.html
+kallithea/templates/search/search_path.html
+kallithea/templates/search/search_repository.html
+kallithea/templates/summary/
+kallithea/templates/summary/statistics.html
+kallithea/templates/summary/summary.html
+kallithea/templates/switch_to_list.html
+kallithea/templates/tags/
+kallithea/templates/tags/tags.html
+kallithea/templates/tags/tags_data.html
+kallithea/tests/
+kallithea/tests/__init__.py
+kallithea/tests/api/
+kallithea/tests/api/__init__.py
+kallithea/tests/api/api_base.py
+kallithea/tests/api/test_api_git.py
+kallithea/tests/api/test_api_hg.py
+kallithea/tests/conftest.py
+kallithea/tests/fixture.py
+kallithea/tests/fixtures/
+kallithea/tests/fixtures/diff_with_diff_data.diff
+kallithea/tests/fixtures/git_diff_binary_and_normal.diff
+kallithea/tests/fixtures/git_diff_chmod.diff
+kallithea/tests/fixtures/git_diff_mod_single_binary_file.diff
+kallithea/tests/fixtures/git_diff_modify_binary_file.diff
+kallithea/tests/fixtures/git_diff_rename_file.diff
+kallithea/tests/fixtures/git_node_history_response.json
+kallithea/tests/fixtures/hg_diff_add_single_binary_file.diff
+kallithea/tests/fixtures/hg_diff_binary_and_normal.diff
+kallithea/tests/fixtures/hg_diff_chmod.diff
+kallithea/tests/fixtures/hg_diff_chmod_and_mod_single_binary_file.diff
+kallithea/tests/fixtures/hg_diff_copy_and_chmod_file.diff
+kallithea/tests/fixtures/hg_diff_copy_and_modify_file.diff
+kallithea/tests/fixtures/hg_diff_copy_chmod_and_edit_file.diff
+kallithea/tests/fixtures/hg_diff_copy_file.diff
+kallithea/tests/fixtures/hg_diff_del_single_binary_file.diff
+kallithea/tests/fixtures/hg_diff_mod_file_and_rename.diff
+kallithea/tests/fixtures/hg_diff_mod_single_binary_file.diff
+kallithea/tests/fixtures/hg_diff_mod_single_file_and_rename_and_chmod.diff
+kallithea/tests/fixtures/hg_diff_rename_and_chmod_file.diff
+kallithea/tests/fixtures/hg_diff_rename_file.diff
+kallithea/tests/fixtures/hg_diff_rename_space_cr.diff
+kallithea/tests/fixtures/hg_node_history_response.json
+kallithea/tests/fixtures/journal_dump.csv
+kallithea/tests/fixtures/markuptest.diff
+kallithea/tests/fixtures/vcs_test_git.tar.gz
+kallithea/tests/fixtures/vcs_test_hg.tar.gz
+kallithea/tests/functional/
+kallithea/tests/functional/__init__.py
+kallithea/tests/functional/test_admin.py
+kallithea/tests/functional/test_admin_auth_settings.py
+kallithea/tests/functional/test_admin_defaults.py
+kallithea/tests/functional/test_admin_gists.py
+kallithea/tests/functional/test_admin_notifications.py
+kallithea/tests/functional/test_admin_permissions.py
+kallithea/tests/functional/test_admin_repo_groups.py
+kallithea/tests/functional/test_admin_repos.py
+kallithea/tests/functional/test_admin_settings.py
+kallithea/tests/functional/test_admin_user_groups.py
+kallithea/tests/functional/test_admin_users.py
+kallithea/tests/functional/test_branches.py
+kallithea/tests/functional/test_changelog.py
+kallithea/tests/functional/test_changeset.py
+kallithea/tests/functional/test_changeset_comments.py
+kallithea/tests/functional/test_compare.py
+kallithea/tests/functional/test_compare_local.py
+kallithea/tests/functional/test_feed.py
+kallithea/tests/functional/test_files.py
+kallithea/tests/functional/test_followers.py
+kallithea/tests/functional/test_forks.py
+kallithea/tests/functional/test_home.py
+kallithea/tests/functional/test_journal.py
+kallithea/tests/functional/test_login.py
+kallithea/tests/functional/test_my_account.py
+kallithea/tests/functional/test_pullrequests.py
+kallithea/tests/functional/test_repo_groups.py
+kallithea/tests/functional/test_search.py
+kallithea/tests/functional/test_summary.py
+kallithea/tests/functional/test_tags.py
+kallithea/tests/models/
+kallithea/tests/models/__init__.py
+kallithea/tests/models/common.py
+kallithea/tests/models/test_changeset_status.py
+kallithea/tests/models/test_diff_parsers.py
+kallithea/tests/models/test_notifications.py
+kallithea/tests/models/test_permissions.py
+kallithea/tests/models/test_repo_groups.py
+kallithea/tests/models/test_repos.py
+kallithea/tests/models/test_user_group_permissions_on_repo_groups.py
+kallithea/tests/models/test_user_groups.py
+kallithea/tests/models/test_user_permissions_on_repo_groups.py
+kallithea/tests/models/test_user_permissions_on_repos.py
+kallithea/tests/models/test_users.py
+kallithea/tests/other/
+kallithea/tests/other/__init__.py
+kallithea/tests/other/manual_test_vcs_operations.py
+kallithea/tests/other/test_libs.py
+kallithea/tests/other/test_mail.py
+kallithea/tests/other/test_validators.py
+kallithea/tests/parameterized.py
+kallithea/tests/scripts/
+kallithea/tests/scripts/create_rc.sh
+kallithea/tests/scripts/manual_test_concurrency.py
+kallithea/tests/scripts/manual_test_crawler.py
+kallithea/tests/scripts/mem_watch
+kallithea/tests/test.ini
+kallithea/tests/vcs/
+kallithea/tests/vcs/__init__.py
+kallithea/tests/vcs/aconfig
+kallithea/tests/vcs/base.py
+kallithea/tests/vcs/conf.py
+kallithea/tests/vcs/test_archives.py
+kallithea/tests/vcs/test_branches.py
+kallithea/tests/vcs/test_changesets.py
+kallithea/tests/vcs/test_filenodes_unicode_path.py
+kallithea/tests/vcs/test_getitem.py
+kallithea/tests/vcs/test_getslice.py
+kallithea/tests/vcs/test_git.py
+kallithea/tests/vcs/test_hg.py
+kallithea/tests/vcs/test_inmemchangesets.py
+kallithea/tests/vcs/test_nodes.py
+kallithea/tests/vcs/test_repository.py
+kallithea/tests/vcs/test_tags.py
+kallithea/tests/vcs/test_utils.py
+kallithea/tests/vcs/test_utils_filesize.py
+kallithea/tests/vcs/test_vcs.py
+kallithea/tests/vcs/test_workdirs.py
+kallithea/tests/vcs/utils.py
+kallithea/websetup.py
+setup.cfg
+setup.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/whitespacecleanup.sh	Fri Oct 02 22:46:15 2015 +0200
@@ -0,0 +1,24 @@
+#!/bin/bash -x
+
+# Enforce some consistency in whitespace - just to avoid spurious whitespaces changes
+
+files=`hg loc '*.py' '*.html' '*.css' '*.rst' '*.txt' '*.js' '*.ini' '*.cfg' CONTRIBUTORS LICENSE.md| egrep -v '/lockfiles.py|LICENSE-MERGELY.html|/codemirror/|/fontello/|(graph|mergely|native.history|select2/select2|yui.flot|yui.2.9)\.js$'`
+
+sed -i -e "s,`printf '\t'`,    ,g" $files
+sed -i -e "s,  *$,,g" $files
+# ensure one trailing newline - remove empty last line and make last line include trailing newline:
+sed -i -e '$,${/^$/d}' -e '$a\' $files
+
+sed -i -e 's,\([^ /]\){,\1 {,g' `hg loc '*.css'`
+sed -i -e 's|^\([^ /].*,\)\([^ ]\)|\1 \2|g' `hg loc '*.css'`
+
+sed -i -e 's/^\(    [^: ]*\) *: *\([^/]\)/\1: \2/g' kallithea/public/css/{style,contextbar}.css
+sed -i -e '1s|, |,|g' kallithea/public/css/{style,contextbar}.css
+sed -i -e 's/^\([^ ,/]\+ [^,]*[^ ,]\) *, *\(.\)/\1,\n\2/g' kallithea/public/css/{style,contextbar}.css
+sed -i -e 's/^\([^ ,/].*\)   */\1 /g' kallithea/public/css/{style,contextbar}.css
+sed -i -e 's,^--$,-- ,g' kallithea/templates/email_templates/main.txt
+
+hg mani | xargs chmod -x
+hg loc 'set:!binary()&grep("^#!")&!(**_tmpl.py)&!(**/template**)' | xargs chmod +x
+
+hg diff
--- a/setup.py	Tue Sep 08 10:56:22 2015 +0000
+++ b/setup.py	Fri Oct 02 22:46:15 2015 +0200
@@ -121,6 +121,16 @@
     from ez_setup import use_setuptools
     use_setuptools()
     from setuptools import setup, find_packages
+
+# monkey patch setuptools to use distutils owner/group functionality
+from setuptools.command import sdist
+sdist_org = sdist.sdist
+class sdist_new(sdist_org):
+    def initialize_options(self):
+        sdist_org.initialize_options(self)
+        self.owner = self.group = 'root'
+sdist.sdist = sdist_new
+
 # packages
 packages = find_packages(exclude=['ez_setup'])
 
--- a/whitespacecleanup.sh	Tue Sep 08 10:56:22 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#!/bin/bash -x
-
-# Enforce some consistency in whitespace - just to avoid spurious whitespaces changes
-
-files=`hg loc '*.py' '*.html' '*.css' '*.rst' '*.txt' '*.js' '*.ini' '*.cfg' CONTRIBUTORS LICENSE.md| egrep -v '/lockfiles.py|LICENSE-MERGELY.html|/codemirror/|/fontello/|(graph|mergely|native.history|select2/select2|yui.flot|yui.2.9)\.js$'`
-
-sed -i -e "s,`printf '\t'`,    ,g" $files
-sed -i -e "s,  *$,,g" $files
-# ensure one trailing newline - remove empty last line and make last line include trailing newline:
-sed -i -e '$,${/^$/d}' -e '$a\' $files
-
-sed -i -e 's,\([^ /]\){,\1 {,g' `hg loc '*.css'`
-sed -i -e 's|^\([^ /].*,\)\([^ ]\)|\1 \2|g' `hg loc '*.css'`
-
-sed -i -e 's/^\(    [^: ]*\) *: *\([^/]\)/\1: \2/g' kallithea/public/css/{style,contextbar}.css
-sed -i -e '1s|, |,|g' kallithea/public/css/{style,contextbar}.css
-sed -i -e 's/^\([^ ,/]\+ [^,]*[^ ,]\) *, *\(.\)/\1,\n\2/g' kallithea/public/css/{style,contextbar}.css
-sed -i -e 's/^\([^ ,/].*\)   */\1 /g' kallithea/public/css/{style,contextbar}.css
-sed -i -e 's,^--$,-- ,g' kallithea/templates/email_templates/main.txt
-
-hg mani | xargs chmod -x
-hg loc 'set:!binary()&grep("^#!")&!(**_tmpl.py)&!(**/template**)' | xargs chmod +x
-
-hg diff