Changeset - 7f9040460576
[Not reviewed]
Merge default
1 58 5
Mads Kiilerich - 10 years ago 2015-10-02 22:46:15
madski@unity3d.com
Merge stable 0.3
59 files changed:
Changeset was too big and was cut off... Show full diff anyway
0 comments (0 inline, 0 general)
.hgignore
Show inline comments
 
@@ -25,6 +25,7 @@ syntax: regexp
 
^kallithea\.db$
 
^test\.db$
 
^Kallithea\.egg-info$
 
^my\.ini$
 
^fabfile.py
 
^\.idea$
 
^\.cache$
.hgsigs
Show inline comments
 
new file 100644
 
9b3e9e242f5c97cc0c7657e5ac93dce7de61ca16 0 iQEcBAABAgAGBQJWDuAdAAoJEJ1bI/kYT6UUAlYH/ReCa7Im5tvy+ot5oAc7xey/O2rCVHp2h6i82tTWK/0i9EaS4DP+eTbAjV4WJA4qWF5DPenEJ3X9JhrTLNvGkR0f7lUqiFVMTJ472YlSsvIWg38gVFruzwk1cODRfq72o8ERYcRSfzrL4cDpIqjEd/vVVCV/gKVvPmzr4/FED/ZmS0X6T9gxWJo/eWSuLNAxHHtE/pCWDO3XEe+iOm+hHjkyz4Hn2r9/+ucrirnzycH6DnYO/kWvQzBnzgMjJm+1rLZ5cfU89V8zfhv6z0pd8CHZfpKGc2Z8EwVJq9LR+M4/76uDlYXx7IfZAxhRNqN6MC+yvPmDo3382dNr7Wkopi0=
.hgtags
Show inline comments
 
@@ -58,6 +58,7 @@ c15d7b336af58df9f1bbc8f8957464e7ea618d4c
 
1f71ef689d2a3c9978cea6591a1f4e9107a5ca83 rhodecode-0.0.1.7.1
 
cc48c1541c7e2e84114bf92a0f9cd4b8b1341545 0.0
 
d17e88a1a88a29f6fac948c94498129e405a40d3 0.1
 
ad0ce803b40cb17fc3988373052943e041030b02 0.2
 
c6e32714336345403adf76abb6ebf9b8116fcdc7 0.2.1
 
14f488a5dc4ca6647bc6acf12534fd137e968aa8 0.2.2
 
9b3e9e242f5c97cc0c7657e5ac93dce7de61ca16 0.3
CONTRIBUTORS
Show inline comments
 
@@ -32,12 +32,13 @@ List of contributors to Kallithea projec
 
    Michael V. DePalatis <mike@depalatis.net> 2015
 
    Morten Skaaning <mortens@unity3d.com> 2015
 
    Nick High <nick@silverchip.org> 2015
 
    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
 
    Tuux <tuxa@galaxie.eu.org> 2015
 
    Viktar Palstsiuk <vipals@gmail.com> 2015
 
    Dominik Ruf <dominikruf@gmail.com> 2012 2014
README.rst
Show inline comments
 
@@ -34,12 +34,19 @@ virtualenv_. Official releases of Kallit
 
The development repository is kept very stable and used in production by the
 
developers -- you can do the same.
 

	
 
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
 
-----------
 

	
 
The latest sources can be obtained from
 
https://kallithea-scm.org/repos/kallithea.
 
@@ -175,13 +182,13 @@ To run Kallithea on a RhodeCode database
 

	
 
   echo "BRAND = 'rhodecode'" > kallithea/brand.py
 

	
 
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``.
 

	
 
One-time conversion
 
~~~~~~~~~~~~~~~~~~~
 
@@ -191,13 +198,13 @@ a helper script provided by Kallithea. T
 
database, using the database string you can find in your ``production.ini`` (or
 
``development.ini``) file. For example, if using SQLite::
 

	
 
   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::
 

	
 
   If you started out using the branding interoperability approach mentioned
 
   above, watch out for stray brand.pyc after removing brand.py.
 

	
 
@@ -235,6 +242,7 @@ repository, and have a look at the hooks
 
.. _GitHub: http://github.com/
 
.. _Subversion: http://subversion.tigris.org/
 
.. _Git: http://git-scm.com/
 
.. _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
development.ini
Show inline comments
 
@@ -54,13 +54,13 @@ pdebug = false
 
#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
 
#error_email_from = paste_error@example.com
 

	
 
## 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
 
#smtp_use_tls = false
 
#smtp_use_ssl = false
 
## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).
 
@@ -225,14 +225,14 @@ rss_include_diff = false
 
## options for showing and identifying changesets
 
show_sha_length = 12
 
show_revision_number = false
 

	
 
## 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
 
## controllers to which access will be enabled by api_key. eg: to enable
 
## api access to raw_files put `FilesController:raw`, to enable access to patches
 
## add `ChangesetController:changeset_patch`. This list should be "," separated
 
@@ -261,26 +261,26 @@ default_encoding = utf8
 
issue_pat = (?:\s*#)(\d+)
 

	
 
## server url to the issue, each {id} will be replaced with match
 
## 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>
 

	
 
issue_prefix = #
 

	
 
## 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 prefix key for this instance used for cache invalidation when running
 
## multiple instances of kallithea, make sure it's globally unique for
 
## all running kallithea instances. Leave empty if you don't use it
docs/api/api.rst
Show inline comments
 
@@ -46,13 +46,13 @@ Clients must send JSON encoded JSON-RPC 
 
        "method": "<method_name>",
 
        "args": {"<arg_key>": "<arg_val>"}
 
    }
 

	
 
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
 
 - *id*, a value of any type, can be used to match the response with the request that it is replying to.
 
 - *api_key*, for authentication and permission validation.
 
 - *method*, the name of the method to call -- a list of available methods can be found below.
 
@@ -80,36 +80,35 @@ API client
 

	
 
Kallithea comes with a ``kallithea-api`` command line tool, providing a convenient
 
way to call the JSON-RPC API.
 

	
 
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.
 

	
 

	
 
API methods
 
+++++++++++
 

	
docs/contributing.rst
Show inline comments
 
@@ -31,13 +31,14 @@ Getting started
 
To get started with development::
 

	
 
        hg clone https://kallithea-scm.org/repos/kallithea
 
        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 &
 
        firefox http://127.0.0.1:5000/
 

	
 
You can also start out by forking https://bitbucket.org/conservancy/kallithea
docs/index.rst
Show inline comments
 
@@ -19,12 +19,13 @@ Kallithea Documentation
 
   overview
 
   installation
 
   installation_win
 
   installation_win_old
 
   installation_iis
 
   setup
 
   installation_puppet
 

	
 
**Usage**
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
docs/installation.rst
Show inline comments
 
@@ -36,14 +36,15 @@ To install Kallithea in a virtualenv_ us
 
repository, follow the instructions below::
 

	
 
        hg clone https://kallithea-scm.org/repos/kallithea -u stable
 
        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`.
 

	
 
To upgrade, simply update the repository with ``hg pull -u`` and restart the
 
server.
 

	
 
@@ -61,33 +62,44 @@ An additional benefit of virtualenv_ is 
 

	
 
- Assuming you have installed virtualenv_, create a new virtual environment
 
  for example, in `/srv/kallithea/venv`, using the virtualenv command::
 

	
 
    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::
 

	
 
    mkdir /srv/kallithea
 

	
 
- Go into the created directory and run this command to install Kallithea::
 

	
 
    pip install kallithea
 

	
 
  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.
 

	
 
You can now proceed to :ref:`setup`.
 

	
docs/installation_iis.rst
Show inline comments
 
@@ -52,13 +52,13 @@ The ISAPI handler can be generated using
 

	
 
This will generate a ``dispatch.py`` file in the current directory that contains
 
the necessary components to finalize an installation into IIS. Once this file
 
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
 
``--root`` specified above pointing to ``_dispatch.dll``.
 

	
 
The ISAPI handler is registered to all file extensions, so it will automatically
 
@@ -100,11 +100,11 @@ different options for finding issues exi
 
is great at finding issues until they exist inside Kallithea, at which point the
 
ISAPI-WSGI wrapper above uses ``win32traceutil``, which is part of ``pywin32``.
 

	
 
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
 
traces, making it a lot easier to identify issues.
docs/installation_puppet.rst
Show inline comments
 
new file 100644
 
.. _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.
docs/installation_win.rst
Show inline comments
 
@@ -68,13 +68,13 @@ pip is a package management system for P
 
If you installed Python 2.7.9+, you already have it (as long as you ran the installer with admin privileges or disabled UAC).
 

	
 
If it was not installed or if you are using Python>=2.6,<2.7.9:
 

	
 
- 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::
 

	
 
   See http://stackoverflow.com/questions/4750806/how-to-install-pip-on-windows
 
   for details and alternative methods.
 

	
 
@@ -131,12 +131,13 @@ Download and install "Microsoft Visual C
 
  You can also install the dependencies using already compiled Windows binaries packages. A good source of compiled Python packages is http://www.lfd.uci.edu/~gohlke/pythonlibs/. However, not all of the necessary packages for Kallithea are on this site and some are hard to find, so we will stick with using the compiler.
 

	
 
In a command prompt type (adapting paths if necessary)::
 

	
 
  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::
 

	
 
  pip install kallithea
 

	
docs/installation_win_old.rst
Show inline comments
 
@@ -148,13 +148,13 @@ Download to C:\\Kallithea (or whatever y
 
https://raw.github.com/pypa/virtualenv/master/virtualenv.py)
 

	
 
Create a virtual Python environment in C:\\Kallithea\\Env (or similar). To
 
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)
 

	
 
Step 7 -- Install Kallithea
 
---------------------------
 
@@ -180,12 +180,13 @@ to::
 
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" amd64
 

	
 
In that CMD (loaded with VS2008 PATHs) type::
 

	
 
  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::
 

	
 
 pip install kallithea
 

	
docs/setup.rst
Show inline comments
 
@@ -33,13 +33,13 @@ entering this "root" path ``setup-db`` w
 
and password for the initial admin account which ``setup-db`` sets
 
up for you.
 

	
 
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
 
empty location, or a location which already contains existing
 
repositories. If you choose a location which contains existing
 
repositories Kallithea will add all of the repositories at the chosen
 
@@ -105,13 +105,13 @@ login accounts have the correct permissi
 
          have set up using the Kallithea web interface.
 

	
 
If your main directory (the same as set in Kallithea settings) is for
 
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.
 

	
 
.. note:: In an advanced setup, in order for your ssh access to use
 
          the same permissions as set up via the Kallithea web
 
@@ -173,13 +173,13 @@ Choose *Admin > Authentication*, click t
 
and then *Save*, to enable the LDAP plugin and configure its settings.
 

	
 
Here's a typical LDAP setup::
 

	
 
 Connection settings
 
 Enable LDAP          = checked
 
 Host                 = host.example.org
 
 Host                 = host.example.com
 
 Port                 = 389
 
 Account              = <account>
 
 Password             = <password>
 
 Connection Security  = LDAPS connection
 
 Certificate Checks   = DEMAND
 

	
 
@@ -440,13 +440,13 @@ Integration with issue trackers
 
Kallithea provides a simple integration with issue trackers. It's possible
 
to define a regular expression that will match an issue ID in commit messages,
 
and have that replaced with a URL to the issue. To enable this simply
 
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
 
commit messages will be treated as issue references. A match group in
 
parentheses should be used to specify the actual issue id.
 

	
 
@@ -458,27 +458,27 @@ Matched issue references are replaced wi
 
``issue_prefix`` is prepended to the link text.  ``issue_prefix`` doesn't
 
necessarily need to be ``#``: if you set issue prefix to ``ISSUE-`` this will
 
generate a URL in the format:
 

	
 
.. 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
 
such reference will be transformed into:
 

	
 
.. 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
 
---------------
 

	
 
Hooks can be managed in similar way to that used in ``.hgrc`` files.
 
@@ -566,13 +566,13 @@ Sample config for Nginx using proxy:
 
        #server 127.0.0.1:5002;
 
    }
 

	
 
    ## 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;
 

	
 
       ssl on;
 
       ssl_certificate     gist.your.kallithea.server.crt;
 
       ssl_certificate_key gist.your.kallithea.server.key;
 
@@ -580,19 +580,19 @@ Sample config for Nginx using proxy:
 
       ssl_session_timeout 5m;
 

	
 
       ssl_protocols SSLv3 TLSv1;
 
       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;
 

	
 
       ssl on;
 
       ssl_certificate     your.kallithea.server.crt;
 
       ssl_certificate_key your.kallithea.server.key;
 
@@ -609,13 +609,13 @@ Sample config for Nginx using proxy:
 
       include         /etc/nginx/proxy.conf;
 
       location / {
 
            try_files $uri @kallithea;
 
       }
 

	
 
       location @kallithea {
 
            proxy_pass      http://kallithea;
 
            proxy_pass      http://127.0.0.1:5000;
 
       }
 

	
 
    }
 

	
 
Here's the proxy.conf. It's tuned so it will not timeout on long
 
pushes or large pushes::
 
@@ -645,14 +645,13 @@ Apache virtual host reverse proxy exampl
 

	
 
Here is a sample configuration file for Apache using proxy:
 

	
 
.. code-block:: apache
 

	
 
    <VirtualHost *:80>
 
            ServerName hg.myserver.com
 
            ServerAlias hg.myserver.com
 
            ServerName kallithea.example.com
 

	
 
            <Proxy *>
 
              # For Apache 2.4 and later:
 
              Require all granted
 

	
 
              # For Apache 2.2 and earlier, instead use:
docs/usage/general.rst
Show inline comments
 
@@ -75,29 +75,29 @@ Creating a pull request
 
Permanent repository URLs
 
-------------------------
 

	
 
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,
 
Kallithea provides permanent URLs using the repository ID prefixed with an
 
underscore. In all Kallithea URLs, for example those for the changelog and the
 
file view, a repository name can be replaced by this ``_ID`` string. Since IDs
 
are always the same, moving the repository to a different group will not affect
 
such URLs.
 

	
 
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``.
 

	
 

	
 
Email notifications
 
@@ -134,13 +134,13 @@ Currently it supports the following opti
 

	
 
.. note:: svn -> hg cloning requires the ``hgsubversion`` library to be
 
   installed.
 

	
 
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.
 

	
 

	
 
Specific features configurable in the Admin settings
kallithea/__init__.py
Show inline comments
 
@@ -26,13 +26,13 @@ Original author and date, and relevant c
 
:license: GPLv3, see LICENSE.md for more details.
 
"""
 

	
 
import sys
 
import platform
 

	
 
VERSION = (0, 2, 2)
 
VERSION = (0, 3)
 
BACKENDS = {
 
    'hg': 'Mercurial repository',
 
    'git': 'Git repository',
 
}
 

	
 
CELERY_ON = False
kallithea/bin/kallithea_api.py
Show inline comments
 
@@ -33,13 +33,13 @@ from kallithea.bin.base import json, api
 

	
 
def argparser(argv):
 
    usage = (
 
      "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',
 
                                     usage=usage)
 

	
 
    ## config
kallithea/bin/kallithea_gist.py
Show inline comments
 
@@ -36,13 +36,13 @@ from kallithea.bin.base import json, api
 

	
 
def argparser(argv):
 
    usage = (
 
      "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',
 
                                     usage=usage)
 

	
 
    ## config
kallithea/bin/ldap_sync.conf
Show inline comments
 
[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
kallithea/bin/template.ini.mako
Show inline comments
 
@@ -48,13 +48,13 @@ pdebug = false
 
#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
 
#error_email_from = paste_error@example.com
 

	
 
<%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
 
#smtp_use_tls = false
 
#smtp_use_ssl = false
 
<%text>## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).</%text>
 
@@ -223,14 +223,14 @@ rss_include_diff = false
 
<%text>## options for showing and identifying changesets</%text>
 
show_sha_length = 12
 
show_revision_number = false
 

	
 
<%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>
 
<%text>## controllers to which access will be enabled by api_key. eg: to enable</%text>
 
<%text>## api access to raw_files put `FilesController:raw`, to enable access to patches</%text>
 
<%text>## add `ChangesetController:changeset_patch`. This list should be "," separated</%text>
 
@@ -259,26 +259,26 @@ default_encoding = utf8
 
issue_pat = (?:\s*#)(\d+)
 

	
 
<%text>## server url to the issue, each {id} will be replaced with match</%text>
 
<%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>
 

	
 
issue_prefix = #
 

	
 
<%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>
 
<%text>## a prefix key for this instance used for cache invalidation when running</%text>
 
<%text>## multiple instances of kallithea, make sure it's globally unique for</%text>
 
<%text>## all running kallithea instances. Leave empty if you don't use it</%text>
kallithea/config/deployment.ini_tmpl
Show inline comments
 
@@ -49,13 +49,13 @@ pdebug = false
 
#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
 
#error_email_from = paste_error@example.com
 

	
 
## 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
 
#smtp_use_tls = false
 
#smtp_use_ssl = false
 
## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).
 
@@ -219,14 +219,14 @@ rss_include_diff = false
 
## options for showing and identifying changesets
 
show_sha_length = 12
 
show_revision_number = false
 

	
 
## 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
 
## controllers to which access will be enabled by api_key. eg: to enable
 
## api access to raw_files put `FilesController:raw`, to enable access to patches
 
## add `ChangesetController:changeset_patch`. This list should be "," separated
 
@@ -255,26 +255,26 @@ default_encoding = utf8
 
issue_pat = (?:\s*#)(\d+)
 

	
 
## server url to the issue, each {id} will be replaced with match
 
## 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>
 

	
 
issue_prefix = #
 

	
 
## 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 prefix key for this instance used for cache invalidation when running
 
## multiple instances of kallithea, make sure it's globally unique for
 
## all running kallithea instances. Leave empty if you don't use it
kallithea/controllers/changelog.py
Show inline comments
 
@@ -95,13 +95,12 @@ class ChangelogController(BaseRepoContro
 
                                   'repository.admin')
 
    def index(self, repo_name, revision=None, f_path=None):
 
        # Fix URL after page size form submission via GET
 
        # 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))
 

	
 
        limit = 2000
 
        default = 100
kallithea/controllers/login.py
Show inline comments
 
@@ -24,14 +24,14 @@ Original author and date, and relevant c
 
:copyright: (c) 2013 RhodeCode GmbH, and others.
 
:license: GPLv3, see LICENSE.md for more details.
 
"""
 

	
 

	
 
import logging
 
import re
 
import formencode
 
import urlparse
 

	
 
from formencode import htmlfill
 
from webob.exc import HTTPFound, HTTPBadRequest
 
from pylons.i18n.translation import _
 
from pylons.controllers.util import redirect
 
from pylons import request, session, tmpl_context as c, url
 
@@ -53,46 +53,41 @@ log = logging.getLogger(__name__)
 

	
 
class LoginController(BaseController):
 

	
 
    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
 
        ip_allowed = AuthUser.check_ip_allowed(self.authuser, self.ip_addr)
 

	
 
        # 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
 
            login_form = LoginForm()
 
            try:
 
                c.form_result = login_form.to_python(dict(request.POST))
 
@@ -116,13 +111,13 @@ class LoginController(BaseController):
 
                # with user creation, explanation should be provided in
 
                # Exception itself
 
                h.flash(e, 'error')
 
            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')
 

	
 
    @HasPermissionAnyDecorator('hg.admin', 'hg.register.auto_activate',
 
                               'hg.register.manual_activate')
 
    def register(self):
kallithea/controllers/pullrequests.py
Show inline comments
 
@@ -499,15 +499,16 @@ class PullrequestsController(BaseRepoCon
 
                                      reviewers_ids)
 

	
 
        old_description = pull_request.description
 
        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()
 

	
 
        Session().commit()
 
        h.flash(_('Pull request updated'), category='success')
 
@@ -587,13 +588,13 @@ class PullrequestsController(BaseRepoCon
 
                    c.a_branch_name = other_scm_instance.get_changeset(c.a_ref_name).branch # use ref_type ?
 
                except EmptyRepositoryError:
 
                    c.a_branch_name = 'null' # not a branch name ... but close enough
 
            # 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.')
 
            else: # look for descendants of PR head on source branch in org repo
 
                avail_revs = org_scm_instance._repo.revs('%s:: & branch(%s)',
 
                                                         revs[0], c.cs_branch_name)
 
@@ -611,16 +612,17 @@ class PullrequestsController(BaseRepoCon
 
                        hgrepo = org_scm_instance._repo
 
                    show = set(hgrepo.revs('::%ld & !::%s & !::%s',
 
                                           avail_revs, revs[0], targethead))
 
                    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))
 
                    show.add(revs[0]) # make sure graph shows this so we can see how they relate
 
                    c.update_msg_other = _('Note: Branch %s has another head: %s.') % (c.cs_branch_name,
 
                        h.short_id(org_scm_instance.get_changeset((max(brevs))).raw_id))
kallithea/controllers/summary.py
Show inline comments
 
@@ -192,12 +192,13 @@ class SummaryController(BaseRepoControll
 
        c.ts_min = ts_min_m
 
        c.ts_max = ts_max_y
 

	
 
        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)
 
            c.commit_data = stats.commit_activity
 
            c.overview_data = stats.commit_activity_combined
 

	
kallithea/i18n/fr/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -5,16 +5,16 @@
 
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
 
msgid ""
 
msgstr ""
 
"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"
 
"Content-Transfer-Encoding: 8bit\n"
 
"Plural-Forms: nplurals=2; plural=n > 1;\n"
 
"X-Generator: Weblate 2.4-dev\n"
 
@@ -47,15 +47,15 @@ msgstr "Afficher les espaces et tabulati
 
#: kallithea/controllers/changeset.py:96 kallithea/controllers/changeset.py:103
 
#: kallithea/templates/files/diff_2way.html:55
 
msgid "Ignore whitespace"
 
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
 
msgid "Such revision does not exist for this repository"
 
msgstr "Une telle révision n'existe pas pour ce dépôt"
 

	
 
@@ -296,32 +296,30 @@ msgstr "Journal public"
 
#: kallithea/templates/base/base.html:222
 
#: kallithea/templates/journal/journal.html:4
 
#: kallithea/templates/journal/journal.html:12
 
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"
 

	
 
#: kallithea/controllers/login.py:157
 
msgid "You have successfully registered into Kallithea"
 
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
 
msgid "Successfully updated password"
 
msgstr "Mot de passe mis à jour avec succès"
 

	
 
@@ -435,26 +433,26 @@ msgstr "Cette pull request a été fermée et ne peut pas être mise à jour."
 
#, python-format
 
msgid "This pull request can be updated with changes on %s:"
 
msgstr "Cette demande de pull peut être mise à jour avec les modifications de %s :"
 

	
 
#: 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
 
msgid "Note: Branch %s has another head: %s."
 
msgstr "Note: La branche %s a une autre tête: %s."
 

	
 
#: kallithea/controllers/pullrequests.py:631
 
msgid "Git pull requests don't support updates yet."
 
msgstr "Le smises à jour des Git pull requests ne sont pas encore supportées."
 

	
 
#: 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."
 
msgstr "Fermeture."
 

	
 
#: kallithea/controllers/search.py:135
 
@@ -499,15 +497,14 @@ msgstr "Mise à jour des réglages par défaut effectuée avec succès"
 
msgid "Error occurred during update of defaults"
 
msgstr "Une erreur est survenue durant la mise à jour des réglages par défaut"
 

	
 
#: 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
 
#: kallithea/controllers/admin/users.py:286
 
msgid "5 minutes"
 
msgstr "5 minute"
 
@@ -543,15 +540,14 @@ msgstr "Une erreur est survenue lors de la création du gist"
 
#: kallithea/controllers/admin/gists.py:184
 
#, python-format
 
msgid "Deleted gist %s"
 
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"
 
msgstr "Le contenu du gist a été mis à jour avec succès"
 

	
 
#: kallithea/controllers/admin/gists.py:267
 
@@ -829,15 +825,15 @@ msgstr "%s forks supprimés"
 
#: kallithea/controllers/admin/repos.py:318
 
#, python-format
 
msgid "Deleted repository %s"
 
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
 
msgid "An error occurred during deletion of %s"
 
msgstr "Erreur pendant la suppression de %s"
 

	
 
@@ -879,21 +875,19 @@ msgstr "Le dépôt %s a été marké comme fork de %s"
 
#: kallithea/controllers/admin/repos.py:521
 
msgid "An error occurred during this operation"
 
msgstr "Une erreur est survenue durant cette opération"
 

	
 
#: 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
 
msgid "An error occurred during unlocking"
 
msgstr "Une erreur est survenue durant le déverrouillage"
 

	
 
@@ -1046,13 +1040,13 @@ msgstr "Utilisateur supprimé avec succès"
 
#: kallithea/controllers/admin/users.py:223
 
msgid "An error occurred during deletion of user"
 
msgstr "Une erreur est survenue durant la suppression de l’utilisateur"
 

	
 
#: 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
 
msgid "Added IP address %s to user whitelist"
 
msgstr "L'adresse IP %s a été ajoutée à la liste blanche"
 

	
 
@@ -1067,27 +1061,26 @@ msgstr "L'adresse IP a été supprimée de la liste blanche"
 
#: kallithea/lib/auth.py:743
 
#, python-format
 
msgid "IP %s not allowed"
 
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"
 
msgstr "Vous devez être un utilisateur enregistré pour effectuer cette action"
 

	
 
#: kallithea/lib/auth.py:844
 
msgid "You need to be signed in to view this page"
 
msgstr "Vous devez être connecté pour visualiser cette page"
 

	
 
#: 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"
 
msgstr "Ensemble de changements non trouvé"
 

	
 
#: kallithea/lib/diffs.py:66
 
@@ -1117,15 +1110,14 @@ msgstr "Étiquette créée : %s"
 
#: kallithea/lib/helpers.py:671
 
#, python-format
 
msgid "Show all combined changesets %s->%s"
 
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"
 
msgstr "et"
 

	
 
#: kallithea/lib/helpers.py:697
 
@@ -1135,20 +1127,20 @@ msgstr "%s de plus"
 

	
 
#: kallithea/lib/helpers.py:698 kallithea/templates/changelog/changelog.html:44
 
msgid "revisions"
 
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"
 
msgstr "[a supprimé] le dépôt"
 

	
 
#: kallithea/lib/helpers.py:754 kallithea/lib/helpers.py:766
 
@@ -1233,13 +1225,13 @@ msgid " and %s more"
 
msgstr " et %s de plus"
 

	
 
#: kallithea/lib/helpers.py:1128
 
#: 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"
 
msgstr "nouveau fichier"
 

	
 
#: kallithea/lib/helpers.py:1197
 
@@ -1778,117 +1770,119 @@ msgstr "à la ligne %s"
 
#: kallithea/model/comment.py:217 kallithea/model/pull_request.py:169
 
msgid "[Mention]"
 
msgstr "[Mention]"
 

	
 
#: 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"
 

	
 
#: kallithea/model/forms.py:57
 
msgid "Please enter a login"
 
msgstr "Veuillez entrer un identifiant"
 
@@ -1909,40 +1903,40 @@ msgstr "Entrez au moins %(min)i caractères"
 

	
 
#: kallithea/model/forms.py:160
 
msgid "Name must not contain only digits"
 
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
 
msgid "%(user)s commented on changeset at %(when)s"
 
msgstr "%(user)s a commenté sur le changeset à %(when)s"
 

	
 
@@ -1971,59 +1965,59 @@ msgstr "%(user)s a ouvert une nouvelle demande de pull à %(when)s"
 
msgid "%(user)s commented on pull request at %(when)s"
 
msgstr "%(user)s a commenté la demande de pull à %(when)s"
 

	
 
#: 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
 
msgid "New user %(new_username)s registered"
 
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
 
msgid "latest tip"
 
msgstr "Dernier sommet"
 

	
 
#: kallithea/model/user.py:192
 
msgid "New user registration"
 
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
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
@@ -2038,63 +2032,61 @@ msgid ""
 
" owners or remove those repository groups: %s"
 
msgstr ""
 
"L’utilisateur \"%s\" possède %s groupes de dépôt et ne peut être "
 
"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
 
msgid ""
 
"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"
 
msgstr "Cette valeur ne peut être une liste vide"
 

	
 
#: kallithea/model/validators.py:95
 
#, python-format
 
msgid "Username \"%(username)s\" already exists"
 
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"
 
msgstr "L'entrée n'est pas valide"
 

	
 
#: kallithea/model/validators.py:133
 
@@ -2144,22 +2136,21 @@ msgstr "Ancien mot de passe invalide"
 

	
 
#: kallithea/model/validators.py:285
 
msgid "Passwords do not match"
 
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é"
 

	
 
#: kallithea/model/validators.py:347
 
#, python-format
 
msgid "Repository named %(repo)s already exists"
 
@@ -2173,21 +2164,22 @@ msgstr "Le dépôt « %(repo)s » existe déjà dans le groupe « %(group)s »"
 
#: kallithea/model/validators.py:350
 
#, python-format
 
msgid "Repository group with name \"%(repo)s\" already exists"
 
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"
 
msgstr "Le fork doit être du même type que le parent"
 

	
 
#: kallithea/model/validators.py:504
 
@@ -2208,20 +2200,19 @@ msgstr "Ce nom d'utilisateur ou nom de g
 

	
 
#: kallithea/model/validators.py:690
 
msgid "This is not a valid path"
 
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 ""
 
"The LDAP Login attribute of the CN must be specified - this is the name "
 
"of the attribute that is equivalent to \"username\""
 
msgstr ""
 
@@ -2504,52 +2495,51 @@ msgstr "Captcha"
 

	
 
#: kallithea/templates/password_reset.html:46
 
msgid "Send Password Reset Email"
 
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
 
msgid "Sign Up"
 
msgstr "Inscription"
 

	
 
@@ -2586,16 +2576,18 @@ msgstr "Nom"
 
msgid "Email"
 
msgstr "E-mail"
 

	
 
#: 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
 
msgid "There are no branches yet"
 
msgstr "Aucune branche n’a été créée pour le moment"
 

	
 
@@ -2687,22 +2679,18 @@ msgstr "Greffons d'authentification"
 

	
 
#: kallithea/templates/admin/auth/auth_settings.html:31
 
msgid "Enabled Plugins"
 
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"
 
msgstr "Greffons inclus disponibles"
 

	
 
#: kallithea/templates/admin/auth/auth_settings.html:51
 
@@ -2833,15 +2821,14 @@ msgstr "Expire le"
 
#: kallithea/templates/admin/gists/index.html:57
 
#: kallithea/templates/admin/gists/show.html:47
 
#: kallithea/templates/admin/my_account/my_account_api_keys.html: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"
 
msgstr "Mettre à jour le gist"
 

	
 
#: kallithea/templates/admin/gists/edit.html:146
 
@@ -3017,78 +3004,70 @@ msgstr "Mon compte"
 
#: kallithea/templates/admin/my_account/my_account.html:35
 
#: kallithea/templates/admin/users/user_edit.html:29
 
msgid "Profile"
 
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
 
msgid "API Keys"
 
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
 
msgid "Built-in"
 
msgstr "Inclus"
 

	
 
#: 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"
 

	
 
#: kallithea/templates/admin/my_account/my_account_api_keys.html:69
 
#: kallithea/templates/admin/my_account/my_account_emails.html:45
 
#: kallithea/templates/admin/permissions/permissions_ips.html:38
 
@@ -3139,12 +3118,13 @@ msgid "Confirm new password"
 
msgstr "Confirmer le nouveau mot de passe"
 

	
 
#: kallithea/templates/admin/my_account/my_account_password.html:45
 
#, 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"
 
msgstr "Vous pouvez changer votre avatar sur"
 

	
 
#: kallithea/templates/admin/my_account/my_account_profile.html:12
 
@@ -3160,15 +3140,14 @@ msgstr "Les avatars sont désactivés"
 
#: kallithea/templates/admin/my_account/my_account_profile.html:15
 
msgid "Missing email, please update your user email address."
 
msgstr "Adresse courriel manquante, veuillez mettre à jour votre adresse courriel."
 

	
 
#: 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"
 
msgstr "Dépôts dont vous êtes le propriétaire"
 

	
 
#: kallithea/templates/admin/my_account/my_account_repos.html:59
 
@@ -3222,13 +3201,12 @@ msgstr "Montrer Notification"
 
msgid "Notifications"
 
msgstr "Notifications"
 

	
 
#: 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"
 

	
 
#: kallithea/templates/admin/permissions/permissions.html:28
 
#: kallithea/templates/admin/settings/settings.html:29
 
msgid "Global"
 
@@ -3241,35 +3219,37 @@ msgstr "Liste blanche d'adresses IP"
 

	
 
#: kallithea/templates/admin/permissions/permissions_globals.html:7
 
msgid "Anonymous access"
 
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 ""
 
"All default permissions on each repository will be reset to chosen "
 
"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
 
#: kallithea/templates/admin/repos/repo_edit_settings.html:35
 
#: kallithea/templates/data_table/_dt_elements.html:202
 
#: kallithea/templates/forks/fork.html:48
 
@@ -3279,103 +3259,120 @@ msgstr "Groupe de dépôt"
 
#: kallithea/templates/admin/permissions/permissions_globals.html:39
 
msgid ""
 
"All default permissions on each repository group will be reset to chosen "
 
"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
 
msgid "User group"
 
msgstr "Groupe d'utilisateurs"
 

	
 
#: kallithea/templates/admin/permissions/permissions_globals.html:53
 
msgid ""
 
"All default permissions on each user group will be reset to chosen "
 
"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"
 
msgstr "Création de dépôts avec l'accès en écriture du groupe"
 

	
 
#: kallithea/templates/admin/permissions/permissions_globals.html:74
 
msgid ""
 
"With this, write permission to a repository group allows creating "
 
"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"
 
msgstr "Création de groupes d'utilisateurs"
 

	
 
#: 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"
 
msgstr "Fork de dépôt"
 

	
 
#: 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"
 
msgstr "Enregistrement"
 

	
 
#: 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
 
msgid "New IP address"
 
msgstr "Nouvelle adresse IP"
 

	
 
@@ -3404,18 +3401,18 @@ msgstr "Parent du groupe"
 
msgid "Copy parent group permissions"
 
msgstr "Copier les permissions du groupe parent"
 

	
 
#: 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"
 
msgstr "Ajouter un groupe enfant"
 

	
 
#: kallithea/templates/admin/repo_groups/repo_group_edit.html:40
 
@@ -3478,73 +3475,70 @@ msgstr[1] "Confirmer la suppression de ce groupe : %s avec %s dépôts"
 
msgid "Delete this repository group"
 
msgstr "Supprimer ce groupe de dépôts"
 

	
 
#: 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
 
#: kallithea/templates/admin/repos/repo_edit_permissions.html:24
 
#: 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
 
#: kallithea/templates/admin/repos/repo_edit_permissions.html:43
 
#: 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"
 

	
 
#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:97
 
#: kallithea/templates/admin/repos/repo_edit_permissions.html:94
 
#: kallithea/templates/admin/user_groups/user_group_edit_perms.html:97
 
msgid "Add new"
 
msgstr "Ajouter un nouveau"
 

	
 
#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:103
 
#, fuzzy
 
msgid "Apply to children"
 
msgstr "Appliquer aux enfants"
 

	
 
#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:107
 
msgid "Both"
 
msgstr "Les deux"
 

	
 
#: kallithea/templates/admin/repo_groups/repo_group_edit_perms.html:108
 
msgid ""
 
"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 ""
 
"Enable lock-by-pulling on group. This option will be applied to all other"
 
" groups and repositories inside"
 
msgstr ""
 
"Activer le verrou lors d’un pull sur le groupe. Cette option sera "
 
"appliquée à tous les sous-groupes et dépôts de ce groupe"
 

	
 
#: 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
 
msgid "%s Repository group dashboard"
 
msgstr "Tableau de bord du groupe de dépôts %s"
 

	
 
@@ -3554,31 +3548,30 @@ msgstr "Accueil"
 

	
 
#: kallithea/templates/admin/repo_groups/repo_group_show.html:13
 
msgid "with"
 
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
 
#: kallithea/templates/forks/fork.html:42
 
msgid "Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
@@ -3603,47 +3596,54 @@ msgstr "Révision d’arrivée"
 

	
 
#: kallithea/templates/admin/repos/repo_add_base.html:68
 
msgid ""
 
"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"
 
msgstr "Création du dépôt"
 

	
 
#: kallithea/templates/admin/repos/repo_creating.html:27
 
#, python-format
 
msgid ""
 
"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"
 
msgstr "Dépôt distant"
 

	
 
#: kallithea/templates/admin/repos/repo_edit.html:58
 
@@ -3651,152 +3651,144 @@ msgstr "Dépôt distant"
 
#: kallithea/templates/summary/summary.html:171
 
#: kallithea/templates/summary/summary.html:172
 
msgid "Statistics"
 
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"
 
msgstr "Ce dépôt n’est pas verrouillé"
 

	
 
#: kallithea/templates/admin/repos/repo_edit_advanced.html:68
 
msgid ""
 
"Force locking on the repository. Works only when anonymous access is "
 
"disabled. Triggering a pull locks the repository.  The user who is "
 
"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
 
#, python-format
 
msgid "Confirm to delete this repository: %s"
 
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 ""
 
"The deleted repository will be moved away and hidden until the "
 
"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
 
#: kallithea/templates/admin/user_groups/user_group_edit_settings.html:24
 
#: kallithea/templates/admin/user_groups/user_groups.html:49
 
#: kallithea/templates/admin/users/user_add.html:86
 
@@ -3804,106 +3796,108 @@ msgstr ""
 
#: kallithea/templates/admin/users/users.html:54
 
msgid "Active"
 
msgstr "Actif"
 

	
 
#: 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 ""
 
"In case this repository is renamed or moved into another group the "
 
"repository URL changes.\n"
 
"                               Using the above permanent URL guarantees "
 
"that this repository always will be accessible on that URL.\n"
 
"                               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"
 
msgstr ""
 
"Révision par défaut pour les pages de fichiers, de téléchargements, de "
 
"recherche et de documentation"
 
@@ -3911,61 +3905,56 @@ msgstr ""
 
#: kallithea/templates/admin/repos/repo_edit_settings.html:58
 
msgid "Change owner of this repository."
 
msgstr "Changer le propriétaire de ce dépôt."
 

	
 
#: 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"
 

	
 
#: kallithea/templates/admin/repos/repos.html:51
 
msgid "State"
 
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"
 
msgstr "VCS"
 

	
 
#: 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"
 
msgstr "Visuel"
 

	
 
#: kallithea/templates/admin/settings/settings.html:32
 
#: kallithea/templates/admin/settings/settings_vcs.html:19
 
msgid "Hooks"
 
msgstr "Hooks"
 

	
 
#: kallithea/templates/admin/settings/settings.html:33
 
#, fuzzy
 
msgid "Full Text Search"
 
msgstr "Recherche dans le texte complet"
 

	
 
#: kallithea/templates/admin/settings/settings.html:34
 
msgid "System Info"
 
msgstr "Informations sytème"
 
@@ -3977,31 +3966,33 @@ msgstr "Envoyer un courriel de test à"
 
#: kallithea/templates/admin/settings/settings_email.html:15
 
msgid "Send"
 
msgstr "Envoyer"
 

	
 
#: 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."
 
msgstr "Mettez un title personnalisé pour votre service Kallithea."
 

	
 
#: 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"
 
msgstr "Clé publique ReCaptcha"
 

	
 
#: kallithea/templates/admin/settings/settings_global.html:41
 
@@ -4010,178 +4001,182 @@ msgstr "Clé publique pour le système reCaptcha."
 

	
 
#: kallithea/templates/admin/settings/settings_global.html:47
 
msgid "ReCaptcha private key"
 
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"
 

	
 
#: kallithea/templates/admin/settings/settings_hooks.html:67
 
msgid "Failed to remove hook"
 
msgstr "Erreur lors de la suppression du hook"
 

	
 
#: 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 ""
 
"If installing Git hooks, overwrite any existing hooks, even if they do "
 
"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"
 
msgstr "Construire ex nihilo"
 

	
 
#: kallithea/templates/admin/settings/settings_search.html:15
 
msgid ""
 
"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"
 
msgstr "Mettre à jour l’index"
 

	
 
#: kallithea/templates/admin/settings/settings_system.html:4
 
msgid "Kallithea version"
 
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"
 
msgstr "Version de Python"
 

	
 
#: kallithea/templates/admin/settings/settings_system.html:7
 
msgid "Platform"
 
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"
 

	
 
#: kallithea/templates/admin/settings/settings_system.html:15
 
msgid "Checking for updates..."
 
msgstr "Vérification des mises à jour…"
 

	
 
#: kallithea/templates/admin/settings/settings_system.html:23
 
#, fuzzy
 
msgid "Python Packages"
 
msgstr "Paquets Python"
 

	
 
#: kallithea/templates/admin/settings/settings_vcs.html:6
 
msgid "Web"
 
msgstr "Web"
 

	
 
#: kallithea/templates/admin/settings/settings_vcs.html:11
 
msgid "Require SSL for vcs operations"
 
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"
 
msgstr "Afficher la taille du dépôt après un push"
 

	
 
#: kallithea/templates/admin/settings/settings_vcs.html:28
 
@@ -4194,37 +4189,34 @@ msgstr "Journaliser les commandes de pul
 

	
 
#: kallithea/templates/admin/settings/settings_vcs.html:36
 
msgid "Update repository after push (hg update)"
 
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 ""
 
"Click to unlock. You must restart Kallithea in order to make this setting"
 
" take effect."
 
msgstr ""
 
@@ -4233,36 +4225,40 @@ msgstr ""
 

	
 
#: kallithea/templates/admin/settings/settings_vcs.html:72
 
msgid ""
 
"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 ""
 
"Gravatar URL allows you to use another avatar server application.\n"
 
"                                                        The following "
 
"variables of the URL will be replaced accordingly.\n"
 
@@ -4274,12 +4270,26 @@ msgid ""
 
"hash of the user email (like at gravatar.com),\n"
 
"                                                        {size}      size "
 
"of the image that is expected from the server application,\n"
 
"                                                        {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 ""
 
"Schema of clone URL construction eg. '{scheme}://{user}@{netloc}/{repo}'."
 
"\n"
 
"                                                        The following "
 
@@ -4292,32 +4302,50 @@ msgid ""
 
"location/server host of running Kallithea server,\n"
 
"                                                        {repo}   full "
 
"repository name,\n"
 
"                                                        {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"
 
msgstr "Icônes"
 

	
 
#: kallithea/templates/admin/settings/settings_visual.html:80
 
@@ -4326,99 +4354,97 @@ msgstr "Afficher l’icône de dépôt public sur les dépôts"
 

	
 
#: kallithea/templates/admin/settings/settings_visual.html:84
 
msgid "Show private repository icon on repositories"
 
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
 
#: kallithea/templates/admin/user_groups/user_groups.html:48
 
msgid "Members"
 
msgstr "Membres"
 

	
 
#: kallithea/templates/admin/user_groups/user_group_edit_advanced.html:19
 
#: 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"
 
msgstr "Ajouter un utilisateur"
 

	
 
#: kallithea/templates/admin/users/user_add.html:10
 
@@ -4428,107 +4454,106 @@ msgstr "Ajouter un utilisateur"
 
msgid "Users"
 
msgstr "Utilisateurs"
 

	
 
#: 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"
 
msgstr "Confirmation"
 

	
 
#: 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
 
#, python-format
 
msgid "Confirm to delete this user: %s"
 
msgstr "Voulez-vous vraiment supprimer l’utilisateur « %s » ?"
 

	
 
#: 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"
 
msgstr "Dépôt Mercurial"
 

	
 
#: kallithea/templates/base/base.html:93
 
msgid "Git repository"
 
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
 
#: kallithea/templates/data_table/_dt_elements.html:17
 
#: kallithea/templates/summary/summary.html:8
 
msgid "Summary"
 
@@ -4548,22 +4573,21 @@ msgstr "Historique"
 
#: kallithea/templates/files/files.html:11
 
msgid "Files"
 
msgstr "Fichiers"
 

	
 
#: 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
 
msgid "Options"
 
msgstr "Options"
 

	
 
#: kallithea/templates/base/base.html:155
 
#: kallithea/templates/forks/forks_data.html:21
 
#, fuzzy
 
msgid "Compare Fork"
 
msgstr "Comparer le fork"
 

	
 
#: kallithea/templates/base/base.html:157
 
#: kallithea/templates/bookmarks/bookmarks.html:56
 
#: kallithea/templates/bookmarks/bookmarks_data.html:13
 
@@ -4580,93 +4604,88 @@ msgstr "Comparer"
 
#: kallithea/templates/search/search.html:54
 
msgid "Search"
 
msgstr "Rechercher"
 

	
 
#: 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
 
#: kallithea/templates/data_table/_dt_elements.html:41
 
#: kallithea/templates/forks/fork.html:9
 
msgid "Fork"
 
msgstr "Fork"
 

	
 
#: 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
 
msgid "Public journal"
 
msgstr "Journal public"
 

	
 
#: 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"
 

	
 
#: kallithea/templates/base/base.html:319
 
msgid "Forgot password ?"
 
msgstr "Mot de passe oublié ?"
 
@@ -4674,66 +4693,71 @@ msgstr "Mot de passe oublié ?"
 
#: kallithea/templates/base/base.html:346
 
msgid "Log Out"
 
msgstr "Se déconnecter"
 

	
 
#: 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
 
msgid ""
 
"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"
 
msgstr "Création de dépôts"
 

	
 
#: 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"
 
msgstr "Forker les dépôts"
 

	
 
#: 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
 
msgid "Show"
 
msgstr "Afficher"
 

	
 
#: 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
 
msgid "Permission"
 
msgstr "Permission"
 

	
 
@@ -4741,18 +4765,17 @@ msgstr "Permission"
 
#: kallithea/templates/base/perms_summary.html:56
 
msgid "Edit Permission"
 
msgstr "Éditer"
 

	
 
#: 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
 
msgid "Stop following this repository"
 
msgstr "Arrêter de suivre ce dépôt"
 

	
 
@@ -4767,44 +4790,41 @@ msgstr "Groupe"
 
#: kallithea/templates/base/root.html:26
 
msgid "members"
 
msgstr "Membres"
 

	
 
#: 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"
 

	
 
#: kallithea/templates/base/root.html:35
 
#: kallithea/templates/changeset/diff_block.html:8
 
msgid "Collapse Diff"
 
@@ -4813,40 +4833,38 @@ msgstr "Replier le Diff"
 
#: kallithea/templates/base/root.html:36
 
msgid "Expand Diff"
 
msgstr "Déplier le Diff"
 

	
 
#: 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"
 
msgstr "activé"
 

	
 
#: kallithea/templates/base/root.html:40
 
msgid "disabled"
 
msgstr "désactivé"
 

	
 
#: kallithea/templates/base/root.html:42
 
#, fuzzy
 
msgid "Specify changeset"
 
msgstr "Sélectionner le changeset"
 

	
 
#: kallithea/templates/bookmarks/bookmarks.html:5
 
#, python-format
 
msgid "%s Bookmarks"
 
msgstr "Signets de %s"
 

	
 
#: 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
 
#: kallithea/templates/branches/branches.html:53
 
#: kallithea/templates/branches/branches_data.html:10
 
#: kallithea/templates/changelog/changelog_summary_data.html:10
 
@@ -4872,13 +4890,13 @@ msgstr "Révision"
 
#, python-format
 
msgid "%s Branches"
 
msgstr "Branches de %s"
 

	
 
#: kallithea/templates/branches/branches.html:26
 
msgid "Compare Branches"
 
msgstr ""
 
msgstr "Comparer les branches"
 

	
 
#: kallithea/templates/changelog/changelog.html:6
 
#, python-format
 
msgid "%s Changelog"
 
msgstr "Historique de %s"
 

	
 
@@ -4888,142 +4906,141 @@ msgid "showing %d out of %d revision"
 
msgid_plural "showing %d out of %d revisions"
 
msgstr[0] "Affichage de %d révision sur %d"
 
msgstr[1] "Affichage de %d révisions sur %d"
 

	
 
#: 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
 
#, python-format
 
msgid ""
 
"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
 
#: kallithea/templates/changeset/changeset.html:94
 
#: 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
 
#: kallithea/templates/changeset/changeset.html:101
 
#: 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
 
#: kallithea/templates/changeset/changeset.html:106
 
#: 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"
 
msgstr "Il n’y a aucun changement pour le moment"
 

	
 
#: 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
 
#: kallithea/templates/changelog/changelog_details.html:10
 
#: kallithea/templates/changeset/changeset.html:81
 
#: kallithea/templates/changeset/changeset.html:82
 
#: 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"
 
msgstr "Ajouter ou téléverser des fichiers directement via Kallithea"
 

	
 
#: kallithea/templates/changelog/changelog_summary_data.html:84
 
#: 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"
 

	
 
#: kallithea/templates/changelog/changelog_summary_data.html:98
 
msgid "Existing repository?"
 
msgstr "Le dépôt existe déjà ?"
 
@@ -5032,120 +5049,110 @@ msgstr "Le dépôt existe déjà ?"
 
#, python-format
 
msgid "%s Changeset"
 
msgstr "Changeset de %s"
 

	
 
#: 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
 
#: kallithea/templates/changeset/changeset_range.html:48
 
msgid "Changeset status"
 
msgstr "Statut du changeset"
 

	
 
#: kallithea/templates/changeset/changeset.html:54
 
#: 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
 
#: kallithea/templates/pullrequests/pullrequest_show.html:318
 
#, 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
 
#: kallithea/templates/pullrequests/pullrequest_show.html:320
 
#, 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}."
 
msgstr "Commentaire sur la ligne {1}."
 

	
 
#: kallithea/templates/changeset/changeset_file_comment.html:60
 
@@ -5154,37 +5161,35 @@ msgstr "Commentaire sur la ligne {1}."
 
msgid "Comments parsed using %s syntax with %s support."
 
msgstr ""
 
"Les commentaires sont analysés avec la syntaxe %s, avec le support de la "
 
"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…"
 

	
 
#: kallithea/templates/changeset/changeset_file_comment.html:80
 
#: kallithea/templates/changeset/changeset_file_comment.html:190
 
msgid "Comment"
 
msgstr "Commentaire"
 

	
 
#: 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."
 
msgstr "Vous devez être connecté pour poster des commentaires."
 

	
 
#: kallithea/templates/changeset/changeset_file_comment.html:90
 
@@ -5200,50 +5205,46 @@ msgstr "Masquer"
 
msgid "%d comment"
 
msgid_plural "%d comments"
 
msgstr[0] "%d commentaire"
 
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
 
msgid "%s Changesets"
 
msgstr "Changesets de %s"
 

	
 
@@ -5251,121 +5252,117 @@ msgstr "Changesets de %s"
 
msgid "Files affected"
 
msgstr "Fichiers affectés"
 

	
 
#: 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"
 
msgstr "Aucun changeset"
 

	
 
#: kallithea/templates/compare/compare_cs.html:8
 
msgid "Ancestor"
 
msgstr "Ancêtre"
 

	
 
#: 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
 
msgid "Common ancestor"
 
msgstr "Ancêtre commun"
 

	
 
#: kallithea/templates/compare/compare_cs.html:90
 
msgid "No common ancestor found - repositories are unrelated"
 
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"
 
msgstr "Dépôt public"
 

	
 
#: 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"
 
msgstr "Dépôt vide"
 

	
 
#: kallithea/templates/data_table/_dt_elements.html:105
 
@@ -5379,160 +5376,164 @@ msgstr "S’abonner au flux RSS de %s"
 
#, python-format
 
msgid "Subscribe to %s atom feed"
 
msgstr "S’abonner au flux ATOM de %s"
 

	
 
#: 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
 
msgid "File diff"
 
msgstr "Diff de fichier"
 

	
 
#: 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
 
#, python-format
 
msgid "%s Files"
 
msgstr "Fichiers de %s"
 

	
 
#: 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
 
#: kallithea/templates/files/files_ypjax.html:3
 
msgid "Location"
 
msgstr "Emplacement"
 

	
 
#: 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
 
msgid "or"
 
msgstr "ou"
 

	
 
#: 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..."
 
msgstr "Chargement de la liste des fichiers…"
 

	
 
#: kallithea/templates/files/files_browser.html:61
 
@@ -5541,53 +5542,51 @@ msgstr "Taille"
 

	
 
#: kallithea/templates/files/files_browser.html:62
 
msgid "Last Revision"
 
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"
 
msgstr "Édition du fichier"
 

	
 
#: kallithea/templates/files/files_history_box.html:2
 
@@ -5596,46 +5595,50 @@ msgid "%s author"
 
msgid_plural "%s authors"
 
msgstr[0] "%s auteur"
 
msgstr[1] "%s auteurs"
 

	
 
#: 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
 
msgid "Binary file (%s)"
 
msgstr "Fichier binaire (%s)"
 

	
 
@@ -5646,13 +5649,13 @@ msgstr "Ce fichier est trop gros pour être affiché"
 
#: kallithea/templates/files/files_ypjax.html:5
 
msgid "annotation"
 
msgstr "annotation"
 

	
 
#: 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"
 
msgstr "Aucun fichier à cet endroit"
 

	
 
#: kallithea/templates/followers/followers.html:5
 
@@ -5670,24 +5673,23 @@ msgstr "Followers"
 
msgid "Started following -"
 
msgstr "A commencé à suivre le dépôt :"
 

	
 
#: 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"
 
msgstr "Privé"
 

	
 
#: kallithea/templates/forks/fork.html:77
 
@@ -5705,13 +5707,13 @@ msgstr "MÀJ après le clonage"
 
#: kallithea/templates/forks/fork.html:91
 
msgid "Checkout source after making a clone"
 
msgstr "Mettre à jour depuis la source après clonage"
 

	
 
#: 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
 
msgid "%s Forks"
 
msgstr "Forks de %s"
 

	
 
@@ -5720,13 +5722,13 @@ msgstr "Forks de %s"
 
#: kallithea/templates/summary/summary.html:149
 
msgid "Forks"
 
msgstr "Forks"
 

	
 
#: 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"
 
msgstr "Il n’y a pas encore de forks"
 

	
 
#: kallithea/templates/journal/journal.html:21
 
@@ -5752,118 +5754,115 @@ msgstr "Flux ATOM du journal public"
 
#: kallithea/templates/journal/public_journal.html:14
 
msgid "RSS public journal feed"
 
msgstr "Flux RSS du journal public"
 

	
 
#: kallithea/templates/pullrequests/pullrequest.html:4
 
#: kallithea/templates/pullrequests/pullrequest.html:8
 
#, fuzzy
 
msgid "New Pull Request"
 
msgstr "Nouvelle requête de pull"
 

	
 
#: kallithea/templates/pullrequests/pullrequest.html:31
 
#: kallithea/templates/pullrequests/pullrequest_data.html:15
 
#: kallithea/templates/pullrequests/pullrequest_show.html:29
 
#: kallithea/templates/pullrequests/pullrequest_show.html:54
 
msgid "Title"
 
msgstr "Titre"
 

	
 
#: 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
 
#: kallithea/templates/pullrequests/pullrequest_show.html:83
 
msgid "Closed"
 
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"
 
msgstr "Pas encore relue par"
 

	
 
#: kallithea/templates/pullrequests/pullrequest_show.html:97
 
@@ -5872,151 +5871,143 @@ msgid "%d reviewer"
 
msgid_plural "%d reviewers"
 
msgstr[0] "%d relecteur"
 
msgstr[1] "%d relecteurs"
 

	
 
#: 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 na é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"
 

	
 
#: kallithea/templates/search/search.html:50
 
msgid "Search term"
 
msgstr "Termes de la recherches"
 
@@ -6043,31 +6034,31 @@ msgstr "Les noms de fichiers"
 
msgid "Permission denied"
 
msgstr "Permission refusée"
 

	
 
#: 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: "
 
msgstr "Statistiques obtenues : "
 

	
 
#: kallithea/templates/summary/statistics.html:89
 
@@ -6075,13 +6066,13 @@ msgstr "Statistiques obtenues : "
 
msgid "files"
 
msgstr "Fichiers"
 

	
 
#: 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"
 
msgstr "commits"
 

	
 
#: kallithea/templates/summary/statistics.html:391
 
@@ -6117,17 +6108,17 @@ msgstr "fichier supprimé"
 
msgid "%s Summary"
 
msgstr "Résumé de %s"
 

	
 
#: 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"
 
msgstr "Fork de"
 

	
 
#: kallithea/templates/summary/summary.html:29
 
@@ -6168,15 +6159,14 @@ msgstr "Télécharger en ZIP"
 

	
 
#: kallithea/templates/summary/summary.html:125
 
msgid "Check this to download archive with subrepos"
 
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"
 
msgstr "Taille du dépôt"
 

	
 
#: kallithea/templates/summary/summary.html:163
 
@@ -6239,12 +6229,14 @@ msgstr "Comparer les tags"
 
#~ msgstr "Vous ne pouvez pas éditer cet utilisateur"
 

	
 
#~ msgid "No Files"
 
#~ msgstr "Aucun fichier"
 

	
 
#~ msgid ""
 
#~ "_: \n"
 
#~ ""
 
#~ msgstr ""
 

	
 
#~ msgid "Username \"%(username)s\" is forbidden"
 
#~ msgstr "Le nom d’utilisateur « %(username)s » n’est pas autorisé"
 

	
 
#~ msgid "invalid user name"
kallithea/i18n/how_to
Show inline comments
 
@@ -47,42 +47,42 @@ using its administrative interface.
 
Manual creation of a new language translation
 
---------------------------------------------
 

	
 
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`.
 

	
 
Edit the new PO file located in `LC_MESSAGES` directory with poedit or your
 
favorite PO files editor. After you finished with the translations, check the
 
translation file for errors by executing::
 

	
 
    msgfmt -f -c kallithea/i18n/<new_language_code>/LC_MESSAGES/<updated_file.po>
 

	
 
Finally, compile the translations::
 

	
 
    python setup.py compile_catalog -l <new_language_code>
 
    python2 setup.py compile_catalog -l <new_language_code>
 

	
 

	
 
Updating translations
 
---------------------
 

	
 
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
 

	
 

	
 
Testing translations
kallithea/i18n/ru/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -1901,40 +1901,40 @@ msgstr "Введите не менее %(min)i символов"
 

	
 
#: kallithea/model/forms.py:160
 
msgid "Name must not contain only digits"
 
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
 
msgid "%(user)s commented on changeset at %(when)s"
 
msgstr "%(user)s оставил комментарий к набору изменений %(when)s"
 

	
kallithea/lib/auth.py
Show inline comments
 
@@ -31,13 +31,13 @@ import traceback
 
import hashlib
 
import itertools
 
import collections
 

	
 
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
 
from sqlalchemy import or_
 
from sqlalchemy.orm.exc import ObjectDeletedError
 
from sqlalchemy.orm import joinedload
 
@@ -709,17 +709,18 @@ def set_available_permissions(config):
 
#==============================================================================
 
# CHECK DECORATORS
 
#==============================================================================
 

	
 
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):
 
    """
 
    Must be logged in to execute this function else
 
    redirect to login page
 

	
 
@@ -762,12 +763,21 @@ class LoginRequired(object):
 
        # Only allow the following HTTP request methods. (We sometimes use POST
 
        # requests with a '_method' set to 'PUT' or 'DELETE'; but that is only
 
        # used for the route lookup, and does not affect request.method.)
 
        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
 
        # guaranteed to be side effect free. In practice, the only situation
 
        # where we allow side effects without ambient authority is when the
 
        # authority comes from an API key; and that is handled above.
kallithea/lib/helpers.py
Show inline comments
 
@@ -33,18 +33,19 @@ from pylons.i18n.translation import _, u
 
from webhelpers.html import literal, HTML, escape
 
from webhelpers.html.tools import *
 
from webhelpers.html.builder import make_tag
 
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
 
from webhelpers.date import time_ago_in_words
 
from webhelpers.paginate import Page as _Page
 
from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
 
@@ -1448,6 +1449,16 @@ def not_mapped_error(repo_name):
 

	
 

	
 
def ip_range(ip_addr):
 
    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)
kallithea/lib/rcmail/response.py
Show inline comments
 
@@ -135,13 +135,13 @@ class MailResponse(object):
 
    to, rather than read from (although you can do both).
 

	
 
    You can easily set a Body or Html during creation or after by passing it
 
    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
 
    send it out when it's ready.
 
    """
 
    def __init__(self, To=None, From=None, Subject=None, Body=None, Html=None,
kallithea/lib/vcs/backends/git/repository.py
Show inline comments
 
@@ -672,16 +672,16 @@ class GitRepository(BaseRepository):
 
        runs gits update-server-info command in this repo instance
 
        """
 
        from dulwich.server import update_server_info
 
        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):
 
        """
 
        Returns ``Workdir`` instance for this repository.
 
        """
kallithea/model/comment.py
Show inline comments
 
@@ -97,13 +97,13 @@ class ChangesetCommentsModel(BaseModel):
 
            if not cs_author:
 
                #use repo owner if we cannot extract the author correctly
 
                cs_author = repo.user
 
            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,
 
                'message': cs.message,
 
                'repo_name': repo.repo_name,
 
                'short_id': h.short_id(revision),
 
@@ -145,13 +145,13 @@ class ChangesetCommentsModel(BaseModel):
 
            email_kwargs = {
 
                'pr_title': pull_request.title,
 
                'pr_nice_id': pull_request.nice_id(),
 
                '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,
 
                'ref': org_ref_name,
 
                'comment_username': user.username,
 
                'threading': threading,
kallithea/model/pull_request.py
Show inline comments
 
@@ -108,17 +108,17 @@ class PullRequestModel(BaseModel):
 
            comment,
 
            pull_request=new
 
        )
 

	
 
        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)
 
            if _usr is None:
 
                raise UserInvalidException(member)
 
            reviewer = PullRequestReviewers(_usr, pr)
 
@@ -132,72 +132,72 @@ class PullRequestModel(BaseModel):
 
        threading = ['%s-pr-%s@%s' % (pr.other_repo.repo_name,
 
                                      pr.pull_request_id,
 
                                      h.canonical_hostname())]
 
        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)
 
            )
 
        body = pr.description
 
        _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)
 

	
 
        if mention_recipients:
 
            mention_recipients.discard(None)
 
            mention_recipients.difference_update(reviewers)
 
        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()\
 
                            .filter(PullRequestReviewers.pull_request==
 
                                   pull_request)\
 
                            .all()
 
        current_reviewers_ids = set([x.user.user_id for x in current_reviewers])
 

	
 
        to_add = reviewers_ids.difference(current_reviewers_ids)
 
        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:
 
            reviewer = PullRequestReviewers.query()\
 
                    .filter(PullRequestReviewers.user_id==uid,
 
                            PullRequestReviewers.pull_request==pull_request)\
kallithea/public/css/style.css
Show inline comments
 
@@ -4306,13 +4306,13 @@ form.comment-inline-form {
 
    border: 1px solid #ddd;
 
    border-radius: 4px;
 
    margin: 3px 3px 5px 5px;
 
    background-color: #FAFAFA;
 
}
 

	
 
.inline-comments .add-comment {
 
.inline-comments .add-button-row {
 
    padding: 2px 4px 8px 5px;
 
}
 

	
 
.inline-comments .comment .meta {
 
    background: #f8f8f8;
 
    padding: 4px;
 
@@ -4823,12 +4823,13 @@ div.comment:target:before {
 
  margin: -100px 0 0;
 
  content: "";
 
}
 

	
 
div.comment:target>.comment-wrapp {
 
    border: solid 2px #ee0 !important;
 
    margin: 2px 2px 4px 4px;
 
}
 

	
 
.lineno:target a {
 
    border: solid 2px #ee0 !important;
 
    margin: -2px;
 
}
kallithea/public/js/base.js
Show inline comments
 
@@ -652,33 +652,33 @@ function _get_add_comment_div(target_id)
 
    return $comments_box;
 
}
 

	
 
// 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) {
 
            _comment_div_append_form($comment_div, f_path, line_no);
 
        }
 
    } else {
 
        $forms.remove();
 
    }
 
    $buttons.remove();
 
    $buttonrow.remove();
 
    if ($comments.length && !show_form) {
 
        _comment_div_append_add($comment_div, f_path, line_no);
 
    }
 
}
 

	
 
// 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);
 
    });
 
}
 

	
 
// append a comment form to $comment_div
 
function _comment_div_append_form($comment_div, f_path, line_no) {
 
@@ -893,20 +893,20 @@ var fileBrowserListeners = function(curr
 
            clearTimeout(filterTimeout);
 
            filterTimeout = setTimeout(updateFilter(e),600);
 
        });
 
};
 

	
 

	
 
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;
 
        });
 

	
 
    $('#file_enable').click(function(){
 
@@ -948,13 +948,13 @@ var _getIdentNode = function(n){
 

	
 
/* generate links for multi line selects that can be shown by files.html page_highlights.
 
 * This is a mouseup handler for hlcode from CodeHtmlFormatter and pygmentize */
 
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);
 

	
 
        var f_int = parseInt(from.id.replace('L',''));
 
        var t_int = parseInt(till.id.replace('L',''));
kallithea/public/js/codemirror_loadmode.js
Show inline comments
 
(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;
 
    return function() { if (--countDown == 0) cont(); };
 
  }
 
  function ensureDeps(mode, cont) {
kallithea/templates/about.html
Show inline comments
 
@@ -59,12 +59,13 @@
 
  <li>Copyright &copy; 2015, Michael V. DePalatis</li>
 
  <li>Copyright &copy; 2015, Morten Skaaning</li>
 
  <li>Copyright &copy; 2015, Nick High</li>
 
  <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>
 
  <li>Copyright &copy; 2015, Tuux</li>
 
  <li>Copyright &copy; 2015, Viktar Palstsiuk</li>
 
  <li>Copyright &copy; 2012, 2014, Dominik Ruf</li>
kallithea/templates/admin/gists/edit.html
Show inline comments
 
@@ -78,13 +78,13 @@
 
                        <textarea id="editor_${h.FID('f',file.path)}" name="contents" style="display:none">${file.content}</textarea>
 
                    </div>
 
                </div>
 

	
 
                ## 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)}');
 
                $modes_select.each(function(){
 
                    var modes_select = this;
 
                    var index = 1;
kallithea/templates/admin/gists/new.html
Show inline comments
 
@@ -56,13 +56,13 @@
 
            ${h.submit('private',_('Create Private Gist'),class_="btn btn-mini btn-success")}
 
            ${h.submit('public',_('Create Public Gist'),class_="btn btn-mini")}
 
            ${h.reset('reset',_('Reset'),class_="btn btn-mini")}
 
            </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');
 
            $modes_select.each(function(){
 
                var modes_select = this;
 
                var index = 1;
kallithea/templates/admin/notifications/notifications_data.html
Show inline comments
 
@@ -29,13 +29,13 @@ unread = lambda n:{False:'unread'}.get(n
 
  </div>
 
%endfor
 
</div>
 

	
 
<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>
 

	
 
%else:
 
    <div class="table">${_('No notifications here yet')}</div>
 
%endif
kallithea/templates/base/base.html
Show inline comments
 
@@ -291,13 +291,13 @@
 
      </a>
 

	
 
      <div class="user-menu">
 
        <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">
 
                        <div class="label">
 
                            <label for="username">${_('Username')}:</label>
 
                        </div>
kallithea/templates/changelog/changelog.html
Show inline comments
 
@@ -107,13 +107,13 @@ ${self.repo_context_bar('changelog', c.f
 
                        <td class="hash" style="width:${len(h.show_id(cs))*6.5}px">
 
                            <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}">
 
                                <span class="changeset_hash">${h.show_id(cs)}</span>
 
                            </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>
 
                        </td>
 
                        <td class="mid">
 
                            <div class="log-container">
kallithea/templates/changeset/changeset_file_comment.html
Show inline comments
 
@@ -84,13 +84,13 @@
 
      </div>
 
    ${h.end_form()}
 
  %else:
 
      ${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">
 
      ${h.reset('hide-inline-form', _('Hide'), class_='btn btn-small hide-inline-form')}
 
      </div>
 
      ${h.end_form()}
kallithea/templates/files/files_add.html
Show inline comments
 
@@ -64,13 +64,13 @@ ${self.repo_context_bar('files')}
 
            ${h.submit('commit',_('Commit Changes'),class_="btn btn-small btn-success")}
 
            ${h.reset('reset',_('Reset'),class_="btn btn-small")}
 
            </div>
 
            ${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(){
 
                var modes_select = this;
 
                var index = 1;
 
                for(var i=0;i<CodeMirror.modeInfo.length;i++){
kallithea/templates/files/files_edit.html
Show inline comments
 
@@ -72,13 +72,13 @@ ${self.repo_context_bar('files')}
 
    </div>
 
</div>
 

	
 
<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(){
 
        var modes_select = this;
 
        var index = 1;
 
        for(var i=0;i<CodeMirror.modeInfo.length;i++){
kallithea/templates/login.html
Show inline comments
 
@@ -13,13 +13,13 @@
 
            <h5>${_('Log In to %s') % c.site_name}</h5>
 
        %else:
 
            <h5>${_('Log In')}</h5>
 
        %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 -->
 

	
 
            <div class="form-horizontal">
 
                <div class="form-group">
kallithea/tests/__init__.py
Show inline comments
 
@@ -87,21 +87,21 @@ environ = {}
 

	
 
#SOME GLOBALS FOR TESTS
 

	
 
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'
 

	
 
NEW_HG_REPO = 'vcs_test_hg_new'
 
NEW_GIT_REPO = 'vcs_test_git_new'
kallithea/tests/api/api_base.py
Show inline comments
 
@@ -549,13 +549,13 @@ class _BaseTestApi(object):
 
        expected = []
 
        self._compare_ok(id_, expected, given=response.body)
 

	
 
    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)
 

	
 
        expected = "user `%s` already exist" % TEST_USER_ADMIN_LOGIN
 
        self._compare_error(id_, expected, given=response.body)
 

	
 
@@ -568,13 +568,13 @@ class _BaseTestApi(object):
 

	
 
        expected = "email `%s` already exist" % TEST_USER_REGULAR_EMAIL
 
        self._compare_error(id_, expected, given=response.body)
 

	
 
    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,
 
                                  email=email,
 
                                  password='trololo')
 
        response = api_call(self, params)
 
@@ -590,13 +590,13 @@ class _BaseTestApi(object):
 
            self._compare_ok(id_, expected, given=response.body)
 
        finally:
 
            fixture.destroy_user(usr.user_id)
 

	
 
    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,
 
                                  email=email)
 
        response = api_call(self, params)
 

	
 
@@ -610,13 +610,13 @@ class _BaseTestApi(object):
 
            self._compare_ok(id_, expected, given=response.body)
 
        finally:
 
            fixture.destroy_user(usr.user_id)
 

	
 
    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,
 
                                  email=email, extern_name='internal')
 
        response = api_call(self, params)
 

	
 
@@ -632,13 +632,13 @@ class _BaseTestApi(object):
 
            fixture.destroy_user(usr.user_id)
 

	
 
    @mock.patch.object(UserModel, 'create_or_update', crash)
 
    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,
 
                                  email=email,
 
                                  password='trololo')
 
        response = api_call(self, params)
 
@@ -1135,13 +1135,13 @@ class _BaseTestApi(object):
 

	
 
    @parameterized.expand([
 
        ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
 
        ('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}),
 
        ('enable_locking', {'enable_locking': True}),
 
        ('enable_downloads', {'enable_downloads': True}),
 
        ('name', {'name': 'new_repo_name'}),
kallithea/tests/functional/test_admin_users.py
Show inline comments
 
@@ -44,13 +44,13 @@ class TestAdminUsersController(TestContr
 
        self.log_user()
 
        username = 'newtestuser'
 
        password = 'test12'
 
        password_confirmation = password
 
        name = 'name'
 
        lastname = 'lastname'
 
        email = 'mail@mail.com'
 
        email = 'mail@example.com'
 

	
 
        response = self.app.post(url('users'),
 
            {'username': username,
 
             'password': password,
 
             'password_confirmation': password_confirmation,
 
             'firstname': name,
 
@@ -80,13 +80,13 @@ class TestAdminUsersController(TestContr
 
    def test_create_err(self):
 
        self.log_user()
 
        username = 'new_user'
 
        password = ''
 
        name = 'name'
 
        lastname = 'lastname'
 
        email = 'errmail.com'
 
        email = 'errmail.example.com'
 

	
 
        response = self.app.post(url('users'), {'username': username,
 
                                               'password': password,
 
                                               'name': name,
 
                                               'active': False,
 
                                               'lastname': lastname,
 
@@ -116,13 +116,13 @@ class TestAdminUsersController(TestContr
 
         ('extern_type', {'extern_type': 'ldap'}),
 
         ('extern_type', {'extern_type': None}),
 
         ('extern_name', {'extern_name': 'test'}),
 
         ('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'})
 
        ])
 
    def test_update(self, name, attrs):
 
        self.log_user()
 
        usr = fixture.create_user(self.test_user_1, password='qweqwe',
kallithea/tests/functional/test_files.py
Show inline comments
 
@@ -94,13 +94,13 @@ class TestFilesController(TestController
 
        self.log_user()
 
        response = self.app.get(url(controller='files', action='index',
 
                                    repo_name=HG_REPO,
 
                                    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.
 
removed extra unicode conversion in diff.</div>
 
""")
 

	
kallithea/tests/functional/test_login.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
import re
 
import time
 
import urlparse
 

	
 
import mock
 

	
 
from kallithea.tests import *
 
from kallithea.tests.fixture import Fixture
 
from kallithea.lib.utils2 import generate_api_key
 
@@ -100,26 +101,25 @@ class TestLoginController(TestController
 
        self.assertNotIn('authuser', response.session)
 

	
 
    @parameterized.expand([
 
          ('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'),
 
                                 {'username': TEST_USER_ADMIN_LOGIN,
 
                                  'password': 'as'})
 
        self.assertEqual(response.status, '200 OK')
 
@@ -133,67 +133,68 @@ class TestLoginController(TestController
 

	
 
        response.mustcontain('Invalid username or password')
 

	
 
    # 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):
 
            response = self.app.get(url(controller='summary', action='index',
 
                                        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')
 
        for encoded in args_encoded:
 
            self.assertIn(encoded, response.location)
 

	
 
    @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
 
    #==========================================================================
 
    def test_register(self):
 
        response = self.app.get(url(controller='login', action='register'))
 
@@ -202,13 +203,13 @@ class TestLoginController(TestController
 
    def test_register_err_same_username(self):
 
        uname = TEST_USER_ADMIN_LOGIN
 
        response = self.app.post(url(controller='login', action='register'),
 
                                            {'username': uname,
 
                                             'password': 'test12',
 
                                             'password_confirmation': 'test12',
 
                                             'email': 'goodmail@domain.com',
 
                                             'email': 'goodmail@example.com',
 
                                             'firstname': 'test',
 
                                             'lastname': 'test'})
 

	
 
        msg = validators.ValidUsername()._messages['username_exists']
 
        msg = h.html_escape(msg % {'username': uname})
 
        response.mustcontain(msg)
 
@@ -301,13 +302,13 @@ class TestLoginController(TestController
 
        msg = validators.ValidPasswordsMatch('password', 'password_confirmation')._messages['password_mismatch']
 
        response.mustcontain(msg)
 

	
 
    def test_register_ok(self):
 
        username = 'test_regular4'
 
        password = 'qweqwe'
 
        email = 'username@test.com'
 
        email = 'user4@example.com'
 
        name = 'testname'
 
        lastname = 'testlastname'
 

	
 
        response = self.app.post(url(controller='login', action='register'),
 
                                            {'username': username,
 
                                             'password': password,
 
@@ -345,13 +346,13 @@ class TestLoginController(TestController
 
        response = self.app.get(url(controller='login',
 
                                    action='password_reset'))
 
        self.assertEqual(response.status, '200 OK')
 

	
 
        username = 'test_password_reset_1'
 
        password = 'qweqwe'
 
        email = 'username@python-works.com'
 
        email = 'username@example.com'
 
        name = 'passwd'
 
        lastname = 'reset'
 
        timestamp = int(time.time())
 

	
 
        new = User()
 
        new.username = username
kallithea/tests/functional/test_my_account.py
Show inline comments
 
@@ -64,22 +64,22 @@ class TestMyAccountController(TestContro
 
    def test_my_account_my_emails_add_remove(self):
 
        self.log_user()
 
        response = self.app.get(url('my_account_emails'))
 
        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'),
 
                                 {'del_email_id': email_id, '_method': 'delete', '_authentication_token': self.authentication_token()})
 
        self.checkSessionFlash(response, 'Removed email from user')
 
        response = self.app.get(url('my_account_emails'))
 
@@ -94,13 +94,13 @@ class TestMyAccountController(TestContro
 
         ('extern_type', {'extern_type': 'ldap'}),
 
         ('extern_type', {'extern_type': None}),
 
         #('extern_name', {'extern_name': 'test'}),
 
         #('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'})
 
        ])
 
    def test_my_account_update(self, name, attrs):
 
        usr = fixture.create_user(self.test_user_1, password='qweqwe',
 
                                  email='testme@example.com',
kallithea/tests/other/manual_test_vcs_operations.py
Show inline comments
 
@@ -109,19 +109,19 @@ def _add_files_and_push(vcs, DEST, **kwa
 
    Command(cwd).execute('touch %s' % added_file)
 
    Command(cwd).execute('%s add %s' % (vcs, added_file))
 

	
 
    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)
 

	
 
    # PUSH it back
 
    _REPO = None
kallithea/tests/other/test_libs.py
Show inline comments
 
@@ -39,34 +39,34 @@ TEST_URLS = [
 
    ('%s://username@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
 
     '%s://127.0.0.1' % proto),
 
    ('%s://username:pass@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
 
     '%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'
 
TEST_URLS += [
 
    ('%s://127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
 
     '%s://127.0.0.1' % proto),
 
    ('%s://username@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
 
     '%s://127.0.0.1' % proto),
 
    ('%s://username:pass@127.0.0.1' % proto, ['%s://' % proto, '127.0.0.1'],
 
     '%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),
 
]
 

	
 

	
 
class TestLibs(BaseTestCase):
 

	
 
    @parameterized.expand(TEST_URLS)
 
@@ -101,17 +101,17 @@ class TestLibs(BaseTestCase):
 
        from kallithea.lib.utils2 import str2bool
 
        self.assertEqual(str2bool(str_bool), expected)
 

	
 
    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([
 
            '2one_more22', 'first', 'lukaszb', 'one', 'one_more22', 'UPPER', 'cAmEL', 'john',
 
            'marian.user', 'marco-polo', 'marco_polo', 'world'], key=lambda k: k.lower())
 
        self.assertEqual(s, extract_mentioned_users(sample))
 
@@ -181,13 +181,13 @@ class TestLibs(BaseTestCase):
 
        delt = lambda *args, **kwargs: relativedelta.relativedelta(*args, **kwargs)
 
        self.assertEqual(age(n + delt(**age_args), now=n), expected)
 

	
 
    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]]"
 
        )
 
        from kallithea.lib.helpers import urlify_text
 
        res = urlify_text(sample, stylize=True)
 
        self.assertIn('<div class="metatag" tag="tag">tag</div>', res)
 
@@ -202,54 +202,54 @@ class TestLibs(BaseTestCase):
 
        _md5 = lambda s: hashlib.md5(s).hexdigest()
 

	
 
        #mock pylons.url
 
        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):
 
            _c = AttributeDict()
 
            _c.visual = AttributeDict()
 
            _c.visual.use_gravatar = True
 
            _c.visual.gravatar_url = _url
 

	
 
            return _c
 

	
 

	
 
        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'),
 
        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'username'}, '', 'http://username@vps1:8000/group/repo1'),
 
        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {}, '/prefix', 'http://vps1:8000/prefix/group/repo1'),
 
        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'user'}, '/prefix', 'http://user@vps1:8000/prefix/group/repo1'),
 
@@ -257,15 +257,15 @@ class TestLibs(BaseTestCase):
 
        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'user'}, '/prefix/', 'http://user@vps1:8000/prefix/group/repo1'),
 
        (Repository.DEFAULT_CLONE_URI, 'group/repo1', {'user': 'username'}, '/prefix/', 'http://username@vps1:8000/prefix/group/repo1'),
 
        ('{scheme}://{user}@{netloc}/_{repoid}', 'group/repo1', {}, '', 'http://vps1:8000/_23'),
 
        ('{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
 
        clone_url = get_clone_url(uri_tmpl=tmpl, qualified_home_url='http://vps1:8000'+prefix,
 
                                  repo_name=repo_name, repo_id=23, **overrides)
 
        self.assertEqual(clone_url, expected)
 
@@ -334,18 +334,18 @@ class TestLibs(BaseTestCase):
 
       "url[http://svn.apache.org/repos]",
 
       "http://svn.apache.org/repos"),
 
      ("from rev a also rev http://google.com",
 
       "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
 
        expected = self._quick_url(expected,
 
                                   tmpl="""<a href="%s">%s</a>""", url_=url_)
 
        self.assertEqual(urlify_text(sample), expected)
kallithea/tests/scripts/manual_test_concurrency.py
Show inline comments
 
@@ -104,13 +104,13 @@ def create_test_user(force=True):
 

	
 
    if user is None or force:
 
        print 'creating new one'
 
        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
 
        new_usr.admin = True
 
        sa.add(new_usr)
 
        sa.commit()
kallithea/tests/test.ini
Show inline comments
 
@@ -53,13 +53,13 @@ pdebug = false
 
#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
 
#error_email_from = paste_error@example.com
 

	
 
## 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
 
#smtp_use_tls = false
 
#smtp_use_ssl = false
 
## SMTP authentication parameters to use (e.g. LOGIN PLAIN CRAM-MD5, etc.).
 
@@ -225,14 +225,14 @@ rss_include_diff = false
 
## options for showing and identifying changesets
 
show_sha_length = 12
 
show_revision_number = true
 

	
 
## 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
 
## controllers to which access will be enabled by api_key. eg: to enable
 
## api access to raw_files put `FilesController:raw`, to enable access to patches
 
## add `ChangesetController:changeset_patch`. This list should be "," separated
 
@@ -261,26 +261,26 @@ default_encoding = utf8
 
issue_pat = (?:\s*#)(\d+)
 

	
 
## server url to the issue, each {id} will be replaced with match
 
## 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>
 

	
 
issue_prefix = #
 

	
 
## 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 prefix key for this instance used for cache invalidation when running
 
## multiple instances of kallithea, make sure it's globally unique for
 
## all running kallithea instances. Leave empty if you don't use it
kallithea/tests/vcs/test_utils.py
Show inline comments
 
@@ -181,32 +181,32 @@ class TestParseDatetime(unittest.TestCas
 
        self.assertEqual(parse_datetime('2w 3d'), expected)
 
        self.assertEqual(parse_datetime('2w 3 days'), expected)
 
        self.assertEqual(parse_datetime('2 weeks 3 days'), expected)
 

	
 

	
 
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):
 

	
 
        for test_str, result in self.TEST_AUTHORS:
 
            self.assertEqual(result[1], author_email(test_str))

Changeset was too big and was cut off... Show full diff anyway

0 comments (0 inline, 0 general)